X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=93dbedf544c27b029a56dc352f1f9e6e502be4ad;hb=437ad8b3b19d2ba396551efa66723366364b1ad3;hp=da3b7d515fe253b79db3412ea0e98d2bd062d6ea;hpb=29878263d8faf9b7e5845e8b1c3d52b139a255cf;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index da3b7d5..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; @@ -165,8 +187,8 @@ void TrainRouter::tick(const Time::TimeDelta &dt) if(arriving==1 && !train.get_speed()) { - signal_arrived.emit(); - signal_event.emit(Message("arrived")); + signal_arrived.emit(destination); + signal_event.emit(Message("arrived", destination)); arriving = 2; } else if(arriving==2 && !train.get_block_allocator().is_active()) @@ -237,8 +259,31 @@ void TrainRouter::train_advanced(Block &block) if(route.has_track(*b_iter.endpoint().track)) { routes.pop_front(); + const Route *r = get_route(); // XXX Exceptions? - signal_event.emit(Message("route-changed", get_route())); + signal_route_changed.emit(r); + signal_event.emit(Message("route-changed", r)); + } + } + + if(!waypoints.empty()) + { + const TrackChain &wp = *waypoints.front(); + TrackIter t_iter = b_iter.track_iter(); + if(wp.has_track(*t_iter)) + { + for(; t_iter; t_iter=t_iter.next()) + { + 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)) + break; + } } } @@ -261,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) @@ -303,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(); }