]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/layout.cpp
Halt all trains in various unexpected situations
[r2c2.git] / source / libmarklin / layout.cpp
index 7855dca7d7115333dc1b060ff4f3d57b68950bbd..af88d7d8fd2e35f3a44af86ff24640c85c003d1d 100644 (file)
@@ -28,7 +28,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 +212,13 @@ void Layout::tick()
                i->second->tick(t, dt);
 }
 
+void Layout::emergency(const string &msg)
+{
+       if(driver)
+               driver->halt(true);
+       signal_emergency.emit(msg);
+}
+
 void Layout::save(const string &fn)
 {
        IO::BufferedFile out(fn, IO::M_WRITE);
@@ -344,6 +354,20 @@ void Layout::check_routes()
        }
 }
 
+void Layout::sensor_event(unsigned addr, bool state)
+{
+       if(state)
+       {
+               for(set<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
+                       if((*i)->get_sensor_id()==addr)
+                       {
+                               if(!(*i)->get_train())
+                                       emergency("Unreserved sensor triggered");
+                               break;
+                       }
+       }
+}
+
 
 Layout::Loader::Loader(Layout &l):
        DataFile::BasicLoader<Layout>(l),