]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/trafficmanager.cpp
516f64fd0b00741ea65ee2572cbec2e501d44afc
[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 TrackSeq &tracks=layout.get_tracks();
15
16         TrackSet used_tracks;
17         for(TrackSeq::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
18         {
19                 if(unsigned tid=(*i)->get_turnout_id())
20                 {
21                         Turnout *t=control.get_turnout(tid);
22                         if(!t)
23                                 t=new Turnout(control, tid);
24                         //t->signal_route_changed.connect(sigc::mem_fun(*i, &Track::set_current_route));
25                 }
26                 if(unsigned sid=(*i)->get_sensor_id())
27                 {
28                         Sensor *s=control.get_sensor(sid);
29                         if(!s)
30                                 s=new Sensor(control, sid);
31                 }
32                 if(used_tracks.count(*i)==0)
33                 {
34                         Block *block=new Block(*this, *i);
35                         blocks.push_back(block);
36                         used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end());
37                 }
38         }
39
40         for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i)
41         {
42                 for(BlockSeq::iterator j=i; j!=blocks.end(); ++j)
43                         if(j!=i)
44                                 (*i)->check_link(**j);
45                 (*i)->print_debug();
46         }
47 }
48
49 TrafficManager::~TrafficManager()
50 {
51         for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i)
52                 delete *i;
53         for(TrainSeq::iterator i=trains.begin(); i!=trains.end(); ++i)
54                 delete *i;
55 }
56
57 Block *TrafficManager::get_block_by_track(const Track *t) const
58 {
59         for(BlockSeq::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
60         {
61                 const TrackSet &tracks=(*i)->get_tracks();
62                 if(tracks.count(const_cast<Track *>(t)))
63                         return *i;
64         }
65
66         return 0;
67 }
68
69 void TrafficManager::add_train(Train *t)
70 {
71         if(find(trains.begin(), trains.end(), t)==trains.end())
72                 trains.push_back(t);
73 }
74
75 void TrafficManager::turnout_route_changed(unsigned, Turnout *)
76 {
77 }
78
79 } // namespace Marklin