]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/train.h
Change terminology to better distinguish routes on the layout from paths across track...
[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
22 class Train: public sigc::trackable
23 {
24 public:
25         class Loader: public Msp::DataFile::BasicLoader<Train>
26         {
27         public:
28                 Loader(Train &);
29         private:
30                 void real_speed(unsigned, float, float);
31         };
32
33         sigc::signal<void, const std::string &> signal_name_changed;
34         sigc::signal<void, unsigned> signal_target_speed_changed;
35         sigc::signal<void, const std::string &> signal_status_changed;
36
37 private:
38         struct BlockRef
39         {
40                 Block *block;
41                 unsigned entry;
42
43                 BlockRef(Block *s, unsigned e): block(s), entry(e) { }
44         };
45
46         struct RealSpeed
47         {
48                 float speed;
49                 float weight;
50
51                 RealSpeed();
52                 void add(float, float);
53         };
54
55         TrafficManager &trfc_mgr;
56         std::string name;
57         Locomotive &loco;
58         std::list<BlockRef> cur_blocks;
59         std::list<BlockRef> rsv_blocks;
60         unsigned target_speed;
61         Msp::Time::TimeStamp try_reserve;
62         std::string status;
63
64         Msp::Time::TimeStamp last_entry_time;
65         float travel_dist;
66         unsigned travel_speed;
67         bool pure_speed;
68         std::vector<RealSpeed> real_speed;
69
70         Track *cur_track;
71         unsigned cur_track_ep;
72         float offset;
73         Point pos;
74
75 public:
76         Train(TrafficManager &, Locomotive &);
77
78         void set_name(const std::string &);
79         void set_speed(unsigned);
80         void set_reverse(bool);
81         const std::string &get_name() const { return name; }
82         Locomotive &get_locomotive() const { return loco; }
83         unsigned get_target_speed() const { return target_speed; }
84         const std::string &get_status() const { return status; }
85         const Point &get_position() const { return pos; }
86         void place(Block *, unsigned);
87         bool free_block(Block *);
88         void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &);
89         void save(std::list<Msp::DataFile::Statement> &) const;
90 private:
91         void locomotive_reverse_changed(bool);
92         void sensor_event(bool, Sensor *);
93         void turnout_path_changing(unsigned, Turnout *);
94         void turnout_path_changed(unsigned, Turnout *);
95         unsigned reserve_more();
96         void update_speed();
97         float get_real_speed(unsigned) const;
98         unsigned find_speed(float) const;
99         void set_status(const std::string &);
100         void set_position(const Block::Endpoint &);
101         void release_reserved_blocks();
102 };
103
104 } // namespace Marklin
105
106 #endif