X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=b388bb2be9bc1a1062f49ce6d41f7b3e8ee86382;hb=a1c3c054707fc65d497dd13da59b37a9ddb369cc;hp=b2993ee74ba47d0620234719016ff465f06b7aeb;hpb=a7b4305930090851623da7e02e21650510ce7dae;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index b2993ee..b388bb2 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -61,6 +61,7 @@ bool TrainRouter::set_route(const Route *r) if(!r) { destination = 0; + waypoints.clear(); } train.refresh_blocks_from(*fncb); @@ -101,6 +102,20 @@ bool TrainRouter::is_destination(Track &track) const return false; } +void TrainRouter::add_waypoint(const TrackChain &wp) +{ + waypoints.push_back(&wp); + update_pending = true; +} + +bool TrainRouter::is_waypoint(unsigned index, Track &track) const +{ + if(index>=waypoints.size()) + throw out_of_range("TrainRouter::is_waypoint"); + + return waypoints[index]->has_track(track); +} + void TrainRouter::set_departure_delay(const Time::TimeDelta &d) { delay = d; @@ -125,6 +140,13 @@ void TrainRouter::message(const Message &msg) else set_destination(*msg.value.value()); } + else if(msg.type=="add-waypoint") + { + if(msg.value.check_type()) + add_waypoint(*msg.value.value()); + else + add_waypoint(*msg.value.value()); + } else if(msg.type=="set-departure-delay") set_departure_delay(msg.value.value()); } @@ -143,8 +165,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()) @@ -215,8 +237,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; + } } }