]> git.tdb.fi Git - r2c2.git/commitdiff
Combine the sequence_check_pending flag with state
authorMikko Rasa <tdb@tdb.fi>
Sat, 21 Feb 2015 18:29:30 +0000 (20:29 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 21 Feb 2015 18:29:30 +0000 (20:29 +0200)
source/libr2c2/trainrouter.cpp
source/libr2c2/trainrouter.h

index 7d52b8437a8bffe8c847c3b05e58142522fecf7f..f0870d250f2b7b95293797a2c86a8c72addf56c1 100644 (file)
@@ -16,11 +16,10 @@ namespace R2C2 {
 TrainRouter::TrainRouter(Train &t):
        TrainAI(t),
        priority(0),
-       arrival(ON_THE_WAY),
+       state(ON_THE_WAY),
        waypoints_changed(false),
        metrics_stale(false),
-       current_sequence(0),
-       sequence_check_pending(false)
+       current_sequence(0)
 {
        train.get_layout().signal_block_reserved.connect(sigc::mem_fun(this, &TrainRouter::block_reserved));
        train.signal_advanced.connect(sigc::mem_fun(this, &TrainRouter::train_advanced));
@@ -50,7 +49,6 @@ bool TrainRouter::set_route(const Route *r)
        waypoints.clear();
        sequence_points.clear();
        current_sequence = 0;
-       sequence_check_pending = false;
 
        route_changed();
 
@@ -79,7 +77,6 @@ void TrainRouter::use_planned_route()
 
        sequence_points = planner->get_sequence_for(train);
        current_sequence = 0;
-       sequence_check_pending = false;
 
        route_changed();
 }
@@ -88,7 +85,7 @@ void TrainRouter::route_changed()
 {
        BlockIter fncb = train.get_last_critical_block().next();
 
-       arrival = ON_THE_WAY;
+       state = ON_THE_WAY;
        reserving_route = routes.begin();
        if(!routes.empty())
        {
@@ -102,7 +99,7 @@ void TrainRouter::route_changed()
                {
                        if(!advance_to_track(reserving_route, track))
                        {
-                               arrival = (allocator.is_block_current(track->get_block()) ? ADVANCED_TO_END : RESERVED_TO_END);
+                               state = (allocator.is_block_current(track->get_block()) ? ADVANCED_TO_END : RESERVED_TO_END);
                                break;
                        }
                        if(&track->get_block()==fncb.block())
@@ -122,21 +119,18 @@ void TrainRouter::route_changed()
                {
                        const SequencePoint &sp = sequence_points.front();
                        if(sp.block==fncb.block() && sp.preceding_train)
-                       {
-                               arrival = WAITING_FOR_SEQUENCE;
-                               sequence_check_pending = true;
-                       }
+                               state = SEQUENCE_CHECK_PENDING;
                }
        }
 
        /* Refresh from the first non-critical block to pick up any changes in the
-       route.  Set stop marker first in case an arrival condition was met within the
+       route.  Set stop marker first in case a stopping state was set within the
        critical blocks. */
-       if(arrival)
+       if(state!=ON_THE_WAY)
                train.stop_at(&*fncb.flip());
        train.refresh_blocks_from(*fncb);
-       // If no arrival condition was found, clear a possible previous stop marker.
-       if(!arrival)
+       // If we don't need to stop, clear a possible previous stop marker.
+       if(state==ON_THE_WAY)
                train.stop_at(0);
 
        const Route *route = get_route();
@@ -255,23 +249,24 @@ void TrainRouter::tick(const Time::TimeDelta &dt)
                        duration = max(duration-dt, Time::zero);
        }
 
-       if(sequence_check_pending)
+       if(state==SEQUENCE_CHECK_PENDING)
        {
                if(sequence_points.front().is_cleared())
                {
-                       arrival = ON_THE_WAY;
+                       state = ON_THE_WAY;
                        train.stop_at(0);
                }
-               sequence_check_pending = false;
+               else
+                       state = WAITING_FOR_SEQUENCE;
        }
 
-       if(arrival==ADVANCED_TO_END && !train.get_speed())
+       if(state==ADVANCED_TO_END && !train.get_speed())
        {
                signal_arrived.emit(waypoints.back().chain);
                signal_event.emit(Message("arrived", waypoints.back().chain));
-               arrival = ARRIVED;
+               state = ARRIVED;
        }
-       else if(arrival==ARRIVED && !train.get_block_allocator().is_active())
+       else if(state==ARRIVED && !train.get_block_allocator().is_active())
                set_route(0);
 }
 
@@ -303,7 +298,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
                if(sp.preceding_train==t && sp.block==&block)
                        /* The other train's router will advance its sequence on the same
                        signal and may not have handled it yet. */
-                       sequence_check_pending = true;
+                       state = SEQUENCE_CHECK_PENDING;
 
                return;
        }
@@ -334,7 +329,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
        if(reserving_route==routes.end() || !(*reserving_route)->has_track(*track))
        {
                reserving_route = routes.begin();
-               arrival = ON_THE_WAY;
+               state = ON_THE_WAY;
                track = t->get_block_allocator().first().track_iter();
                for(; track; track=track.next())
                {
@@ -352,7 +347,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
                if(!advance_to_track(reserving_route, track))
                {
                        // We've reached the end of the route.  Stop here.
-                       arrival = RESERVED_TO_END;
+                       state = RESERVED_TO_END;
                        train.stop_at(&block);
                        return;
                }
@@ -366,7 +361,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
                SequencePoint &sp = sequence_points.front();
                if(sp.block==&track->get_block() && !sp.is_cleared())
                {
-                       arrival = WAITING_FOR_SEQUENCE;
+                       state = WAITING_FOR_SEQUENCE;
                        train.stop_at(&block);
                }
        }
@@ -396,8 +391,8 @@ void TrainRouter::train_advanced(Block &block)
 
                                        if(waypoints.size()==1)
                                        {
-                                               if(arrival==RESERVED_TO_END)
-                                                       arrival = ADVANCED_TO_END;
+                                               if(state==RESERVED_TO_END)
+                                                       state = ADVANCED_TO_END;
                                        }
                                        else
                                        {
index 835ec484737761663da76d30eb97246d0a6178bd..ad77f31b914b766c5c91af88208ddb6253dbf784 100644 (file)
@@ -48,10 +48,11 @@ public:
 private:
        typedef std::list<const Route *> RouteList;
 
-       enum ArrivalState
+       enum TravelState
        {
                ON_THE_WAY,
                WAITING_FOR_SEQUENCE,
+               SEQUENCE_CHECK_PENDING,
                RESERVED_TO_END,
                ADVANCED_TO_END,
                ARRIVED
@@ -66,14 +67,13 @@ private:
        int priority;
        RouteList routes;
        RouteList::iterator reserving_route;
-       ArrivalState arrival;
+       TravelState state;
        std::vector<Waypoint> waypoints;
        bool waypoints_changed;
        std::vector<TrainRouteMetric *> metrics;
        bool metrics_stale;
        std::list<SequencePoint> sequence_points;
        unsigned current_sequence;
-       bool sequence_check_pending;
        Msp::Time::TimeDelta delay;
        Msp::Time::TimeDelta duration;
        Msp::RefPtr<TrainRoutePlanner> planner;