TrainAI(t),
priority(0),
arrival(ON_THE_WAY),
- destination(0),
- destination_changed(false),
+ waypoints_changed(false),
metrics_stale(false),
current_sequence(0),
sequence_check_pending(false)
create_lead_route();
}
- destination = 0;
waypoints.clear();
sequence_points.clear();
current_sequence = 0;
void TrainRouter::set_destination(const TrackChain &d)
{
- destination = &d;
- destination_changed = true;
+ if(waypoints.empty())
+ waypoints.push_back(&d);
+ else
+ waypoints.back() = &d;
+ waypoints_changed = true;
metrics_stale = true;
}
void TrainRouter::add_waypoint(const TrackChain &wp)
{
waypoints.push_back(&wp);
- destination_changed = true;
+ waypoints_changed = true;
metrics_stale = true;
}
const TrainRouteMetric &TrainRouter::get_metric(int index) const
{
- if(!destination)
+ if(waypoints.empty())
throw logic_error("no metrics");
else if(metrics_stale)
throw logic_error("metrics are stale");
if(index<0)
- return *metrics.front();
+ return *metrics.back();
else if(static_cast<unsigned>(index)>=waypoints.size())
throw out_of_range("TrainRouter::get_metric");
else
- return *metrics[index+1];
+ return *metrics[index];
}
void TrainRouter::set_departure_delay(const Time::TimeDelta &d)
{
delay = d;
- destination_changed = true;
+ waypoints_changed = true;
}
void TrainRouter::set_trip_duration(const Time::TimeDelta &d)
else if(duration)
duration = max(duration-dt, Time::zero);
- if(destination_changed && !planner)
+ if(waypoints_changed && !planner)
start_planning(train.get_layout());
if(planner && planner->check()!=TrainRoutePlanner::PENDING)
{
- destination_changed = false;
+ waypoints_changed = false;
if(planner->get_result()==TrainRoutePlanner::COMPLETE)
{
const list<Route *> &planned_routes = planner->get_routes_for(train);
if(arrival==RESERVED_TO_END && !train.get_speed())
{
- signal_arrived.emit(destination);
- signal_event.emit(Message("arrived", destination));
+ signal_arrived.emit(waypoints.back());
+ signal_event.emit(Message("arrived", waypoints.back()));
arrival = ARRIVED;
}
else if(arrival==ARRIVED && !train.get_block_allocator().is_active())
{
BlockIter b_iter = train.get_block_allocator().iter_for(block);
- if(!waypoints.empty())
+ if(waypoints.size()>1)
{
// A waypoint is considered reached when the train has advanced through it.
const TrackChain &wp = *waypoints.front();
metrics_stale = false;
- if(!destination)
+ if(waypoints.empty())
return;
- metrics.push_back(new TrainRouteMetric(*destination));
for(vector<const TrackChain *>::const_iterator i=waypoints.begin(); i!=waypoints.end(); ++i)
metrics.push_back(new TrainRouteMetric(**i));
- for(unsigned i=metrics.size(); --i>0; )
- metrics[i]->chain_to(*metrics[(i+1)%metrics.size()]);
+ for(unsigned i=metrics.size()-1; i-->0; )
+ metrics[i]->chain_to(*metrics[i+1]);
}
bool TrainRouter::create_lead_route()