Diag-Client-Lib
doip_vehicle_discovery_handler.cpp
Go to the documentation of this file.
1 /* Diagnostic Client library
2  * Copyright (C) 2024 Avijit Dey
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8 
10 
11 #include "common/logger.h"
12 #include "utility/state.h"
13 
14 namespace doip_client {
15 namespace channel {
16 namespace udp_channel {
17 namespace {
22 
26 class kIdle final : public utility::state::State<VehicleDiscoveryState> {
27  public:
33  explicit kIdle(VehicleDiscoveryState state) : State<VehicleDiscoveryState>(state) {}
34 
38  void Start() override {}
39 
43  void Stop() override {}
44 };
45 
49 class kWaitForVehicleAnnouncement final : public utility::state::State<VehicleDiscoveryState> {
50  public:
57 
61  void Start() override {}
62 
66  void Stop() override {}
67 };
68 
72 class kDoIPCtrlTimeout final : public utility::state::State<VehicleDiscoveryState> {
73  public:
80 
84  void Start() override {}
85 
89  void Stop() override {}
90 };
91 
92 } // namespace
93 
98  public:
103 
110  : udp_socket_handler_{udp_socket_handler},
111  state_context_{} {
112  // create and add state for vehicle discovery
113  // kIdle
114  state_context_.AddState(VehicleDiscoveryState::kIdle, std::make_unique<kIdle>(VehicleDiscoveryState::kIdle));
115  // kWaitForVehicleAnnouncement
117  VehicleDiscoveryState::kWaitForVehicleAnnouncement,
118  std::make_unique<kWaitForVehicleAnnouncement>(VehicleDiscoveryState::kWaitForVehicleAnnouncement));
119  // kDoIPCtrlTimeout
120  state_context_.AddState(VehicleDiscoveryState::kDoIPCtrlTimeout,
121  std::make_unique<kDoIPCtrlTimeout>(VehicleDiscoveryState::kDoIPCtrlTimeout));
122  // Transit to wait for vehicle announcement
123  state_context_.TransitionTo(VehicleDiscoveryState::kWaitForVehicleAnnouncement);
124  }
125 
131 
136  auto GetSocketHandler() noexcept -> sockets::UdpSocketHandler & { return udp_socket_handler_; }
137 
138  private:
143 
148 };
149 
151  DoipUdpChannel &)
152  : handler_impl_{std::make_unique<VehicleDiscoveryHandlerImpl>(udp_socket_handler)} {}
153 
155 
157  if (handler_impl_->GetStateContext().GetActiveState().GetState() ==
158  VehicleDiscoveryState::kWaitForVehicleAnnouncement) {
159  // Deserialize and Add to task executor
160  logger::DoipClientLogger::GetDiagClientLogger().GetLogger().LogWarn(
161  __FILE__, __LINE__, __func__,
162  [](std::stringstream &msg) { msg << "Processing of vehicle announcement is not implemented"; });
163  } else {
164  // ignore
165  }
166 }
167 
168 } // namespace udp_channel
169 } // namespace channel
170 } // namespace doip_client
Immutable class to store received doip message.
Definition: doip_message.h:21
Class to manage a udp channel as per DoIP protocol.
VehicleDiscoveryHandlerImpl(sockets::UdpSocketHandler &udp_socket_handler)
Constructs an instance of VehicleDiscoveryHandlerImpl.
auto GetSocketHandler() noexcept -> sockets::UdpSocketHandler &
Function to get the socket handler.
auto GetStateContext() noexcept -> VehicleDiscoveryStateContext &
Function to get the Vehicle Discovery State context.
~VehicleDiscoveryHandler()
Destruct an instance of VehicleDiscoveryHandler.
void ProcessVehicleAnnouncementResponse(DoipMessage &doip_payload) noexcept
Function to process received vehicle announcement response.
VehicleDiscoveryHandler(sockets::UdpSocketHandler &udp_socket_handler, DoipUdpChannel &channel)
Constructs an instance of VehicleDiscoveryHandler.
static auto GetDiagClientLogger() noexcept -> DoipClientLogger &
Definition: logger.h:20
Class used to create a udp socket for handling transmission and reception of udp message from driver.
void TransitionTo(EnumState state)
Definition: state.h:69
void AddState(EnumState state, std::unique_ptr< State< EnumState >> state_ptr)
Definition: state.h:58