]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/train.h
Strip Id tags and copyright notices from files
[r2c2.git] / source / libr2c2 / train.h
1 #ifndef LIBR2C2_TRAIN_H_
2 #define LIBR2C2_TRAIN_H_
3
4 #include <sigc++/signal.h>
5 #include <sigc++/trackable.h>
6 #include <msp/time/timestamp.h>
7 #include "block.h"
8 #include "blockiter.h"
9 #include "controller.h"
10 #include "trainai.h"
11
12 namespace R2C2 {
13
14 class ArticleNumber;
15 class Route;
16 class SpeedQuantizer;
17 class Vehicle;
18 class VehicleType;
19 class Zone;
20
21 class Train: public sigc::trackable
22 {
23 public:
24         class Loader: public Msp::DataFile::BasicLoader<Train>
25         {
26         private:
27                 Block *prev_block;
28                 bool blocks_valid;
29
30         public:
31                 Loader(Train &);
32         private:
33                 virtual void finish();
34                 void block(unsigned);
35                 void block_hint(unsigned);
36                 void name(const std::string &);
37                 void quantized_speed();
38                 void route(const std::string &);
39                 void timetable();
40                 void vehicle(ArticleNumber);
41         };
42
43         sigc::signal<void, const std::string &> signal_name_changed;
44         sigc::signal<void, const std::string &, float> signal_control_changed;
45         sigc::signal<void, unsigned, bool> signal_function_changed;
46         sigc::signal<void, TrainAI &, const TrainAI::Message &> signal_ai_event;
47         sigc::signal<void, const Route *> signal_route_changed;
48         sigc::signal<void, Block &> signal_advanced;
49         sigc::signal<void> signal_arrived;
50         sigc::signal<void, const std::string &> signal_status_changed;
51
52 private:
53         struct RouteRef
54         {
55                 const Route *route;
56                 unsigned diversion;
57
58                 RouteRef(const Route *, unsigned = 0);
59         };
60
61         typedef std::list<BlockIter> BlockList;
62
63         Layout &layout;
64         const VehicleType &loco_type;
65         unsigned address;
66         std::string protocol;
67         std::string name;
68         int priority;
69         const Train *yielding_to;
70         const Train *preceding_train;
71         std::vector<Vehicle *> vehicles;
72         BlockList blocks;
73         BlockList::iterator cur_blocks_end;
74         BlockList::iterator clear_blocks_end;
75         Block *pending_block;
76         bool reserving;
77         bool advancing;
78         Controller *controller;
79         std::list<TrainAI *> ais;
80         bool active;
81         unsigned current_speed_step;
82         bool speed_changing;
83         bool reverse;
84         Msp::Time::TimeStamp stop_timeout;
85         unsigned functions;
86         std::list<RouteRef> routes;
87         bool end_of_route;
88
89         Msp::Time::TimeStamp last_entry_time;
90         float travel_dist;
91         bool pure_speed;
92         SpeedQuantizer *speed_quantizer;
93         bool accurate_position;
94         float overshoot_dist;
95
96 public:
97         Train(Layout &, const VehicleType &, unsigned, const std::string &);
98         ~Train();
99
100         Layout &get_layout() const { return layout; }
101         const VehicleType &get_locomotive_type() const { return loco_type; }
102         unsigned get_address() const { return address; }
103         const std::string &get_protocol() const { return protocol; }
104         void set_name(const std::string &);
105         const std::string &get_name() const { return name; }
106         void set_priority(int);
107         void yield_to(const Train &);
108         int get_priority() const { return priority; }
109         const Train *get_preceding_train() const { return preceding_train; }
110         Controller &get_controller() const { return *controller; }
111
112         void add_vehicle(const VehicleType &);
113         void remove_vehicle(unsigned);
114         unsigned get_n_vehicles() const;
115         Vehicle &get_vehicle(unsigned);
116         const Vehicle &get_vehicle(unsigned) const;
117
118         void set_control(const std::string &, float);
119         void set_active(bool);
120         void set_function(unsigned, bool);
121         float get_control(const std::string &) const;
122         float get_speed() const;
123         float get_quantized_speed() const;
124         unsigned get_speed_step() const { return current_speed_step; }
125         bool is_active() const { return active; }
126         bool get_function(unsigned) const;
127         unsigned get_functions() const { return functions; }
128
129         void add_ai(TrainAI &);
130         void remove_ai(TrainAI &);
131         TrainAI *get_tagged_ai(const std::string &) const;
132         void ai_message(const TrainAI::Message &);
133
134         bool set_route(const Route *);
135         bool go_to(Track &);
136         bool go_to(const Zone &);
137         bool divert(Track &);
138         const Route *get_route() const;
139         void place(Block &, unsigned);
140         void unplace();
141         bool is_placed() const { return !blocks.empty(); }
142         bool free_block(Block &);
143         void free_noncritical_blocks();
144         int get_entry_to_block(Block &) const;
145         float get_reserved_distance() const;
146
147         void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &);
148
149         void save(std::list<Msp::DataFile::Statement> &) const;
150 private:
151         void control_changed(const Controller::Control &);
152         void loco_speed_event(unsigned, unsigned, bool);
153         void loco_func_event(unsigned, unsigned, bool);
154         void block_state_changed(Block &, Block::State);
155         void turnout_path_changed(Track &);
156         void halt_event(bool);
157         void block_reserved(const Block &, const Train *);
158         void reserve_more();
159         void check_turnout_paths(bool);
160         float get_reserved_distance_until(const Block *, bool) const;
161         void release_blocks();
162         void release_blocks(BlockList::iterator, BlockList::iterator);
163         void reverse_blocks(BlockList &) const;
164         bool advance_route(std::list<RouteRef>::iterator &, Track &);
165         Route *create_lead_route(Route *, const Route *);
166         bool is_valid_diversion(const Route &, const TrackIter &);
167 };
168
169 } // namespace R2C2
170
171 #endif