X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Flibmarklin%2Ftrafficmanager.cpp;h=4075415ac95fdbe703a3287ad0e1f8d6e586d2d0;hb=3df8cb5c78fbb0b919bcb79677c6c788b8028482;hp=29823ffa0109130136a119a814f65eba78b99553;hpb=3e9c210ddc036cd015228504cc0803c909e27f84;p=r2c2.git diff --git a/source/libmarklin/trafficmanager.cpp b/source/libmarklin/trafficmanager.cpp index 29823ff..4075415 100644 --- a/source/libmarklin/trafficmanager.cpp +++ b/source/libmarklin/trafficmanager.cpp @@ -1,13 +1,18 @@ /* $Id$ This file is part of the MSP Märklin suite -Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +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" @@ -26,7 +31,7 @@ TrafficManager::TrafficManager(Control &c, Layout &l): for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { if(unsigned tid=(*i)->get_turnout_id()) - new Turnout(control, tid); + new Turnout(control, tid, (*i)->get_type().get_n_routes()>=3); if(unsigned sid=(*i)->get_sensor_id()) new Sensor(control, sid); @@ -39,12 +44,9 @@ TrafficManager::TrafficManager(Control &c, Layout &l): } 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() @@ -76,13 +78,46 @@ void TrafficManager::add_train(Train *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); + (*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_route_changed(unsigned, Turnout *) { } + +TrafficManager::Loader::Loader(TrafficManager &tm): + DataFile::BasicLoader(tm) +{ + add("train", &Loader::train); +} + +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