]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/driver.h
Add telemetry framework for drivers
[r2c2.git] / source / libr2c2 / driver.h
1 #ifndef LIBR2C2_DRIVER_H_
2 #define LIBR2C2_DRIVER_H_
3
4 #include <map>
5 #include <string>
6 #include <sigc++/signal.h>
7 #include <msp/strings/lexicalcast.h>
8
9 namespace R2C2 {
10
11 class SignalType;
12 class TrackType;
13 class VehicleType;
14
15 class Driver
16 {
17 public:
18         class Options
19         {
20         private:
21                 typedef std::map<std::string, std::string> OptionMap;
22
23                 OptionMap opts;
24
25         public:
26                 Options() { }
27                 Options(const std::string &);
28
29                 void set(const std::string &, const std::string &);
30
31                 template<typename T>
32                 T get(const std::string &k, const T &d = T()) const
33                 {
34                         OptionMap::const_iterator i = opts.find(k);
35                         if(i==opts.end())
36                                 return d;
37                         return Msp::lexical_cast<T>(i->second);
38                 }
39         };
40
41         struct DetectedLocomotive
42         {
43                 std::string protocol;
44                 unsigned address;
45                 std::string name;
46         };
47
48         struct TelemetryInfo
49         {
50                 const char *name;
51                 const char *label;
52                 const char *unit;
53                 unsigned precision;
54         };
55
56         sigc::signal<void, bool> signal_power;
57         sigc::signal<void, bool> signal_halt;
58         sigc::signal<void, const DetectedLocomotive &> signal_locomotive_detected;
59         sigc::signal<void, const DetectedLocomotive &> signal_locomotive_gone;
60         sigc::signal<void, unsigned, unsigned, bool> signal_loco_speed;
61         sigc::signal<void, unsigned, unsigned, bool> signal_loco_function;
62         sigc::signal<void, unsigned, unsigned> signal_turnout;
63         sigc::signal<void, unsigned> signal_turnout_failed;
64         sigc::signal<void, unsigned, unsigned> signal_signal;
65         sigc::signal<void, unsigned, bool> signal_sensor;
66
67 protected:
68         Driver() { }
69 public:
70         virtual ~Driver() { }
71
72         virtual void set_power(bool) = 0;
73         virtual bool get_power() const = 0;
74         virtual void halt(bool) = 0;
75         virtual bool is_halted() const = 0;
76
77         virtual const char *enumerate_protocols(unsigned) const = 0;
78         virtual unsigned get_protocol_speed_steps(const std::string &) const = 0;
79
80         virtual const DetectedLocomotive *enumerate_detected_locos(unsigned) const = 0;
81         virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &) = 0;
82         virtual void remove_loco(unsigned) = 0;
83         virtual void set_loco_speed(unsigned, unsigned) = 0;
84         virtual void set_loco_reverse(unsigned, bool) = 0;
85         virtual void set_loco_function(unsigned, unsigned, bool) = 0;
86
87         virtual unsigned add_turnout(unsigned, const TrackType &) = 0;
88         virtual void remove_turnout(unsigned) = 0;
89         virtual void set_turnout(unsigned, unsigned) = 0;
90         virtual unsigned get_turnout(unsigned) const = 0;
91
92         virtual unsigned add_signal(unsigned, const SignalType &) = 0;
93         virtual void remove_signal(unsigned) = 0;
94         virtual void set_signal(unsigned, unsigned) = 0;
95         virtual unsigned get_signal(unsigned) const = 0;
96
97         virtual unsigned add_sensor(unsigned) = 0;
98         virtual void remove_sensor(unsigned) = 0;
99         virtual void set_sensor(unsigned, bool) = 0;
100         virtual bool get_sensor(unsigned) const = 0;
101
102         virtual const TelemetryInfo *enumerate_telemetry(unsigned) const = 0;
103         virtual float get_telemetry_value(const std::string &) const = 0;
104
105         virtual void tick() = 0;
106         virtual void flush() = 0;
107
108         static Driver *create(const std::string &);
109 };
110
111 } // namespace R2C2
112
113 #endif