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