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