3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
9 #include <msp/datafile/writer.h>
10 #include <msp/time/utils.h>
11 #include "catalogue.h"
15 #include "tracktype.h"
16 #include "trafficmanager.h"
24 TrafficManager::TrafficManager(Control &c, Layout &l):
28 const set<Track *> &tracks = layout.get_tracks();
30 set<Track *> used_tracks;
31 for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
33 if(unsigned tid=(*i)->get_turnout_id())
34 new Turnout(control, tid, (*i)->get_type().get_n_paths()>=3);
35 if(unsigned sid=(*i)->get_sensor_id())
36 if(!control.get_sensors().count(sid))
37 new Sensor(control, sid);
39 if(used_tracks.count(*i)==0)
41 Block *block = new Block(*this, **i);
42 blocks.push_back(block);
43 used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end());
47 for(list<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
48 for(list<Block *>::iterator j=i; j!=blocks.end(); ++j)
50 (*i)->check_link(**j);
53 TrafficManager::~TrafficManager()
55 for(list<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
57 for(list<Train *>::iterator i=trains.begin(); i!=trains.end(); ++i)
61 Block &TrafficManager::get_block(unsigned id) const
63 for(list<Block *>::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
64 if((*i)->get_id()==id)
67 throw KeyError("Unknown block", lexical_cast(id));
70 Block &TrafficManager::get_block_by_track(const Track &t) const
72 for(list<Block *>::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
74 const set<Track *> &tracks = (*i)->get_tracks();
75 if(tracks.count(const_cast<Track *>(&t)))
79 throw InvalidParameterValue("Unknown track");
82 Train &TrafficManager::get_train_by_locomotive(const Locomotive &loco) const
84 for(list<Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
85 if(&(*i)->get_locomotive()==&loco)
88 throw InvalidParameterValue("Unknown locomotive");
91 void TrafficManager::add_train(Train *t)
93 if(find(trains.begin(), trains.end(), t)==trains.end())
96 signal_train_added.emit(*t);
100 void TrafficManager::tick()
102 Time::TimeStamp t = Time::now();
108 for(list<Train *>::iterator i=trains.begin(); i!=trains.end(); ++i)
112 void TrafficManager::save(const string &fn) const
114 IO::BufferedFile out(fn, IO::M_WRITE);
115 DataFile::Writer writer(out);
116 for(list<Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
118 const Locomotive &loco = (*i)->get_locomotive();
119 DataFile::Statement st("train");
120 st.append(loco.get_type().get_article_number());
121 st.append(loco.get_address());
127 void TrafficManager::turnout_path_changed(unsigned, Turnout *)
132 TrafficManager::Loader::Loader(TrafficManager &tm):
133 DataFile::BasicLoader<TrafficManager>(tm)
135 add("train", &Loader::train);
138 void TrafficManager::Loader::train(unsigned art_nr, unsigned addr)
140 Locomotive *loco = new Locomotive(obj.layout.get_catalogue().get_locomotive(art_nr), obj.control, addr);
141 Train *trn = new Train(obj, *loco);
145 } // namespace Marklin