]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/arducontrol.h
Add basic MFX support to arducontrol driver
[r2c2.git] / source / libr2c2 / arducontrol.h
index cbdecad3a27513c70bb0e168b661d1bd6349a2e8..3a86ceeacc09790bbfc1c7afa04ac6dab29093ff 100644 (file)
@@ -17,6 +17,7 @@ private:
        {
                POWER_ON = 0x01,
                POWER_OFF = 0x02,
+               READ_POWER_STATE = 0x03,
                READ_TRACK_CURRENT = 0x08,
                SET_OVERCURRENT_LIMIT = 0x09,
                READ_INPUT_VOLTAGE = 0x0A,
@@ -25,6 +26,14 @@ private:
                MOTOROLA_SPEED_DIRECTION = 0x13,
                MOTOROLA_SPEED_FUNCTION = 0x14,
                MOTOROLA_SOLENOID = 0x15,
+               MFX_SET_STATION_ID = 0x21,
+               MFX_ANNOUNCE = 0x22,
+               MFX_SEARCH = 0x23,
+               MFX_ASSIGN_ADDRESS = 0x24,
+               MFX_PING = 0x25,
+               MFX_SPEED = 0x28,
+               MFX_SPEED_FUNCS8 = 0x29,
+               MFX_SPEED_FUNCS16 = 0x2A,
                S88_READ = 0x30,
                COMMAND_OK = 0x80,
                RECEIVE_OVERRUN = 0x81,
@@ -35,7 +44,9 @@ private:
                OVERCURRENT = 0xA0,
                TRACK_CURRENT = 0xC0,
                INPUT_VOLTAGE = 0xC1,
-               S88_DATA = 0xD0
+               POWER_STATE = 0xC2,
+               S88_DATA = 0xD0,
+               MFX_FEEDBACK = 0xD1
        };
 
        struct Tag
@@ -52,7 +63,7 @@ private:
                Type type;
                unsigned char command;
                unsigned short serial;
-               unsigned address;
+               unsigned id;
 
                Tag();
 
@@ -66,8 +77,15 @@ private:
 
        enum Protocol
        {
-               NONE,
-               MM
+               MM,
+               MFX
+       };
+
+       struct ProtocolInfo
+       {
+               unsigned max_address;
+               unsigned max_speed;
+               unsigned max_func;
        };
 
        template<typename T>
@@ -95,6 +113,7 @@ private:
                        FUNCTIONS
                };
 
+               unsigned id;
                Protocol proto;
                unsigned address;
                ControlledVariable<unsigned> speed;
@@ -180,7 +199,7 @@ private:
        typedef std::map<unsigned, Sensor> SensorMap;
 
        Msp::IO::Serial serial;
-       bool debug;
+       unsigned debug;
 
        ControlledVariable<bool> power;
 
@@ -198,9 +217,14 @@ private:
        SensorMap sensors;
        unsigned n_s88_octets;
 
+       unsigned mfx_announce_serial;
+       unsigned next_mfx_address;
+
        Msp::Mutex mutex;
        ControlThread thread;
 
+       static ProtocolInfo protocol_info[2];
+
 public:
        ArduControl(const std::string &);
        ~ArduControl();
@@ -216,7 +240,7 @@ private:
 public:
        virtual unsigned get_protocol_speed_steps(const std::string &) const;
 
-       virtual void add_loco(unsigned, const std::string &, const VehicleType &);
+       virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &);
        virtual void remove_loco(unsigned);
        virtual void set_loco_speed(unsigned, unsigned);
        virtual void set_loco_reverse(unsigned, bool);
@@ -228,24 +252,24 @@ private:
        void advance_next_refresh();
 
 public:
-       virtual void add_turnout(unsigned, const TrackType &);
+       virtual unsigned add_turnout(unsigned, const TrackType &);
        virtual void remove_turnout(unsigned);
        virtual void set_turnout(unsigned, unsigned);
        virtual unsigned get_turnout(unsigned) const;
 
-       virtual void add_signal(unsigned, const SignalType &);
+       virtual unsigned add_signal(unsigned, const SignalType &);
        virtual void remove_signal(unsigned);
        virtual void set_signal(unsigned, unsigned);
        virtual unsigned get_signal(unsigned) const;
 
 private:
-       void add_accessory(Accessory::Kind, unsigned, unsigned);
+       unsigned add_accessory(Accessory::Kind, unsigned, unsigned);
        void remove_accessory(Accessory::Kind, unsigned);
        void set_accessory(Accessory::Kind, unsigned, unsigned);
        unsigned get_accessory(Accessory::Kind, unsigned) const;
 
 public:
-       virtual void add_sensor(unsigned);
+       virtual unsigned add_sensor(unsigned);
        virtual void remove_sensor(unsigned);
        virtual void set_sensor(unsigned, bool) { }
        virtual bool get_sensor(unsigned) const;