From 3051264c306adc12b6028061a3257f523c211f81 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 1 Feb 2013 18:56:11 +0200 Subject: [PATCH] Implement signals in Intellibox driver as well --- source/libr2c2/intellibox.cpp | 42 ++++++++++++++++++++++++++++++----- source/libr2c2/intellibox.h | 14 ++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/source/libr2c2/intellibox.cpp b/source/libr2c2/intellibox.cpp index 82623e1..73c2057 100644 --- a/source/libr2c2/intellibox.cpp +++ b/source/libr2c2/intellibox.cpp @@ -193,11 +193,17 @@ void Intellibox::set_loco_function(unsigned addr, unsigned func, bool state) } void Intellibox::add_turnout(unsigned addr, const TrackType &type) +{ + add_turnout(addr, type.get_state_bits(), false); +} + +void Intellibox::add_turnout(unsigned addr, unsigned bits, bool signal) { if(!turnouts.count(addr)) { Turnout &turnout = turnouts[addr]; - turnout.bits = type.get_state_bits(); + turnout.bits = bits; + turnout.signal = signal; unsigned char data[2]; data[0] = addr&0xFF; @@ -215,6 +221,14 @@ void Intellibox::add_turnout(unsigned addr, const TrackType &type) } } +void Intellibox::turnout_state_changed(unsigned addr, const Turnout &turnout) const +{ + if(turnout.signal) + signal_signal.emit(addr, turnout.state); + else + signal_turnout.emit(addr, turnout.state); +} + void Intellibox::set_turnout(unsigned addr, unsigned state) { Turnout &turnout = turnouts[addr]; @@ -223,7 +237,7 @@ void Intellibox::set_turnout(unsigned addr, unsigned state) { turnout.state = state; turnout.pending = state; - signal_turnout.emit(addr, state); + turnout_state_changed(addr, turnout); return; } @@ -245,6 +259,21 @@ unsigned Intellibox::get_turnout(unsigned addr) const return 0; } +void Intellibox::add_signal(unsigned addr, const SignalType &) +{ + add_turnout(addr, 1, true); +} + +void Intellibox::set_signal(unsigned addr, unsigned state) +{ + set_turnout(addr, state); +} + +unsigned Intellibox::get_signal(unsigned addr) const +{ + return get_turnout(addr); +} + void Intellibox::add_sensor(unsigned addr) { if(!sensors.count(addr)) @@ -472,7 +501,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) unsigned bit = !(data[1]&0x80); turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr,turnout); } } else if(cmd==CMD_EVENT_SENSOR) @@ -541,7 +570,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) if(turnout.active) { if(turnout.state==turnout.pending) - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr, turnout); turnout.off_timeout = t+500*Time::msec; } } @@ -573,7 +602,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) { turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr, turnout); } turnout.synced = true; @@ -723,7 +752,8 @@ Intellibox::Turnout::Turnout(): state(0), active(false), synced(false), - pending(0) + pending(0), + signal(false) { } diff --git a/source/libr2c2/intellibox.h b/source/libr2c2/intellibox.h index e35da47..4740a1e 100644 --- a/source/libr2c2/intellibox.h +++ b/source/libr2c2/intellibox.h @@ -85,6 +85,7 @@ private: Locomotive(); }; + // These are used for signals as well, but Intellibox calls them turnouts. struct Turnout { unsigned bits; @@ -93,6 +94,7 @@ private: bool synced; unsigned pending; Msp::Time::TimeStamp off_timeout; + bool signal; Turnout(); }; @@ -140,14 +142,18 @@ public: virtual void set_loco_function(unsigned, unsigned, bool); virtual void add_turnout(unsigned, const TrackType &); +private: + void add_turnout(unsigned, unsigned, bool); + void turnout_state_changed(unsigned, const Turnout &) const; +public: virtual void set_turnout(unsigned, unsigned); virtual unsigned get_turnout(unsigned) const; - // TODO implement these - virtual void add_signal(unsigned, const SignalType &) { } - virtual void set_signal(unsigned, unsigned) { } - virtual unsigned get_signal(unsigned) const { return 0; } + virtual void add_signal(unsigned, const SignalType &); + virtual void set_signal(unsigned, unsigned); + virtual unsigned get_signal(unsigned) const; +public: virtual void add_sensor(unsigned); virtual void set_sensor(unsigned, bool) { } virtual bool get_sensor(unsigned) const; -- 2.45.2