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