]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Use max/min for range capping
[r2c2.git] / source / libr2c2 / train.cpp
index 8e10026f182bee49987318eb0daee177ad679873..858cbbc9e8c8d093971af814a3acb049717ffc37 100644 (file)
@@ -5,13 +5,11 @@
 #include <msp/strings/format.h>
 #include <msp/time/units.h>
 #include <msp/time/utils.h>
-#include "aicontrol.h"
 #include "beamgate.h"
 #include "block.h"
 #include "catalogue.h"
 #include "driver.h"
 #include "layout.h"
-#include "route.h"
 #include "simplecontroller.h"
 #include "speedquantizer.h"
 #include "timetable.h"
@@ -22,7 +20,6 @@
 #include "trainrouter.h"
 #include "vehicle.h"
 #include "vehicletype.h"
-#include "zone.h"
 
 using namespace std;
 using namespace Msp;
@@ -63,11 +60,12 @@ Train::Train(Layout &l, const VehicleType &t, unsigned a, const string &p):
        layout.get_driver().signal_loco_speed.connect(sigc::mem_fun(this, &Train::loco_speed_event));
        layout.get_driver().signal_loco_function.connect(sigc::mem_fun(this, &Train::loco_func_event));
 
-       layout.signal_sensor_state_changed.connect(sigc::mem_fun(this, &Train::sensor_state_changed));
-
        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(sigc::mem_fun(this, &Train::advanced));
+       allocator.signal_rear_advanced.connect(signal_rear_advanced);
 }
 
 Train::~Train()
@@ -300,12 +298,9 @@ void Train::tick(const Time::TimeDelta &dt)
 {
        if(stop_timeout)
        {
-               stop_timeout -= dt;
+               stop_timeout = max(stop_timeout-dt, Time::zero);
                if(stop_timeout<=Time::zero)
-               {
                        allocator.set_active(false);
-                       stop_timeout = Time::TimeDelta();
-               }
        }
 
        travel_time += dt;
@@ -358,7 +353,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 +364,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;
                        }
                }
@@ -383,9 +379,10 @@ void Train::save(list<DataFile::Statement> &st) const
 {
        st.push_back((DataFile::Statement("name"), name));
 
+       const Catalogue &cat = layout.get_catalogue();
        for(vector<Vehicle *>::const_iterator i=vehicles.begin(); i!=vehicles.end(); ++i)
                if(i!=vehicles.begin())
-                       st.push_back((DataFile::Statement("vehicle"), (*i)->get_type().get_article_number()));
+                       st.push_back((DataFile::Statement("vehicle"), cat.get_name(&(*i)->get_type())));
 
        if(speed_quantizer)
        {
@@ -451,29 +448,21 @@ void Train::loco_func_event(unsigned id, unsigned func, bool state)
        }
 }
 
-void Train::sensor_state_changed(Sensor &sensor, Sensor::State state)
+void Train::advanced(Block &block, Sensor *sensor)
 {
-       if(!current_speed_step || state!=Sensor::MAYBE_ACTIVE)
-               return;
+       if(!sensor || sensor==block.get_sensor())
+               signal_advanced.emit(block);
 
-       Block *block = sensor.get_block();
-       if(!block || block->get_train()!=this)
+       if(!sensor)
                return;
 
-       if(last_entry_block && &*last_entry_block!=block)
-       {
-               for(BlockIter i=last_entry_block.next(); (i && &*i!=block); i=i.next())
-                       if(i->get_train()!=this || i->get_sensor_address())
-                               return;
-       }
-
-       if(dynamic_cast<TrackCircuit *>(&sensor))
+       if(sensor==block.get_sensor())
        {
                if(last_entry_block && pure_speed && speed_quantizer)
                {
                        float travel_distance = 0;
 
-                       for(BlockIter i=last_entry_block; &*i!=block; i=i.next())
+                       for(BlockIter i=last_entry_block; &*i!=&block; i=i.next())
                                travel_distance += i->get_path_length(i.entry());
 
                        if(travel_distance>0)
@@ -485,7 +474,7 @@ void Train::sensor_state_changed(Sensor &sensor, Sensor::State state)
                        }
                }
 
-               last_entry_block = allocator.iter_for(*block);
+               last_entry_block = allocator.iter_for(block);
                travel_time = Time::zero;
                if(!layout.get_driver().is_halted())
                {
@@ -506,12 +495,12 @@ void Train::sensor_state_changed(Sensor &sensor, Sensor::State state)
                                vehicles.front()->place(track, VehiclePlacement::FRONT_AXLE);
                }
        }
-       else if(BeamGate *gate = dynamic_cast<BeamGate *>(&sensor))
+       else if(BeamGate *gate = dynamic_cast<BeamGate *>(sensor))
        {
                if(!advancing && vehicles.front()->is_placed())
                {
-                       TrackIter track = allocator.iter_for(*block).track_iter();
-                       for(; (track && &track->get_block()==block); track=track.next())
+                       TrackIter track = allocator.iter_for(block).track_iter();
+                       for(; (track && &track->get_block()==&block); track=track.next())
                                if(track.track()==gate->get_track())
                                {
                                        if(reverse)
@@ -629,9 +618,9 @@ void Train::Loader::timetable()
        load_sub(*ttbl, obj.layout);
 }
 
-void Train::Loader::vehicle(ArticleNumber art_nr)
+void Train::Loader::vehicle(const string &n)
 {
-       const VehicleType &vtype = obj.layout.get_catalogue().get<VehicleType>(art_nr);
+       const VehicleType &vtype = obj.layout.get_catalogue().get<VehicleType>(n);
        Vehicle *veh = new Vehicle(obj.layout, vtype);
        obj.vehicles.back()->attach_back(*veh);
        obj.vehicles.push_back(veh);