1 #include <msp/strings/utils.h>
2 #include <msp/time/utils.h>
10 Dummy::Dummy(const Options &opts):
12 turnout_delay(opts.get("turnout_delay", 0U)*Time::sec)
15 void Dummy::set_power(bool p)
18 signal_power.emit(power);
21 const char *Dummy::enumerate_protocols(unsigned i) const
28 unsigned Dummy::get_protocol_speed_steps(const string &) const
33 unsigned Dummy::add_turnout(unsigned addr, const TrackType &)
39 void Dummy::set_turnout(unsigned addr, unsigned state)
41 TurnoutState &turnout = turnouts[addr];
42 if(turnout.state==state && turnout.pending==state)
44 signal_turnout.emit(addr, state);
48 turnout.pending = state;
50 turnout.timeout = Time::now()+turnout_delay;
53 turnout.state = state;
54 signal_turnout.emit(addr, state);
58 unsigned Dummy::get_turnout(unsigned addr) const
60 map<unsigned, TurnoutState>::const_iterator i = turnouts.find(addr);
62 return i->second.state;
66 void Dummy::set_loco_speed(unsigned addr, unsigned speed)
68 LocoState &loco = locos[addr];
70 signal_loco_speed.emit(addr, speed, loco.reverse);
73 void Dummy::set_loco_reverse(unsigned addr, bool rev)
75 LocoState &loco = locos[addr];
77 signal_loco_speed.emit(addr, loco.speed, rev);
80 void Dummy::set_loco_function(unsigned addr, unsigned func, bool state)
82 signal_loco_function.emit(addr, func, state);
85 void Dummy::set_sensor(unsigned addr, bool state)
87 if(sensors[addr]!=state)
89 sensors[addr] = state;
90 signal_sensor.emit(addr, state);
94 bool Dummy::get_sensor(unsigned addr) const
96 map<unsigned, bool>::const_iterator i = sensors.find(addr);
104 Time::TimeStamp t = Time::now();
105 for(map<unsigned, TurnoutState>::iterator i=turnouts.begin(); i!=turnouts.end(); ++i)
107 if(i->second.timeout && t>=i->second.timeout)
109 i->second.state = i->second.pending;
110 i->second.timeout = Time::TimeStamp();
111 signal_turnout.emit(i->first, i->second.state);