]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/trafficmanager.cpp
Convert engineer to use mspgbase instead of SDL
[r2c2.git] / source / libmarklin / trafficmanager.cpp
1 #include <msp/time/utils.h>
2 #include "control.h"
3 #include "layout.h"
4 #include "trafficmanager.h"
5 #include "turnout.h"
6
7 using namespace std;
8 using namespace Msp;
9
10 namespace Marklin {
11
12 TrafficManager::TrafficManager(Control &c, Layout &l):
13         control(c),
14         layout(l)
15 {
16         const set<Track *> &tracks=layout.get_tracks();
17
18         set<Track *> used_tracks;
19         for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
20         {
21                 if(unsigned tid=(*i)->get_turnout_id())
22                         new Turnout(control, tid);
23                 if(unsigned sid=(*i)->get_sensor_id())
24                         new Sensor(control, sid);
25
26                 if(used_tracks.count(*i)==0)
27                 {
28                         Block *block=new Block(*this, **i);
29                         blocks.push_back(block);
30                         used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end());
31                 }
32         }
33
34         for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i)
35         {
36                 for(BlockSeq::iterator j=i; j!=blocks.end(); ++j)
37                         if(j!=i)
38                                 (*i)->check_link(**j);
39                 (*i)->print_debug();
40         }
41 }
42
43 TrafficManager::~TrafficManager()
44 {
45         for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i)
46                 delete *i;
47         for(TrainSeq::iterator i=trains.begin(); i!=trains.end(); ++i)
48                 delete *i;
49 }
50
51 Block &TrafficManager::get_block_by_track(const Track &t) const
52 {
53         for(BlockSeq::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
54         {
55                 const set<Track *> &tracks=(*i)->get_tracks();
56                 if(tracks.count(const_cast<Track *>(&t)))
57                         return **i;
58         }
59
60         throw InvalidParameterValue("Unknown track");
61 }
62
63 void TrafficManager::add_train(Train *t)
64 {
65         if(find(trains.begin(), trains.end(), t)==trains.end())
66                 trains.push_back(t);
67 }
68
69 void TrafficManager::tick()
70 {
71         Time::TimeStamp t=Time::now();
72
73         for(list<Train *>::iterator i=trains.begin(); i!=trains.end(); ++i)
74                 (*i)->tick(t);
75 }
76
77 void TrafficManager::turnout_route_changed(unsigned, Turnout *)
78 {
79 }
80
81 } // namespace Marklin