2 #include <msp/core/maputils.h>
3 #include <msp/strings/utils.h>
4 #include <msp/time/utils.h>
12 Dummy::Dummy(const Options &opts):
14 turnout_delay(opts.get("turnout_delay", 0.0f)*Time::sec),
15 turnout_fail_rate(opts.get("turnout_fail_rate", 0.0f)*RAND_MAX)
18 void Dummy::set_power(bool p)
21 signal_power.emit(power);
24 void Dummy::halt(bool h)
29 for(map<unsigned, LocoState>::iterator i=locos.begin(); i!=locos.end(); ++i)
31 set_loco_speed(i->first, 0);
33 signal_halt.emit(halted);
36 const char *Dummy::enumerate_protocols(unsigned i) const
43 unsigned Dummy::get_protocol_speed_steps(const string &) const
48 unsigned Dummy::add_turnout(unsigned addr, const TrackType &)
54 void Dummy::set_turnout(unsigned addr, unsigned state)
56 TurnoutState &turnout = turnouts[addr];
57 if(turnout.state==state && turnout.pending==state)
59 signal_turnout.emit(addr, state);
63 turnout.pending = state;
65 turnout.timeout = Time::now()+turnout_delay;
68 if(!turnout_fail_rate || rand()>=turnout_fail_rate)
69 turnout.state = state;
70 signal_turnout.emit(addr, state);
74 unsigned Dummy::get_turnout(unsigned addr) const
76 map<unsigned, TurnoutState>::const_iterator i = turnouts.find(addr);
78 return i->second.state;
82 void Dummy::set_loco_speed(unsigned addr, unsigned speed)
87 LocoState &loco = locos[addr];
89 signal_loco_speed.emit(addr, speed, loco.reverse);
92 void Dummy::set_loco_reverse(unsigned addr, bool rev)
94 LocoState &loco = locos[addr];
96 signal_loco_speed.emit(addr, loco.speed, rev);
99 void Dummy::set_loco_function(unsigned addr, unsigned func, bool state)
101 signal_loco_function.emit(addr, func, state);
104 void Dummy::set_sensor(unsigned addr, bool state)
106 if(sensors[addr]!=state)
108 sensors[addr] = state;
109 signal_sensor.emit(addr, state);
113 bool Dummy::get_sensor(unsigned addr) const
115 map<unsigned, bool>::const_iterator i = sensors.find(addr);
121 float Dummy::get_telemetry_value(const string &name) const
123 throw key_error(name);
128 Time::TimeStamp t = Time::now();
129 for(map<unsigned, TurnoutState>::iterator i=turnouts.begin(); i!=turnouts.end(); ++i)
131 if(i->second.timeout && t>=i->second.timeout)
133 if(turnout_fail_rate && rand()<turnout_fail_rate)
135 signal_turnout_failed.emit(i->first);
136 i->second.pending = i->second.state;
138 i->second.state = i->second.pending;
139 i->second.timeout = Time::TimeStamp();
140 signal_turnout.emit(i->first, i->second.state);