X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrafficmanager.cpp;h=49dda42954d05ccdcb8b58f067899743111c4dbf;hb=dcfa1e9503b7e97b61396d7458f0b2e5896779cd;hp=7a47f1425c077c85686624587f92682c7e293810;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/libmarklin/trafficmanager.cpp b/source/libmarklin/trafficmanager.cpp index 7a47f14..49dda42 100644 --- a/source/libmarklin/trafficmanager.cpp +++ b/source/libmarklin/trafficmanager.cpp @@ -1,9 +1,23 @@ +/* $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 +#include "catalogue.h" #include "control.h" #include "layout.h" +#include "locotype.h" +#include "tracktype.h" #include "trafficmanager.h" #include "turnout.h" using namespace std; +using namespace Msp; namespace Marklin { @@ -11,61 +25,121 @@ 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_paths()>=3); if(unsigned sid=(*i)->get_sensor_id()) - { - Sensor *s=control.get_sensor(sid); - if(!s) - s=new Sensor(control, sid); - } + if(!control.get_sensors().count(sid)) + new Sensor(control, sid); + if(used_tracks.count(*i)==0) { - Section *sect=new Section(*this, *i); - sections.push_back(sect); - used_tracks.insert(sect->get_tracks().begin(), sect->get_tracks().end()); + Block *block = new Block(*this, **i); + blocks.push_back(block); + used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end()); } } - for(SectionSeq::iterator i=sections.begin(); i!=sections.end(); ++i) - { - for(SectionSeq::iterator j=i; j!=sections.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(); - } } -Section *TrafficManager::get_section_by_track(const Track *t) const +TrafficManager::~TrafficManager() { - for(SectionSeq::const_iterator i=sections.begin(); i!=sections.end(); ++i) + for(list::iterator i=blocks.begin(); i!=blocks.end(); ++i) + delete *i; + for(list::iterator i=trains.begin(); i!=trains.end(); ++i) + delete *i; +} + +Block &TrafficManager::get_block(unsigned id) const +{ + for(list::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) + if((*i)->get_id()==id) + return **i; + + throw KeyError("Unknown block", lexical_cast(id)); +} + +Block &TrafficManager::get_block_by_track(const Track &t) const +{ + 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"); +} + +Train &TrafficManager::get_train_by_locomotive(const Locomotive &loco) const +{ + for(list::const_iterator i=trains.begin(); i!=trains.end(); ++i) + if(&(*i)->get_locomotive()==&loco) + return **i; + + throw InvalidParameterValue("Unknown locomotive"); } void TrafficManager::add_train(Train *t) { if(find(trains.begin(), trains.end(), t)==trains.end()) + { trains.push_back(t); + signal_train_added.emit(*t); + } +} + +void TrafficManager::tick() +{ + Time::TimeStamp t = Time::now(); + Time::TimeDelta dt; + if(last_tick) + dt = t-last_tick; + last_tick = t; + + for(list::iterator i=trains.begin(); i!=trains.end(); ++i) + (*i)->tick(t, dt); +} + +void TrafficManager::save(const string &fn) const +{ + IO::BufferedFile out(fn, IO::M_WRITE); + DataFile::Writer writer(out); + for(list::const_iterator i=trains.begin(); i!=trains.end(); ++i) + { + const Locomotive &loco = (*i)->get_locomotive(); + DataFile::Statement st("train"); + st.append(loco.get_type().get_article_number()); + st.append(loco.get_address()); + (*i)->save(st.sub); + writer.write(st); + } +} + +void TrafficManager::turnout_path_changed(unsigned, Turnout *) +{ +} + + +TrafficManager::Loader::Loader(TrafficManager &tm): + DataFile::BasicLoader(tm) +{ + add("train", &Loader::train); } -void TrafficManager::turnout_route_changed(unsigned, Turnout *) +void TrafficManager::Loader::train(unsigned art_nr, unsigned addr) { + Locomotive *loco = new Locomotive(obj.layout.get_catalogue().get_locomotive(art_nr), obj.control, addr); + Train *trn = new Train(obj, *loco); + load_sub(*trn); } } // namespace Marklin