]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouteplanner.h
Move duplicated successor step creation code to a function
[r2c2.git] / source / libr2c2 / trainrouteplanner.h
index 7d1ff9a0709a61f4fdfe413687cf990790760caf..3076c3978efa5ed0b27edae5cec7b4130e72afa7 100644 (file)
@@ -3,8 +3,10 @@
 
 #include <list>
 #include <vector>
+#include <msp/core/thread.h>
 #include <msp/time/timedelta.h>
 #include "trackiter.h"
+#include "trainrouter.h"
 
 namespace R2C2 {
 
@@ -12,10 +14,17 @@ class Layout;
 class Route;
 class Track;
 class Train;
-class TrainRouter;
 
 class TrainRoutePlanner
 {
+public:
+       enum Result
+       {
+               PENDING,
+               COMPLETE,
+               FAILED
+       };
+
 private:
        struct TrainRoutingState;
 
@@ -23,9 +32,14 @@ private:
        {
                Train *train;
                float speed;
+               Block *first_noncritical;
                TrainRouter *router;
-               Route *route;
-               std::list<const TrainRoutingState *> waits;
+               std::vector<TrainRouter::Waypoint> waypoints;
+               std::vector<const TrainRouteMetric *> metrics;
+               bool has_duration;
+               std::list<Route *> routes;
+               Track *track_history[2];
+               std::list<TrainRouter::SequencePoint> sequence;
 
                TrainRoutingInfo(Train &);
        };
@@ -55,13 +69,18 @@ private:
        {
                TrainRoutingInfo *info;
                TrackIter track;
-               unsigned path;
+               unsigned char path;
+               bool critical;
                OccupiedTrack *occupied_tracks;
                float offset;
                float back_offset;
                TrainState state;
                Msp::Time::TimeDelta delay;
-               int waypoint;
+               Msp::Time::TimeDelta duration;
+               unsigned waypoint;
+               float distance_traveled;
+               float remaining_estimate;
+               Msp::Time::TimeDelta wait_time;
                int blocked_by;
 
                TrainRoutingState(TrainRoutingInfo &);
@@ -72,12 +91,17 @@ private:
                bool is_occupying(Track &) const;
                bool check_arrival();
                void advance(float);
+               void advance(const Msp::Time::TimeDelta &);
                void advance_track(unsigned);
+               void update_estimate();
+               bool is_viable() const;
        };
 
        struct RoutingStep
        {
                Msp::Time::TimeDelta time;
+               Msp::Time::TimeDelta penalty;
+               Msp::Time::TimeDelta cost_estimate;
                std::vector<TrainRoutingState> trains;
                const RoutingStep *prev;
 
@@ -85,29 +109,57 @@ private:
                RoutingStep(const RoutingStep *);
 
                void create_successors(std::list<RoutingStep> &) const;
+               static void create_successor(RoutingStep &, unsigned, unsigned, std::list<RoutingStep> &);
                bool update_states();
                bool check_deadlocks() const;
                int get_occupant(Track &) const;
                int find_next_train() const;
                void advance(const Msp::Time::TimeDelta &);
+               void update_estimate();
                bool is_viable() const;
                bool is_goal() const;
 
                bool operator<(const RoutingStep &) const;
        };
 
+       class PlanningThread: public Msp::Thread
+       {
+       private:
+               TrainRoutePlanner &planner;
+
+       public:
+               PlanningThread(TrainRoutePlanner &);
+
+       private:
+               virtual void main();
+       };
+
        std::vector<TrainRoutingInfo> routed_trains;
        std::list<RoutingStep> steps;
        std::list<RoutingStep> queue;
+       const RoutingStep *goal;
+       Msp::Time::TimeDelta timeout;
+       Result result;
+       PlanningThread *thread;
 
 public:
        TrainRoutePlanner(Layout &);
-
-       void plan();
+       ~TrainRoutePlanner();
+
+       void set_timeout(const Msp::Time::TimeDelta &);
+       Result plan();
+       void plan_async();
+       Result check();
+       Result get_result() const { return result; }
+       const std::list<Route *> &get_routes_for(const Train &) const;
+       const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
 private:
+       const TrainRoutingInfo &get_train_info(const Train &) const;
        const RoutingStep &get_step();
+       void prepare_plan();
+       void create_plan();
        void add_steps(const RoutingStep &);
-       void create_routes(const RoutingStep &);
+       void finalize_plan();
 };
 
 } // namespace R2C2