]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/layout.h
f820cb5dc73e6c6fc05166ab6816de11b7922c06
[r2c2.git] / source / libmarklin / layout.h
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #ifndef LIBMARKLIN_LAYOUT_H_
9 #define LIBMARKLIN_LAYOUT_H_
10
11 #include <set>
12 #include <sigc++/sigc++.h>
13 #include <msp/datafile/loader.h>
14 #include <msp/time/timestamp.h>
15
16 namespace Marklin {
17
18 class Block;
19 class Catalogue;
20 class Driver;
21 class Route;
22 class Track;
23 class Train;
24 class Vehicle;
25
26 class Layout
27 {
28 public:
29         class Loader: public Msp::DataFile::BasicLoader<Layout>
30         {
31         private:
32                 bool new_tracks;
33
34         public:
35                 Loader(Layout &);
36         private:
37                 virtual void finish();
38                 void route(const std::string &);
39                 void track(unsigned);
40                 void train(unsigned, unsigned);
41         };
42
43 public:
44         sigc::signal<void, Track &> signal_track_added;
45         sigc::signal<void, Track &> signal_track_removed;
46         sigc::signal<void, Route &> signal_route_added;
47         sigc::signal<void, Route &> signal_route_removed;
48         sigc::signal<void, Train &> signal_train_added;
49         sigc::signal<void, Train &> signal_train_removed;
50         sigc::signal<void, Vehicle &> signal_vehicle_added;
51         sigc::signal<void, Vehicle &> signal_vehicle_removed;
52         sigc::signal<void, Block &, Train *> signal_block_reserved;
53         sigc::signal<void, const std::string &> signal_emergency;
54
55 private:
56         Catalogue &catalogue;
57         Driver *driver;
58         std::string base;
59         std::set<Track *> tracks;
60         std::map<std::string, Route *> routes;
61         std::set<Block *> blocks;
62         std::map<unsigned, Train *> trains;
63         std::set<Vehicle *> vehicles;
64         Msp::Time::TimeStamp last_tick;
65         unsigned next_turnout_id;
66
67 public:
68         Layout(Catalogue &, Driver * = 0);
69         ~Layout();
70
71         Catalogue &get_catalogue() const { return catalogue; }
72         bool has_driver() const { return driver; }
73         Driver &get_driver() const;
74         const std::string &get_base() const { return base; }
75
76         void add_track(Track &);
77         const std::set<Track *> &get_tracks() const { return tracks; }
78         void remove_track(Track &);
79         unsigned allocate_turnout_id();
80
81         void add_block(Block &);
82         Block &get_block(unsigned) const;
83         Block &get_block_by_track(const Track &) const;
84         const std::set<Block *> &get_blocks() const { return blocks; }
85         void create_blocks();
86         void create_blocks(const Track &);
87         void remove_block(Block &);
88
89         void add_route(Route &);
90         const std::map<std::string, Route *> &get_routes() const { return routes; }
91         Route &get_route(const std::string &) const;
92         void update_routes();
93         void remove_route(Route &);
94
95         void add_train(Train &);
96         Train &get_train(unsigned) const;
97         const std::map<unsigned, Train *> &get_trains() const { return trains; }
98         void remove_train(Train &);
99
100         void add_vehicle(Vehicle &);
101         void remove_vehicle(Vehicle &);
102
103         void tick();
104         void emergency(const std::string &);
105
106         void save(const std::string &);
107         void save_trains(const std::string &);
108 private:
109         void sensor_event(unsigned, bool);
110 };
111
112 } // namespace Marklin
113
114 #endif
115