]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/sensor.cpp
Use max/min for range capping
[r2c2.git] / source / libr2c2 / sensor.cpp
index 8a65d3dedf20f52419d130bfd1612f5bb3cc2a30..83dcb6d1be3b6bae9610101672bf21973674e655 100644 (file)
@@ -2,6 +2,7 @@
 #include "layout.h"
 #include "sensor.h"
 
+using namespace std;
 using namespace Msp;
 
 namespace R2C2 {
@@ -9,6 +10,8 @@ namespace R2C2 {
 Sensor::Sensor(Layout &l):
        layout(l),
        address(0),
+       id(0),
+       invert(false),
        state(INACTIVE)
 {
        if(layout.has_driver())
@@ -19,37 +22,50 @@ Sensor::Sensor(Layout &l):
 
 Sensor::~Sensor()
 {
+       if(layout.has_driver() && address)
+               layout.get_driver().remove_sensor(address);
        layout.remove(*this);
 }
 
+void Sensor::set_address(unsigned a)
+{
+       Driver *driver = (layout.has_driver() ? &layout.get_driver() : 0);
+       if(driver && id)
+               driver->remove_sensor(id);
+       address = a;
+       if(driver && address)
+               id = driver->add_sensor(address);
+       else
+               id = 0;
+}
+
 void Sensor::tick(const Time::TimeDelta &dt)
 {
        if(state_confirm_timeout)
        {
-               state_confirm_timeout -= dt;
+               state_confirm_timeout = max(state_confirm_timeout-dt, Time::zero);
                if(state_confirm_timeout<=Time::zero)
                {
                        if(state==MAYBE_INACTIVE)
                                state = INACTIVE;
                        else if(state==MAYBE_ACTIVE)
                                state = ACTIVE;
-                       state_confirm_timeout = Time::zero;
                        signal_state_changed.emit(state);
                }
        }
 }
 
-void Sensor::event(unsigned a, bool s)
+void Sensor::event(unsigned i, bool s)
 {
-       if(a==address)
+       if(i==id)
        {
-               if(s && state<MAYBE_ACTIVE)
+               if(s!=invert && state<MAYBE_ACTIVE)
                {
                        state = MAYBE_ACTIVE;
                        state_confirm_timeout = 300*Time::msec;
                        signal_state_changed.emit(state);
                }
-               else if(!s && state>MAYBE_INACTIVE)
+               else if(s==invert && state>MAYBE_INACTIVE)
                {
                        state = MAYBE_INACTIVE;
                        state_confirm_timeout = 700*Time::msec;