]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/arducontrol.h
Add two new telemetry values to the arducontrol driver
[r2c2.git] / source / libr2c2 / arducontrol.h
index a48f6f0990aa59997b9c45bdde7778cd3506c17c..fffaf8cc36854d691860e8064548fcd589579aac 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef LIBR2C2_ARDUCONTROL_H_
 #define LIBR2C2_ARDUCONTROL_H_
 
+#include <deque>
 #include <msp/core/mutex.h>
 #include <msp/core/thread.h>
 #include <msp/datafile/objectloader.h>
@@ -44,6 +45,7 @@ private:
                MFX_SEARCH = 0x23,
                MFX_ASSIGN_ADDRESS = 0x24,
                MFX_PING = 0x25,
+               MFX_READ = 0x26,
                MFX_SPEED = 0x28,
                MFX_SPEED_FUNCS8 = 0x29,
                MFX_SPEED_FUNCS16 = 0x2A,
@@ -62,7 +64,8 @@ private:
                POWER_STATE = 0xC2,
                S88_DATA = 0xD0,
                MFX_SEARCH_FEEDBACK = 0xD1,
-               MFX_PING_FEEDBACK = 0xD2
+               MFX_PING_FEEDBACK = 0xD2,
+               MFX_READ_FEEDBACK = 0xD3
        };
 
        struct Tag
@@ -214,7 +217,7 @@ private:
        class Queue
        {
        private:
-               std::list<T> items;
+               std::deque<T> items;
                Msp::Mutex mutex;
 
        public:
@@ -330,6 +333,13 @@ private:
                unsigned misses;
                Queue<MfxInfo> queue;
 
+               MfxInfo *pending_info;
+               unsigned read_array;
+               unsigned read_offset;
+               unsigned read_length;
+               char read_data[0x40];
+               unsigned block_size;
+
        public:
                MfxSearchTask(ArduControl &);
 
@@ -367,10 +377,15 @@ private:
                ArduControl &control;
                bool done;
                std::vector<Task *> tasks;
+               unsigned cmd_rate;
+               unsigned cmd_count;
+               Msp::Time::TimeStamp cmd_rate_start;
 
        public:
                ControlThread(ArduControl &);
 
+               unsigned get_command_rate() const { return cmd_rate; }
+
                void exit();
        private:
                virtual void main();
@@ -415,7 +430,7 @@ private:
        ControlThread thread;
 
        static ProtocolInfo protocol_info[2];
-       static TelemetryInfo telemetry_info[4];
+       static TelemetryInfo telemetry_info[6];
 
 public:
        ArduControl(const Options &);
@@ -436,6 +451,7 @@ public:
        virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &);
 private:
        MfxInfoArray::iterator add_mfx_info(const MfxInfo &);
+       MfxInfo *find_mfx_info(unsigned);
 public:
        virtual void remove_loco(unsigned);
        virtual void set_loco_speed(unsigned, unsigned);