1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
6 #include <msp/core/thread.h>
7 #include <msp/time/timedelta.h>
9 #include "trainrouter.h"
18 class TrainRoutePlanner
29 struct TrainRoutingState;
31 struct TrainRoutingInfo
36 Block *first_noncritical;
38 std::vector<TrainRouter::Waypoint> waypoints;
39 std::vector<const TrainRouteMetric *> metrics;
41 std::list<Route *> routes;
42 Track *track_history[2];
43 std::list<TrainRouter::SequencePoint> sequence;
45 TrainRoutingInfo(Train &);
56 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
57 OccupiedTrack(const OccupiedTrack &);
69 struct TrainRoutingState
71 TrainRoutingInfo *info;
75 OccupiedTrack *occupied_tracks;
79 Msp::Time::TimeDelta delay;
80 Msp::Time::TimeDelta duration;
82 float travel_multiplier;
83 float distance_traveled;
84 float remaining_estimate;
85 Msp::Time::TimeDelta wait_time;
86 Msp::Time::TimeDelta estimated_wait;
89 TrainRoutingState(TrainRoutingInfo &);
90 TrainRoutingState(const TrainRoutingState &);
93 Msp::Time::TimeDelta get_time_to_next_track() const;
94 Msp::Time::TimeDelta get_time_to_pass(Track &) const;
95 bool is_occupying(Track &) const;
98 void advance(const Msp::Time::TimeDelta &);
99 void advance_track(unsigned);
100 void set_path(unsigned);
101 void update_estimate();
102 bool is_viable() const;
107 Msp::Time::TimeDelta time;
108 Msp::Time::TimeDelta cost_estimate;
110 std::vector<TrainRoutingState> trains;
111 const RoutingStep *prev;
114 RoutingStep(const RoutingStep *);
116 void create_successors(std::list<RoutingStep> &) const;
117 static void create_successor(RoutingStep &, unsigned, unsigned, std::list<RoutingStep> &);
118 bool update_states();
119 bool check_deadlocks() const;
120 int get_occupant(Track &) const;
121 int find_next_train() const;
122 void advance(const Msp::Time::TimeDelta &);
123 void update_estimate();
124 bool is_viable() const;
125 bool is_goal() const;
127 bool operator<(const RoutingStep &) const;
130 class PlanningThread: public Msp::Thread
133 TrainRoutePlanner &planner;
136 PlanningThread(TrainRoutePlanner &);
142 std::vector<TrainRoutingInfo> routed_trains;
143 std::list<RoutingStep> steps;
144 std::list<RoutingStep> queue;
145 const RoutingStep *goal;
146 Msp::Time::TimeDelta path_switch_bias;
147 Msp::Time::TimeDelta timeout;
149 PlanningThread *thread;
152 TrainRoutePlanner(Layout &);
153 ~TrainRoutePlanner();
155 void set_timeout(const Msp::Time::TimeDelta &);
159 Result get_result() const { return result; }
160 const std::list<Route *> &get_routes_for(const Train &) const;
161 const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
163 const TrainRoutingInfo &get_train_info(const Train &) const;
164 const RoutingStep &get_step();
167 void add_steps(const RoutingStep &);
168 void finalize_plan();