X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Flibmarklin%2Ftrafficmanager.cpp;h=4cc186bcdebafa39174bba59b9aeae857152c942;hb=80e10207bee4d774f3015a5e946d463d2c828029;hp=516f64fd0b00741ea65ee2572cbec2e501d44afc;hpb=06c100aacb559fbbe7380e15981c4772092c269b;p=r2c2.git diff --git a/source/libmarklin/trafficmanager.cpp b/source/libmarklin/trafficmanager.cpp index 516f64f..4cc186b 100644 --- a/source/libmarklin/trafficmanager.cpp +++ b/source/libmarklin/trafficmanager.cpp @@ -1,9 +1,20 @@ +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include #include "control.h" #include "layout.h" +#include "tracktype.h" #include "trafficmanager.h" #include "turnout.h" using namespace std; +using namespace Msp; namespace Marklin { @@ -11,59 +22,48 @@ TrafficManager::TrafficManager(Control &c, Layout &l): control(c), layout(l) { - const TrackSeq &tracks=layout.get_tracks(); + const set &tracks=layout.get_tracks(); - TrackSet used_tracks; - for(TrackSeq::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + set used_tracks; + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { if(unsigned tid=(*i)->get_turnout_id()) - { - Turnout *t=control.get_turnout(tid); - if(!t) - t=new Turnout(control, tid); - //t->signal_route_changed.connect(sigc::mem_fun(*i, &Track::set_current_route)); - } + new Turnout(control, tid, (*i)->get_type().get_n_routes()>=3); if(unsigned sid=(*i)->get_sensor_id()) - { - Sensor *s=control.get_sensor(sid); - if(!s) - s=new Sensor(control, sid); - } + new Sensor(control, sid); + if(used_tracks.count(*i)==0) { - Block *block=new Block(*this, *i); + Block *block=new Block(*this, **i); blocks.push_back(block); used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end()); } } - for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i) - { - for(BlockSeq::iterator j=i; j!=blocks.end(); ++j) + for(list::iterator i=blocks.begin(); i!=blocks.end(); ++i) + for(list::iterator j=i; j!=blocks.end(); ++j) if(j!=i) (*i)->check_link(**j); - (*i)->print_debug(); - } } TrafficManager::~TrafficManager() { - for(BlockSeq::iterator i=blocks.begin(); i!=blocks.end(); ++i) + for(list::iterator i=blocks.begin(); i!=blocks.end(); ++i) delete *i; - for(TrainSeq::iterator i=trains.begin(); i!=trains.end(); ++i) + for(list::iterator i=trains.begin(); i!=trains.end(); ++i) delete *i; } -Block *TrafficManager::get_block_by_track(const Track *t) const +Block &TrafficManager::get_block_by_track(const Track &t) const { - for(BlockSeq::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) + for(list::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) { - const TrackSet &tracks=(*i)->get_tracks(); - if(tracks.count(const_cast(t))) - return *i; + const set &tracks=(*i)->get_tracks(); + if(tracks.count(const_cast(&t))) + return **i; } - return 0; + throw InvalidParameterValue("Unknown track"); } void TrafficManager::add_train(Train *t) @@ -72,6 +72,14 @@ void TrafficManager::add_train(Train *t) trains.push_back(t); } +void TrafficManager::tick() +{ + Time::TimeStamp t=Time::now(); + + for(list::iterator i=trains.begin(); i!=trains.end(); ++i) + (*i)->tick(t); +} + void TrafficManager::turnout_route_changed(unsigned, Turnout *) { }