--- /dev/null
+#ifndef LIBMARKLIN_CONTROL_H_
+#define LIBMARKLIN_CONTROL_H_
+
+#include <list>
+#include <string>
+#include <msp/time/timestamp.h>
+#include "constants.h"
+#include "sensor.h"
+#include "locomotive.h"
+#include "turnout.h"
+
+namespace Marklin {
+
+class Command;
+
+class Control
+{
+public:
+ sigc::signal<void, unsigned, bool> signal_turnout_event;
+ sigc::signal<void, unsigned, bool> signal_sensor_event;
+
+ Control();
+ void set_power(bool);
+ void set_debug(bool d) { debug=d; }
+ bool get_power() const { return power; }
+ const TurnoutMap &get_turnouts() const { return turnouts; }
+ Turnout *get_turnout(unsigned) const;
+ Locomotive *get_locomotive(unsigned) const;
+ Sensor *get_sensor(unsigned) const;
+ unsigned get_queue_length() const { return queue.size(); }
+ void open(const std::string &);
+ Command &command(const std::string &);
+ void add_turnout(Turnout *);
+ void add_locomotive(Locomotive *);
+ void add_sensor(Sensor *);
+ void tick();
+ ~Control();
+private:
+ int serial_fd;
+ bool p50_enabled;
+ bool power;
+ std::list<Command> queue;
+ TurnoutMap turnouts;
+ LocomotiveSeq locomotives;
+ SensorMap sensors;
+ Msp::Time::TimeStamp next_event_query;
+ bool poll_sensors;
+ bool debug;
+
+ void read_all(int, char *, int);
+ std::string read_reply(Cmd);
+ void event_query_done(Error, const std::string &);
+ void turnout_event_done(Error, const std::string &);
+ void sensor_event_done(Error, const std::string &);
+};
+
+} // namespace Marklin
+
+#endif