+#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):
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);
+ }
+ }
}
}