X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.h;h=8d27a2f572d74e561acdbc0266dc20561a777f8c;hb=fe8b45dc60ed7828f0b4af9daa9b4cd0649415ca;hp=a8bdfa7a7ba1b018d3798c9ff3d50f25f8d640ff;hpb=7ff47d1f59711542f4943aef02655d1bee51a8f6;p=r2c2.git diff --git a/source/libr2c2/arducontrol.h b/source/libr2c2/arducontrol.h index a8bdfa7..8d27a2f 100644 --- a/source/libr2c2/arducontrol.h +++ b/source/libr2c2/arducontrol.h @@ -117,6 +117,7 @@ private: bool set(T v) { if(v==pending) return false; pending = v; ++serial; return true; } bool commit(unsigned short s) { if(s!=serial) return false; current = pending; return true; } + void rollback() { pending = current; ++serial; } operator T() const { return current; } }; @@ -173,6 +174,7 @@ private: unsigned address; unsigned bits; ControlledVariable state; + unsigned uncertain; unsigned target; Msp::Time::TimeDelta active_time; @@ -217,6 +219,7 @@ private: public: void push(const T &); bool pop(T &); + bool empty() const; }; class Task @@ -317,6 +320,28 @@ private: bool pop_info(MfxInfo &); }; + class MonitorTask: public Task + { + private: + float voltage; + float current; + float base_level; + float peak_level; + Msp::Time::TimeStamp next_poll; + unsigned next_type; + + public: + MonitorTask(); + + virtual bool get_work(PendingCommand &); + virtual void process_reply(const char *, unsigned); + + float get_voltage() const { return voltage; } + float get_current() const { return current; } + void reset_peak(); + float get_peak() const { return peak_level-base_level; } + }; + class ControlThread: public Msp::Thread { private: @@ -332,8 +357,9 @@ private: virtual void main(); void init_baud_rate(); bool get_work(PendingCommand &); - unsigned do_command(const PendingCommand &); + unsigned do_command(const PendingCommand &, const Msp::Time::TimeDelta &); unsigned process_reply(const char *, unsigned); + void set_power(bool); }; typedef std::map LocomotiveMap; @@ -347,35 +373,38 @@ private: Msp::FS::Path state_file; ControlledVariable power; + bool halted; LocomotiveMap locomotives; MfxInfoArray mfx_info; AccessoryMap accessories; AccessoryPtrList accessory_queue; Accessory *active_accessory; + unsigned char active_index; Msp::Time::TimeStamp off_timeout; SensorMap sensors; - Msp::Mutex mutex; + Msp::Time::TimeDelta command_timeout; Queue command_queue; Queue completed_commands; RefreshTask refresh; S88Task s88; MfxAnnounceTask mfx_announce; MfxSearchTask mfx_search; + MonitorTask monitor; ControlThread thread; static ProtocolInfo protocol_info[2]; public: - ArduControl(const std::string &); + ArduControl(const Options &); ~ArduControl(); 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: