X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=b847637fab797481a34225ccf88dea9a2d29ceb4;hb=0443ca05cbd306487131f5f5bd3b91181ae4a733;hp=efc1e0f74cbc97627de661b40caa4cc09dd6ac8e;hpb=eb9c7f5200da4f3f31b41233be8cee397cb6abb9;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index efc1e0f..b847637 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "beamgate.h" #include "block.h" #include "catalogue.h" #include "driver.h" @@ -39,7 +40,9 @@ Layout::Layout(Catalogue &c, Driver *d): catalogue(c), driver(d), next_turnout_id(0x800) -{ } +{ + clock.set_rate(60); +} Layout::~Layout() { @@ -102,6 +105,12 @@ void Layout::add(Sensor &s) } } +void Layout::add(BeamGate &g) +{ + add(static_cast(g)); + add(static_cast(g)); +} + template<> const set &Layout::get_all() const { @@ -162,6 +171,12 @@ const set &Layout::get_all() const return sensors.get(); } +template<> +const set &Layout::get_all() const +{ + return sensors.get(); +} + template T *Layout::pick(const Ray &ray) { @@ -206,6 +221,12 @@ void Layout::remove(Sensor &s) sensors.erase(s); } +void Layout::remove(BeamGate &g) +{ + remove(static_cast(g)); + remove(static_cast(g)); +} + unsigned Layout::allocate_turnout_id() { set used_ids; @@ -343,13 +364,15 @@ void Layout::tick() dt = t-last_tick; last_tick = t; + clock.tick(dt); + for(set::iterator i=sensors.get().begin(); i!=sensors.get().end(); ++i) (*i)->tick(dt); const set &signals = objects.get(); for(set::iterator i=signals.begin(); i!=signals.end(); ++i) (*i)->tick(dt); for(map::iterator i=trains.begin(); i!=trains.end(); ++i) - i->second->tick(t, dt); + i->second->tick(dt); } void Layout::emergency(const string &msg) @@ -386,6 +409,14 @@ void Layout::save(const string &fn) const writer.write(st); } + const set &gates = objects.get(); + for(set::const_iterator i=gates.begin(); i!=gates.end(); ++i) + { + DataFile::Statement st("beamgate"); + (*i)->save(st.sub); + writer.write(st); + } + const set &routes = track_chains.get(); for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i) { @@ -431,10 +462,7 @@ void Layout::sensor_state_changed(Sensor &sensor, Sensor::State state) { if(state==Sensor::ACTIVE) { - Block *block = 0; - if(TrackCircuit *tc = dynamic_cast(&sensor)) - block = &tc->get_block(); - + Block *block = sensor.get_block(); if(block && !block->get_train()) emergency(format("Unreserved sensor %d triggered", sensor.get_address())); } @@ -499,29 +527,24 @@ Layout::Loader::Loader(Layout &l): new_tracks(false) { add("base", &Layout::base); - add("route", static_cast(&Loader::route)); + add("beamgate", &Loader::beamgate); + add("route", &Loader::route); add("signal", &Loader::signal); - add("track", static_cast(&Loader::track)); - add("train", static_cast(&Loader::train)); + add("track", &Loader::track); + add("train", &Loader::train); add("turnout", &Loader::turnout); add("zone", &Loader::zone); - - // Deprecated aliases - add("route", static_cast(&Loader::route)); - add("track", static_cast(&Loader::track)); - add("train", static_cast(&Loader::train)); } -void Layout::Loader::route() +void Layout::Loader::beamgate() { - Route *rte = new Route(obj); - load_sub(*rte); + BeamGate *gate = new BeamGate(obj); + load_sub(*gate); } -void Layout::Loader::route(const string &n) +void Layout::Loader::route() { Route *rte = new Route(obj); - rte->set_name(n); load_sub(*rte); } @@ -531,11 +554,6 @@ void Layout::Loader::signal(ArticleNumber art_nr) load_sub(*sig); } -void Layout::Loader::track(unsigned art_nr) -{ - track(ArticleNumber(art_nr)); -} - void Layout::Loader::track(ArticleNumber art_nr) { Track *trk = new Track(obj, obj.catalogue.get_track(art_nr)); @@ -547,11 +565,6 @@ void Layout::Loader::track(ArticleNumber art_nr) trk->link_to(**i); } -void Layout::Loader::train(unsigned art_nr, unsigned addr, const std::string &proto) -{ - train(ArticleNumber(art_nr), addr, proto); -} - void Layout::Loader::train(ArticleNumber art_nr, unsigned addr, const std::string &proto) { Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr, proto);