]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/train.h
0b88d8ac6af6fef6f5fee5af9da7cd51be8d52b7
[r2c2.git] / source / libmarklin / train.h
1 #ifndef LIBMARKLIN_TRAIN_H_
2 #define LIBMARKLIN_TRAIN_H_
3
4 #include <sigc++/signal.h>
5 #include <sigc++/trackable.h>
6 #include <msp/time/timestamp.h>
7 #include "block.h"
8
9 namespace Marklin {
10
11 class Locomotive;
12 class Sensor;
13 class TrafficManager;
14
15 class Train: public sigc::trackable
16 {
17 private:
18         struct BlockRef
19         {
20                 Block *block;
21                 unsigned entry;
22
23                 BlockRef(Block *s, unsigned e): block(s), entry(e) { }
24         };
25
26         TrafficManager &trfc_mgr;
27         std::string name;
28         Locomotive &loco;
29         std::list<BlockRef> cur_blocks;
30         std::list<BlockRef> rsv_blocks;
31         unsigned target_speed;
32         Msp::Time::TimeStamp try_reserve;
33         std::string status;
34         Msp::Time::TimeStamp last_entry_time;
35         float travel_dist;
36         unsigned real_speed;
37
38 public:
39         sigc::signal<void, const std::string &> signal_name_changed;
40         sigc::signal<void, const std::string &> signal_status_changed;
41
42         Train(TrafficManager &, Locomotive &);
43
44         void set_name(const std::string &);
45         void set_speed(unsigned);
46         const std::string &get_name() const { return name; }
47         Locomotive &get_locomotive() const { return loco; }
48         const std::string &get_status() const { return status; }
49         void place(Block *, unsigned);
50         bool free_block(Block *);
51         void tick(const Msp::Time::TimeStamp &);
52 private:
53         void sensor_event(bool, Sensor *);
54         bool reserve_more();
55         void set_status(const std::string &);
56 };
57
58 } // namespace Marklin
59
60 #endif