]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Use signal_advanced for train speed measurement and vehicle placement
[r2c2.git] / source / libr2c2 / train.cpp
index b278948a83ed9c8d38d7694f293037a48ef99842..98553e3c611540aef90dc34477315ec3c8f6ea48 100644 (file)
@@ -63,13 +63,11 @@ 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(signal_advanced);
+       allocator.signal_advanced.connect(sigc::mem_fun(this, &Train::advanced));
 }
 
 Train::~Train()
@@ -454,29 +452,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)
@@ -488,7 +478,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())
                {
@@ -509,12 +499,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)