]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/train.h
Prevent a crash if a layout file contains empty routes
[r2c2.git] / source / libmarklin / train.h
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #ifndef LIBMARKLIN_TRAIN_H_
9 #define LIBMARKLIN_TRAIN_H_
10
11 #include <sigc++/signal.h>
12 #include <sigc++/trackable.h>
13 #include <msp/time/timestamp.h>
14 #include "block.h"
15
16 namespace Marklin {
17
18 class Locomotive;
19 class Sensor;
20 class TrafficManager;
21 class Turnout;
22
23 class Train: public sigc::trackable
24 {
25 public:
26         class Loader: public Msp::DataFile::BasicLoader<Train>
27         {
28         public:
29                 Loader(Train &);
30         private:
31                 void real_speed(unsigned, float, float);
32         };
33
34         sigc::signal<void, const std::string &> signal_name_changed;
35         sigc::signal<void, unsigned> signal_target_speed_changed;
36         sigc::signal<void, const std::string &> signal_status_changed;
37
38 private:
39         struct BlockRef
40         {
41                 Block *block;
42                 unsigned entry;
43
44                 BlockRef(Block *s, unsigned e): block(s), entry(e) { }
45         };
46
47         struct RealSpeed
48         {
49                 float speed;
50                 float weight;
51
52                 RealSpeed();
53                 void add(float, float);
54         };
55
56         TrafficManager &trfc_mgr;
57         std::string name;
58         Locomotive &loco;
59         std::list<BlockRef> cur_blocks;
60         std::list<BlockRef> rsv_blocks;
61         unsigned target_speed;
62         Msp::Time::TimeStamp try_reserve;
63         std::string status;
64
65         Msp::Time::TimeStamp last_entry_time;
66         float travel_dist;
67         unsigned travel_speed;
68         bool pure_speed;
69         std::vector<RealSpeed> real_speed;
70
71         Track *cur_track;
72         unsigned cur_track_ep;
73         float offset;
74         Point pos;
75
76 public:
77         Train(TrafficManager &, Locomotive &);
78
79         void set_name(const std::string &);
80         void set_speed(unsigned);
81         void set_reverse(bool);
82         const std::string &get_name() const { return name; }
83         Locomotive &get_locomotive() const { return loco; }
84         unsigned get_target_speed() const { return target_speed; }
85         const std::string &get_status() const { return status; }
86         const Point &get_position() const { return pos; }
87         void place(Block *, unsigned);
88         bool free_block(Block *);
89         void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &);
90         void save(std::list<Msp::DataFile::Statement> &) const;
91 private:
92         void locomotive_reverse_changed(bool);
93         void sensor_event(bool, Sensor *);
94         void turnout_path_changing(unsigned, Turnout *);
95         void turnout_path_changed(unsigned, Turnout *);
96         unsigned reserve_more();
97         void update_speed();
98         float get_real_speed(unsigned) const;
99         unsigned find_speed(float) const;
100         void set_status(const std::string &);
101         void set_position(const Block::Endpoint &);
102         void release_reserved_blocks();
103 };
104
105 } // namespace Marklin
106
107 #endif