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()
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);
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;
}
}
}
}
-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!=█ i=i.next())
travel_distance += i->get_path_length(i.entry());
if(travel_distance>0)
}
}
- last_entry_block = allocator.iter_for(*block);
+ 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())
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)