INSTINCT Code Coverage Report


Directory: src/
File: Nodes/DataProvider/GNSS/Sensors/UbloxSensor.cpp
Date: 2025-11-25 23:34:18
Exec Total Coverage
Lines: 15 61 24.6%
Functions: 4 12 33.3%
Branches: 12 66 18.2%

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 #include "UbloxSensor.hpp"
10
11 #include "util/Logger.hpp"
12
13 #include "util/Time/TimeBase.hpp"
14
15 #include "internal/gui/widgets/HelpMarker.hpp"
16
17 #include "internal/FlowManager.hpp"
18
19 #include "NodeData/General/UartPacket.hpp"
20
21 114 NAV::UbloxSensor::UbloxSensor()
22
4/8
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 114 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 114 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 114 times.
✗ Branch 13 not taken.
114 : Node(typeStatic()), _sensor(typeStatic())
23 {
24 LOG_TRACE("{}: called", name);
25
26 114 _onlyRealTime = true;
27 114 _hasConfig = true;
28 114 _guiConfigDefaultWindowSize = { 360, 70 };
29
30 // TODO: Update the library to handle different baudrates
31
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
114 _selectedBaudrate = baudrate2Selection(Baudrate::BAUDRATE_9600);
32
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
114 _sensorPort = "/dev/ttyACM0";
33
34
4/8
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 114 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 114 times.
✓ Branch 10 taken 114 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
456 CreateOutputPin("UartPacket", Pin::Type::Flow, { NAV::UartPacket::type() });
35 228 }
36
37 228 NAV::UbloxSensor::~UbloxSensor()
38 {
39 LOG_TRACE("{}: called", nameId());
40 228 }
41
42 342 std::string NAV::UbloxSensor::typeStatic()
43 {
44
1/2
✓ Branch 1 taken 342 times.
✗ Branch 2 not taken.
684 return "UbloxSensor";
45 }
46
47 std::string NAV::UbloxSensor::type() const
48 {
49 return typeStatic();
50 }
51
52 114 std::string NAV::UbloxSensor::category()
53 {
54
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
228 return "Data Provider";
55 }
56
57 void NAV::UbloxSensor::guiConfig()
58 {
59 if (ImGui::InputTextWithHint("SensorPort", "/dev/ttyACM0", &_sensorPort))
60 {
61 LOG_DEBUG("{}: SensorPort changed to {}", nameId(), _sensorPort);
62 flow::ApplyChanges();
63 doDeinitialize();
64 }
65 ImGui::SameLine();
66 gui::widgets::HelpMarker("COM port where the sensor is attached to\n"
67 "- \"COM1\" (Windows format for physical and virtual (USB) serial port)\n"
68 "- \"/dev/ttyS1\" (Linux format for physical serial port)\n"
69 "- \"/dev/ttyUSB0\" (Linux format for virtual (USB) serial port)\n"
70 "- \"/dev/tty.usbserial-FTXXXXXX\" (Mac OS X format for virtual (USB) serial port)\n"
71 "- \"/dev/ttyS0\" (CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1)");
72 }
73
74 [[nodiscard]] json NAV::UbloxSensor::save() const
75 {
76 LOG_TRACE("{}: called", nameId());
77
78 json j;
79
80 j["UartSensor"] = UartSensor::save();
81
82 return j;
83 }
84
85 void NAV::UbloxSensor::restore(json const& j)
86 {
87 LOG_TRACE("{}: called", nameId());
88
89 if (j.contains("UartSensor"))
90 {
91 UartSensor::restore(j.at("UartSensor"));
92 }
93 }
94
95 bool NAV::UbloxSensor::resetNode()
96 {
97 return true;
98 }
99
100 bool NAV::UbloxSensor::initialize()
101 {
102 LOG_TRACE("{}: called", nameId());
103
104 // connect to the sensor
105 try
106 {
107 _sensor->connect(_sensorPort, sensorBaudrate());
108
109 LOG_DEBUG("{} connected on port {} with baudrate {}", nameId(), _sensorPort, sensorBaudrate());
110 }
111 catch (...)
112 {
113 LOG_ERROR("{} could not connect", nameId());
114 return false;
115 }
116
117 _sensor->registerAsyncPacketReceivedHandler(this, asciiOrBinaryAsyncMessageReceived);
118 _connected = true;
119
120 return true;
121 }
122
123 void NAV::UbloxSensor::deinitialize()
124 {
125 LOG_TRACE("{}: called", nameId());
126
127 if (!_connected) { return; }
128
129 try
130 {
131 _sensor->unregisterAsyncPacketReceivedHandler();
132 LOG_TRACE("{}: Async packet receive handler unregistered", nameId());
133 }
134 catch (...) // NOLINT(bugprone-empty-catch)
135 {}
136
137 try
138 {
139 LOG_TRACE("{}: Disconnecting...", nameId());
140 _sensor->disconnect();
141 LOG_TRACE("{}: Disconnected", nameId());
142 }
143 catch (...) // NOLINT(bugprone-empty-catch)
144 {}
145
146 _connected = false;
147 }
148
149 void NAV::UbloxSensor::asciiOrBinaryAsyncMessageReceived(void* userData, uart::protocol::Packet& p, [[maybe_unused]] size_t index)
150 {
151 auto* ubSensor = static_cast<UbloxSensor*>(userData);
152
153 auto packet = std::make_shared<UartPacket>(p);
154 packet->insTime = util::time::GetCurrentInsTime();
155
156 ubSensor->invokeCallbacks(OUTPUT_PORT_INDEX_UBLOX_OBS, packet);
157 }
158