]> 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 c0930352fb7d2b171f7279a55c0dd1fddffc454b..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()
 {
@@ -182,6 +185,18 @@ void Layout::remove_train(Train &t)
                signal_train_removed.emit(t);
 }
 
+void Layout::add_vehicle(Vehicle &v)
+{
+       if(vehicles.insert(&v).second)
+               signal_vehicle_added.emit(v);
+}
+
+void Layout::remove_vehicle(Vehicle &v)
+{
+       if(vehicles.erase(&v))
+               signal_vehicle_removed.emit(v);
+}
+
 void Layout::tick()
 {
        if(driver)
@@ -197,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);
@@ -332,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),