-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
#ifndef LIBR2C2_DRIVER_H_
#define LIBR2C2_DRIVER_H_
+#include <map>
#include <string>
#include <sigc++/signal.h>
+#include <msp/strings/lexicalcast.h>
namespace R2C2 {
+class SignalType;
+class TrackType;
+class VehicleType;
+
class Driver
{
public:
+ class Options
+ {
+ private:
+ typedef std::map<std::string, std::string> OptionMap;
+
+ OptionMap opts;
+
+ public:
+ Options() { }
+ Options(const std::string &);
+
+ void set(const std::string &, const std::string &);
+
+ template<typename T>
+ T get(const std::string &k, const T &d = T()) const
+ {
+ OptionMap::const_iterator i = opts.find(k);
+ if(i==opts.end())
+ return d;
+ return Msp::lexical_cast<T>(i->second);
+ }
+ };
+
+ struct DetectedLocomotive
+ {
+ std::string protocol;
+ unsigned address;
+ std::string name;
+ };
+
sigc::signal<void, bool> signal_power;
sigc::signal<void, bool> signal_halt;
+ sigc::signal<void, const DetectedLocomotive &> signal_locomotive_detected;
+ sigc::signal<void, const DetectedLocomotive &> signal_locomotive_gone;
sigc::signal<void, unsigned, unsigned, bool> signal_loco_speed;
sigc::signal<void, unsigned, unsigned, bool> signal_loco_function;
- sigc::signal<void, unsigned, bool> signal_turnout;
+ sigc::signal<void, unsigned, unsigned> signal_turnout;
+ sigc::signal<void, unsigned> signal_turnout_failed;
+ sigc::signal<void, unsigned, unsigned> signal_signal;
sigc::signal<void, unsigned, bool> signal_sensor;
protected:
virtual const char *enumerate_protocols(unsigned) const = 0;
virtual unsigned get_protocol_speed_steps(const std::string &) const = 0;
- virtual void add_loco(unsigned, const std::string &) = 0;
+
+ virtual const DetectedLocomotive *enumerate_detected_locos(unsigned) const = 0;
+ virtual unsigned add_loco(unsigned, const std::string &, const VehicleType &) = 0;
+ virtual void remove_loco(unsigned) = 0;
virtual void set_loco_speed(unsigned, unsigned) = 0;
virtual void set_loco_reverse(unsigned, bool) = 0;
virtual void set_loco_function(unsigned, unsigned, bool) = 0;
- virtual void add_turnout(unsigned) = 0;
- virtual void set_turnout(unsigned, bool) = 0;
- virtual bool get_turnout(unsigned) const = 0;
+ virtual unsigned add_turnout(unsigned, const TrackType &) = 0;
+ virtual void remove_turnout(unsigned) = 0;
+ virtual void set_turnout(unsigned, unsigned) = 0;
+ virtual unsigned get_turnout(unsigned) const = 0;
+
+ virtual unsigned add_signal(unsigned, const SignalType &) = 0;
+ virtual void remove_signal(unsigned) = 0;
+ virtual void set_signal(unsigned, unsigned) = 0;
+ virtual unsigned get_signal(unsigned) const = 0;
- virtual void add_sensor(unsigned) = 0;
+ virtual unsigned add_sensor(unsigned) = 0;
+ virtual void remove_sensor(unsigned) = 0;
virtual void set_sensor(unsigned, bool) = 0;
virtual bool get_sensor(unsigned) const = 0;