1#ifndef LIBOSMSCOUT_ROUTEINSTRUCTIONAGENT_H
2#define LIBOSMSCOUT_ROUTEINSTRUCTIONAGENT_H
29template <
typename RouteInstruction>
40template <
typename RouteInstruction>
41struct NextRouteInstructionsMessage
CLASS_FINAL :
public NavigationMessage
51template <
typename RouteInstruction,
typename RouteInstructionBuilder>
52class RouteInstructionAgent
CLASS_FINAL :
public NavigationAgent
55 RouteDescriptionRef prevRoute;
56 std::list<RouteInstruction> instructions;
65template <
typename RouteInstruction,
typename RouteInstructionBuilder>
66RouteInstructionAgent<RouteInstruction, RouteInstructionBuilder>::RouteInstructionAgent() =
default;
68template <
typename RouteInstruction,
typename RouteInstructionBuilder>
69std::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;
#define CLASS_FINAL
Definition Compiler.h:26
RouteInstruction nextRouteInstruction
Definition RouteInstructionAgent.h:44
std::list< NavigationMessageRef > Process(const NavigationMessageRef &message) override
RouteInstructionsMessage(const Timestamp ×tamp, const std::list< RouteInstruction > &instructions)
Definition RouteInstructionAgent.h:35
std::list< RouteInstruction > instructions
Definition RouteInstructionAgent.h:33
NextRouteInstructionsMessage(const Timestamp ×tamp, const RouteInstruction &nextRouteInstruction)
Definition RouteInstructionAgent.h:46
std::vector< VoiceSample > message
Definition VoiceInstructionAgent.h:99
std::chrono::system_clock::time_point Timestamp
Definition Time.h:27
std::shared_ptr< NavigationMessage > NavigationMessageRef
Definition Engine.h:56
NavigationMessage(const Timestamp ×tamp)
const Timestamp timestamp
Definition Engine.h:50