]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/train.h
4c19caf01a9625a9921b4a345bd4baada65a177e
[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         };
30
31         sigc::signal<void, const std::string &> signal_name_changed;
32         sigc::signal<void, const std::string &> signal_status_changed;
33
34 private:
35         struct BlockRef
36         {
37                 Block *block;
38                 unsigned entry;
39
40                 BlockRef(Block *s, unsigned e): block(s), entry(e) { }
41         };
42
43         TrafficManager &trfc_mgr;
44         std::string name;
45         Locomotive &loco;
46         std::list<BlockRef> cur_blocks;
47         std::list<BlockRef> rsv_blocks;
48         unsigned target_speed;
49         Msp::Time::TimeStamp try_reserve;
50         std::string status;
51
52         Msp::Time::TimeStamp last_entry_time;
53         float travel_dist;
54         unsigned travel_speed;
55         bool pure_speed;
56         float speed_scale;
57         float speed_scale_weight;
58
59         Track *cur_track;
60         unsigned cur_track_ep;
61         float offset;
62         Point pos;
63
64 public:
65         Train(TrafficManager &, Locomotive &);
66
67         void set_name(const std::string &);
68         void set_speed(unsigned);
69         void set_reverse(bool);
70         const std::string &get_name() const { return name; }
71         Locomotive &get_locomotive() const { return loco; }
72         const std::string &get_status() const { return status; }
73         const Point &get_position() const { return pos; }
74         void place(Block *, unsigned);
75         bool free_block(Block *);
76         void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &);
77         void save(std::list<Msp::DataFile::Statement> &) const;
78 private:
79         void locomotive_reverse_changed(bool);
80         void sensor_event(bool, Sensor *);
81         void turnout_route_changing(unsigned, Turnout *);
82         void turnout_route_changed(unsigned, Turnout *);
83         unsigned reserve_more();
84         void update_speed();
85         void set_status(const std::string &);
86         void set_position(const Block::Endpoint &);
87 };
88
89 } // namespace Marklin
90
91 #endif