]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/sensor.cpp
Use max/min for range capping
[r2c2.git] / source / libr2c2 / sensor.cpp
1 #include "driver.h"
2 #include "layout.h"
3 #include "sensor.h"
4
5 using namespace std;
6 using namespace Msp;
7
8 namespace R2C2 {
9
10 Sensor::Sensor(Layout &l):
11         layout(l),
12         address(0),
13         id(0),
14         invert(false),
15         state(INACTIVE)
16 {
17         if(layout.has_driver())
18                 layout.get_driver().signal_sensor.connect(sigc::mem_fun(this, &Sensor::event));
19
20         layout.add(*this);
21 }
22
23 Sensor::~Sensor()
24 {
25         if(layout.has_driver() && address)
26                 layout.get_driver().remove_sensor(address);
27         layout.remove(*this);
28 }
29
30 void Sensor::set_address(unsigned a)
31 {
32         Driver *driver = (layout.has_driver() ? &layout.get_driver() : 0);
33         if(driver && id)
34                 driver->remove_sensor(id);
35         address = a;
36         if(driver && address)
37                 id = driver->add_sensor(address);
38         else
39                 id = 0;
40 }
41
42 void Sensor::tick(const Time::TimeDelta &dt)
43 {
44         if(state_confirm_timeout)
45         {
46                 state_confirm_timeout = max(state_confirm_timeout-dt, Time::zero);
47                 if(state_confirm_timeout<=Time::zero)
48                 {
49                         if(state==MAYBE_INACTIVE)
50                                 state = INACTIVE;
51                         else if(state==MAYBE_ACTIVE)
52                                 state = ACTIVE;
53                         signal_state_changed.emit(state);
54                 }
55         }
56 }
57
58 void Sensor::event(unsigned i, bool s)
59 {
60         if(i==id)
61         {
62                 if(s!=invert && state<MAYBE_ACTIVE)
63                 {
64                         state = MAYBE_ACTIVE;
65                         state_confirm_timeout = 300*Time::msec;
66                         signal_state_changed.emit(state);
67                 }
68                 else if(s==invert && state>MAYBE_INACTIVE)
69                 {
70                         state = MAYBE_INACTIVE;
71                         state_confirm_timeout = 700*Time::msec;
72                         signal_state_changed.emit(state);
73                 }
74         }
75 }
76
77 } // namespace R2C2