]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/arducontrol.h
Store and export information about detected MFX locomotives
[r2c2.git] / source / libr2c2 / arducontrol.h
index 46af9238af3fe845e5e19af05ea285b27987361d..69311f8280fecbb94ce0671b636a0ec4bf9fcf0d 100644 (file)
@@ -35,6 +35,7 @@ private:
                MFX_SPEED_FUNCS8 = 0x29,
                MFX_SPEED_FUNCS16 = 0x2A,
                S88_READ = 0x30,
+               SET_BAUD_RATE = 0x70,
                COMMAND_OK = 0x80,
                RECEIVE_OVERRUN = 0x81,
                FRAMING_ERROR = 0x82,
@@ -42,6 +43,7 @@ private:
                LENGTH_ERROR = 0x84,
                INVALID_VALUE = 0x85,
                OVERCURRENT = 0xA0,
+               BAUD_CHANGE_FAILED = 0xA1,
                TRACK_CURRENT = 0xC0,
                INPUT_VOLTAGE = 0xC1,
                POWER_STATE = 0xC2,
@@ -73,7 +75,8 @@ private:
 
        enum GeneralCommand
        {
-               POWER
+               POWER,
+               NEW_LOCO
        };
 
        enum Protocol
@@ -128,6 +131,11 @@ private:
                unsigned create_speed_func_command(unsigned, char *) const;
        };
 
+       struct MfxInfo: public DetectedLocomotive
+       {
+               unsigned id;
+       };
+
        struct Accessory
        {
                enum Kind
@@ -255,12 +263,19 @@ private:
                unsigned size;
                unsigned bits;
                unsigned misses;
+               std::list<MfxInfo> queue;
+               Msp::Mutex mutex;
 
        public:
                MfxSearchTask(ArduControl &);
 
                virtual bool get_work(PendingCommand &);
                virtual void process_reply(const char *, unsigned);
+
+       private:
+               void push_info(const MfxInfo &);
+       public:
+               bool pop_info(MfxInfo &);
        };
 
        class ControlThread: public Msp::Thread
@@ -276,12 +291,14 @@ private:
                void exit();
        private:
                virtual void main();
+               void init_baud_rate();
                bool get_work(PendingCommand &);
                unsigned do_command(const PendingCommand &);
                unsigned process_reply(const char *, unsigned);
        };
 
        typedef std::map<unsigned, Locomotive> LocomotiveMap;
+       typedef std::vector<MfxInfo> MfxInfoArray;
        typedef std::map<unsigned, Accessory> AccessoryMap;
        typedef std::list<Accessory *> AccessoryPtrList;
        typedef std::map<unsigned, Sensor> SensorMap;
@@ -292,6 +309,7 @@ private:
        ControlledVariable<bool> power;
 
        LocomotiveMap locomotives;
+       MfxInfoArray mfx_info;
        AccessoryMap accessories;
        AccessoryPtrList accessory_queue;
        Accessory *active_accessory;
@@ -325,6 +343,7 @@ private:
 public:
        virtual unsigned get_protocol_speed_steps(const std::string &) const;
 
+       virtual const DetectedLocomotive *enumerate_detected_locos(unsigned) const;
        virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &);
        virtual void remove_loco(unsigned);
        virtual void set_loco_speed(unsigned, unsigned);