X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.h;h=a8bdfa7a7ba1b018d3798c9ff3d50f25f8d640ff;hb=7ff47d1f59711542f4943aef02655d1bee51a8f6;hp=69311f8280fecbb94ce0671b636a0ec4bf9fcf0d;hpb=58c56db5f740d9d3c56ff64f4062b108076c63c3;p=r2c2.git diff --git a/source/libr2c2/arducontrol.h b/source/libr2c2/arducontrol.h index 69311f8..a8bdfa7 100644 --- a/source/libr2c2/arducontrol.h +++ b/source/libr2c2/arducontrol.h @@ -3,6 +3,8 @@ #include #include +#include +#include #include #include #include @@ -12,6 +14,17 @@ namespace R2C2 { class ArduControl: public Driver { +public: + class Loader: public Msp::DataFile::ObjectLoader + { + public: + Loader(ArduControl &); + + private: + void mfx_announce_serial(unsigned); + void mfx_locomotive(unsigned); + }; + private: enum Command { @@ -133,6 +146,12 @@ private: struct MfxInfo: public DetectedLocomotive { + class Loader: public Msp::DataFile::ObjectLoader + { + public: + Loader(MfxInfo &); + }; + unsigned id; }; @@ -188,6 +207,18 @@ private: PendingCommand(Accessory &, Accessory::Command, unsigned = 0); }; + template + class Queue + { + private: + std::list items; + Msp::Mutex mutex; + + public: + void push(const T &); + bool pop(T &); + }; + class Task { protected: @@ -199,6 +230,15 @@ private: virtual void process_reply(const char *, unsigned) { } }; + class CommandQueueTask: public Task + { + private: + Queue queue; + + public: + virtual bool get_work(PendingCommand &); + }; + class RefreshTask: public Task { private: @@ -229,6 +269,7 @@ private: ArduControl &control; unsigned n_octets; unsigned octets_remaining; + unsigned delay; public: S88Task(ArduControl &); @@ -252,6 +293,7 @@ private: virtual bool get_work(PendingCommand &); void set_serial(unsigned); + unsigned get_serial() const { return serial; } }; class MfxSearchTask: public Task @@ -263,8 +305,7 @@ private: unsigned size; unsigned bits; unsigned misses; - std::list queue; - Msp::Mutex mutex; + Queue queue; public: MfxSearchTask(ArduControl &); @@ -272,9 +313,7 @@ private: virtual bool get_work(PendingCommand &); virtual void process_reply(const char *, unsigned); - private: - void push_info(const MfxInfo &); - public: + void set_next_address(unsigned); bool pop_info(MfxInfo &); }; @@ -305,6 +344,7 @@ private: Msp::IO::Serial serial; unsigned debug; + Msp::FS::Path state_file; ControlledVariable power; @@ -314,12 +354,12 @@ private: AccessoryPtrList accessory_queue; Accessory *active_accessory; Msp::Time::TimeStamp off_timeout; - std::list command_queue; - std::list completed_commands; SensorMap sensors; Msp::Mutex mutex; + Queue command_queue; + Queue completed_commands; RefreshTask refresh; S88Task s88; MfxAnnounceTask mfx_announce; @@ -345,6 +385,9 @@ public: virtual const DetectedLocomotive *enumerate_detected_locos(unsigned) const; virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &); +private: + MfxInfoArray::iterator add_mfx_info(const MfxInfo &); +public: virtual void remove_loco(unsigned); virtual void set_loco_speed(unsigned, unsigned); virtual void set_loco_reverse(unsigned, bool); @@ -374,12 +417,8 @@ public: virtual void tick(); virtual void flush(); - private: - void push_command(const PendingCommand &); - bool pop_command(PendingCommand &); - void push_completed_tag(const Tag &); - Tag pop_completed_tag(); + void save_state() const; }; } // namespace R2C2