]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Put signal_advanced in BlockAllocator
[r2c2.git] / source / libr2c2 / train.cpp
index 845232fa4d9cf442fc5dddc692c5873291c35302..b278948a83ed9c8d38d7694f293037a48ef99842 100644 (file)
@@ -14,6 +14,7 @@
 #include "route.h"
 #include "simplecontroller.h"
 #include "speedquantizer.h"
+#include "timetable.h"
 #include "trackcircuit.h"
 #include "trackiter.h"
 #include "tracktype.h"
@@ -67,6 +68,8 @@ Train::Train(Layout &l, const VehicleType &t, unsigned a, const string &p):
        layout.get_driver().signal_halt.connect(sigc::mem_fun(this, &Train::halt_event));
 
        controller->signal_control_changed.connect(sigc::mem_fun(this, &Train::control_changed));
+
+       allocator.signal_advanced.connect(signal_advanced);
 }
 
 Train::~Train()
@@ -357,7 +360,8 @@ void Train::tick(const Time::TimeDelta &dt)
                Vehicle &vehicle = *(reverse ? vehicles.back() : vehicles.front());
 
                float d = speed*(dt/Time::sec);
-               if(allocator.is_block_current(vehicle.get_placement().get_position(reverse ? VehiclePlacement::BACK_AXLE : VehiclePlacement::FRONT_AXLE)->get_block()))
+               Block &block = vehicle.get_placement().get_position(reverse ? VehiclePlacement::BACK_AXLE : VehiclePlacement::FRONT_AXLE)->get_block();
+               if(allocator.is_block_current(block))
                {
                        SetFlag setf(advancing);
                        vehicle.advance(reverse ? -d : d);
@@ -367,7 +371,7 @@ void Train::tick(const Time::TimeDelta &dt)
                        overshoot_dist += d;
                        if(overshoot_dist>40*layout.get_catalogue().get_scale())
                        {
-                               layout.emergency(name+" has not arrived at sensor");
+                               layout.emergency(&block, name+" has not arrived at sensor");
                                accurate_position = false;
                        }
                }
@@ -408,6 +412,12 @@ void Train::save(list<DataFile::Statement> &st) const
                        router->save(ss.sub);
                        st.push_back(ss);
                }
+               else if(Timetable *timetable = dynamic_cast<Timetable *>(*i))
+               {
+                       DataFile::Statement ss("timetable");
+                       timetable->save(ss.sub);
+                       st.push_back(ss);
+               }
        }
 }
 
@@ -480,8 +490,11 @@ void Train::sensor_state_changed(Sensor &sensor, Sensor::State state)
 
                last_entry_block = allocator.iter_for(*block);
                travel_time = Time::zero;
-               pure_speed = true;
-               accurate_position = true;
+               if(!layout.get_driver().is_halted())
+               {
+                       pure_speed = true;
+                       accurate_position = true;
+               }
                overshoot_dist = 0;
 
                if(!advancing && vehicles.front()->is_placed())
@@ -577,6 +590,7 @@ Train::Loader::Loader(Train &t):
        add("name",        &Loader::name);
        add("quantized_speed",  &Loader::quantized_speed);
        add("router",      &Loader::router);
+       add("timetable",   &Loader::timetable);
        add("vehicle",     &Loader::vehicle);
 }
 
@@ -612,6 +626,12 @@ void Train::Loader::router()
        load_sub(*rtr);
 }
 
+void Train::Loader::timetable()
+{
+       Timetable *ttbl = new Timetable(obj);
+       load_sub(*ttbl, obj.layout);
+}
+
 void Train::Loader::vehicle(ArticleNumber art_nr)
 {
        const VehicleType &vtype = obj.layout.get_catalogue().get<VehicleType>(art_nr);