]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/dummy.cpp
cfee07417b3105b75c2eba5a1029f3056ead320a
[r2c2.git] / source / libr2c2 / dummy.cpp
1 #include <msp/strings/utils.h>
2 #include <msp/time/utils.h>
3 #include "dummy.h"
4
5 using namespace std;
6 using namespace Msp;
7
8 namespace R2C2 {
9
10 Dummy::Dummy(const Options &opts):
11         power(true),
12         turnout_delay(opts.get("turnout_delay", 0U)*Time::sec)
13 { }
14
15 void Dummy::set_power(bool p)
16 {
17         power = p;
18         signal_power.emit(power);
19 }
20
21 const char *Dummy::enumerate_protocols(unsigned i) const
22 {
23         if(i==0)
24                 return "dummy";
25         return 0;
26 }
27
28 unsigned Dummy::get_protocol_speed_steps(const string &) const
29 {
30         return 0;
31 }
32
33 unsigned Dummy::add_turnout(unsigned addr, const TrackType &)
34 {
35         turnouts[addr];
36         return addr;
37 }
38
39 void Dummy::set_turnout(unsigned addr, unsigned state)
40 {
41         TurnoutState &turnout = turnouts[addr];
42         if(turnout.state==state && turnout.pending==state)
43         {
44                 signal_turnout.emit(addr, state);
45                 return;
46         }
47
48         turnout.pending = state;
49         if(turnout_delay)
50                 turnout.timeout = Time::now()+turnout_delay;
51         else
52         {
53                 turnout.state = state;
54                 signal_turnout.emit(addr, state);
55         }
56 }
57
58 unsigned Dummy::get_turnout(unsigned addr) const
59 {
60         map<unsigned, TurnoutState>::const_iterator i = turnouts.find(addr);
61         if(i!=turnouts.end())
62                 return i->second.state;
63         return 0;
64 }
65
66 void Dummy::set_loco_speed(unsigned addr, unsigned speed)
67 {
68         LocoState &loco = locos[addr];
69         loco.speed = speed;
70         signal_loco_speed.emit(addr, speed, loco.reverse);
71 }
72
73 void Dummy::set_loco_reverse(unsigned addr, bool rev)
74 {
75         LocoState &loco = locos[addr];
76         loco.reverse = rev;
77         signal_loco_speed.emit(addr, loco.speed, rev);
78 }
79
80 void Dummy::set_loco_function(unsigned addr, unsigned func, bool state)
81 {
82         signal_loco_function.emit(addr, func, state);
83 }
84
85 void Dummy::set_sensor(unsigned addr, bool state)
86 {
87         if(sensors[addr]!=state)
88         {
89                 sensors[addr] = state;
90                 signal_sensor.emit(addr, state);
91         }
92 }
93
94 bool Dummy::get_sensor(unsigned addr) const
95 {
96         map<unsigned, bool>::const_iterator i = sensors.find(addr);
97         if(i!=sensors.end())
98                 return i->second;
99         return false;
100 }
101
102 void Dummy::tick()
103 {
104         Time::TimeStamp t = Time::now();
105         for(map<unsigned, TurnoutState>::iterator i=turnouts.begin(); i!=turnouts.end(); ++i)
106         {
107                 if(i->second.timeout && t>=i->second.timeout)
108                 {
109                         i->second.state = i->second.pending;
110                         i->second.timeout = Time::TimeStamp();
111                         signal_turnout.emit(i->first, i->second.state);
112                 }
113         }
114 }
115
116 } // namespace R2C2