]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/trafficmanager.cpp
Attempt to estimate the exact positions of trains from measured speed data
[r2c2.git] / source / libmarklin / trafficmanager.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 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 "tracktype.h"
13 #include "trafficmanager.h"
14 #include "turnout.h"
15
16 using namespace std;
17 using namespace Msp;
18
19 namespace Marklin {
20
21 TrafficManager::TrafficManager(Control &c, Layout &l):
22         control(c),
23         layout(l)
24 {
25         const set<Track *> &tracks=layout.get_tracks();
26
27         set<Track *> used_tracks;
28         for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
29         {
30                 if(unsigned tid=(*i)->get_turnout_id())
31                         new Turnout(control, tid, (*i)->get_type().get_n_routes()>=3);
32                 if(unsigned sid=(*i)->get_sensor_id())
33                         new Sensor(control, sid);
34
35                 if(used_tracks.count(*i)==0)
36                 {
37                         Block *block=new Block(*this, **i);
38                         blocks.push_back(block);
39                         used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end());
40                 }
41         }
42
43         for(list<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
44                 for(list<Block *>::iterator j=i; j!=blocks.end(); ++j)
45                         if(j!=i)
46                                 (*i)->check_link(**j);
47 }
48
49 TrafficManager::~TrafficManager()
50 {
51         for(list<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
52                 delete *i;
53         for(list<Train *>::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(list<Block *>::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
60         {
61                 const set<Track *> &tracks=(*i)->get_tracks();
62                 if(tracks.count(const_cast<Track *>(&t)))
63                         return **i;
64         }
65
66         throw InvalidParameterValue("Unknown track");
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::tick()
76 {
77         Time::TimeStamp t=Time::now();
78         Time::TimeDelta dt;
79         if(last_tick)
80                 dt=t-last_tick;
81         last_tick=t;
82
83         for(list<Train *>::iterator i=trains.begin(); i!=trains.end(); ++i)
84                 (*i)->tick(t, dt);
85 }
86
87 void TrafficManager::turnout_route_changed(unsigned, Turnout *)
88 {
89 }
90
91 } // namespace Marklin