]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/sensor.cpp
Convert engineer to use mspgbase instead of SDL
[r2c2.git] / source / libmarklin / sensor.cpp
index f6913ba1b05a3173069a4cc63b5ba7f94537d097..ff9594de60826ca69c2ef7c5660a5c5e6546a754 100644 (file)
@@ -1,6 +1,10 @@
+#include <msp/time/utils.h>
+#include <msp/time/units.h>
 #include "control.h"
 #include "sensor.h"
 
+using namespace Msp;
+
 namespace Marklin {
 
 Sensor::Sensor(Control &c, unsigned a):
@@ -8,16 +12,42 @@ Sensor::Sensor(Control &c, unsigned a):
        addr(a),
        state(false)
 {
-       control.add_sensor(this);
+       control.add_sensor(*this);
        control.signal_sensor_event.connect(sigc::mem_fun(this, &Sensor::sensor_event));
 }
 
 void Sensor::sensor_event(unsigned a, bool s)
 {
-       if(a==addr && s!=state)
+       if(a==addr)
+       {
+               if(s)
+               {
+                       off_timeout=Time::TimeStamp();
+                       if(s!=state)
+                       {
+                               state=s;
+                               signal_state_changed.emit(state);
+                       }
+               }
+               else
+                       off_timeout=Time::now()+0.5*Time::sec;
+       }
+}
+
+void Sensor::tick()
+{
+       if(off_timeout)
        {
-               state=s;
-               signal_state_changed.emit(state);
+               const Time::TimeStamp t=Time::now();
+               if(t>off_timeout)
+               {
+                       off_timeout=Time::TimeStamp();
+                       if(state)
+                       {
+                               state=false;
+                               signal_state_changed.emit(state);
+                       }
+               }
        }
 }