namespace Marklin {
-AIControl::AIControl(Train &t, ControlModel *n):
+AIControl::AIControl(Train &t, Controller *n):
train(t),
- next_model(n),
- target_speed(TrainControl::continuous("speed", 0, 1000)),
+ next_ctrl(n),
+ target_speed(Control::continuous("speed", 0, 1000)),
blocked(false),
approach(false)
{
target_speed.set(0);
train.signal_arrived.connect(sigc::mem_fun(this, &AIControl::arrived));
- next_model->signal_control_changed.connect(sigc::mem_fun(this, &AIControl::control_changed));
+ next_ctrl->signal_control_changed.connect(sigc::mem_fun(this, &AIControl::control_changed));
}
AIControl::~AIControl()
{
- delete next_model;
+ delete next_ctrl;
}
void AIControl::set_control(const string &n, float v)
{
float approach_speed = 5*train.get_layout().get_catalogue().get_scale();
if(approach && target_speed.value>approach_speed)
- next_model->set_control("speed", approach_speed);
+ next_ctrl->set_control("speed", approach_speed);
else
- next_model->set_control("speed", target_speed.value);
+ next_ctrl->set_control("speed", target_speed.value);
}
signal_control_changed.emit(target_speed);
}
else
- next_model->set_control(n, v);
+ next_ctrl->set_control(n, v);
}
-const TrainControl &AIControl::get_control(const string &n) const
+const Controller::Control &AIControl::get_control(const string &n) const
{
if(n=="speed")
return target_speed;
else
- return next_model->get_control(n);
+ return next_ctrl->get_control(n);
}
float AIControl::get_speed() const
{
- return next_model->get_speed();
+ return next_ctrl->get_speed();
}
bool AIControl::get_reverse() const
{
- return next_model->get_reverse();
+ return next_ctrl->get_reverse();
}
float AIControl::get_braking_distance() const
{
- return next_model->get_braking_distance();
+ return next_ctrl->get_braking_distance();
}
void AIControl::tick(const Time::TimeDelta &dt)
{
float scale = train.get_layout().get_catalogue().get_scale();
float rsv_dist = train.get_reserved_distance();
- float brake_dist = next_model->get_braking_distance();
+ float brake_dist = next_ctrl->get_braking_distance();
float approach_margin = 50*scale;
float approach_speed = 5*scale;
float margin = 10*scale;
if(!blocked && rsv_dist<brake_dist+margin)
{
blocked = true;
- next_model->set_control("speed", 0);
+ next_ctrl->set_control("speed", 0);
}
else if((!approach && rsv_dist<brake_dist*1.3+approach_margin) || (blocked && rsv_dist>brake_dist+margin*2))
{
blocked = false;
approach = true;
if(target_speed.value>approach_speed)
- next_model->set_control("speed", approach_speed);
+ next_ctrl->set_control("speed", approach_speed);
else
- next_model->set_control("speed", target_speed.value);
+ next_ctrl->set_control("speed", target_speed.value);
}
else if((blocked || approach) && rsv_dist>brake_dist*1.3+approach_margin*2)
{
blocked = false;
approach = false;
- next_model->set_control("speed", target_speed.value);
+ next_ctrl->set_control("speed", target_speed.value);
}
- next_model->tick(dt);
+ next_ctrl->tick(dt);
- if(!target_speed.value && !next_model->get_speed() && train.is_active())
+ if(!target_speed.value && !next_ctrl->get_speed() && train.is_active())
train.set_active(false);
}
-void AIControl::control_changed(const TrainControl &ctrl)
+void AIControl::control_changed(const Control &ctrl)
{
if(ctrl.name!="speed")
signal_control_changed.emit(ctrl);