+#include <cstdlib>
+#include <msp/core/maputils.h>
#include <msp/strings/utils.h>
#include <msp/time/utils.h>
#include "dummy.h"
Dummy::Dummy(const Options &opts):
power(true),
- turnout_delay(opts.get("turnout_delay", 0U)*Time::sec)
+ halted(false),
+ turnout_delay(opts.get("turnout_delay", 0.0f)*Time::sec),
+ turnout_fail_rate(opts.get("turnout_fail_rate", 0.0f)*RAND_MAX)
{ }
void Dummy::set_power(bool p)
signal_power.emit(power);
}
+void Dummy::halt(bool h)
+{
+ halted = h;
+ if(halted)
+ {
+ for(map<unsigned, LocoState>::iterator i=locos.begin(); i!=locos.end(); ++i)
+ if(i->second.speed)
+ set_loco_speed(i->first, 0);
+ }
+ signal_halt.emit(halted);
+}
+
const char *Dummy::enumerate_protocols(unsigned i) const
{
if(i==0)
turnout.timeout = Time::now()+turnout_delay;
else
{
- turnout.state = state;
+ if(!turnout_fail_rate || rand()>=turnout_fail_rate)
+ turnout.state = state;
signal_turnout.emit(addr, state);
}
}
void Dummy::set_loco_speed(unsigned addr, unsigned speed)
{
+ if(speed && halted)
+ return;
+
LocoState &loco = locos[addr];
loco.speed = speed;
signal_loco_speed.emit(addr, speed, loco.reverse);
return false;
}
+float Dummy::get_telemetry_value(const string &name) const
+{
+ throw key_error(name);
+}
+
void Dummy::tick()
{
Time::TimeStamp t = Time::now();
{
if(i->second.timeout && t>=i->second.timeout)
{
+ if(turnout_fail_rate && rand()<turnout_fail_rate)
+ {
+ signal_turnout_failed.emit(i->first);
+ i->second.pending = i->second.state;
+ }
i->second.state = i->second.pending;
i->second.timeout = Time::TimeStamp();
signal_turnout.emit(i->first, i->second.state);