]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/centralstation.h
Don't crash if a train has no router
[r2c2.git] / source / libr2c2 / centralstation.h
index fea882be1011230fa9d6f8c86fc77a7dfbc6288d..959a5acb6b21b8429ba8dfe851f1c7bbee1d5e90 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #ifndef LIBR2C2_CENTRALSTATION_H_
 #define LIBR2C2_CENTRALSTATION_H_
 
@@ -30,7 +23,7 @@ private:
 
        struct Message
        {
-               typedef std::map<std::string, std::string> AttribMap;
+               typedef std::multimap<std::string, std::string> AttribMap;
                typedef std::map<unsigned, AttribMap> ObjectMap;
        
                Tag header;
@@ -68,29 +61,40 @@ private:
                unsigned address;
                unsigned speed;
                bool reverse;
+               unsigned func_mask;
                unsigned funcs;
                bool control;
 
                Locomotive();
        };
 
-       struct Turnout
+       struct MagnetAccessory
        {
+               enum Type
+               {
+                       TURNOUT,
+                       SIGNAL
+               };
+
                enum Symbol
                {
-                       LEFT,
-                       RIGHT,
-                       THREEWAY,
-                       DOUBLESLIP
+                       TURNOUT_LEFT = 0,
+                       TURNOUT_RIGHT = 1,
+                       TURNOUT_THREEWAY = 2,
+                       TURNOUT_DOUBLESLIP = 3,
+                       SEMAPHORE_HOME = 5,
+                       TURNOUT_CURVED_LEFT = 21,
+                       TURNOUT_CURVED_RIGHT = 22
                };
 
                unsigned address;
-               unsigned symbol;
+               Type type;
+               Symbol symbol;
                unsigned state;
                unsigned bits;
                bool synced;
 
-               Turnout();
+               MagnetAccessory();
        };
 
        struct Sensor
@@ -102,7 +106,7 @@ private:
 
        typedef std::map<unsigned, unsigned> AddressMap;
        typedef std::map<unsigned, Locomotive> LocoMap;
-       typedef std::map<unsigned, Turnout> TurnoutMap;
+       typedef std::map<unsigned, MagnetAccessory> AccessoryMap;
        typedef std::map<unsigned, Sensor> SensorMap;
 
        Msp::Net::StreamSocket socket;
@@ -114,15 +118,15 @@ private:
        LocoMap locos;
        AddressMap loco_addr;
        bool locos_synced;
-       TurnoutMap turnouts;
-       AddressMap turnout_addr;
-       bool turnouts_synced;
+       AccessoryMap accessories;
+       AddressMap accessory_addr;
+       bool accessories_synced;
        SensorMap sensors;
        std::vector<unsigned> s88;
        bool sensors_synced;
 
 public:
-       CentralStation(const std::string &);
+       CentralStation(const Options &);
        ~CentralStation();
 
        virtual void set_power(bool);
@@ -133,19 +137,39 @@ public:
        virtual const char *enumerate_protocols(unsigned) const;
        virtual unsigned get_protocol_speed_steps(const std::string &) const;
 
-       virtual void add_loco(unsigned, const std::string &, const VehicleType &);
+       virtual DetectedLocomotive *enumerate_detected_locos(unsigned) const { return 0; }
+       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);
        virtual void set_loco_function(unsigned, unsigned, bool);
 
-       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_sensor(unsigned);
+       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:
+       MagnetAccessory &add_accessory(unsigned, MagnetAccessory::Type, MagnetAccessory::Symbol);
+       void remove_accessory(unsigned);
+       void set_accessory_state(unsigned, MagnetAccessory::Type, unsigned);
+       unsigned get_accessory_state(unsigned, MagnetAccessory::Type) const;
+       void accessory_state_changed(const MagnetAccessory &) const;
+
+public:
+       virtual unsigned add_sensor(unsigned);
+       virtual void remove_sensor(unsigned);
        virtual void set_sensor(unsigned, bool) { }
        virtual bool get_sensor(unsigned) const;
 
+       virtual const TelemetryInfo *enumerate_telemetry(unsigned) const { return 0; }
+       virtual float get_telemetry_value(const std::string &) const;
+
        virtual void tick();
        virtual void flush();