]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/dummy.cpp
Add helper class for processing driver options
[r2c2.git] / source / libr2c2 / dummy.cpp
index 814dce44a99818f78de28f7aa4f4c5c836b2bc8d..cfee07417b3105b75c2eba5a1029f3056ead320a 100644 (file)
@@ -1,18 +1,15 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
+#include <msp/strings/utils.h>
+#include <msp/time/utils.h>
 #include "dummy.h"
 
 using namespace std;
+using namespace Msp;
 
 namespace R2C2 {
 
-Dummy::Dummy():
-       power(true)
+Dummy::Dummy(const Options &opts):
+       power(true),
+       turnout_delay(opts.get("turnout_delay", 0U)*Time::sec)
 { }
 
 void Dummy::set_power(bool p)
@@ -33,26 +30,37 @@ unsigned Dummy::get_protocol_speed_steps(const string &) const
        return 0;
 }
 
-void Dummy::add_turnout(unsigned addr)
+unsigned Dummy::add_turnout(unsigned addr, const TrackType &)
 {
        turnouts[addr];
+       return addr;
 }
 
-void Dummy::set_turnout(unsigned addr, bool state)
+void Dummy::set_turnout(unsigned addr, unsigned state)
 {
-       if(turnouts[addr]!=state)
+       TurnoutState &turnout = turnouts[addr];
+       if(turnout.state==state && turnout.pending==state)
        {
-               turnouts[addr] = state;
+               signal_turnout.emit(addr, state);
+               return;
+       }
+
+       turnout.pending = state;
+       if(turnout_delay)
+               turnout.timeout = Time::now()+turnout_delay;
+       else
+       {
+               turnout.state = state;
                signal_turnout.emit(addr, state);
        }
 }
 
-bool Dummy::get_turnout(unsigned addr) const
+unsigned Dummy::get_turnout(unsigned addr) const
 {
-       map<unsigned, bool>::const_iterator i = turnouts.find(addr);
+       map<unsigned, TurnoutState>::const_iterator i = turnouts.find(addr);
        if(i!=turnouts.end())
-               return i->second;
-       return false;
+               return i->second.state;
+       return 0;
 }
 
 void Dummy::set_loco_speed(unsigned addr, unsigned speed)
@@ -91,4 +99,18 @@ bool Dummy::get_sensor(unsigned addr) const
        return false;
 }
 
+void Dummy::tick()
+{
+       Time::TimeStamp t = Time::now();
+       for(map<unsigned, TurnoutState>::iterator i=turnouts.begin(); i!=turnouts.end(); ++i)
+       {
+               if(i->second.timeout && t>=i->second.timeout)
+               {
+                       i->second.state = i->second.pending;
+                       i->second.timeout = Time::TimeStamp();
+                       signal_turnout.emit(i->first, i->second.state);
+               }
+       }
+}
+
 } // namespace R2C2