X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fdummy.cpp;h=0c3c351d968d01b23a79597aa4e725791dea5d62;hb=b3cc0d29a0fda2d48443d66881214c81a04b1729;hp=cfee07417b3105b75c2eba5a1029f3056ead320a;hpb=2c08ce7d004b20a1cd9bc68fccbf734a6ba2d242;p=r2c2.git diff --git a/source/libr2c2/dummy.cpp b/source/libr2c2/dummy.cpp index cfee074..0c3c351 100644 --- a/source/libr2c2/dummy.cpp +++ b/source/libr2c2/dummy.cpp @@ -1,3 +1,4 @@ +#include #include #include #include "dummy.h" @@ -9,7 +10,8 @@ namespace R2C2 { Dummy::Dummy(const Options &opts): power(true), - turnout_delay(opts.get("turnout_delay", 0U)*Time::sec) + 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) @@ -18,6 +20,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) @@ -50,7 +64,8 @@ void Dummy::set_turnout(unsigned addr, unsigned state) turnout.timeout = Time::now()+turnout_delay; else { - turnout.state = state; + if(!turnout_fail_rate || rand()>=turnout_fail_rate) + turnout.state = state; signal_turnout.emit(addr, state); } } @@ -65,6 +80,9 @@ unsigned Dummy::get_turnout(unsigned addr) const 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); @@ -106,6 +124,11 @@ void Dummy::tick() { 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);