BlockRef next() const;
};
+ struct RouteRef
+ {
+ const Route *route;
+ unsigned diversion;
+
+ RouteRef(const Route *, unsigned = 0);
+ };
+
struct RealSpeed
{
float speed;
bool reverse;
Msp::Time::TimeStamp stop_timeout;
unsigned functions;
- const Route *route;
- const Route *next_route;
+ std::list<RouteRef> routes;
bool end_of_route;
std::string status;
void set_route(const Route *);
void go_to(const Track &);
- const Route *get_route() const { return route; }
+ bool divert(Track &);
+ const Route *get_route() const;
void place(Block &, unsigned);
void unplace();
bool is_placed() const { return !cur_blocks.empty(); }
bool free_block(Block &);
+ void free_noncritical_blocks();
int get_entry_to_block(Block &) const;
float get_reserved_distance() const;
void release_blocks(std::list<BlockRef> &);
void release_blocks(std::list<BlockRef> &, std::list<BlockRef>::iterator, std::list<BlockRef>::iterator);
void reverse_blocks(std::list<BlockRef> &) const;
+ bool advance_route(std::list<RouteRef>::iterator &, const Track &);
+ Route *create_lead_route(Route *, const Route *);
+ bool is_valid_diversion(const Route &, const Track &, unsigned);
};
} // namespace Marklin