]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/dummy.cpp
a8efac3a1d71204f3b0d861843b482db41911f98
[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", 0.0f)*Time::sec)
13 { }
14
15 void Dummy::set_power(bool p)
16 {
17         power = p;
18         signal_power.emit(power);
19 }
20
21 void Dummy::halt(bool h)
22 {
23         halted = h;
24         if(halted)
25         {
26                 for(map<unsigned, LocoState>::iterator i=locos.begin(); i!=locos.end(); ++i)
27                         if(i->second.speed)
28                                 set_loco_speed(i->first, 0);
29         }
30         signal_halt.emit(halted);
31 }
32
33 const char *Dummy::enumerate_protocols(unsigned i) const
34 {
35         if(i==0)
36                 return "dummy";
37         return 0;
38 }
39
40 unsigned Dummy::get_protocol_speed_steps(const string &) const
41 {
42         return 0;
43 }
44
45 unsigned Dummy::add_turnout(unsigned addr, const TrackType &)
46 {
47         turnouts[addr];
48         return addr;
49 }
50
51 void Dummy::set_turnout(unsigned addr, unsigned state)
52 {
53         TurnoutState &turnout = turnouts[addr];
54         if(turnout.state==state && turnout.pending==state)
55         {
56                 signal_turnout.emit(addr, state);
57                 return;
58         }
59
60         turnout.pending = state;
61         if(turnout_delay)
62                 turnout.timeout = Time::now()+turnout_delay;
63         else
64         {
65                 turnout.state = state;
66                 signal_turnout.emit(addr, state);
67         }
68 }
69
70 unsigned Dummy::get_turnout(unsigned addr) const
71 {
72         map<unsigned, TurnoutState>::const_iterator i = turnouts.find(addr);
73         if(i!=turnouts.end())
74                 return i->second.state;
75         return 0;
76 }
77
78 void Dummy::set_loco_speed(unsigned addr, unsigned speed)
79 {
80         if(speed && halted)
81                 return;
82
83         LocoState &loco = locos[addr];
84         loco.speed = speed;
85         signal_loco_speed.emit(addr, speed, loco.reverse);
86 }
87
88 void Dummy::set_loco_reverse(unsigned addr, bool rev)
89 {
90         LocoState &loco = locos[addr];
91         loco.reverse = rev;
92         signal_loco_speed.emit(addr, loco.speed, rev);
93 }
94
95 void Dummy::set_loco_function(unsigned addr, unsigned func, bool state)
96 {
97         signal_loco_function.emit(addr, func, state);
98 }
99
100 void Dummy::set_sensor(unsigned addr, bool state)
101 {
102         if(sensors[addr]!=state)
103         {
104                 sensors[addr] = state;
105                 signal_sensor.emit(addr, state);
106         }
107 }
108
109 bool Dummy::get_sensor(unsigned addr) const
110 {
111         map<unsigned, bool>::const_iterator i = sensors.find(addr);
112         if(i!=sensors.end())
113                 return i->second;
114         return false;
115 }
116
117 void Dummy::tick()
118 {
119         Time::TimeStamp t = Time::now();
120         for(map<unsigned, TurnoutState>::iterator i=turnouts.begin(); i!=turnouts.end(); ++i)
121         {
122                 if(i->second.timeout && t>=i->second.timeout)
123                 {
124                         i->second.state = i->second.pending;
125                         i->second.timeout = Time::TimeStamp();
126                         signal_turnout.emit(i->first, i->second.state);
127                 }
128         }
129 }
130
131 } // namespace R2C2