X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fdummy.cpp;h=90638f63bd8c438b2cfa845a7c0d20173992df41;hb=9f0d428e974defa64cdf8e7b7072967327250958;hp=814dce44a99818f78de28f7aa4f4c5c836b2bc8d;hpb=1ff06c5bc46a677fa389ef86c6b26664368f1653;p=r2c2.git diff --git a/source/libr2c2/dummy.cpp b/source/libr2c2/dummy.cpp index 814dce4..90638f6 100644 --- a/source/libr2c2/dummy.cpp +++ b/source/libr2c2/dummy.cpp @@ -1,18 +1,19 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - +#include +#include +#include +#include #include "dummy.h" using namespace std; +using namespace Msp; namespace R2C2 { -Dummy::Dummy(): - power(true) +Dummy::Dummy(const Options &opts): + power(true), + halted(false), + turnout_delay(opts.get("turnout_delay", 0.0f)*Time::sec), + turnout_fail_rate(opts.get("turnout_fail_rate", 0.0f)*RAND_MAX) { } void Dummy::set_power(bool p) @@ -21,6 +22,18 @@ void Dummy::set_power(bool p) signal_power.emit(power); } +void Dummy::halt(bool h) +{ + halted = h; + if(halted) + { + for(map::iterator i=locos.begin(); i!=locos.end(); ++i) + if(i->second.speed) + set_loco_speed(i->first, 0); + } + signal_halt.emit(halted); +} + const char *Dummy::enumerate_protocols(unsigned i) const { if(i==0) @@ -33,30 +46,45 @@ 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) + { + signal_turnout.emit(addr, state); + return; + } + + turnout.pending = state; + if(turnout_delay) + turnout.timeout = Time::now()+turnout_delay; + else { - turnouts[addr] = state; + if(!turnout_fail_rate || rand()>=turnout_fail_rate) + turnout.state = state; signal_turnout.emit(addr, state); } } -bool Dummy::get_turnout(unsigned addr) const +unsigned Dummy::get_turnout(unsigned addr) const { - map::const_iterator i = turnouts.find(addr); + map::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) { + if(speed && halted) + return; + LocoState &loco = locos[addr]; loco.speed = speed; signal_loco_speed.emit(addr, speed, loco.reverse); @@ -91,4 +119,28 @@ bool Dummy::get_sensor(unsigned addr) const return false; } +float Dummy::get_telemetry_value(const string &name) const +{ + throw key_error(name); +} + +void Dummy::tick() +{ + Time::TimeStamp t = Time::now(); + for(map::iterator i=turnouts.begin(); i!=turnouts.end(); ++i) + { + if(i->second.timeout && t>=i->second.timeout) + { + if(turnout_fail_rate && rand()first); + i->second.pending = i->second.state; + } + i->second.state = i->second.pending; + i->second.timeout = Time::TimeStamp(); + signal_turnout.emit(i->first, i->second.state); + } + } +} + } // namespace R2C2