From: Mikko Rasa Date: Wed, 2 Apr 2014 16:40:11 +0000 (+0300) Subject: Implement halt mode to ArduControl X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=57628dfb3e1874ab73c0c3df02043a4f57feb4b1;p=r2c2.git Implement halt mode to ArduControl --- diff --git a/source/libr2c2/arducontrol.cpp b/source/libr2c2/arducontrol.cpp index fa95a69..4b89efa 100644 --- a/source/libr2c2/arducontrol.cpp +++ b/source/libr2c2/arducontrol.cpp @@ -23,6 +23,7 @@ ArduControl::ArduControl(const Options &opts): debug(opts.get("debug")), state_file("arducontrol.state"), power(false), + halted(false), active_accessory(0), s88(*this), mfx_search(*this), @@ -67,8 +68,19 @@ void ArduControl::set_power(bool p) } } -void ArduControl::halt(bool) +void ArduControl::halt(bool h) { + if(h==halted) + return; + + halted = h; + if(halted) + { + for(LocomotiveMap::const_iterator i=locomotives.begin(); i!=locomotives.end(); ++i) + set_loco_speed(i->first, 0); + } + + signal_halt.emit(halted); } const char *ArduControl::enumerate_protocols(unsigned i) const @@ -146,6 +158,9 @@ void ArduControl::set_loco_speed(unsigned id, unsigned speed) if(speed>protocol_info[loco.proto].max_speed) throw invalid_argument("ArduControl::set_loco_speed"); + if(speed && halted) + return; + if(loco.speed.set(speed)) { PendingCommand cmd(loco, Locomotive::SPEED); diff --git a/source/libr2c2/arducontrol.h b/source/libr2c2/arducontrol.h index c3ca7a4..8560a13 100644 --- a/source/libr2c2/arducontrol.h +++ b/source/libr2c2/arducontrol.h @@ -371,6 +371,7 @@ private: Msp::FS::Path state_file; ControlledVariable power; + bool halted; LocomotiveMap locomotives; MfxInfoArray mfx_info; @@ -401,7 +402,7 @@ public: virtual void set_power(bool); virtual bool get_power() const { return power; } virtual void halt(bool); - virtual bool is_halted() const { return false; } + virtual bool is_halted() const { return halted; } virtual const char *enumerate_protocols(unsigned) const; private: