]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/arducontrol.h
Remember discovered MFX locomotives across runs
[r2c2.git] / source / libr2c2 / arducontrol.h
index c9a88aa56f4c30f068bda6fc40c9f673337d2284..1f45534a1ca472ee22cfbd40159fe2be806cf7a7 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <msp/core/mutex.h>
 #include <msp/core/thread.h>
+#include <msp/datafile/objectloader.h>
+#include <msp/fs/path.h>
 #include <msp/io/serial.h>
 #include <msp/time/timedelta.h>
 #include <msp/time/timestamp.h>
@@ -12,6 +14,17 @@ namespace R2C2 {
 
 class ArduControl: public Driver
 {
+public:
+       class Loader: public Msp::DataFile::ObjectLoader<ArduControl>
+       {
+       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<MfxInfo>
+               {
+               public:
+                       Loader(MfxInfo &);
+               };
+
                unsigned id;
        };
 
@@ -211,6 +230,15 @@ private:
                virtual void process_reply(const char *, unsigned) { }
        };
 
+       class CommandQueueTask: public Task
+       {
+       private:
+               Queue<PendingCommand> queue;
+
+       public:
+               virtual bool get_work(PendingCommand &);
+       };
+
        class RefreshTask: public Task
        {
        private:
@@ -264,6 +292,7 @@ private:
                virtual bool get_work(PendingCommand &);
 
                void set_serial(unsigned);
+               unsigned get_serial() const { return serial; }
        };
 
        class MfxSearchTask: public Task
@@ -283,6 +312,7 @@ private:
                virtual bool get_work(PendingCommand &);
                virtual void process_reply(const char *, unsigned);
 
+               void set_next_address(unsigned);
                bool pop_info(MfxInfo &);
        };
 
@@ -313,6 +343,7 @@ private:
 
        Msp::IO::Serial serial;
        unsigned debug;
+       Msp::FS::Path state_file;
 
        ControlledVariable<bool> power;
 
@@ -353,6 +384,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);
@@ -382,6 +416,8 @@ public:
 
        virtual void tick();
        virtual void flush();
+private:
+       void save_state() const;
 };
 
 } // namespace R2C2