X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrafficmanager.cpp;h=069731e060ae3a80e741a754fa83519af0b6da59;hb=6109a2122226e1c71e9cc71e4c21036e99e43601;hp=4cc186bcdebafa39174bba59b9aeae857152c942;hpb=80e10207bee4d774f3015a5e946d463d2c828029;p=r2c2.git diff --git a/source/libmarklin/trafficmanager.cpp b/source/libmarklin/trafficmanager.cpp index 4cc186b..069731e 100644 --- a/source/libmarklin/trafficmanager.cpp +++ b/source/libmarklin/trafficmanager.cpp @@ -6,9 +6,12 @@ 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" @@ -22,7 +25,7 @@ TrafficManager::TrafficManager(Control &c, Layout &l): control(c), layout(l) { - const set &tracks=layout.get_tracks(); + const set &tracks = layout.get_tracks(); set used_tracks; for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) @@ -34,7 +37,7 @@ TrafficManager::TrafficManager(Control &c, Layout &l): 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()); } @@ -58,7 +61,7 @@ Block &TrafficManager::get_block_by_track(const Track &t) const { for(list::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) { - const set &tracks=(*i)->get_tracks(); + const set &tracks = (*i)->get_tracks(); if(tracks.count(const_cast(&t))) return **i; } @@ -74,14 +77,47 @@ void TrafficManager::add_train(Train *t) void TrafficManager::tick() { - Time::TimeStamp t=Time::now(); + 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