]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/layout.cpp
Set correct Z coordinate to vehicle position
[r2c2.git] / source / libmarklin / layout.cpp
index c0930352fb7d2b171f7279a55c0dd1fddffc454b..1448a1d76eef08085e76f4604c29fc2586b43e04 100644 (file)
@@ -9,16 +9,17 @@ Distributed under the GPL
 #include <msp/core/refptr.h>
 #include <msp/datafile/parser.h>
 #include <msp/datafile/writer.h>
+#include <msp/io/print.h>
 #include <msp/time/utils.h>
 #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()
 {
@@ -182,6 +186,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 +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);
@@ -215,6 +239,9 @@ void Layout::save(const string &fn)
 
        for(map<string, Route *>::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);
@@ -265,6 +292,9 @@ void Layout::check_routes()
 {
        for(map<string, Route *>::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<unsigned, int> turnouts = i->second->get_turnouts();
@@ -300,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)
@@ -332,6 +364,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(format("Unreserved sensor %d triggered", addr));
+                               break;
+                       }
+       }
+}
+
 
 Layout::Loader::Loader(Layout &l):
        DataFile::BasicLoader<Layout>(l),
@@ -368,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);
 }