INSTINCT Code Coverage Report


Directory: src/
File: util/Vendor/Espressif/EspressifUartSensor.hpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 1 2 50.0%
Functions: 1 2 50.0%
Branches: 0 0 -%

Line Branch Exec Source
1 // This file is part of INSTINCT, the INS Toolkit for Integrated
2 // Navigation Concepts and Training by the Institute of Navigation of
3 // the University of Stuttgart, Germany.
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9 /// @file EspressifUartSensor.hpp
10 /// @brief Class to read out Espressif Sensors
11 /// @author R. Lintz (r-lintz@gmx.de) (master thesis)
12 /// @author T. Topp (topp@ins.uni-stuttgart.de)
13 /// @date 2024-01-08
14
15 #pragma once
16
17 #include <memory>
18
19 #include "uart/sensors/sensors.hpp"
20
21 namespace NAV::vendor::espressif
22 {
23 /// @brief Class to read out Espressif Sensors
24 class EspressifUartSensor
25 {
26 public:
27 /// @brief Constructor
28 /// @param[in] name Name of the Parent Node
29 explicit EspressifUartSensor(std::string name);
30
31 /// @brief Default constructor
32 EspressifUartSensor() = default;
33 /// @brief Destructor
34 112 ~EspressifUartSensor() = default;
35 /// @brief Copy constructor
36 EspressifUartSensor(const EspressifUartSensor&) = delete;
37 /// @brief Move constructor
38 EspressifUartSensor(EspressifUartSensor&&) = delete;
39 /// @brief Copy assignment operator
40 EspressifUartSensor& operator=(const EspressifUartSensor&) = delete;
41 /// @brief Move assignment operator
42 EspressifUartSensor& operator=(EspressifUartSensor&&) = delete;
43 /// @brief Arrow operator overload
44 uart::sensors::UartSensor* operator->() { return &_sensor; };
45
46 /// @brief Collects data bytes and searches for packages inside of them
47 /// @param[in] dataByte The next data byte
48 /// @return nullptr if no packet found yet, otherwise a pointer to the packet
49 std::unique_ptr<uart::protocol::Packet> findPacket(uint8_t dataByte);
50
51 static constexpr uint8_t BINARY_SYNC_CHAR_1 = 0xB5; ///< ยต - First sync character which begins a new binary message
52 static constexpr uint8_t BINARY_SYNC_CHAR_2 = 0x62; ///< b - Second sync character which begins a new binary message
53
54 private:
55 /// Name of the Parent Node
56 const std::string _name;
57
58 /// UartSensor object which handles the UART interface
59 uart::sensors::UartSensor _sensor{ ENDIANNESS,
60 packetFinderFunction,
61 this,
62 packetTypeFunction,
63 checksumFunction,
64 isErrorFunction,
65 isResponseFunction,
66 PACKET_HEADER_LENGTH };
67
68 /// @brief Function which is called to find packets in the provided data buffer
69 /// @param[in] data Raw data buffer which has potential packets inside
70 /// @param[in] timestamp Timestamp then the data in the buffer was received
71 /// @param[in] dispatchPacket Function to call when a complete packet was found
72 /// @param[in] dispatchPacketUserData User data to forward to the dispatchPacket function
73 /// @param[in] userData User data provided when regisering this function. Should contain the sensor object
74 static void packetFinderFunction(const std::vector<uint8_t>& data,
75 const uart::xplat::TimeStamp& timestamp,
76 uart::sensors::UartSensor::ValidPacketFoundHandler dispatchPacket, void* dispatchPacketUserData,
77 void* userData);
78
79 /// @brief Function which is called to determine the packet type (ascii/binary)
80 /// @param[in] packet Packet to check the type of
81 /// @return The type of the packet
82 static uart::protocol::Packet::Type packetTypeFunction(const uart::protocol::Packet& packet);
83
84 /// @brief Function which is called to verify packet integrity
85 /// @param[in] packet Packet to calculate the checksum for
86 /// @return True if the packet is fault free
87 static bool checksumFunction(const uart::protocol::Packet& packet);
88
89 /// @brief Function which determines, if the packet is an Error Packet
90 /// @param[in] packet The packet to check
91 static bool isErrorFunction(const uart::protocol::Packet& packet);
92
93 /// @brief Function which determines, if the packet is a Response
94 /// @param[in] packet The packet to check
95 static bool isResponseFunction(const uart::protocol::Packet& packet);
96
97 static constexpr uart::Endianness ENDIANNESS = uart::Endianness::ENDIAN_LITTLE; ///< Endianess of the sensor
98 static constexpr size_t PACKET_HEADER_LENGTH = 2; ///< Length of the header of each packet
99
100 bool _currentlyBuildingBinaryPacket{ false }; ///< Flag if currently a binary packet is built
101
102 bool _binarySyncChar2Found{ false }; ///< Flag if the second binary end character was found
103 bool _binaryPayloadLength1Found{ false }; ///< Flag if the first byte of the payload length was found
104 bool _binaryPayloadLength2Found{ false }; ///< Flag if the second byte of the payload length was found
105
106 /// Payload length of the current packet
107 uint16_t _binaryPayloadLength{ 0 };
108
109 /// Buffer to collect messages till they are complete
110 std::vector<uint8_t> _buffer;
111
112 /// Used for correlating raw data with where the packet was found for the end user.
113 size_t _runningDataIndex{ 0 };
114 /// Amount of bytes remaining for a complete packet
115 size_t _numOfBytesRemainingForCompletePacket{ 0 };
116
117 /// @brief Resets the current message tracking
118 void resetTracking();
119 };
120
121 } // namespace NAV::vendor::espressif
122