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