X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=93dbedf544c27b029a56dc352f1f9e6e502be4ad;hb=3ea934a7c6be204f82e5d41c3be8d5256efdac64;hp=2be3c8814fd14727d7ff3a5ffdbb8fc8458ffc0e;hpb=f2092c352667a3178bfea9c2bc90882e4b7fb3aa;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index 2be3c88..93dbedf 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -3,6 +3,7 @@ #include "trackiter.h" #include "train.h" #include "trackchain.h" +#include "trainroutemetric.h" #include "trainrouteplanner.h" #include "trainrouter.h" @@ -22,6 +23,12 @@ TrainRouter::TrainRouter(Train &t): train.signal_advanced.connect(sigc::mem_fun(this, &TrainRouter::train_advanced)); } +TrainRouter::~TrainRouter() +{ + for(vector::iterator i=metrics.begin(); i!=metrics.end(); ++i) + delete *i; +} + void TrainRouter::set_priority(int p) { priority = p; @@ -116,6 +123,21 @@ bool TrainRouter::is_waypoint(unsigned index, Track &track) const return waypoints[index]->has_track(track); } +const TrainRouteMetric &TrainRouter::get_metric(int index) const +{ + if(!destination) + throw logic_error("no metrics"); + else if(update_pending) + throw logic_error("metrics are stale"); + + if(index<0) + return *metrics.front(); + else if(static_cast(index)>=waypoints.size()) + throw out_of_range("TrainRouter::get_metric"); + else + return *metrics[index+1]; +} + void TrainRouter::set_departure_delay(const Time::TimeDelta &d) { delay = d; @@ -255,6 +277,8 @@ void TrainRouter::train_advanced(Block &block) if(!wp.has_track(*t_iter)) { waypoints.erase(waypoints.begin()); + signal_waypoint_reached.emit(&wp); + signal_event.emit(Message("waypoint-reached", &wp)); break; } else if(!block.has_track(*t_iter)) @@ -282,6 +306,23 @@ const Route *TrainRouter::get_route_for_block(const Block &block) const return 0; } +void TrainRouter::create_metrics() +{ + for(vector::iterator i=metrics.begin(); i!=metrics.end(); ++i) + delete *i; + metrics.clear(); + + if(!destination) + return; + + metrics.push_back(new TrainRouteMetric(*destination)); + for(vector::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()]); +} + Route *TrainRouter::create_lead_route(Route *lead, const Route *target) { if(!lead) @@ -324,13 +365,17 @@ bool TrainRouter::is_on_route(const Block &block) void TrainRouter::create_plans(Layout &layout) { - TrainRoutePlanner planner(layout); - planner.plan(); - const map &trains = layout.get_trains(); for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) if(TrainRouter *router = i->second->get_ai_of_type()) + { + if(router->update_pending) + router->create_metrics(); router->update_pending = false; + } + + TrainRoutePlanner planner(layout); + planner.plan(); }