X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=1448a1d76eef08085e76f4604c29fc2586b43e04;hb=97443d96ff3ce51388d2edd1e0dca8f2cd231346;hp=7855dca7d7115333dc1b060ff4f3d57b68950bbd;hpb=e5cd9e4fbc577036a0385c985b6b65df8218d0a2;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index 7855dca..1448a1d 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -9,16 +9,17 @@ Distributed under the GPL #include #include #include +#include #include #include "block.h" #include "catalogue.h" #include "driver.h" #include "layout.h" -#include "locotype.h" #include "route.h" #include "track.h" #include "tracktype.h" #include "train.h" +#include "vehicletype.h" using namespace std; using namespace Msp; @@ -28,7 +29,10 @@ namespace Marklin { Layout::Layout(Catalogue &c, Driver *d): catalogue(c), driver(d) -{ } +{ + if(driver) + driver->signal_sensor.connect(sigc::mem_fun(this, &Layout::sensor_event)); +} Layout::~Layout() { @@ -209,6 +213,14 @@ void Layout::tick() i->second->tick(t, dt); } +void Layout::emergency(const string &msg) +{ + if(driver) + driver->halt(true); + IO::print("Emergency: %s\n", msg); + signal_emergency.emit(msg); +} + void Layout::save(const string &fn) { IO::BufferedFile out(fn, IO::M_WRITE); @@ -227,6 +239,9 @@ void Layout::save(const string &fn) for(map::iterator i=routes.begin(); i!=routes.end(); ++i) { + if(i->second->is_temporary()) + continue; + DataFile::Statement st("route"); st.append(i->first); i->second->save(st.sub); @@ -277,6 +292,9 @@ void Layout::check_routes() { for(map::iterator i=routes.begin(); i!=routes.end(); ++i) { + if(i->second->is_temporary()) + continue; + /* We must copy the turnout map, since adding tracks to the route will (temporarily) mess it up */ const map turnouts = i->second->get_turnouts(); @@ -312,6 +330,8 @@ void Layout::check_routes() while(1) { // Traverse the track and get the next one + if(track->get_type().get_endpoints().size()<2) + break; unsigned out_ep = track->traverse(ep, trk_path); Track *next = track->get_links()[out_ep]; if(!next || next == start) @@ -344,6 +364,20 @@ void Layout::check_routes() } } +void Layout::sensor_event(unsigned addr, bool state) +{ + if(state) + { + for(set::iterator i=blocks.begin(); i!=blocks.end(); ++i) + if((*i)->get_sensor_id()==addr) + { + if(!(*i)->get_train()) + emergency(format("Unreserved sensor %d triggered", addr)); + break; + } + } +} + Layout::Loader::Loader(Layout &l): DataFile::BasicLoader(l), @@ -380,7 +414,7 @@ void Layout::Loader::track(unsigned art_nr) void Layout::Loader::train(unsigned art_nr, unsigned addr) { - Train *trn = new Train(obj, obj.catalogue.get_locomotive(art_nr), addr); + Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr); load_sub(*trn); }