1 #ifndef LIBOSMSCOUT_ROUTEINSTRUCTIONAGENT_H 2 #define LIBOSMSCOUT_ROUTEINSTRUCTIONAGENT_H 29 template <
typename RouteInstruction>
30 struct RouteInstructionsMessage
CLASS_FINAL :
public NavigationMessage
40 template <
typename RouteInstruction>
41 struct NextRouteInstructionsMessage
CLASS_FINAL :
public NavigationMessage
51 template <
typename RouteInstruction,
typename RouteInstructionBuilder>
52 class RouteInstructionAgent
CLASS_FINAL :
public NavigationAgent
56 std::list<RouteInstruction> instructions;
59 RouteInstructionAgent();
65 template <
typename RouteInstruction,
typename RouteInstructionBuilder>
66 RouteInstructionAgent<RouteInstruction, RouteInstructionBuilder>::RouteInstructionAgent() =
default;
68 template <
typename RouteInstruction,
typename RouteInstructionBuilder>
69 std::list<NavigationMessageRef> RouteInstructionAgent<RouteInstruction, RouteInstructionBuilder>
72 std::list<NavigationMessageRef> result;
74 auto* positionMessage =
dynamic_cast<PositionAgent::PositionMessage*
>(message.get());
75 if (positionMessage==
nullptr) {
79 if (!positionMessage->route){
83 if (positionMessage->position.state != PositionAgent::PositionState::OnRoute &&
84 positionMessage->position.state != PositionAgent::PositionState::EstimateInTunnel) {
89 RouteInstructionBuilder builder;
91 Timestamp now = positionMessage->timestamp;
92 if (prevRoute != positionMessage->route){
93 instructions=builder.GenerateRouteInstructions(positionMessage->position.routeNode,
94 positionMessage->route->Nodes().end());
95 result.push_back(std::make_shared<RouteInstructionsMessage<RouteInstruction>>(now,instructions));
100 while (!instructions.empty() &&
101 positionMessage->position.routeNode != positionMessage->route->Nodes().end() &&
102 instructions.front().GetDistance() <= positionMessage->position.routeNode->GetDistance()){
104 instructions.pop_front();
108 result.push_back(std::make_shared<RouteInstructionsMessage<RouteInstruction>>(now,instructions));
112 RouteInstruction nextInstruction = builder.GenerateNextRouteInstruction(positionMessage->position.routeNode,
113 positionMessage->route->Nodes().end(),
114 positionMessage->position.coord);
115 result.push_back(std::make_shared<NextRouteInstructionsMessage<RouteInstruction>>(now,nextInstruction));
117 prevRoute=positionMessage->route;
124 #endif //LIBOSMSCOUT_ROUTEINSTRUCTIONAGENT_H std::chrono::system_clock::time_point Timestamp
Definition: Time.h:27
#define CLASS_FINAL
Definition: Compiler.h:26
std::list< RouteInstruction > instructions
Definition: RouteInstructionAgent.h:33
RouteInstructionsMessage(const Timestamp ×tamp, const std::list< RouteInstruction > &instructions)
Definition: RouteInstructionAgent.h:35
std::shared_ptr< RouteDescription > RouteDescriptionRef
Definition: RouteDescription.h:814
RouteInstruction nextRouteInstruction
Definition: RouteInstructionAgent.h:44
std::shared_ptr< NavigationMessage > NavigationMessageRef
Definition: Engine.h:56
NextRouteInstructionsMessage(const Timestamp ×tamp, const RouteInstruction &nextRouteInstruction)
Definition: RouteInstructionAgent.h:46