]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/layout.h
0035e7a5481fdadc37ea29d51dd1903ed7863d84
[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();
39                 void route(const std::string &);
40                 void track(unsigned);
41                 void train(unsigned, unsigned);
42         };
43
44 public:
45         sigc::signal<void, Track &> signal_track_added;
46         sigc::signal<void, Track &> signal_track_removed;
47         sigc::signal<void, Route &> signal_route_added;
48         sigc::signal<void, Route &> signal_route_removed;
49         sigc::signal<void, Train &> signal_train_added;
50         sigc::signal<void, Train &> signal_train_removed;
51         sigc::signal<void, Vehicle &> signal_vehicle_added;
52         sigc::signal<void, Vehicle &> signal_vehicle_removed;
53         sigc::signal<void, Block &, Train *> signal_block_reserved;
54         sigc::signal<void, const std::string &> signal_emergency;
55
56 private:
57         Catalogue &catalogue;
58         Driver *driver;
59         std::string base;
60         std::set<Track *> tracks;
61         std::set<Route *> routes;
62         std::set<Block *> blocks;
63         std::map<unsigned, Train *> trains;
64         std::set<Vehicle *> vehicles;
65         Msp::Time::TimeStamp last_tick;
66         unsigned next_turnout_id;
67
68 public:
69         Layout(Catalogue &, Driver * = 0);
70         ~Layout();
71
72         Catalogue &get_catalogue() const { return catalogue; }
73         bool has_driver() const { return driver; }
74         Driver &get_driver() const;
75         const std::string &get_base() const { return base; }
76
77         void add_track(Track &);
78         const std::set<Track *> &get_tracks() const { return tracks; }
79         void remove_track(Track &);
80         unsigned allocate_turnout_id(bool);
81
82         void add_block(Block &);
83         Block &get_block(unsigned) const;
84         Block &get_block_by_track(const Track &) const;
85         const std::set<Block *> &get_blocks() const { return blocks; }
86         void create_blocks();
87         void create_blocks(const Track &);
88         void remove_block(Block &);
89
90         void add_route(Route &);
91         const std::set<Route *> &get_routes() const { return routes; }
92         Route &get_route(const std::string &) const;
93         void update_routes();
94         void remove_route(Route &);
95
96         void add_train(Train &);
97         Train &get_train(unsigned) const;
98         const std::map<unsigned, Train *> &get_trains() const { return trains; }
99         void remove_train(Train &);
100
101         void add_vehicle(Vehicle &);
102         void remove_vehicle(Vehicle &);
103
104         void tick();
105         void emergency(const std::string &);
106
107         void save(const std::string &);
108         void save_trains(const std::string &);
109 private:
110         void sensor_event(unsigned, bool);
111 };
112
113 } // namespace Marklin
114
115 #endif
116