]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Put signal_advanced in BlockAllocator
[r2c2.git] / source / libr2c2 / train.cpp
index 34b80ddcc39d213635431e50613ecdce29776d51..b278948a83ed9c8d38d7694f293037a48ef99842 100644 (file)
@@ -68,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()
@@ -358,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);
@@ -368,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;
                        }
                }
@@ -487,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())