layout.get_driver().signal_halt.connect(sigc::mem_fun(this, &Train::halt_event));
- control->signal_control_changed.connect(signal_control_changed);
+ control->signal_control_changed.connect(sigc::mem_fun(this, &Train::control_changed));
}
Train::~Train()
layout.get_driver().set_loco_function(address+1, func-4, state);
}
+float Train::get_control(const string &ctrl) const
+{
+ return control->get_control(ctrl).value;
+}
+
+float Train::get_speed() const
+{
+ return control->get_speed();
+}
+
bool Train::get_function(unsigned func) const
{
return (functions>>func)&1;
timetable->tick(t);
control->tick(dt);
float speed = control->get_speed();
- unsigned speed_notch = find_speed(abs(speed));
+ unsigned speed_notch = find_speed(speed);
if(control->get_reverse()!=reverse)
{
}
}
}
- else if(end_of_route)
+ else if(end_of_route && rsv_blocks.empty())
+ {
+ signal_arrived.emit();
set_route(0);
+ }
if(!cur_blocks.empty() && !cur_blocks.front().block->get_sensor_id())
{
}
}
+void Train::control_changed(const TrainControl &ctrl)
+{
+ signal_control_changed.emit(ctrl.name, ctrl.value);
+}
+
void Train::loco_speed_event(unsigned addr, unsigned speed, bool)
{
if(addr==address)
// Try to get more blocks if we're moving
if(active)
- {
- unsigned nsens = reserve_more();
- if(!nsens && end_of_route)
- signal_arrived.emit();
- }
+ reserve_more();
}
else if(result==3)
layout.emergency("Sensor for "+name+" triggered out of order");