INSTINCT Code Coverage Report


Directory: src/
File: NodeData/IMU/VectorNavBinaryOutput.hpp
Date: 2025-06-02 15:19:59
Exec Total Coverage
Lines: 465 1633 28.5%
Functions: 9 13 69.2%
Branches: 790 4430 17.8%

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 VectorNavBinaryOutput.hpp
10 /// @brief Binary Outputs from VectorNav Sensors
11 /// @author T. Topp (topp@ins.uni-stuttgart.de)
12 /// @date 2021-07-01
13
14 #pragma once
15
16 #include <cmath>
17 #include <memory>
18
19 #include "Navigation/GNSS/Core/SatelliteSystem.hpp"
20 #include "NodeData/NodeData.hpp"
21 #include "NodeData/IMU/ImuPos.hpp"
22 #include "util/Eigen.hpp"
23 #include "Navigation/GNSS/Core/SatelliteIdentifier.hpp"
24
25 #include "util/Vendor/VectorNav/BinaryOutputs/TimeOutputs.hpp"
26 #include "util/Vendor/VectorNav/BinaryOutputs/ImuOutputs.hpp"
27 #include "util/Vendor/VectorNav/BinaryOutputs/GnssOutputs.hpp"
28 #include "util/Vendor/VectorNav/BinaryOutputs/AttitudeOutputs.hpp"
29 #include "util/Vendor/VectorNav/BinaryOutputs/InsOutputs.hpp"
30 #include "util/Vendor/VectorNav/VectorNavTypes.hpp"
31 #include <fmt/core.h>
32 #include <sys/types.h>
33 #include <vn/types.h>
34
35 namespace NAV
36 {
37 /// IMU Observation storage class
38 class VectorNavBinaryOutput : public NodeData
39 {
40 public:
41 /// @brief Constructor
42 /// @param[in] imuPos Reference to the position and rotation info of the Imu
43 28715 explicit VectorNavBinaryOutput(const ImuPos& imuPos)
44 28715 : imuPos(imuPos) {}
45
46 /// @brief Returns the type of the data class
47 /// @return The data type
48 582721 [[nodiscard]] static std::string type()
49 {
50
1/2
✓ Branch 1 taken 582721 times.
✗ Branch 2 not taken.
1165442 return "VectorNavBinaryOutput";
51 }
52
53 /// @brief Returns the type of the data class
54 /// @return The data type
55 [[nodiscard]] std::string getType() const override { return type(); }
56
57 /// @brief Returns the parent types of the data class
58 /// @return The parent data types
59 112 [[nodiscard]] static std::vector<std::string> parentTypes()
60 {
61
3/6
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 112 times.
✓ Branch 4 taken 112 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
336 return { NodeData::type() };
62 112 }
63
64 /// @brief Returns a vector of data descriptors
65 38 [[nodiscard]] static std::vector<std::string> GetStaticDataDescriptors()
66 {
67 38 return {};
68 }
69
70 /// @brief Get the amount of descriptors
71 30 [[nodiscard]] static constexpr size_t GetStaticDescriptorCount() { return 0; }
72
73 /// @brief Returns a vector of data descriptors
74 32 [[nodiscard]] std::vector<std::string> staticDataDescriptors() const override { return GetStaticDataDescriptors(); }
75
76 /// @brief Get the amount of descriptors
77 30 [[nodiscard]] size_t staticDescriptorCount() const override { return GetStaticDescriptorCount(); }
78
79 /// @brief Get the value at the index
80 /// @param idx Index corresponding to data descriptor order
81 /// @return Value if in the observation
82 [[nodiscard]] std::optional<double> getValueAt(size_t idx) const override
83 {
84 INS_ASSERT(idx < GetStaticDescriptorCount());
85 switch (idx)
86 {
87 // Group 2 (Time)
88 case 0: // Time::TimeStartup [ns]
89 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)) { return static_cast<double>(timeOutputs->timeStartup); }
90 break;
91 case 1: // Time::TimeGps [ns]
92 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)) { return static_cast<double>(timeOutputs->timeGps); }
93 break;
94 case 2: // Time::GpsTow [ns]
95 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)) { return static_cast<double>(timeOutputs->gpsTow); }
96 break;
97 case 3: // Time::GpsWeek
98 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)) { return static_cast<double>(timeOutputs->gpsWeek); }
99 break;
100 case 4: // Time::TimeSyncIn [ns]
101 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)) { return static_cast<double>(timeOutputs->timeSyncIn); }
102 break;
103 case 5: // Time::TimeGpsPps [ns]
104 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)) { return static_cast<double>(timeOutputs->timePPS); }
105 break;
106 case 6: // Time::TimeUTC::year
107 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.year); }
108 break;
109 case 7: // Time::TimeUTC::month
110 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.month); }
111 break;
112 case 8: // Time::TimeUTC::day
113 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.day); }
114 break;
115 case 9: // Time::TimeUTC::hour
116 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.hour); }
117 break;
118 case 10: // Time::TimeUTC::min
119 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.min); }
120 break;
121 case 11: // Time::TimeUTC::sec
122 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.sec); }
123 break;
124 case 12: // Time::TimeUTC::ms
125 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)) { return static_cast<double>(timeOutputs->timeUtc.ms); }
126 break;
127 case 13: // Time::SyncInCnt
128 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)) { return static_cast<double>(timeOutputs->syncInCnt); }
129 break;
130 case 14: // Time::SyncOutCnt
131 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)) { return static_cast<double>(timeOutputs->syncOutCnt); }
132 break;
133 case 15: // Time::TimeStatus::timeOk
134 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)) { return static_cast<double>(timeOutputs->timeStatus.timeOk()); }
135 break;
136 case 16: // Time::TimeStatus::dateOk
137 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)) { return static_cast<double>(timeOutputs->timeStatus.dateOk()); }
138 break;
139 case 17: // Time::TimeStatus::utcTimeValid
140 if (timeOutputs && (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)) { return static_cast<double>(timeOutputs->timeStatus.utcTimeValid()); }
141 break;
142 // Group 3 (IMU)
143 case 18: // IMU::ImuStatus
144 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)) { return static_cast<double>(imuOutputs->imuStatus); }
145 break;
146 case 19: // IMU::UncompMag::X [Gauss]
147 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)) { return static_cast<double>(imuOutputs->uncompMag(0)); }
148 break;
149 case 20: // IMU::UncompMag::Y [Gauss]
150 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)) { return static_cast<double>(imuOutputs->uncompMag(1)); }
151 break;
152 case 21: // IMU::UncompMag::Z [Gauss]
153 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)) { return static_cast<double>(imuOutputs->uncompMag(2)); }
154 break;
155 case 22: // IMU::UncompAccel::X [m/s^2]
156 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)) { return static_cast<double>(imuOutputs->uncompAccel(0)); }
157 break;
158 case 23: // IMU::UncompAccel::Y [m/s^2]
159 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)) { return static_cast<double>(imuOutputs->uncompAccel(1)); }
160 break;
161 case 24: // IMU::UncompAccel::Z [m/s^2]
162 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)) { return static_cast<double>(imuOutputs->uncompAccel(2)); }
163 break;
164 case 25: // IMU::UncompGyro::X [rad/s]
165 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)) { return static_cast<double>(imuOutputs->uncompGyro(0)); }
166 break;
167 case 26: // IMU::UncompGyro::Y [rad/s]
168 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)) { return static_cast<double>(imuOutputs->uncompGyro(1)); }
169 break;
170 case 27: // IMU::UncompGyro::Z [rad/s]
171 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)) { return static_cast<double>(imuOutputs->uncompGyro(2)); }
172 break;
173 case 28: // IMU::Temp [Celsius]
174 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)) { return static_cast<double>(imuOutputs->temp); }
175 break;
176 case 29: // IMU::Pres [kPa]
177 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)) { return static_cast<double>(imuOutputs->pres); }
178 break;
179 case 30: // IMU::DeltaTime [s]
180 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)) { return static_cast<double>(imuOutputs->deltaTime); }
181 break;
182 case 31: // IMU::DeltaTheta::X [deg]
183 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)) { return static_cast<double>(imuOutputs->deltaTheta(0)); }
184 break;
185 case 32: // IMU::DeltaTheta::Y [deg]
186 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)) { return static_cast<double>(imuOutputs->deltaTheta(1)); }
187 break;
188 case 33: // IMU::DeltaTheta::Z [deg]
189 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)) { return static_cast<double>(imuOutputs->deltaTheta(2)); }
190 break;
191 case 34: // IMU::DeltaVel::X [m/s]
192 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)) { return static_cast<double>(imuOutputs->deltaV(0)); }
193 break;
194 case 35: // IMU::DeltaVel::Y [m/s]
195 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)) { return static_cast<double>(imuOutputs->deltaV(1)); }
196 break;
197 case 36: // IMU::DeltaVel::Z [m/s]
198 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)) { return static_cast<double>(imuOutputs->deltaV(2)); }
199 break;
200 case 37: // IMU::Mag::X [Gauss]
201 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)) { return static_cast<double>(imuOutputs->mag(0)); }
202 break;
203 case 38: // IMU::Mag::Y [Gauss]
204 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)) { return static_cast<double>(imuOutputs->mag(1)); }
205 break;
206 case 39: // IMU::Mag::Z [Gauss]
207 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)) { return static_cast<double>(imuOutputs->mag(2)); }
208 break;
209 case 40: // IMU::Accel::X [m/s^2]
210 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)) { return static_cast<double>(imuOutputs->accel(0)); }
211 break;
212 case 41: // IMU::Accel::Y [m/s^2]
213 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)) { return static_cast<double>(imuOutputs->accel(1)); }
214 break;
215 case 42: // IMU::Accel::Z [m/s^2]
216 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)) { return static_cast<double>(imuOutputs->accel(2)); }
217 break;
218 case 43: // IMU::AngularRate::X [rad/s]
219 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)) { return static_cast<double>(imuOutputs->angularRate(0)); }
220 break;
221 case 44: // IMU::AngularRate::Y [rad/s]
222 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)) { return static_cast<double>(imuOutputs->angularRate(1)); }
223 break;
224 case 45: // IMU::AngularRate::Z [rad/s]
225 if (imuOutputs && (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)) { return static_cast<double>(imuOutputs->angularRate(2)); }
226 break;
227 // Group 4 (GNSS1)
228 case 46: // GNSS1::UTC::year
229 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.year); }
230 break;
231 case 47: // GNSS1::UTC::month
232 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.month); }
233 break;
234 case 48: // GNSS1::UTC::day
235 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.day); }
236 break;
237 case 49: // GNSS1::UTC::hour
238 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.hour); }
239 break;
240 case 50: // GNSS1::UTC::min
241 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.min); }
242 break;
243 case 51: // GNSS1::UTC::sec
244 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.sec); }
245 break;
246 case 52: // GNSS1::UTC::ms
247 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss1Outputs->timeUtc.ms); }
248 break;
249 case 53: // GNSS1::Tow [ns]
250 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)) { return static_cast<double>(gnss1Outputs->tow); }
251 break;
252 case 54: // GNSS1::Week
253 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)) { return static_cast<double>(gnss1Outputs->week); }
254 break;
255 case 55: // GNSS1::NumSats
256 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)) { return static_cast<double>(gnss1Outputs->numSats); }
257 break;
258 case 56: // GNSS1::Fix
259 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)) { return static_cast<double>(gnss1Outputs->fix); }
260 break;
261 case 57: // GNSS1::PosLla::latitude [deg]
262 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss1Outputs->posLla(0); }
263 break;
264 case 58: // GNSS1::PosLla::longitude [deg]
265 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss1Outputs->posLla(1); }
266 break;
267 case 59: // GNSS1::PosLla::altitude [m]
268 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss1Outputs->posLla(2); }
269 break;
270 case 60: // GNSS1::PosEcef::X [m]
271 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss1Outputs->posEcef(0); }
272 break;
273 case 61: // GNSS1::PosEcef::Y [m]
274 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss1Outputs->posEcef(1); }
275 break;
276 case 62: // GNSS1::PosEcef::Z [m]
277 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss1Outputs->posEcef(2); }
278 break;
279 case 63: // GNSS1::VelNed::N [m/s]
280 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss1Outputs->velNed(0)); }
281 break;
282 case 64: // GNSS1::VelNed::E [m/s]
283 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss1Outputs->velNed(1)); }
284 break;
285 case 65: // GNSS1::VelNed::D [m/s]
286 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss1Outputs->velNed(2)); }
287 break;
288 case 66: // GNSS1::VelEcef::X [m/s]
289 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss1Outputs->velEcef(0)); }
290 break;
291 case 67: // GNSS1::VelEcef::Y [m/s]
292 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss1Outputs->velEcef(1)); }
293 break;
294 case 68: // GNSS1::VelEcef::Z [m/s]
295 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss1Outputs->velEcef(2)); }
296 break;
297 case 69: // GNSS1::PosU::N [m]
298 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss1Outputs->posU(0)); }
299 break;
300 case 70: // GNSS1::PosU::E [m]
301 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss1Outputs->posU(1)); }
302 break;
303 case 71: // GNSS1::PosU::D [m]
304 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss1Outputs->posU(2)); }
305 break;
306 case 72: // GNSS1::VelU [m/s]
307 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)) { return static_cast<double>(gnss1Outputs->velU); }
308 break;
309 case 73: // GNSS1::TimeU [s]
310 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)) { return static_cast<double>(gnss1Outputs->timeU); }
311 break;
312 case 74: // GNSS1::TimeInfo::Status::timeOk
313 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss1Outputs->timeInfo.status.timeOk()); }
314 break;
315 case 75: // GNSS1::TimeInfo::Status::dateOk
316 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss1Outputs->timeInfo.status.dateOk()); }
317 break;
318 case 76: // GNSS1::TimeInfo::Status::utcTimeValid
319 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss1Outputs->timeInfo.status.utcTimeValid()); }
320 break;
321 case 77: // GNSS1::TimeInfo::LeapSeconds
322 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss1Outputs->timeInfo.leapSeconds); }
323 break;
324 case 78: // GNSS1::DOP::g
325 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.gDop); }
326 break;
327 case 79: // GNSS1::DOP::p
328 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.pDop); }
329 break;
330 case 80: // GNSS1::DOP::t
331 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.tDop); }
332 break;
333 case 81: // GNSS1::DOP::v
334 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.vDop); }
335 break;
336 case 82: // GNSS1::DOP::h
337 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.hDop); }
338 break;
339 case 83: // GNSS1::DOP::n
340 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.nDop); }
341 break;
342 case 84: // GNSS1::DOP::e
343 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss1Outputs->dop.eDop); }
344 break;
345 case 85: // GNSS1::SatInfo::NumSats
346 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)) { return static_cast<double>(gnss1Outputs->satInfo.numSats); }
347 break;
348 case 86: // GNSS1::RawMeas::Tow [s]
349 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return gnss1Outputs->raw.tow; }
350 break;
351 case 87: // GNSS1::RawMeas::Week
352 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return static_cast<double>(gnss1Outputs->raw.week); }
353 break;
354 case 88: // GNSS1::RawMeas::NumSats
355 if (gnss1Outputs && (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return static_cast<double>(gnss1Outputs->raw.numSats); }
356 break;
357 // Group 5 (Attitude)
358 case 89: // Att::VpeStatus::AttitudeQuality
359 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.attitudeQuality()); }
360 break;
361 case 90: // Att::VpeStatus::GyroSaturation
362 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturation()); }
363 break;
364 case 91: // Att::VpeStatus::GyroSaturationRecovery
365 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturationRecovery()); }
366 break;
367 case 92: // Att::VpeStatus::MagDisturbance
368 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.magDisturbance()); }
369 break;
370 case 93: // Att::VpeStatus::MagSaturation
371 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.magSaturation()); }
372 break;
373 case 94: // Att::VpeStatus::AccDisturbance
374 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.accDisturbance()); }
375 break;
376 case 95: // Att::VpeStatus::AccSaturation
377 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.accSaturation()); }
378 break;
379 case 96: // Att::VpeStatus::KnownMagDisturbance
380 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.knownMagDisturbance()); }
381 break;
382 case 97: // Att::VpeStatus::KnownAccelDisturbance
383 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)) { return static_cast<double>(attitudeOutputs->vpeStatus.knownAccelDisturbance()); }
384 break;
385 case 98: // Att::YawPitchRoll::Y [deg]
386 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)) { return static_cast<double>(attitudeOutputs->ypr(0)); }
387 break;
388 case 99: // Att::YawPitchRoll::P [deg]
389 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)) { return static_cast<double>(attitudeOutputs->ypr(1)); }
390 break;
391 case 100: // Att::YawPitchRoll::R [deg]
392 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)) { return static_cast<double>(attitudeOutputs->ypr(2)); }
393 break;
394 case 101: // Att::Quaternion::w
395 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)) { return static_cast<double>(attitudeOutputs->qtn.w()); }
396 break;
397 case 102: // Att::Quaternion::x
398 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)) { return static_cast<double>(attitudeOutputs->qtn.x()); }
399 break;
400 case 103: // Att::Quaternion::y
401 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)) { return static_cast<double>(attitudeOutputs->qtn.y()); }
402 break;
403 case 104: // Att::Quaternion::z
404 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)) { return static_cast<double>(attitudeOutputs->qtn.z()); }
405 break;
406 case 105: // Att::DCM::0-0
407 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(0, 0)); }
408 break;
409 case 106: // Att::DCM::0-1
410 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(0, 1)); }
411 break;
412 case 107: // Att::DCM::0-2
413 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(0, 2)); }
414 break;
415 case 108: // Att::DCM::1-0
416 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(1, 0)); }
417 break;
418 case 109: // Att::DCM::1-1
419 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(1, 1)); }
420 break;
421 case 110: // Att::DCM::1-2
422 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(1, 2)); }
423 break;
424 case 111: // Att::DCM::2-0
425 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(2, 0)); }
426 break;
427 case 112: // Att::DCM::2-1
428 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(2, 1)); }
429 break;
430 case 113: // Att::DCM::2-2
431 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)) { return static_cast<double>(attitudeOutputs->dcm(2, 2)); }
432 break;
433 case 114: // Att::MagNed::N [Gauss]
434 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)) { return static_cast<double>(attitudeOutputs->magNed(0)); }
435 break;
436 case 115: // Att::MagNed::E [Gauss]
437 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)) { return static_cast<double>(attitudeOutputs->magNed(1)); }
438 break;
439 case 116: // Att::MagNed::D [Gauss]
440 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)) { return static_cast<double>(attitudeOutputs->magNed(2)); }
441 break;
442 case 117: // Att::AccelNed::N [m/s^2]
443 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)) { return static_cast<double>(attitudeOutputs->accelNed(0)); }
444 break;
445 case 118: // Att::AccelNed::E [m/s^2]
446 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)) { return static_cast<double>(attitudeOutputs->accelNed(1)); }
447 break;
448 case 119: // Att::AccelNed::D [m/s^2]
449 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)) { return static_cast<double>(attitudeOutputs->accelNed(2)); }
450 break;
451 case 120: // Att::LinearAccelBody::X [m/s^2]
452 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)) { return static_cast<double>(attitudeOutputs->linearAccelBody(0)); }
453 break;
454 case 121: // Att::LinearAccelBody::Y [m/s^2]
455 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)) { return static_cast<double>(attitudeOutputs->linearAccelBody(1)); }
456 break;
457 case 122: // Att::LinearAccelBody::Z [m/s^2]
458 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)) { return static_cast<double>(attitudeOutputs->linearAccelBody(2)); }
459 break;
460 case 123: // Att::LinearAccelNed::N [m/s^2]
461 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)) { return static_cast<double>(attitudeOutputs->linearAccelNed(0)); }
462 break;
463 case 124: // Att::LinearAccelNed::E [m/s^2]
464 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)) { return static_cast<double>(attitudeOutputs->linearAccelNed(1)); }
465 break;
466 case 125: // Att::LinearAccelNed::D [m/s^2]
467 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)) { return static_cast<double>(attitudeOutputs->linearAccelNed(2)); }
468 break;
469 case 126: // Att::YprU::Y [deg]
470 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)) { return static_cast<double>(attitudeOutputs->yprU(0)); }
471 break;
472 case 127: // Att::YprU::P [deg]
473 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)) { return static_cast<double>(attitudeOutputs->yprU(1)); }
474 break;
475 case 128: // Att::YprU::R [deg]
476 if (attitudeOutputs && (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)) { return static_cast<double>(attitudeOutputs->yprU(2)); }
477 break;
478 // Group 6 (INS)
479 case 129: // INS::InsStatus::Mode
480 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.mode()); }
481 break;
482 case 130: // INS::InsStatus::GpsFix
483 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.gpsFix()); }
484 break;
485 case 131: // INS::InsStatus::Error::IMU
486 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.errorIMU()); }
487 break;
488 case 132: // INS::InsStatus::Error::MagPres
489 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.errorMagPres()); }
490 break;
491 case 133: // INS::InsStatus::Error::GNSS
492 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.errorGnss()); }
493 break;
494 case 134: // INS::InsStatus::GpsHeadingIns
495 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.gpsHeadingIns()); }
496 break;
497 case 135: // INS::InsStatus::GpsCompass
498 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)) { return static_cast<double>(insOutputs->insStatus.gpsCompass()); }
499 break;
500 case 136: // INS::PosLla::latitude [deg]
501 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)) { return insOutputs->posLla(0); }
502 break;
503 case 137: // INS::PosLla::longitude [deg]
504 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)) { return insOutputs->posLla(1); }
505 break;
506 case 138: // INS::PosLla::altitude [m]
507 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)) { return insOutputs->posLla(2); }
508 break;
509 case 139: // INS::PosEcef::X [m]
510 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)) { return insOutputs->posEcef(0); }
511 break;
512 case 140: // INS::PosEcef::Y [m]
513 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)) { return insOutputs->posEcef(1); }
514 break;
515 case 141: // INS::PosEcef::Z [m]
516 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)) { return insOutputs->posEcef(2); }
517 break;
518 case 142: // INS::VelBody::X [m/s]
519 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)) { return static_cast<double>(insOutputs->velBody(0)); }
520 break;
521 case 143: // INS::VelBody::Y [m/s]
522 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)) { return static_cast<double>(insOutputs->velBody(1)); }
523 break;
524 case 144: // INS::VelBody::Z [m/s]
525 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)) { return static_cast<double>(insOutputs->velBody(2)); }
526 break;
527 case 145: // INS::VelNed::N [m/s]
528 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)) { return static_cast<double>(insOutputs->velNed(0)); }
529 break;
530 case 146: // INS::VelNed::E [m/s]
531 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)) { return static_cast<double>(insOutputs->velNed(1)); }
532 break;
533 case 147: // INS::VelNed::D [m/s]
534 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)) { return static_cast<double>(insOutputs->velNed(2)); }
535 break;
536 case 148: // INS::VelEcef::X [m/s]
537 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)) { return static_cast<double>(insOutputs->velEcef(0)); }
538 break;
539 case 149: // INS::VelEcef::Y [m/s]
540 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)) { return static_cast<double>(insOutputs->velEcef(1)); }
541 break;
542 case 150: // INS::VelEcef::Z [m/s]
543 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)) { return static_cast<double>(insOutputs->velEcef(2)); }
544 break;
545 case 151: // INS::MagEcef::X [Gauss}
546 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)) { return static_cast<double>(insOutputs->magEcef(0)); }
547 break;
548 case 152: // INS::MagEcef::Y [Gauss}
549 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)) { return static_cast<double>(insOutputs->magEcef(1)); }
550 break;
551 case 153: // INS::MagEcef::Z [Gauss}
552 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)) { return static_cast<double>(insOutputs->magEcef(2)); }
553 break;
554 case 154: // INS::AccelEcef::X [m/s^2]
555 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)) { return static_cast<double>(insOutputs->accelEcef(0)); }
556 break;
557 case 155: // INS::AccelEcef::Y [m/s^2]
558 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)) { return static_cast<double>(insOutputs->accelEcef(1)); }
559 break;
560 case 156: // INS::AccelEcef::Z [m/s^2]
561 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)) { return static_cast<double>(insOutputs->accelEcef(2)); }
562 break;
563 case 157: // INS::LinearAccelEcef::X [m/s^2]
564 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)) { return static_cast<double>(insOutputs->linearAccelEcef(0)); }
565 break;
566 case 158: // INS::LinearAccelEcef::Y [m/s^2]
567 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)) { return static_cast<double>(insOutputs->linearAccelEcef(1)); }
568 break;
569 case 159: // INS::LinearAccelEcef::Z [m/s^2]
570 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)) { return static_cast<double>(insOutputs->linearAccelEcef(2)); }
571 break;
572 case 160: // INS::PosU [m]
573 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)) { return static_cast<double>(insOutputs->posU); }
574 break;
575 case 161: // INS::VelU [m/s]
576 if (insOutputs && (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)) { return static_cast<double>(insOutputs->velU); }
577 break;
578 // Group 7 (GNSS2)
579 case 162: // GNSS2::UTC::year
580 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.year); }
581 break;
582 case 163: // GNSS2::UTC::month
583 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.month); }
584 break;
585 case 164: // GNSS2::UTC::day
586 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.day); }
587 break;
588 case 165: // GNSS2::UTC::hour
589 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.hour); }
590 break;
591 case 166: // GNSS2::UTC::min
592 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.min); }
593 break;
594 case 167: // GNSS2::UTC::sec
595 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.sec); }
596 break;
597 case 168: // GNSS2::UTC::ms
598 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)) { return static_cast<double>(gnss2Outputs->timeUtc.ms); }
599 break;
600 case 169: // GNSS2::Tow [ns]
601 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)) { return static_cast<double>(gnss2Outputs->tow); }
602 break;
603 case 170: // GNSS2::Week
604 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)) { return static_cast<double>(gnss2Outputs->week); }
605 break;
606 case 171: // GNSS2::NumSats
607 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)) { return static_cast<double>(gnss2Outputs->numSats); }
608 break;
609 case 172: // GNSS2::Fix
610 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)) { return static_cast<double>(gnss2Outputs->fix); }
611 break;
612 case 173: // GNSS2::PosLla::latitude [deg]
613 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss2Outputs->posLla(0); }
614 break;
615 case 174: // GNSS2::PosLla::longitude [deg]
616 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss2Outputs->posLla(1); }
617 break;
618 case 175: // GNSS2::PosLla::altitude [m]
619 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)) { return gnss2Outputs->posLla(2); }
620 break;
621 case 176: // GNSS2::PosEcef::X [m]
622 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss2Outputs->posEcef(0); }
623 break;
624 case 177: // GNSS2::PosEcef::Y [m]
625 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss2Outputs->posEcef(1); }
626 break;
627 case 178: // GNSS2::PosEcef::Z [m]
628 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)) { return gnss2Outputs->posEcef(2); }
629 break;
630 case 179: // GNSS2::VelNed::N [m/s]
631 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss2Outputs->velNed(0)); }
632 break;
633 case 180: // GNSS2::VelNed::E [m/s]
634 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss2Outputs->velNed(1)); }
635 break;
636 case 181: // GNSS2::VelNed::D [m/s]
637 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)) { return static_cast<double>(gnss2Outputs->velNed(2)); }
638 break;
639 case 182: // GNSS2::VelEcef::X [m/s]
640 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss2Outputs->velEcef(0)); }
641 break;
642 case 183: // GNSS2::VelEcef::Y [m/s]
643 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss2Outputs->velEcef(1)); }
644 break;
645 case 184: // GNSS2::VelEcef::Z [m/s]
646 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)) { return static_cast<double>(gnss2Outputs->velEcef(2)); }
647 break;
648 case 185: // GNSS2::PosU::N [m]
649 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss2Outputs->posU(0)); }
650 break;
651 case 186: // GNSS2::PosU::E [m]
652 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss2Outputs->posU(1)); }
653 break;
654 case 187: // GNSS2::PosU::D [m]
655 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)) { return static_cast<double>(gnss2Outputs->posU(2)); }
656 break;
657 case 188: // GNSS2::VelU [m/s]
658 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)) { return static_cast<double>(gnss2Outputs->velU); }
659 break;
660 case 189: // GNSS2::TimeU [s]
661 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)) { return static_cast<double>(gnss2Outputs->timeU); }
662 break;
663 case 190: // GNSS2::TimeInfo::Status::timeOk
664 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss2Outputs->timeInfo.status.timeOk()); }
665 break;
666 case 191: // GNSS2::TimeInfo::Status::dateOk
667 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss2Outputs->timeInfo.status.dateOk()); }
668 break;
669 case 192: // GNSS2::TimeInfo::Status::utcTimeValid
670 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss2Outputs->timeInfo.status.utcTimeValid()); }
671 break;
672 case 193: // GNSS2::TimeInfo::LeapSeconds
673 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)) { return static_cast<double>(gnss2Outputs->timeInfo.leapSeconds); }
674 break;
675 case 194: // GNSS2::DOP::g
676 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.gDop); }
677 break;
678 case 195: // GNSS2::DOP::p
679 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.pDop); }
680 break;
681 case 196: // GNSS2::DOP::t
682 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.tDop); }
683 break;
684 case 197: // GNSS2::DOP::v
685 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.vDop); }
686 break;
687 case 198: // GNSS2::DOP::h
688 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.hDop); }
689 break;
690 case 199: // GNSS2::DOP::n
691 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.nDop); }
692 break;
693 case 200: // GNSS2::DOP::e
694 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)) { return static_cast<double>(gnss2Outputs->dop.eDop); }
695 break;
696 case 201: // GNSS2::SatInfo::NumSats
697 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)) { return static_cast<double>(gnss2Outputs->satInfo.numSats); }
698 break;
699 case 202: // GNSS2::RawMeas::Tow [s]
700 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return gnss2Outputs->raw.tow; }
701 break;
702 case 203: // GNSS2::RawMeas::Week
703 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return static_cast<double>(gnss2Outputs->raw.week); }
704 break;
705 case 204: // GNSS2::RawMeas::NumSats
706 if (gnss2Outputs && (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)) { return static_cast<double>(gnss2Outputs->raw.numSats); }
707 break;
708 default:
709 return std::nullopt;
710 }
711 return std::nullopt;
712 }
713
714 /// @brief Get the Sat Sys object in "INSTINCT" format
715 /// @param[in, out] sys VectorNav Satellite Constellation
716 /// @return Satellite System in "INSTINCT" format
717 [[nodiscard]] static SatelliteSystem getSatSys(vendor::vectornav::SatSys& sys)
718 {
719 SatelliteSystem satSys = SatSys_None;
720 switch (sys)
721 {
722 case vendor::vectornav::SatSys::GPS:
723 satSys = GPS;
724 break;
725 case vendor::vectornav::SatSys::SBAS:
726 satSys = SBAS;
727 break;
728 case vendor::vectornav::SatSys::Galileo:
729 satSys = GAL;
730 break;
731 case vendor::vectornav::SatSys::BeiDou:
732 satSys = BDS;
733 break;
734 case vendor::vectornav::SatSys::IMES:
735 LOG_TRACE("VectorNav SatInfoElement satellite system '{}' is not supported yet. Skipping measurement.", sys);
736 break;
737 case vendor::vectornav::SatSys::QZSS:
738 satSys = QZSS;
739 break;
740 case vendor::vectornav::SatSys::GLONASS:
741 satSys = GLO;
742 break;
743 default: // IRNSS not in vectorNav
744 LOG_TRACE("VectorNav SatInfoElement satellite system '{}' is not supported yet. Skipping measurement.", sys);
745 break;
746 }
747 return satSys;
748 }
749
750 /// @brief Returns a vector of data descriptors for the dynamic data
751 30 [[nodiscard]] std::vector<std::string> dynamicDataDescriptors() const override
752 {
753 30 std::vector<std::string> descriptors;
754
755 // Group 2 (Time)
756
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 if (timeOutputs)
757 {
758
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)
759 {
760
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::TimeStartup [ns]");
761 }
762
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)
763 {
764 descriptors.emplace_back("Time::TimeGps [ns]");
765 }
766
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)
767 {
768
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::GpsTow [ns]");
769 }
770
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
29 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)
771 {
772
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::GpsWeek");
773 }
774
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)
775 {
776 descriptors.emplace_back("Time::TimeSyncIn [ns]");
777 }
778
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)
779 {
780 descriptors.emplace_back("Time::TimeGpsPps [ns]");
781 }
782
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)
783 {
784
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::year");
785
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::month");
786
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::day");
787
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::hour");
788
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::min");
789
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::sec");
790
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("Time::TimeUTC::ms");
791 }
792
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)
793 {
794 descriptors.emplace_back("Time::SyncInCnt");
795 }
796
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)
797 {
798 descriptors.emplace_back("Time::SyncOutCnt");
799 }
800
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
801 {
802
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::TimeStatus::timeOk");
803
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::TimeStatus::dateOk");
804
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Time::TimeStatus::utcTimeValid");
805 }
806 }
807 // Group 3 (IMU)
808
2/2
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 12 times.
30 if (imuOutputs)
809 {
810
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)
811 {
812 descriptors.emplace_back("IMU::ImuStatus");
813 }
814
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)
815 {
816
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompMag::X [Gauss]");
817
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompMag::Y [Gauss]");
818
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompMag::Z [Gauss]");
819 }
820
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)
821 {
822
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompAccel::X [m/s^2]");
823
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompAccel::Y [m/s^2]");
824
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompAccel::Z [m/s^2]");
825 }
826
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)
827 {
828
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompGyro::X [rad/s]");
829
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompGyro::Y [rad/s]");
830
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::UncompGyro::Z [rad/s]");
831 }
832
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)
833 {
834
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Temp [Celsius]");
835 }
836
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)
837 {
838
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Pres [kPa]");
839 }
840
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)
841 {
842
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaTime [s]");
843
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaTheta::X [deg]");
844
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaTheta::Y [deg]");
845
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaTheta::Z [deg]");
846 }
847
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)
848 {
849
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaVel::X [m/s]");
850
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaVel::Y [m/s]");
851
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::DeltaVel::Z [m/s]");
852 }
853
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)
854 {
855
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Mag::X [Gauss]");
856
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Mag::Y [Gauss]");
857
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Mag::Z [Gauss]");
858 }
859
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)
860 {
861
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Accel::X [m/s^2]");
862
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Accel::Y [m/s^2]");
863
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::Accel::Z [m/s^2]");
864 }
865
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)
866 {
867
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::AngularRate::X [rad/s]");
868
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::AngularRate::Y [rad/s]");
869
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 descriptors.emplace_back("IMU::AngularRate::Z [rad/s]");
870 }
871 }
872 // Group 4 (GNSS1)
873
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 if (gnss1Outputs)
874 {
875
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
876 {
877
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::year");
878
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::month");
879
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::day");
880
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::hour");
881
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::min");
882
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::sec");
883
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::UTC::ms");
884 }
885
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
886 {
887
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::Tow [ns]");
888 }
889
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
890 {
891
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::Week");
892 }
893
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
894 {
895
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::NumSats");
896 }
897
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
898 {
899
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::Fix");
900 }
901
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
902 {
903
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosLla::latitude [deg]");
904
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosLla::longitude [deg]");
905
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosLla::altitude [m]");
906 }
907
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
908 {
909
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosEcef::X [m]");
910
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosEcef::Y [m]");
911
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosEcef::Z [m]");
912 }
913
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
914 {
915
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelNed::N [m/s]");
916
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelNed::E [m/s]");
917
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelNed::D [m/s]");
918 }
919
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
920 {
921
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelEcef::X [m/s]");
922
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelEcef::Y [m/s]");
923
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelEcef::Z [m/s]");
924 }
925
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
926 {
927
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosU::N [m]");
928
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosU::E [m]");
929
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::PosU::D [m]");
930 }
931
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
932 {
933
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::VelU [m/s]");
934 }
935
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
936 {
937
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::TimeU [s]");
938 }
939
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
940 {
941
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::TimeInfo::Status::timeOk");
942
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::TimeInfo::Status::dateOk");
943
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::TimeInfo::Status::utcTimeValid");
944
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("GNSS1::TimeInfo::LeapSeconds");
945 }
946
3/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 18 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
947 {
948
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::g");
949
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::p");
950
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::t");
951
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::v");
952
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::h");
953
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::n");
954
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS1::DOP::e");
955 }
956
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
957 {
958 descriptors.emplace_back("GNSS1::SatInfo::NumSats");
959 for (auto& satellite : gnss1Outputs->satInfo.satellites)
960 {
961 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
962 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag Healthy", satId));
963 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag Almanac", satId));
964 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag Ephemeris", satId));
965 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag DifferentialCorrection", satId));
966 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag UsedForNavigation", satId));
967 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag AzimuthElevationValid", satId));
968 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - flag UsedForRTK", satId));
969 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - cno", satId));
970 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - qi", satId));
971 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - el", satId));
972 descriptors.push_back(fmt::format("GNSS1::SatInfo::{} - az", satId));
973 }
974 }
975
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
976 {
977 descriptors.emplace_back("GNSS1::RawMeas::Tow [s]");
978 descriptors.emplace_back("GNSS1::RawMeas::Week");
979 descriptors.emplace_back("GNSS1::RawMeas::NumSats");
980 for (auto& satellite : gnss1Outputs->raw.satellites)
981 {
982 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
983 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - sys", satId));
984 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - svId", satId));
985 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - freq", satId));
986 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - chan", satId));
987 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - slot", satId));
988 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - cno", satId));
989 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag Searching", satId));
990 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag Tracking", satId));
991 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag TimeValid", satId));
992 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag CodeLock", satId));
993 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseLock", satId));
994 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfAmbiguity", satId));
995 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfSub", satId));
996 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseSlip", satId));
997 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - flag PseudorangeSmoothed", satId));
998 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - pr", satId));
999 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - cp", satId));
1000 descriptors.push_back(fmt::format("GNSS1::RawMeas::{} - dp", satId));
1001 }
1002 }
1003 }
1004 // Group 5 (Attitude)
1005
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 if (attitudeOutputs)
1006 {
1007
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)
1008 {
1009 descriptors.emplace_back("Att::VpeStatus::AttitudeQuality");
1010 descriptors.emplace_back("Att::VpeStatus::GyroSaturation");
1011 descriptors.emplace_back("Att::VpeStatus::GyroSaturationRecovery");
1012 descriptors.emplace_back("Att::VpeStatus::MagDisturbance");
1013 descriptors.emplace_back("Att::VpeStatus::MagSaturation");
1014 descriptors.emplace_back("Att::VpeStatus::AccDisturbance");
1015 descriptors.emplace_back("Att::VpeStatus::AccSaturation");
1016 descriptors.emplace_back("Att::VpeStatus::KnownMagDisturbance");
1017 descriptors.emplace_back("Att::VpeStatus::KnownAccelDisturbance");
1018 }
1019
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)
1020 {
1021
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YawPitchRoll::Y [deg]");
1022
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YawPitchRoll::P [deg]");
1023
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YawPitchRoll::R [deg]");
1024 }
1025
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)
1026 {
1027
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::Quaternion::w");
1028
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::Quaternion::x");
1029
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::Quaternion::y");
1030
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::Quaternion::z");
1031 }
1032
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)
1033 {
1034 descriptors.emplace_back("Att::DCM::0-0,Att::DCM::0-1,Att::DCM::0-2");
1035 descriptors.emplace_back("Att::DCM::1-0,Att::DCM::1-1,Att::DCM::1-2");
1036 descriptors.emplace_back("Att::DCM::2-0,Att::DCM::2-1,Att::DCM::2-2");
1037 }
1038
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)
1039 {
1040 descriptors.emplace_back("Att::MagNed::N [Gauss]");
1041 descriptors.emplace_back("Att::MagNed::E [Gauss]");
1042 descriptors.emplace_back("Att::MagNed::D [Gauss]");
1043 }
1044
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)
1045 {
1046 descriptors.emplace_back("Att::AccelNed::N [m/s^2]");
1047 descriptors.emplace_back("Att::AccelNed::E [m/s^2]");
1048 descriptors.emplace_back("Att::AccelNed::D [m/s^2]");
1049 }
1050
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)
1051 {
1052 descriptors.emplace_back("Att::LinearAccelBody::X [m/s^2]");
1053 descriptors.emplace_back("Att::LinearAccelBody::Y [m/s^2]");
1054 descriptors.emplace_back("Att::LinearAccelBody::Z [m/s^2]");
1055 }
1056
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)
1057 {
1058 descriptors.emplace_back("Att::LinearAccelNed::N [m/s^2]");
1059 descriptors.emplace_back("Att::LinearAccelNed::E [m/s^2]");
1060 descriptors.emplace_back("Att::LinearAccelNed::D [m/s^2]");
1061 }
1062
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)
1063 {
1064
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YprU::Y [deg]");
1065
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YprU::P [deg]");
1066
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 descriptors.emplace_back("Att::YprU::R [deg]");
1067 }
1068 }
1069 // Group 6 (INS)
1070
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 18 times.
30 if (insOutputs)
1071 {
1072
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
1073 {
1074
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::Mode");
1075
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::GpsFix");
1076
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::Error::IMU");
1077
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::Error::MagPres");
1078
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::Error::GNSS");
1079
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::GpsHeadingIns");
1080
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::InsStatus::GpsCompass");
1081 }
1082
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)
1083 {
1084
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosLla::latitude [deg]");
1085
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosLla::longitude [deg]");
1086
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosLla::altitude [m]");
1087 }
1088
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)
1089 {
1090
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosEcef::X [m]");
1091
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosEcef::Y [m]");
1092
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosEcef::Z [m]");
1093 }
1094
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)
1095 {
1096
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelBody::X [m/s]");
1097
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelBody::Y [m/s]");
1098
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelBody::Z [m/s]");
1099 }
1100
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)
1101 {
1102
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelNed::N [m/s]");
1103
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelNed::E [m/s]");
1104
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelNed::D [m/s]");
1105 }
1106
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)
1107 {
1108
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelEcef::X [m/s]");
1109
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelEcef::Y [m/s]");
1110
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelEcef::Z [m/s]");
1111 }
1112
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)
1113 {
1114
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::MagEcef::X [Gauss]");
1115
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::MagEcef::Y [Gauss]");
1116
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::MagEcef::Z [Gauss]");
1117 }
1118
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)
1119 {
1120
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::AccelEcef::X [m/s^2]");
1121
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::AccelEcef::Y [m/s^2]");
1122
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::AccelEcef::Z [m/s^2]");
1123 }
1124
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)
1125 {
1126
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::LinearAccelEcef::X [m/s^2]");
1127
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::LinearAccelEcef::Y [m/s^2]");
1128
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::LinearAccelEcef::Z [m/s^2]");
1129 }
1130
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)
1131 {
1132
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::PosU [m]");
1133 }
1134
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)
1135 {
1136
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("INS::VelU [m/s]");
1137 }
1138 }
1139 // Group 7 (GNSS2)
1140
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 18 times.
30 if (gnss2Outputs)
1141 {
1142
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1143 {
1144
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::year");
1145
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::month");
1146
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::day");
1147
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::hour");
1148
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::min");
1149
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::sec");
1150
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::UTC::ms");
1151 }
1152
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1153 {
1154
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::Tow [ns]");
1155 }
1156
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1157 {
1158
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::Week");
1159 }
1160
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1161 {
1162
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::NumSats");
1163 }
1164
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1165 {
1166
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::Fix");
1167 }
1168
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1169 {
1170
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosLla::latitude [deg]");
1171
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosLla::longitude [deg]");
1172
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosLla::altitude [m]");
1173 }
1174
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1175 {
1176
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosEcef::X [m]");
1177
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosEcef::Y [m]");
1178
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosEcef::Z [m]");
1179 }
1180
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1181 {
1182
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelNed::N [m/s]");
1183
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelNed::E [m/s]");
1184
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelNed::D [m/s]");
1185 }
1186
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1187 {
1188
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelEcef::X [m/s]");
1189
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelEcef::Y [m/s]");
1190
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelEcef::Z [m/s]");
1191 }
1192
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1193 {
1194
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosU::N [m]");
1195
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosU::E [m]");
1196
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::PosU::D [m]");
1197 }
1198
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1199 {
1200
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::VelU [m/s]");
1201 }
1202
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1203 {
1204
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::TimeU [s]");
1205 }
1206
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1207 {
1208
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::TimeInfo::Status::timeOk");
1209
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::TimeInfo::Status::dateOk");
1210
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::TimeInfo::Status::utcTimeValid");
1211
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::TimeInfo::LeapSeconds");
1212 }
1213
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1214 {
1215
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::g");
1216
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::p");
1217
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::t");
1218
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::v");
1219
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::h");
1220
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::n");
1221
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 descriptors.emplace_back("GNSS2::DOP::e");
1222 }
1223
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1224 {
1225 descriptors.emplace_back("GNSS2::SatInfo::NumSats");
1226 for (auto& satellite : gnss2Outputs->satInfo.satellites)
1227 {
1228 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1229 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag Healthy", satId));
1230 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag Almanac", satId));
1231 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag Ephemeris", satId));
1232 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag DifferentialCorrection", satId));
1233 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag UsedForNavigation", satId));
1234 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag AzimuthElevationValid", satId));
1235 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - flag UsedForRTK", satId));
1236 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - cno", satId));
1237 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - qi", satId));
1238 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - el", satId));
1239 descriptors.push_back(fmt::format("GNSS2::SatInfo::{} - az", satId));
1240 }
1241 }
1242
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
12 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1243 {
1244 descriptors.emplace_back("GNSS2::RawMeas::Tow [s]");
1245 descriptors.emplace_back("GNSS2::RawMeas::Week");
1246 descriptors.emplace_back("GNSS2::RawMeas::NumSats");
1247 for (auto& satellite : gnss2Outputs->raw.satellites)
1248 {
1249 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1250 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - sys", satId));
1251 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - svId", satId));
1252 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - freq", satId));
1253 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - chan", satId));
1254 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - slot", satId));
1255 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - cno", satId));
1256 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag Searching", satId));
1257 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag Tracking", satId));
1258 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag TimeValid", satId));
1259 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag CodeLock", satId));
1260 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseLock", satId));
1261 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfAmbiguity", satId));
1262 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfSub", satId));
1263 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseSlip", satId));
1264 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - flag PseudorangeSmoothed", satId));
1265 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - pr", satId));
1266 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - cp", satId));
1267 descriptors.push_back(fmt::format("GNSS2::RawMeas::{} - dp", satId));
1268 }
1269 }
1270 }
1271
1272 30 return descriptors;
1273 }
1274
1275 /// @brief Get the value for the descriptor
1276 /// @return Value if in the observation
1277 2489 [[nodiscard]] std::optional<double> getDynamicDataAt(const std::string& descriptor) const override
1278 {
1279 // Group 2 (Time)
1280
1/2
✓ Branch 1 taken 2490 times.
✗ Branch 2 not taken.
2489 if (timeOutputs)
1281 {
1282
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2460 times.
2490 if (descriptor == "Time::TimeStartup [ns]") { return static_cast<double>(timeOutputs->timeStartup); }
1283
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2460 times.
2460 if (descriptor == "Time::TimeGps [ns]") { return static_cast<double>(timeOutputs->timeGps); }
1284
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2430 times.
2460 if (descriptor == "Time::GpsTow [ns]") { return static_cast<double>(timeOutputs->gpsTow); }
1285
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2399 times.
2430 if (descriptor == "Time::GpsWeek") { return static_cast<double>(timeOutputs->gpsWeek); }
1286
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2398 times.
2399 if (descriptor == "Time::TimeSyncIn [ns]") { return static_cast<double>(timeOutputs->timeSyncIn); }
1287
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2399 times.
2398 if (descriptor == "Time::TimeGpsPps [ns]") { return static_cast<double>(timeOutputs->timePPS); }
1288
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2387 times.
2399 if (descriptor == "Time::TimeUTC::year") { return static_cast<double>(timeOutputs->timeUtc.year); }
1289
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2375 times.
2387 if (descriptor == "Time::TimeUTC::month") { return static_cast<double>(timeOutputs->timeUtc.month); }
1290
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2362 times.
2375 if (descriptor == "Time::TimeUTC::day") { return static_cast<double>(timeOutputs->timeUtc.day); }
1291
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2350 times.
2362 if (descriptor == "Time::TimeUTC::hour") { return static_cast<double>(timeOutputs->timeUtc.hour); }
1292
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2338 times.
2350 if (descriptor == "Time::TimeUTC::min") { return static_cast<double>(timeOutputs->timeUtc.min); }
1293
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2328 times.
2338 if (descriptor == "Time::TimeUTC::sec") { return static_cast<double>(timeOutputs->timeUtc.sec); }
1294
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2316 times.
2328 if (descriptor == "Time::TimeUTC::ms") { return static_cast<double>(timeOutputs->timeUtc.ms); }
1295
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2315 times.
2316 if (descriptor == "Time::SyncInCnt") { return static_cast<double>(timeOutputs->syncInCnt); }
1296
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2315 times.
2315 if (descriptor == "Time::SyncOutCnt") { return static_cast<double>(timeOutputs->syncOutCnt); }
1297
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2285 times.
2315 if (descriptor == "Time::TimeStatus::timeOk") { return static_cast<double>(timeOutputs->timeStatus.timeOk()); }
1298
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2255 times.
2285 if (descriptor == "Time::TimeStatus::dateOk") { return static_cast<double>(timeOutputs->timeStatus.dateOk()); }
1299
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 2225 times.
2255 if (descriptor == "Time::TimeStatus::utcTimeValid") { return static_cast<double>(timeOutputs->timeStatus.utcTimeValid()); }
1300 }
1301 // Group 3 (IMU)
1302
2/2
✓ Branch 1 taken 774 times.
✓ Branch 2 taken 1451 times.
2224 if (imuOutputs)
1303 {
1304
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 774 times.
774 if (descriptor == "IMU::ImuStatus") { return static_cast<double>(imuOutputs->imuStatus); }
1305
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 756 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
774 if (descriptor == "IMU::UncompMag::X [Gauss]") { return static_cast<double>(imuOutputs->uncompMag(0)); }
1306
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 738 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
756 if (descriptor == "IMU::UncompMag::Y [Gauss]") { return static_cast<double>(imuOutputs->uncompMag(1)); }
1307
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 720 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
738 if (descriptor == "IMU::UncompMag::Z [Gauss]") { return static_cast<double>(imuOutputs->uncompMag(2)); }
1308
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 702 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
720 if (descriptor == "IMU::UncompAccel::X [m/s^2]") { return static_cast<double>(imuOutputs->uncompAccel(0)); }
1309
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 684 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
702 if (descriptor == "IMU::UncompAccel::Y [m/s^2]") { return static_cast<double>(imuOutputs->uncompAccel(1)); }
1310
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 666 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
684 if (descriptor == "IMU::UncompAccel::Z [m/s^2]") { return static_cast<double>(imuOutputs->uncompAccel(2)); }
1311
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 648 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
666 if (descriptor == "IMU::UncompGyro::X [rad/s]") { return static_cast<double>(imuOutputs->uncompGyro(0)); }
1312
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 630 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
648 if (descriptor == "IMU::UncompGyro::Y [rad/s]") { return static_cast<double>(imuOutputs->uncompGyro(1)); }
1313
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 612 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
630 if (descriptor == "IMU::UncompGyro::Z [rad/s]") { return static_cast<double>(imuOutputs->uncompGyro(2)); }
1314
2/2
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 594 times.
612 if (descriptor == "IMU::Temp [Celsius]") { return static_cast<double>(imuOutputs->temp); }
1315
2/2
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 576 times.
594 if (descriptor == "IMU::Pres [kPa]") { return static_cast<double>(imuOutputs->pres); }
1316
2/2
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 558 times.
576 if (descriptor == "IMU::DeltaTime [s]") { return static_cast<double>(imuOutputs->deltaTime); }
1317
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 540 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
558 if (descriptor == "IMU::DeltaTheta::X [deg]") { return static_cast<double>(imuOutputs->deltaTheta(0)); }
1318
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 522 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
540 if (descriptor == "IMU::DeltaTheta::Y [deg]") { return static_cast<double>(imuOutputs->deltaTheta(1)); }
1319
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 504 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
522 if (descriptor == "IMU::DeltaTheta::Z [deg]") { return static_cast<double>(imuOutputs->deltaTheta(2)); }
1320
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 486 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
504 if (descriptor == "IMU::DeltaVel::X [m/s]") { return static_cast<double>(imuOutputs->deltaV(0)); }
1321
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 468 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
486 if (descriptor == "IMU::DeltaVel::Y [m/s]") { return static_cast<double>(imuOutputs->deltaV(1)); }
1322
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 450 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
468 if (descriptor == "IMU::DeltaVel::Z [m/s]") { return static_cast<double>(imuOutputs->deltaV(2)); }
1323
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 432 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
450 if (descriptor == "IMU::Mag::X [Gauss]") { return static_cast<double>(imuOutputs->mag(0)); }
1324
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 414 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
432 if (descriptor == "IMU::Mag::Y [Gauss]") { return static_cast<double>(imuOutputs->mag(1)); }
1325
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 396 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
414 if (descriptor == "IMU::Mag::Z [Gauss]") { return static_cast<double>(imuOutputs->mag(2)); }
1326
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 378 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
396 if (descriptor == "IMU::Accel::X [m/s^2]") { return static_cast<double>(imuOutputs->accel(0)); }
1327
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 360 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
378 if (descriptor == "IMU::Accel::Y [m/s^2]") { return static_cast<double>(imuOutputs->accel(1)); }
1328
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 342 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
360 if (descriptor == "IMU::Accel::Z [m/s^2]") { return static_cast<double>(imuOutputs->accel(2)); }
1329
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 324 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
342 if (descriptor == "IMU::AngularRate::X [rad/s]") { return static_cast<double>(imuOutputs->angularRate(0)); }
1330
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 306 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
324 if (descriptor == "IMU::AngularRate::Y [rad/s]") { return static_cast<double>(imuOutputs->angularRate(1)); }
1331
3/4
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 288 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
306 if (descriptor == "IMU::AngularRate::Z [rad/s]") { return static_cast<double>(imuOutputs->angularRate(2)); }
1332 }
1333 // Group 4 (GNSS1)
1334
1/2
✓ Branch 1 taken 1740 times.
✗ Branch 2 not taken.
1739 if (gnss1Outputs)
1335 {
1336
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1728 times.
1740 if (descriptor == "GNSS1::UTC::year") { return static_cast<double>(gnss1Outputs->timeUtc.year); }
1337
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1716 times.
1728 if (descriptor == "GNSS1::UTC::month") { return static_cast<double>(gnss1Outputs->timeUtc.month); }
1338
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1704 times.
1716 if (descriptor == "GNSS1::UTC::day") { return static_cast<double>(gnss1Outputs->timeUtc.day); }
1339
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1692 times.
1704 if (descriptor == "GNSS1::UTC::hour") { return static_cast<double>(gnss1Outputs->timeUtc.hour); }
1340
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1680 times.
1692 if (descriptor == "GNSS1::UTC::min") { return static_cast<double>(gnss1Outputs->timeUtc.min); }
1341
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1668 times.
1680 if (descriptor == "GNSS1::UTC::sec") { return static_cast<double>(gnss1Outputs->timeUtc.sec); }
1342
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1656 times.
1668 if (descriptor == "GNSS1::UTC::ms") { return static_cast<double>(gnss1Outputs->timeUtc.ms); }
1343
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1626 times.
1656 if (descriptor == "GNSS1::Tow [ns]") { return static_cast<double>(gnss1Outputs->tow); }
1344
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1595 times.
1626 if (descriptor == "GNSS1::Week") { return static_cast<double>(gnss1Outputs->week); }
1345
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1584 times.
1595 if (descriptor == "GNSS1::NumSats") { return static_cast<double>(gnss1Outputs->numSats); }
1346
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1571 times.
1584 if (descriptor == "GNSS1::Fix") { return static_cast<double>(gnss1Outputs->fix); }
1347
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1559 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1571 if (descriptor == "GNSS1::PosLla::latitude [deg]") { return static_cast<double>(gnss1Outputs->posLla(0)); }
1348
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1548 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1559 if (descriptor == "GNSS1::PosLla::longitude [deg]") { return static_cast<double>(gnss1Outputs->posLla(1)); }
1349
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1535 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1548 if (descriptor == "GNSS1::PosLla::altitude [m]") { return static_cast<double>(gnss1Outputs->posLla(2)); }
1350
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1522 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1535 if (descriptor == "GNSS1::PosEcef::X [m]") { return static_cast<double>(gnss1Outputs->posEcef(0)); }
1351
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1509 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1522 if (descriptor == "GNSS1::PosEcef::Y [m]") { return static_cast<double>(gnss1Outputs->posEcef(1)); }
1352
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1497 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1509 if (descriptor == "GNSS1::PosEcef::Z [m]") { return static_cast<double>(gnss1Outputs->posEcef(2)); }
1353
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1486 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1497 if (descriptor == "GNSS1::VelNed::N [m/s]") { return static_cast<double>(gnss1Outputs->velNed(0)); }
1354
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1474 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1486 if (descriptor == "GNSS1::VelNed::E [m/s]") { return static_cast<double>(gnss1Outputs->velNed(1)); }
1355
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1463 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1474 if (descriptor == "GNSS1::VelNed::D [m/s]") { return static_cast<double>(gnss1Outputs->velNed(2)); }
1356
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1452 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1463 if (descriptor == "GNSS1::VelEcef::X [m/s]") { return static_cast<double>(gnss1Outputs->velEcef(0)); }
1357
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1440 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1452 if (descriptor == "GNSS1::VelEcef::Y [m/s]") { return static_cast<double>(gnss1Outputs->velEcef(1)); }
1358
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1428 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1440 if (descriptor == "GNSS1::VelEcef::Z [m/s]") { return static_cast<double>(gnss1Outputs->velEcef(2)); }
1359
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1415 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1428 if (descriptor == "GNSS1::PosU::N [m]") { return static_cast<double>(gnss1Outputs->posU(0)); }
1360
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1404 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1415 if (descriptor == "GNSS1::PosU::E [m]") { return static_cast<double>(gnss1Outputs->posU(1)); }
1361
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1391 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
1404 if (descriptor == "GNSS1::PosU::D [m]") { return static_cast<double>(gnss1Outputs->posU(2)); }
1362
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1380 times.
1391 if (descriptor == "GNSS1::VelU [m/s]") { return static_cast<double>(gnss1Outputs->velU); }
1363
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1367 times.
1380 if (descriptor == "GNSS1::TimeU [s]") { return static_cast<double>(gnss1Outputs->timeU); }
1364
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1338 times.
1367 if (descriptor == "GNSS1::TimeInfo::Status::timeOk") { return static_cast<double>(gnss1Outputs->timeInfo.status.timeOk()); }
1365
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1308 times.
1338 if (descriptor == "GNSS1::TimeInfo::Status::dateOk") { return static_cast<double>(gnss1Outputs->timeInfo.status.dateOk()); }
1366
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1278 times.
1308 if (descriptor == "GNSS1::TimeInfo::Status::utcTimeValid") { return static_cast<double>(gnss1Outputs->timeInfo.status.utcTimeValid()); }
1367
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1247 times.
1278 if (descriptor == "GNSS1::TimeInfo::LeapSeconds") { return static_cast<double>(gnss1Outputs->timeInfo.leapSeconds); }
1368
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1236 times.
1247 if (descriptor == "GNSS1::DOP::g") { return static_cast<double>(gnss1Outputs->dop.gDop); }
1369
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1223 times.
1236 if (descriptor == "GNSS1::DOP::p") { return static_cast<double>(gnss1Outputs->dop.pDop); }
1370
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1211 times.
1223 if (descriptor == "GNSS1::DOP::t") { return static_cast<double>(gnss1Outputs->dop.tDop); }
1371
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1199 times.
1211 if (descriptor == "GNSS1::DOP::v") { return static_cast<double>(gnss1Outputs->dop.vDop); }
1372
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1187 times.
1199 if (descriptor == "GNSS1::DOP::h") { return static_cast<double>(gnss1Outputs->dop.hDop); }
1373
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1175 times.
1187 if (descriptor == "GNSS1::DOP::n") { return static_cast<double>(gnss1Outputs->dop.nDop); }
1374
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1163 times.
1175 if (descriptor == "GNSS1::DOP::e") { return static_cast<double>(gnss1Outputs->dop.eDop); }
1375
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1163 times.
1163 if (descriptor == "GNSS1::SatInfo::NumSats") { return static_cast<double>(gnss1Outputs->satInfo.numSats); }
1376
1/2
✗ Branch 6 not taken.
✓ Branch 7 taken 1164 times.
1163 for (auto& satellite : gnss1Outputs->satInfo.satellites)
1377 {
1378 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1379 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag Healthy", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Healthy) ? 1 : 0); }
1380 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag Almanac", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Almanac) ? 1 : 0); }
1381 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag Ephemeris", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Ephemeris) ? 1 : 0); }
1382 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag DifferentialCorrection", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::DifferentialCorrection) ? 1 : 0); }
1383 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag UsedForNavigation", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForNavigation) ? 1 : 0); }
1384 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag AzimuthElevationValid", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::AzimuthElevationValid) ? 1 : 0); }
1385 if (descriptor == fmt::format("GNSS1::SatInfo::{} - flag UsedForRTK", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForRTK) ? 1 : 0); }
1386 if (descriptor == fmt::format("GNSS1::SatInfo::{} - cno", satId)) { return static_cast<double>(satellite.cno); }
1387 if (descriptor == fmt::format("GNSS1::SatInfo::{} - qi", satId)) { return static_cast<double>(satellite.qi); }
1388 if (descriptor == fmt::format("GNSS1::SatInfo::{} - el", satId)) { return static_cast<double>(satellite.el); }
1389 if (descriptor == fmt::format("GNSS1::SatInfo::{} - az", satId)) { return static_cast<double>(satellite.az); }
1390 }
1391
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1163 times.
1164 if (descriptor == "GNSS1::RawMeas::Tow [s]") { return gnss1Outputs->raw.tow; }
1392
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1163 if (descriptor == "GNSS1::RawMeas::Week") { return static_cast<double>(gnss1Outputs->raw.week); }
1393
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "GNSS1::RawMeas::NumSats") { return static_cast<double>(gnss1Outputs->raw.numSats); }
1394
1/2
✗ Branch 6 not taken.
✓ Branch 7 taken 1164 times.
1164 for (auto& satellite : gnss1Outputs->raw.satellites)
1395 {
1396 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1397 if (descriptor == fmt::format("GNSS1::RawMeas::{} - freq", satId)) { return static_cast<double>(satellite.freq); }
1398 if (descriptor == fmt::format("GNSS1::RawMeas::{} - chan", satId)) { return static_cast<double>(satellite.chan); }
1399 if (descriptor == fmt::format("GNSS1::RawMeas::{} - slot", satId)) { return static_cast<double>(satellite.slot); }
1400 if (descriptor == fmt::format("GNSS1::RawMeas::{} - cno", satId)) { return static_cast<double>(satellite.cno); }
1401 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag Searching", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Searching) ? 1 : 0); }
1402 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag Tracking", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Tracking) ? 1 : 0); }
1403 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag TimeValid", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::TimeValid) ? 1 : 0); }
1404 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag CodeLock", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::CodeLock) ? 1 : 0); }
1405 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag PhaseLock", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseLock) ? 1 : 0); }
1406 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfAmbiguity", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfAmbiguity) ? 1 : 0); }
1407 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfSub", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfSub) ? 1 : 0); }
1408 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag PhaseSlip", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseSlip) ? 1 : 0); }
1409 if (descriptor == fmt::format("GNSS1::RawMeas::{} - flag PseudorangeSmoothed", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PseudorangeSmoothed) ? 1 : 0); }
1410 if (descriptor == fmt::format("GNSS1::RawMeas::{} - pr", satId)) { return satellite.pr; }
1411 if (descriptor == fmt::format("GNSS1::RawMeas::{} - cp", satId)) { return satellite.cp; }
1412 if (descriptor == fmt::format("GNSS1::RawMeas::{} - dp", satId)) { return static_cast<double>(satellite.dp); }
1413 }
1414 }
1415 // Group 5 (Attitude)
1416
1/2
✓ Branch 1 taken 1164 times.
✗ Branch 2 not taken.
1164 if (attitudeOutputs)
1417 {
1418
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::AttitudeQuality") { return static_cast<double>(attitudeOutputs->vpeStatus.attitudeQuality()); }
1419
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::GyroSaturation") { return static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturation()); }
1420
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::GyroSaturationRecovery") { return static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturationRecovery()); }
1421
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::MagDisturbance") { return static_cast<double>(attitudeOutputs->vpeStatus.magDisturbance()); }
1422
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::MagSaturation") { return static_cast<double>(attitudeOutputs->vpeStatus.magSaturation()); }
1423
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::AccDisturbance") { return static_cast<double>(attitudeOutputs->vpeStatus.accDisturbance()); }
1424
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::AccSaturation") { return static_cast<double>(attitudeOutputs->vpeStatus.accSaturation()); }
1425
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::KnownMagDisturbance") { return static_cast<double>(attitudeOutputs->vpeStatus.knownMagDisturbance()); }
1426
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1164 times.
1164 if (descriptor == "Att::VpeStatus::KnownAccelDisturbance") { return static_cast<double>(attitudeOutputs->vpeStatus.knownAccelDisturbance()); }
1427
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1134 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1164 if (descriptor == "Att::YawPitchRoll::Y [deg]") { return static_cast<double>(attitudeOutputs->ypr(0)); }
1428
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1104 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1134 if (descriptor == "Att::YawPitchRoll::P [deg]") { return static_cast<double>(attitudeOutputs->ypr(1)); }
1429
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1074 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1104 if (descriptor == "Att::YawPitchRoll::R [deg]") { return static_cast<double>(attitudeOutputs->ypr(2)); }
1430
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1044 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1074 if (descriptor == "Att::Quaternion::w") { return static_cast<double>(attitudeOutputs->qtn.w()); }
1431
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1014 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1044 if (descriptor == "Att::Quaternion::x") { return static_cast<double>(attitudeOutputs->qtn.x()); }
1432
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 984 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
1014 if (descriptor == "Att::Quaternion::y") { return static_cast<double>(attitudeOutputs->qtn.y()); }
1433
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 954 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
984 if (descriptor == "Att::Quaternion::z") { return static_cast<double>(attitudeOutputs->qtn.z()); }
1434
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::0-0") { return static_cast<double>(attitudeOutputs->dcm(0, 0)); }
1435
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::0-1") { return static_cast<double>(attitudeOutputs->dcm(0, 1)); }
1436
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::0-2") { return static_cast<double>(attitudeOutputs->dcm(0, 2)); }
1437
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::1-0") { return static_cast<double>(attitudeOutputs->dcm(1, 0)); }
1438
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::1-1") { return static_cast<double>(attitudeOutputs->dcm(1, 1)); }
1439
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::1-2") { return static_cast<double>(attitudeOutputs->dcm(1, 2)); }
1440
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::2-0") { return static_cast<double>(attitudeOutputs->dcm(2, 0)); }
1441
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::2-1") { return static_cast<double>(attitudeOutputs->dcm(2, 1)); }
1442
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::DCM::2-2") { return static_cast<double>(attitudeOutputs->dcm(2, 2)); }
1443
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::MagNed::N [Gauss]") { return static_cast<double>(attitudeOutputs->magNed(0)); }
1444
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::MagNed::E [Gauss]") { return static_cast<double>(attitudeOutputs->magNed(1)); }
1445
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::MagNed::D [Gauss]") { return static_cast<double>(attitudeOutputs->magNed(2)); }
1446
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::AccelNed::N [m/s^2]") { return static_cast<double>(attitudeOutputs->accelNed(0)); }
1447
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::AccelNed::E [m/s^2]") { return static_cast<double>(attitudeOutputs->accelNed(1)); }
1448
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::AccelNed::D [m/s^2]") { return static_cast<double>(attitudeOutputs->accelNed(2)); }
1449
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelBody::X [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelBody(0)); }
1450
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelBody::Y [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelBody(1)); }
1451
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelBody::Z [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelBody(2)); }
1452
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelNed::N [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelNed(0)); }
1453
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelNed::E [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelNed(1)); }
1454
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 954 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
954 if (descriptor == "Att::LinearAccelNed::D [m/s^2]") { return static_cast<double>(attitudeOutputs->linearAccelNed(2)); }
1455
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 924 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
954 if (descriptor == "Att::YprU::Y [deg]") { return static_cast<double>(attitudeOutputs->yprU(0)); }
1456
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 894 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
924 if (descriptor == "Att::YprU::P [deg]") { return static_cast<double>(attitudeOutputs->yprU(1)); }
1457
3/4
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 864 times.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
894 if (descriptor == "Att::YprU::R [deg]") { return static_cast<double>(attitudeOutputs->yprU(2)); }
1458 }
1459 // Group 6 (INS)
1460
1/2
✓ Branch 1 taken 864 times.
✗ Branch 2 not taken.
864 if (insOutputs)
1461 {
1462
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 852 times.
864 if (descriptor == "INS::InsStatus::Mode") { return static_cast<double>(insOutputs->insStatus.mode()); }
1463
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 840 times.
852 if (descriptor == "INS::InsStatus::GpsFix") { return static_cast<double>(insOutputs->insStatus.gpsFix()); }
1464
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 828 times.
840 if (descriptor == "INS::InsStatus::Error::IMU") { return static_cast<double>(insOutputs->insStatus.errorIMU()); }
1465
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 816 times.
828 if (descriptor == "INS::InsStatus::Error::MagPres") { return static_cast<double>(insOutputs->insStatus.errorMagPres()); }
1466
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 804 times.
816 if (descriptor == "INS::InsStatus::Error::GNSS") { return static_cast<double>(insOutputs->insStatus.errorGnss()); }
1467
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 792 times.
804 if (descriptor == "INS::InsStatus::GpsHeadingIns") { return static_cast<double>(insOutputs->insStatus.gpsHeadingIns()); }
1468
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 780 times.
792 if (descriptor == "INS::InsStatus::GpsCompass") { return static_cast<double>(insOutputs->insStatus.gpsCompass()); }
1469
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 768 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
780 if (descriptor == "INS::PosLla::latitude [deg]") { return static_cast<double>(insOutputs->posLla(0)); }
1470
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 756 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
768 if (descriptor == "INS::PosLla::longitude [deg]") { return static_cast<double>(insOutputs->posLla(1)); }
1471
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 744 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
756 if (descriptor == "INS::PosLla::altitude [m]") { return static_cast<double>(insOutputs->posLla(2)); }
1472
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 732 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
744 if (descriptor == "INS::PosEcef::X [m]") { return static_cast<double>(insOutputs->posEcef(0)); }
1473
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 720 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
732 if (descriptor == "INS::PosEcef::Y [m]") { return static_cast<double>(insOutputs->posEcef(1)); }
1474
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 708 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
720 if (descriptor == "INS::PosEcef::Z [m]") { return static_cast<double>(insOutputs->posEcef(2)); }
1475
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 696 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
708 if (descriptor == "INS::VelBody::X [m/s]") { return static_cast<double>(insOutputs->velBody(0)); }
1476
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 684 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
696 if (descriptor == "INS::VelBody::Y [m/s]") { return static_cast<double>(insOutputs->velBody(1)); }
1477
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 672 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
684 if (descriptor == "INS::VelBody::Z [m/s]") { return static_cast<double>(insOutputs->velBody(2)); }
1478
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 660 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
672 if (descriptor == "INS::VelNed::N [m/s]") { return static_cast<double>(insOutputs->velNed(0)); }
1479
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 648 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
660 if (descriptor == "INS::VelNed::E [m/s]") { return static_cast<double>(insOutputs->velNed(1)); }
1480
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 636 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
648 if (descriptor == "INS::VelNed::D [m/s]") { return static_cast<double>(insOutputs->velNed(2)); }
1481
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 624 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
636 if (descriptor == "INS::VelEcef::X [m/s]") { return static_cast<double>(insOutputs->velEcef(0)); }
1482
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 612 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
624 if (descriptor == "INS::VelEcef::Y [m/s]") { return static_cast<double>(insOutputs->velEcef(1)); }
1483
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 600 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
612 if (descriptor == "INS::VelEcef::Z [m/s]") { return static_cast<double>(insOutputs->velEcef(2)); }
1484
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 588 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
600 if (descriptor == "INS::MagEcef::X [Gauss]") { return static_cast<double>(insOutputs->magEcef(0)); }
1485
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 576 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
588 if (descriptor == "INS::MagEcef::Y [Gauss]") { return static_cast<double>(insOutputs->magEcef(1)); }
1486
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 564 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
576 if (descriptor == "INS::MagEcef::Z [Gauss]") { return static_cast<double>(insOutputs->magEcef(2)); }
1487
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 552 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
564 if (descriptor == "INS::AccelEcef::X [m/s^2]") { return static_cast<double>(insOutputs->accelEcef(0)); }
1488
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 540 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
552 if (descriptor == "INS::AccelEcef::Y [m/s^2]") { return static_cast<double>(insOutputs->accelEcef(1)); }
1489
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 528 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
540 if (descriptor == "INS::AccelEcef::Z [m/s^2]") { return static_cast<double>(insOutputs->accelEcef(2)); }
1490
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 516 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
528 if (descriptor == "INS::LinearAccelEcef::X [m/s^2]") { return static_cast<double>(insOutputs->linearAccelEcef(0)); }
1491
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 504 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
516 if (descriptor == "INS::LinearAccelEcef::Y [m/s^2]") { return static_cast<double>(insOutputs->linearAccelEcef(1)); }
1492
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 492 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
504 if (descriptor == "INS::LinearAccelEcef::Z [m/s^2]") { return static_cast<double>(insOutputs->linearAccelEcef(2)); }
1493
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 480 times.
492 if (descriptor == "INS::PosU [m]") { return static_cast<double>(insOutputs->posU); }
1494
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 468 times.
480 if (descriptor == "INS::VelU [m/s]") { return static_cast<double>(insOutputs->velU); }
1495 }
1496 // Group 7 (GNSS2)
1497
1/2
✓ Branch 1 taken 468 times.
✗ Branch 2 not taken.
468 if (gnss2Outputs)
1498 {
1499
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 456 times.
468 if (descriptor == "GNSS2::UTC::year") { return static_cast<double>(gnss2Outputs->timeUtc.year); }
1500
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 444 times.
456 if (descriptor == "GNSS2::UTC::month") { return static_cast<double>(gnss2Outputs->timeUtc.month); }
1501
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 432 times.
444 if (descriptor == "GNSS2::UTC::day") { return static_cast<double>(gnss2Outputs->timeUtc.day); }
1502
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 420 times.
432 if (descriptor == "GNSS2::UTC::hour") { return static_cast<double>(gnss2Outputs->timeUtc.hour); }
1503
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 408 times.
420 if (descriptor == "GNSS2::UTC::min") { return static_cast<double>(gnss2Outputs->timeUtc.min); }
1504
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 396 times.
408 if (descriptor == "GNSS2::UTC::sec") { return static_cast<double>(gnss2Outputs->timeUtc.sec); }
1505
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 384 times.
396 if (descriptor == "GNSS2::UTC::ms") { return static_cast<double>(gnss2Outputs->timeUtc.ms); }
1506
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 372 times.
384 if (descriptor == "GNSS2::Tow [ns]") { return static_cast<double>(gnss2Outputs->tow); }
1507
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 360 times.
372 if (descriptor == "GNSS2::Week") { return static_cast<double>(gnss2Outputs->week); }
1508
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 348 times.
360 if (descriptor == "GNSS2::NumSats") { return static_cast<double>(gnss2Outputs->numSats); }
1509
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 336 times.
348 if (descriptor == "GNSS2::Fix") { return static_cast<double>(gnss2Outputs->fix); }
1510
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 324 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
336 if (descriptor == "GNSS2::PosLla::latitude [deg]") { return static_cast<double>(gnss2Outputs->posLla(0)); }
1511
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 312 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
324 if (descriptor == "GNSS2::PosLla::longitude [deg]") { return static_cast<double>(gnss2Outputs->posLla(1)); }
1512
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 300 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
312 if (descriptor == "GNSS2::PosLla::altitude [m]") { return static_cast<double>(gnss2Outputs->posLla(2)); }
1513
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 288 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
300 if (descriptor == "GNSS2::PosEcef::X [m]") { return static_cast<double>(gnss2Outputs->posEcef(0)); }
1514
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 276 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
288 if (descriptor == "GNSS2::PosEcef::Y [m]") { return static_cast<double>(gnss2Outputs->posEcef(1)); }
1515
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 264 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
276 if (descriptor == "GNSS2::PosEcef::Z [m]") { return static_cast<double>(gnss2Outputs->posEcef(2)); }
1516
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 252 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
264 if (descriptor == "GNSS2::VelNed::N [m/s]") { return static_cast<double>(gnss2Outputs->velNed(0)); }
1517
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 240 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
252 if (descriptor == "GNSS2::VelNed::E [m/s]") { return static_cast<double>(gnss2Outputs->velNed(1)); }
1518
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 228 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
240 if (descriptor == "GNSS2::VelNed::D [m/s]") { return static_cast<double>(gnss2Outputs->velNed(2)); }
1519
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 216 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
228 if (descriptor == "GNSS2::VelEcef::X [m/s]") { return static_cast<double>(gnss2Outputs->velEcef(0)); }
1520
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 204 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
216 if (descriptor == "GNSS2::VelEcef::Y [m/s]") { return static_cast<double>(gnss2Outputs->velEcef(1)); }
1521
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 192 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
204 if (descriptor == "GNSS2::VelEcef::Z [m/s]") { return static_cast<double>(gnss2Outputs->velEcef(2)); }
1522
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 180 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
192 if (descriptor == "GNSS2::PosU::N [m]") { return static_cast<double>(gnss2Outputs->posU(0)); }
1523
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 168 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
180 if (descriptor == "GNSS2::PosU::E [m]") { return static_cast<double>(gnss2Outputs->posU(1)); }
1524
3/4
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 156 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
168 if (descriptor == "GNSS2::PosU::D [m]") { return static_cast<double>(gnss2Outputs->posU(2)); }
1525
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 144 times.
156 if (descriptor == "GNSS2::VelU [m/s]") { return static_cast<double>(gnss2Outputs->velU); }
1526
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 132 times.
144 if (descriptor == "GNSS2::TimeU [s]") { return static_cast<double>(gnss2Outputs->timeU); }
1527
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 120 times.
132 if (descriptor == "GNSS2::TimeInfo::Status::timeOk") { return static_cast<double>(gnss2Outputs->timeInfo.status.timeOk()); }
1528
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 108 times.
120 if (descriptor == "GNSS2::TimeInfo::Status::dateOk") { return static_cast<double>(gnss2Outputs->timeInfo.status.dateOk()); }
1529
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 96 times.
108 if (descriptor == "GNSS2::TimeInfo::Status::utcTimeValid") { return static_cast<double>(gnss2Outputs->timeInfo.status.utcTimeValid()); }
1530
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 84 times.
96 if (descriptor == "GNSS2::TimeInfo::LeapSeconds") { return static_cast<double>(gnss2Outputs->timeInfo.leapSeconds); }
1531
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 72 times.
84 if (descriptor == "GNSS2::DOP::g") { return static_cast<double>(gnss2Outputs->dop.gDop); }
1532
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 60 times.
72 if (descriptor == "GNSS2::DOP::p") { return static_cast<double>(gnss2Outputs->dop.pDop); }
1533
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 48 times.
60 if (descriptor == "GNSS2::DOP::t") { return static_cast<double>(gnss2Outputs->dop.tDop); }
1534
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 36 times.
48 if (descriptor == "GNSS2::DOP::v") { return static_cast<double>(gnss2Outputs->dop.vDop); }
1535
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 24 times.
36 if (descriptor == "GNSS2::DOP::h") { return static_cast<double>(gnss2Outputs->dop.hDop); }
1536
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 12 times.
24 if (descriptor == "GNSS2::DOP::n") { return static_cast<double>(gnss2Outputs->dop.nDop); }
1537
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 if (descriptor == "GNSS2::DOP::e") { return static_cast<double>(gnss2Outputs->dop.eDop); }
1538 if (descriptor == "GNSS2::SatInfo::NumSats") { return static_cast<double>(gnss2Outputs->satInfo.numSats); }
1539 for (auto& satellite : gnss2Outputs->satInfo.satellites)
1540 {
1541 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1542 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag Healthy", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Healthy) ? 1 : 0); }
1543 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag Almanac", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Almanac) ? 1 : 0); }
1544 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag Ephemeris", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Ephemeris) ? 1 : 0); }
1545 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag DifferentialCorrection", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::DifferentialCorrection) ? 1 : 0); }
1546 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag UsedForNavigation", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForNavigation) ? 1 : 0); }
1547 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag AzimuthElevationValid", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::AzimuthElevationValid) ? 1 : 0); }
1548 if (descriptor == fmt::format("GNSS2::SatInfo::{} - flag UsedForRTK", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForRTK) ? 1 : 0); }
1549 if (descriptor == fmt::format("GNSS2::SatInfo::{} - cno", satId)) { return static_cast<double>(satellite.cno); }
1550 if (descriptor == fmt::format("GNSS2::SatInfo::{} - qi", satId)) { return static_cast<double>(satellite.qi); }
1551 if (descriptor == fmt::format("GNSS2::SatInfo::{} - el", satId)) { return static_cast<double>(satellite.el); }
1552 if (descriptor == fmt::format("GNSS2::SatInfo::{} - az", satId)) { return static_cast<double>(satellite.az); }
1553 }
1554 if (descriptor == "GNSS2::RawMeas::Tow [s]") { return gnss2Outputs->raw.tow; }
1555 if (descriptor == "GNSS2::RawMeas::Week") { return static_cast<double>(gnss2Outputs->raw.week); }
1556 if (descriptor == "GNSS2::RawMeas::NumSats") { return static_cast<double>(gnss2Outputs->raw.numSats); }
1557 for (auto& satellite : gnss2Outputs->raw.satellites)
1558 {
1559 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1560 if (descriptor == fmt::format("GNSS2::RawMeas::{} - freq", satId)) { return static_cast<double>(satellite.freq); }
1561 if (descriptor == fmt::format("GNSS2::RawMeas::{} - chan", satId)) { return static_cast<double>(satellite.chan); }
1562 if (descriptor == fmt::format("GNSS2::RawMeas::{} - slot", satId)) { return static_cast<double>(satellite.slot); }
1563 if (descriptor == fmt::format("GNSS2::RawMeas::{} - cno", satId)) { return static_cast<double>(satellite.cno); }
1564 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag Searching", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Searching) ? 1 : 0); }
1565 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag Tracking", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Tracking) ? 1 : 0); }
1566 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag TimeValid", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::TimeValid) ? 1 : 0); }
1567 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag CodeLock", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::CodeLock) ? 1 : 0); }
1568 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag PhaseLock", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseLock) ? 1 : 0); }
1569 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfAmbiguity", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfAmbiguity) ? 1 : 0); }
1570 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfSub", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfSub) ? 1 : 0); }
1571 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag PhaseSlip", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseSlip) ? 1 : 0); }
1572 if (descriptor == fmt::format("GNSS2::RawMeas::{} - flag PseudorangeSmoothed", satId)) { return static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PseudorangeSmoothed) ? 1 : 0); }
1573 if (descriptor == fmt::format("GNSS2::RawMeas::{} - pr", satId)) { return satellite.pr; }
1574 if (descriptor == fmt::format("GNSS2::RawMeas::{} - cp", satId)) { return satellite.cp; }
1575 if (descriptor == fmt::format("GNSS2::RawMeas::{} - dp", satId)) { return static_cast<double>(satellite.dp); }
1576 }
1577 }
1578
1579 return std::nullopt;
1580 }
1581
1582 /// @brief Returns a vector of data descriptors and values for the dynamic data
1583 [[nodiscard]] std::vector<std::pair<std::string, double>> getDynamicData() const override
1584 {
1585 std::vector<std::pair<std::string, double>> dynData;
1586
1587 // Group 2 (Time)
1588 if (timeOutputs)
1589 {
1590 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)
1591 {
1592 dynData.emplace_back("Time::TimeStartup [ns]", static_cast<double>(timeOutputs->timeStartup));
1593 }
1594 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)
1595 {
1596 dynData.emplace_back("Time::TimeGps [ns]", static_cast<double>(timeOutputs->timeGps));
1597 }
1598 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)
1599 {
1600 dynData.emplace_back("Time::GpsTow [ns]", static_cast<double>(timeOutputs->gpsTow));
1601 }
1602 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)
1603 {
1604 dynData.emplace_back("Time::GpsWeek", static_cast<double>(timeOutputs->gpsWeek));
1605 }
1606 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)
1607 {
1608 dynData.emplace_back("Time::TimeSyncIn [ns]", static_cast<double>(timeOutputs->timeSyncIn));
1609 }
1610 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)
1611 {
1612 dynData.emplace_back("Time::TimeGpsPps [ns]", static_cast<double>(timeOutputs->timePPS));
1613 }
1614 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)
1615 {
1616 dynData.emplace_back("Time::TimeUTC::year", static_cast<double>(timeOutputs->timeUtc.year));
1617 dynData.emplace_back("Time::TimeUTC::month", static_cast<double>(timeOutputs->timeUtc.month));
1618 dynData.emplace_back("Time::TimeUTC::day", static_cast<double>(timeOutputs->timeUtc.day));
1619 dynData.emplace_back("Time::TimeUTC::hour", static_cast<double>(timeOutputs->timeUtc.hour));
1620 dynData.emplace_back("Time::TimeUTC::min", static_cast<double>(timeOutputs->timeUtc.min));
1621 dynData.emplace_back("Time::TimeUTC::sec", static_cast<double>(timeOutputs->timeUtc.sec));
1622 dynData.emplace_back("Time::TimeUTC::ms", static_cast<double>(timeOutputs->timeUtc.ms));
1623 }
1624 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)
1625 {
1626 dynData.emplace_back("Time::SyncInCnt", static_cast<double>(timeOutputs->syncInCnt));
1627 }
1628 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)
1629 {
1630 dynData.emplace_back("Time::SyncOutCnt", static_cast<double>(timeOutputs->syncOutCnt));
1631 }
1632 if (timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
1633 {
1634 dynData.emplace_back("Time::TimeStatus::timeOk", static_cast<double>(timeOutputs->timeStatus.timeOk()));
1635 dynData.emplace_back("Time::TimeStatus::dateOk", static_cast<double>(timeOutputs->timeStatus.dateOk()));
1636 dynData.emplace_back("Time::TimeStatus::utcTimeValid", static_cast<double>(timeOutputs->timeStatus.utcTimeValid()));
1637 }
1638 }
1639 // Group 3 (IMU)
1640 if (imuOutputs)
1641 {
1642 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)
1643 {
1644 dynData.emplace_back("IMU::ImuStatus", static_cast<double>(imuOutputs->imuStatus));
1645 }
1646 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)
1647 {
1648 dynData.emplace_back("IMU::UncompMag::X [Gauss]", static_cast<double>(imuOutputs->uncompMag(0)));
1649 dynData.emplace_back("IMU::UncompMag::Y [Gauss]", static_cast<double>(imuOutputs->uncompMag(1)));
1650 dynData.emplace_back("IMU::UncompMag::Z [Gauss]", static_cast<double>(imuOutputs->uncompMag(2)));
1651 }
1652 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)
1653 {
1654 dynData.emplace_back("IMU::UncompAccel::X [m/s^2]", static_cast<double>(imuOutputs->uncompAccel(0)));
1655 dynData.emplace_back("IMU::UncompAccel::Y [m/s^2]", static_cast<double>(imuOutputs->uncompAccel(1)));
1656 dynData.emplace_back("IMU::UncompAccel::Z [m/s^2]", static_cast<double>(imuOutputs->uncompAccel(2)));
1657 }
1658 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)
1659 {
1660 dynData.emplace_back("IMU::UncompGyro::X [rad/s]", static_cast<double>(imuOutputs->uncompGyro(0)));
1661 dynData.emplace_back("IMU::UncompGyro::Y [rad/s]", static_cast<double>(imuOutputs->uncompGyro(1)));
1662 dynData.emplace_back("IMU::UncompGyro::Z [rad/s]", static_cast<double>(imuOutputs->uncompGyro(2)));
1663 }
1664 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)
1665 {
1666 dynData.emplace_back("IMU::Temp [Celsius]", static_cast<double>(imuOutputs->temp));
1667 }
1668 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)
1669 {
1670 dynData.emplace_back("IMU::Pres [kPa]", static_cast<double>(imuOutputs->pres));
1671 }
1672 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)
1673 {
1674 dynData.emplace_back("IMU::DeltaTime [s]", static_cast<double>(imuOutputs->deltaTime));
1675 dynData.emplace_back("IMU::DeltaTheta::X [deg]", static_cast<double>(imuOutputs->deltaTheta(0)));
1676 dynData.emplace_back("IMU::DeltaTheta::Y [deg]", static_cast<double>(imuOutputs->deltaTheta(1)));
1677 dynData.emplace_back("IMU::DeltaTheta::Z [deg]", static_cast<double>(imuOutputs->deltaTheta(2)));
1678 }
1679 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)
1680 {
1681 dynData.emplace_back("IMU::DeltaVel::X [m/s]", static_cast<double>(imuOutputs->deltaV(0)));
1682 dynData.emplace_back("IMU::DeltaVel::Y [m/s]", static_cast<double>(imuOutputs->deltaV(1)));
1683 dynData.emplace_back("IMU::DeltaVel::Z [m/s]", static_cast<double>(imuOutputs->deltaV(2)));
1684 }
1685 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)
1686 {
1687 dynData.emplace_back("IMU::Mag::X [Gauss]", static_cast<double>(imuOutputs->mag(0)));
1688 dynData.emplace_back("IMU::Mag::Y [Gauss]", static_cast<double>(imuOutputs->mag(1)));
1689 dynData.emplace_back("IMU::Mag::Z [Gauss]", static_cast<double>(imuOutputs->mag(2)));
1690 }
1691 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)
1692 {
1693 dynData.emplace_back("IMU::Accel::X [m/s^2]", static_cast<double>(imuOutputs->accel(0)));
1694 dynData.emplace_back("IMU::Accel::Y [m/s^2]", static_cast<double>(imuOutputs->accel(1)));
1695 dynData.emplace_back("IMU::Accel::Z [m/s^2]", static_cast<double>(imuOutputs->accel(2)));
1696 }
1697 if (imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)
1698 {
1699 dynData.emplace_back("IMU::AngularRate::X [rad/s]", static_cast<double>(imuOutputs->angularRate(0)));
1700 dynData.emplace_back("IMU::AngularRate::Y [rad/s]", static_cast<double>(imuOutputs->angularRate(1)));
1701 dynData.emplace_back("IMU::AngularRate::Z [rad/s]", static_cast<double>(imuOutputs->angularRate(2)));
1702 }
1703 }
1704
1705 // Group 4 (GNSS1)
1706 if (gnss1Outputs)
1707 {
1708 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1709 {
1710 dynData.emplace_back("GNSS1::UTC::year", static_cast<double>(gnss1Outputs->timeUtc.year));
1711 dynData.emplace_back("GNSS1::UTC::month", static_cast<double>(gnss1Outputs->timeUtc.month));
1712 dynData.emplace_back("GNSS1::UTC::day", static_cast<double>(gnss1Outputs->timeUtc.day));
1713 dynData.emplace_back("GNSS1::UTC::hour", static_cast<double>(gnss1Outputs->timeUtc.hour));
1714 dynData.emplace_back("GNSS1::UTC::min", static_cast<double>(gnss1Outputs->timeUtc.min));
1715 dynData.emplace_back("GNSS1::UTC::sec", static_cast<double>(gnss1Outputs->timeUtc.sec));
1716 dynData.emplace_back("GNSS1::UTC::ms", static_cast<double>(gnss1Outputs->timeUtc.ms));
1717 }
1718 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1719 {
1720 dynData.emplace_back("GNSS1::Tow [ns]", static_cast<double>(gnss1Outputs->tow));
1721 }
1722 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1723 {
1724 dynData.emplace_back("GNSS1::Week", static_cast<double>(gnss1Outputs->week));
1725 }
1726 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1727 {
1728 dynData.emplace_back("GNSS1::NumSats", static_cast<double>(gnss1Outputs->numSats));
1729 }
1730 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1731 {
1732 dynData.emplace_back("GNSS1::Fix", static_cast<double>(gnss1Outputs->fix));
1733 }
1734 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1735 {
1736 dynData.emplace_back("GNSS1::PosLla::latitude [deg]", static_cast<double>(gnss1Outputs->posLla(0)));
1737 dynData.emplace_back("GNSS1::PosLla::longitude [deg]", static_cast<double>(gnss1Outputs->posLla(1)));
1738 dynData.emplace_back("GNSS1::PosLla::altitude [m]", static_cast<double>(gnss1Outputs->posLla(2)));
1739 }
1740 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1741 {
1742 dynData.emplace_back("GNSS1::PosEcef::X [m]", static_cast<double>(gnss1Outputs->posEcef(0)));
1743 dynData.emplace_back("GNSS1::PosEcef::Y [m]", static_cast<double>(gnss1Outputs->posEcef(1)));
1744 dynData.emplace_back("GNSS1::PosEcef::Z [m]", static_cast<double>(gnss1Outputs->posEcef(2)));
1745 }
1746 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1747 {
1748 dynData.emplace_back("GNSS1::VelNed::N [m/s]", static_cast<double>(gnss1Outputs->velNed(0)));
1749 dynData.emplace_back("GNSS1::VelNed::E [m/s]", static_cast<double>(gnss1Outputs->velNed(1)));
1750 dynData.emplace_back("GNSS1::VelNed::D [m/s]", static_cast<double>(gnss1Outputs->velNed(2)));
1751 }
1752 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1753 {
1754 dynData.emplace_back("GNSS1::VelEcef::X [m/s]", static_cast<double>(gnss1Outputs->velEcef(0)));
1755 dynData.emplace_back("GNSS1::VelEcef::Y [m/s]", static_cast<double>(gnss1Outputs->velEcef(1)));
1756 dynData.emplace_back("GNSS1::VelEcef::Z [m/s]", static_cast<double>(gnss1Outputs->velEcef(2)));
1757 }
1758 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1759 {
1760 dynData.emplace_back("GNSS1::PosU::N [m]", static_cast<double>(gnss1Outputs->posU(0)));
1761 dynData.emplace_back("GNSS1::PosU::E [m]", static_cast<double>(gnss1Outputs->posU(1)));
1762 dynData.emplace_back("GNSS1::PosU::D [m]", static_cast<double>(gnss1Outputs->posU(2)));
1763 }
1764 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1765 {
1766 dynData.emplace_back("GNSS1::VelU [m/s]", static_cast<double>(gnss1Outputs->velU));
1767 }
1768 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1769 {
1770 dynData.emplace_back("GNSS1::TimeU [s]", static_cast<double>(gnss1Outputs->timeU));
1771 }
1772 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1773 {
1774 dynData.emplace_back("GNSS1::TimeInfo::Status::timeOk", static_cast<double>(gnss1Outputs->timeInfo.status.timeOk()));
1775 dynData.emplace_back("GNSS1::TimeInfo::Status::dateOk", static_cast<double>(gnss1Outputs->timeInfo.status.dateOk()));
1776 dynData.emplace_back("GNSS1::TimeInfo::Status::utcTimeValid", static_cast<double>(gnss1Outputs->timeInfo.status.utcTimeValid()));
1777 dynData.emplace_back("GNSS1::TimeInfo::LeapSeconds", static_cast<double>(gnss1Outputs->timeInfo.leapSeconds));
1778 }
1779 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1780 {
1781 dynData.emplace_back("GNSS1::DOP::g", static_cast<double>(gnss1Outputs->dop.gDop));
1782 dynData.emplace_back("GNSS1::DOP::p", static_cast<double>(gnss1Outputs->dop.pDop));
1783 dynData.emplace_back("GNSS1::DOP::t", static_cast<double>(gnss1Outputs->dop.tDop));
1784 dynData.emplace_back("GNSS1::DOP::v", static_cast<double>(gnss1Outputs->dop.vDop));
1785 dynData.emplace_back("GNSS1::DOP::h", static_cast<double>(gnss1Outputs->dop.hDop));
1786 dynData.emplace_back("GNSS1::DOP::n", static_cast<double>(gnss1Outputs->dop.nDop));
1787 dynData.emplace_back("GNSS1::DOP::e", static_cast<double>(gnss1Outputs->dop.eDop));
1788 }
1789 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1790 {
1791 dynData.emplace_back("GNSS1::SatInfo::NumSats", static_cast<double>(gnss1Outputs->satInfo.numSats));
1792 for (auto& satellite : gnss1Outputs->satInfo.satellites)
1793 {
1794 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1795 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag Healthy", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Healthy) ? 1 : 0));
1796 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag Almanac", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Almanac) ? 1 : 0));
1797 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag Ephemeris", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Ephemeris) ? 1 : 0));
1798 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag DifferentialCorrection", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::DifferentialCorrection) ? 1 : 0));
1799 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag UsedForNavigation", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForNavigation) ? 1 : 0));
1800 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag AzimuthElevationValid", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::AzimuthElevationValid) ? 1 : 0));
1801 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - flag UsedForRTK", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForRTK) ? 1 : 0));
1802 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - cno", satId), static_cast<double>(satellite.cno));
1803 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - qi", satId), static_cast<double>(satellite.qi));
1804 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - el", satId), static_cast<double>(satellite.el));
1805 dynData.emplace_back(fmt::format("GNSS1::SatInfo::{} - az", satId), static_cast<double>(satellite.az));
1806 }
1807 }
1808 if (gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1809 {
1810 dynData.emplace_back("GNSS1::RawMeas::Tow [s]", gnss1Outputs->raw.tow);
1811 dynData.emplace_back("GNSS1::RawMeas::Week", static_cast<double>(gnss1Outputs->raw.week));
1812 dynData.emplace_back("GNSS1::RawMeas::NumSats", static_cast<double>(gnss1Outputs->raw.numSats));
1813 for (auto& satellite : gnss1Outputs->raw.satellites)
1814 {
1815 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
1816 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - freq", satId), static_cast<double>(satellite.freq));
1817 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - chan", satId), static_cast<double>(satellite.chan));
1818 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - slot", satId), static_cast<double>(satellite.slot));
1819 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - cno", satId), static_cast<double>(satellite.cno));
1820 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag Searching", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Searching) ? 1 : 0));
1821 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag Tracking", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Tracking) ? 1 : 0));
1822 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag TimeValid", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::TimeValid) ? 1 : 0));
1823 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag CodeLock", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::CodeLock) ? 1 : 0));
1824 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseLock", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseLock) ? 1 : 0));
1825 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfAmbiguity", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfAmbiguity) ? 1 : 0));
1826 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseHalfSub", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfSub) ? 1 : 0));
1827 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag PhaseSlip", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseSlip) ? 1 : 0));
1828 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - flag PseudorangeSmoothed", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PseudorangeSmoothed) ? 1 : 0));
1829 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - pr", satId), satellite.pr);
1830 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - cp", satId), satellite.cp);
1831 dynData.emplace_back(fmt::format("GNSS1::RawMeas::{} - dp", satId), static_cast<double>(satellite.dp));
1832 }
1833 }
1834 }
1835
1836 // Group 5 (Attitude)
1837 if (attitudeOutputs)
1838 {
1839 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)
1840 {
1841 dynData.emplace_back("Att::VpeStatus::AttitudeQuality", static_cast<double>(attitudeOutputs->vpeStatus.attitudeQuality()));
1842 dynData.emplace_back("Att::VpeStatus::GyroSaturation", static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturation()));
1843 dynData.emplace_back("Att::VpeStatus::GyroSaturationRecovery", static_cast<double>(attitudeOutputs->vpeStatus.gyroSaturationRecovery()));
1844 dynData.emplace_back("Att::VpeStatus::MagDisturbance", static_cast<double>(attitudeOutputs->vpeStatus.magDisturbance()));
1845 dynData.emplace_back("Att::VpeStatus::MagSaturation", static_cast<double>(attitudeOutputs->vpeStatus.magSaturation()));
1846 dynData.emplace_back("Att::VpeStatus::AccDisturbance", static_cast<double>(attitudeOutputs->vpeStatus.accDisturbance()));
1847 dynData.emplace_back("Att::VpeStatus::AccSaturation", static_cast<double>(attitudeOutputs->vpeStatus.accSaturation()));
1848 dynData.emplace_back("Att::VpeStatus::KnownMagDisturbance", static_cast<double>(attitudeOutputs->vpeStatus.knownMagDisturbance()));
1849 dynData.emplace_back("Att::VpeStatus::KnownAccelDisturbance", static_cast<double>(attitudeOutputs->vpeStatus.knownAccelDisturbance()));
1850 }
1851 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)
1852 {
1853 dynData.emplace_back("Att::YawPitchRoll::Y [deg]", static_cast<double>(attitudeOutputs->ypr(0)));
1854 dynData.emplace_back("Att::YawPitchRoll::P [deg]", static_cast<double>(attitudeOutputs->ypr(1)));
1855 dynData.emplace_back("Att::YawPitchRoll::R [deg]", static_cast<double>(attitudeOutputs->ypr(2)));
1856 }
1857 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)
1858 {
1859 dynData.emplace_back("Att::Quaternion::w", static_cast<double>(attitudeOutputs->qtn.w()));
1860 dynData.emplace_back("Att::Quaternion::x", static_cast<double>(attitudeOutputs->qtn.x()));
1861 dynData.emplace_back("Att::Quaternion::y", static_cast<double>(attitudeOutputs->qtn.y()));
1862 dynData.emplace_back("Att::Quaternion::z", static_cast<double>(attitudeOutputs->qtn.z()));
1863 }
1864 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)
1865 {
1866 dynData.emplace_back("Att::DCM::0-0", static_cast<double>(attitudeOutputs->dcm(0, 0)));
1867 dynData.emplace_back("Att::DCM::0-1", static_cast<double>(attitudeOutputs->dcm(0, 1)));
1868 dynData.emplace_back("Att::DCM::0-2", static_cast<double>(attitudeOutputs->dcm(0, 2)));
1869 dynData.emplace_back("Att::DCM::1-0", static_cast<double>(attitudeOutputs->dcm(1, 0)));
1870 dynData.emplace_back("Att::DCM::1-1", static_cast<double>(attitudeOutputs->dcm(1, 1)));
1871 dynData.emplace_back("Att::DCM::1-2", static_cast<double>(attitudeOutputs->dcm(1, 2)));
1872 dynData.emplace_back("Att::DCM::2-0", static_cast<double>(attitudeOutputs->dcm(2, 0)));
1873 dynData.emplace_back("Att::DCM::2-1", static_cast<double>(attitudeOutputs->dcm(2, 1)));
1874 dynData.emplace_back("Att::DCM::2-2", static_cast<double>(attitudeOutputs->dcm(2, 2)));
1875 }
1876 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)
1877 {
1878 dynData.emplace_back("Att::MagNed::N [Gauss]", static_cast<double>(attitudeOutputs->magNed(0)));
1879 dynData.emplace_back("Att::MagNed::E [Gauss]", static_cast<double>(attitudeOutputs->magNed(1)));
1880 dynData.emplace_back("Att::MagNed::D [Gauss]", static_cast<double>(attitudeOutputs->magNed(2)));
1881 }
1882 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)
1883 {
1884 dynData.emplace_back("Att::AccelNed::N [m/s^2]", static_cast<double>(attitudeOutputs->accelNed(0)));
1885 dynData.emplace_back("Att::AccelNed::E [m/s^2]", static_cast<double>(attitudeOutputs->accelNed(1)));
1886 dynData.emplace_back("Att::AccelNed::D [m/s^2]", static_cast<double>(attitudeOutputs->accelNed(2)));
1887 }
1888 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)
1889 {
1890 dynData.emplace_back("Att::LinearAccelBody::X [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelBody(0)));
1891 dynData.emplace_back("Att::LinearAccelBody::Y [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelBody(1)));
1892 dynData.emplace_back("Att::LinearAccelBody::Z [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelBody(2)));
1893 }
1894 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)
1895 {
1896 dynData.emplace_back("Att::LinearAccelNed::N [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelNed(0)));
1897 dynData.emplace_back("Att::LinearAccelNed::E [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelNed(1)));
1898 dynData.emplace_back("Att::LinearAccelNed::D [m/s^2]", static_cast<double>(attitudeOutputs->linearAccelNed(2)));
1899 }
1900 if (attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)
1901 {
1902 dynData.emplace_back("Att::YprU::Y [deg]", static_cast<double>(attitudeOutputs->yprU(0)));
1903 dynData.emplace_back("Att::YprU::P [deg]", static_cast<double>(attitudeOutputs->yprU(1)));
1904 dynData.emplace_back("Att::YprU::R [deg]", static_cast<double>(attitudeOutputs->yprU(2)));
1905 }
1906 }
1907
1908 // Group 6 (INS)
1909 if (insOutputs)
1910 {
1911 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
1912 {
1913 dynData.emplace_back("INS::InsStatus::Mode", static_cast<double>(insOutputs->insStatus.mode()));
1914 dynData.emplace_back("INS::InsStatus::GpsFix", static_cast<double>(insOutputs->insStatus.gpsFix()));
1915 dynData.emplace_back("INS::InsStatus::Error::IMU", static_cast<double>(insOutputs->insStatus.errorIMU()));
1916 dynData.emplace_back("INS::InsStatus::Error::MagPres", static_cast<double>(insOutputs->insStatus.errorMagPres()));
1917 dynData.emplace_back("INS::InsStatus::Error::GNSS", static_cast<double>(insOutputs->insStatus.errorGnss()));
1918 dynData.emplace_back("INS::InsStatus::GpsHeadingIns", static_cast<double>(insOutputs->insStatus.gpsHeadingIns()));
1919 dynData.emplace_back("INS::InsStatus::GpsCompass", static_cast<double>(insOutputs->insStatus.gpsCompass()));
1920 }
1921 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)
1922 {
1923 dynData.emplace_back("INS::PosLla::latitude [deg]", static_cast<double>(insOutputs->posLla(0)));
1924 dynData.emplace_back("INS::PosLla::longitude [deg]", static_cast<double>(insOutputs->posLla(1)));
1925 dynData.emplace_back("INS::PosLla::altitude [m]", static_cast<double>(insOutputs->posLla(2)));
1926 }
1927 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)
1928 {
1929 dynData.emplace_back("INS::PosEcef::X [m]", static_cast<double>(insOutputs->posEcef(0)));
1930 dynData.emplace_back("INS::PosEcef::Y [m]", static_cast<double>(insOutputs->posEcef(1)));
1931 dynData.emplace_back("INS::PosEcef::Z [m]", static_cast<double>(insOutputs->posEcef(2)));
1932 }
1933 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)
1934 {
1935 dynData.emplace_back("INS::VelBody::X [m/s]", static_cast<double>(insOutputs->velBody(0)));
1936 dynData.emplace_back("INS::VelBody::Y [m/s]", static_cast<double>(insOutputs->velBody(1)));
1937 dynData.emplace_back("INS::VelBody::Z [m/s]", static_cast<double>(insOutputs->velBody(2)));
1938 }
1939 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)
1940 {
1941 dynData.emplace_back("INS::VelNed::N [m/s]", static_cast<double>(insOutputs->velNed(0)));
1942 dynData.emplace_back("INS::VelNed::E [m/s]", static_cast<double>(insOutputs->velNed(1)));
1943 dynData.emplace_back("INS::VelNed::D [m/s]", static_cast<double>(insOutputs->velNed(2)));
1944 }
1945 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)
1946 {
1947 dynData.emplace_back("INS::VelEcef::X [m/s]", static_cast<double>(insOutputs->velEcef(0)));
1948 dynData.emplace_back("INS::VelEcef::Y [m/s]", static_cast<double>(insOutputs->velEcef(1)));
1949 dynData.emplace_back("INS::VelEcef::Z [m/s]", static_cast<double>(insOutputs->velEcef(2)));
1950 }
1951 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)
1952 {
1953 dynData.emplace_back("INS::MagEcef::X [Gauss]", static_cast<double>(insOutputs->magEcef(0)));
1954 dynData.emplace_back("INS::MagEcef::Y [Gauss]", static_cast<double>(insOutputs->magEcef(1)));
1955 dynData.emplace_back("INS::MagEcef::Z [Gauss]", static_cast<double>(insOutputs->magEcef(2)));
1956 }
1957 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)
1958 {
1959 dynData.emplace_back("INS::AccelEcef::X [m/s^2]", static_cast<double>(insOutputs->accelEcef(0)));
1960 dynData.emplace_back("INS::AccelEcef::Y [m/s^2]", static_cast<double>(insOutputs->accelEcef(1)));
1961 dynData.emplace_back("INS::AccelEcef::Z [m/s^2]", static_cast<double>(insOutputs->accelEcef(2)));
1962 }
1963 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)
1964 {
1965 dynData.emplace_back("INS::LinearAccelEcef::X [m/s^2]", static_cast<double>(insOutputs->linearAccelEcef(0)));
1966 dynData.emplace_back("INS::LinearAccelEcef::Y [m/s^2]", static_cast<double>(insOutputs->linearAccelEcef(1)));
1967 dynData.emplace_back("INS::LinearAccelEcef::Z [m/s^2]", static_cast<double>(insOutputs->linearAccelEcef(2)));
1968 }
1969 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)
1970 {
1971 dynData.emplace_back("INS::PosU [m]", static_cast<double>(insOutputs->posU));
1972 }
1973 if (insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)
1974 {
1975 dynData.emplace_back("INS::VelU [m/s]", static_cast<double>(insOutputs->velU));
1976 }
1977 }
1978
1979 // Group 7 (GNSS2)
1980 if (gnss2Outputs)
1981 {
1982 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1983 {
1984 dynData.emplace_back("GNSS2::UTC::year", static_cast<double>(gnss2Outputs->timeUtc.year));
1985 dynData.emplace_back("GNSS2::UTC::month", static_cast<double>(gnss2Outputs->timeUtc.month));
1986 dynData.emplace_back("GNSS2::UTC::day", static_cast<double>(gnss2Outputs->timeUtc.day));
1987 dynData.emplace_back("GNSS2::UTC::hour", static_cast<double>(gnss2Outputs->timeUtc.hour));
1988 dynData.emplace_back("GNSS2::UTC::min", static_cast<double>(gnss2Outputs->timeUtc.min));
1989 dynData.emplace_back("GNSS2::UTC::sec", static_cast<double>(gnss2Outputs->timeUtc.sec));
1990 dynData.emplace_back("GNSS2::UTC::ms", static_cast<double>(gnss2Outputs->timeUtc.ms));
1991 }
1992 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1993 {
1994 dynData.emplace_back("GNSS2::Tow [ns]", static_cast<double>(gnss2Outputs->tow));
1995 }
1996 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1997 {
1998 dynData.emplace_back("GNSS2::Week", static_cast<double>(gnss2Outputs->week));
1999 }
2000 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
2001 {
2002 dynData.emplace_back("GNSS2::NumSats", static_cast<double>(gnss2Outputs->numSats));
2003 }
2004 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
2005 {
2006 dynData.emplace_back("GNSS2::Fix", static_cast<double>(gnss2Outputs->fix));
2007 }
2008 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
2009 {
2010 dynData.emplace_back("GNSS2::PosLla::latitude [deg]", static_cast<double>(gnss2Outputs->posLla(0)));
2011 dynData.emplace_back("GNSS2::PosLla::longitude [deg]", static_cast<double>(gnss2Outputs->posLla(1)));
2012 dynData.emplace_back("GNSS2::PosLla::altitude [m]", static_cast<double>(gnss2Outputs->posLla(2)));
2013 }
2014 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
2015 {
2016 dynData.emplace_back("GNSS2::PosEcef::X [m]", static_cast<double>(gnss2Outputs->posEcef(0)));
2017 dynData.emplace_back("GNSS2::PosEcef::Y [m]", static_cast<double>(gnss2Outputs->posEcef(1)));
2018 dynData.emplace_back("GNSS2::PosEcef::Z [m]", static_cast<double>(gnss2Outputs->posEcef(2)));
2019 }
2020 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
2021 {
2022 dynData.emplace_back("GNSS2::VelNed::N [m/s]", static_cast<double>(gnss2Outputs->velNed(0)));
2023 dynData.emplace_back("GNSS2::VelNed::E [m/s]", static_cast<double>(gnss2Outputs->velNed(1)));
2024 dynData.emplace_back("GNSS2::VelNed::D [m/s]", static_cast<double>(gnss2Outputs->velNed(2)));
2025 }
2026 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
2027 {
2028 dynData.emplace_back("GNSS2::VelEcef::X [m/s]", static_cast<double>(gnss2Outputs->velEcef(0)));
2029 dynData.emplace_back("GNSS2::VelEcef::Y [m/s]", static_cast<double>(gnss2Outputs->velEcef(1)));
2030 dynData.emplace_back("GNSS2::VelEcef::Z [m/s]", static_cast<double>(gnss2Outputs->velEcef(2)));
2031 }
2032 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
2033 {
2034 dynData.emplace_back("GNSS2::PosU::N [m]", static_cast<double>(gnss2Outputs->posU(0)));
2035 dynData.emplace_back("GNSS2::PosU::E [m]", static_cast<double>(gnss2Outputs->posU(1)));
2036 dynData.emplace_back("GNSS2::PosU::D [m]", static_cast<double>(gnss2Outputs->posU(2)));
2037 }
2038 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
2039 {
2040 dynData.emplace_back("GNSS2::VelU [m/s]", static_cast<double>(gnss2Outputs->velU));
2041 }
2042 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
2043 {
2044 dynData.emplace_back("GNSS2::TimeU [s]", static_cast<double>(gnss2Outputs->timeU));
2045 }
2046 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
2047 {
2048 dynData.emplace_back("GNSS2::TimeInfo::Status::timeOk", static_cast<double>(gnss2Outputs->timeInfo.status.timeOk()));
2049 dynData.emplace_back("GNSS2::TimeInfo::Status::dateOk", static_cast<double>(gnss2Outputs->timeInfo.status.dateOk()));
2050 dynData.emplace_back("GNSS2::TimeInfo::Status::utcTimeValid", static_cast<double>(gnss2Outputs->timeInfo.status.utcTimeValid()));
2051 dynData.emplace_back("GNSS2::TimeInfo::LeapSeconds", static_cast<double>(gnss2Outputs->timeInfo.leapSeconds));
2052 }
2053 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
2054 {
2055 dynData.emplace_back("GNSS2::DOP::g", static_cast<double>(gnss2Outputs->dop.gDop));
2056 dynData.emplace_back("GNSS2::DOP::p", static_cast<double>(gnss2Outputs->dop.pDop));
2057 dynData.emplace_back("GNSS2::DOP::t", static_cast<double>(gnss2Outputs->dop.tDop));
2058 dynData.emplace_back("GNSS2::DOP::v", static_cast<double>(gnss2Outputs->dop.vDop));
2059 dynData.emplace_back("GNSS2::DOP::h", static_cast<double>(gnss2Outputs->dop.hDop));
2060 dynData.emplace_back("GNSS2::DOP::n", static_cast<double>(gnss2Outputs->dop.nDop));
2061 dynData.emplace_back("GNSS2::DOP::e", static_cast<double>(gnss2Outputs->dop.eDop));
2062 }
2063 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
2064 {
2065 dynData.emplace_back("GNSS2::SatInfo::NumSats", static_cast<double>(gnss2Outputs->satInfo.numSats));
2066 for (auto& satellite : gnss2Outputs->satInfo.satellites)
2067 {
2068 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
2069 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag Healthy", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Healthy) ? 1 : 0));
2070 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag Almanac", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Almanac) ? 1 : 0));
2071 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag Ephemeris", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::Ephemeris) ? 1 : 0));
2072 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag DifferentialCorrection", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::DifferentialCorrection) ? 1 : 0));
2073 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag UsedForNavigation", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForNavigation) ? 1 : 0));
2074 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag AzimuthElevationValid", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::AzimuthElevationValid) ? 1 : 0));
2075 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - flag UsedForRTK", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::SatInfo::SatInfoElement::Flags::UsedForRTK) ? 1 : 0));
2076 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - cno", satId), static_cast<double>(satellite.cno));
2077 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - qi", satId), static_cast<double>(satellite.qi));
2078 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - el", satId), static_cast<double>(satellite.el));
2079 dynData.emplace_back(fmt::format("GNSS2::SatInfo::{} - az", satId), static_cast<double>(satellite.az));
2080 }
2081 }
2082 if (gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
2083 {
2084 dynData.emplace_back("GNSS2::RawMeas::Tow [s]", gnss2Outputs->raw.tow);
2085 dynData.emplace_back("GNSS2::RawMeas::Week", static_cast<double>(gnss2Outputs->raw.week));
2086 dynData.emplace_back("GNSS2::RawMeas::NumSats", static_cast<double>(gnss2Outputs->raw.numSats));
2087 for (auto& satellite : gnss2Outputs->raw.satellites)
2088 {
2089 SatId satId(getSatSys(satellite.sys), static_cast<uint16_t>(satellite.svId));
2090 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - freq", satId), static_cast<double>(satellite.freq));
2091 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - chan", satId), static_cast<double>(satellite.chan));
2092 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - slot", satId), static_cast<double>(satellite.slot));
2093 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - cno", satId), static_cast<double>(satellite.cno));
2094 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag Searching", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Searching) ? 1 : 0));
2095 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag Tracking", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::Tracking) ? 1 : 0));
2096 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag TimeValid", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::TimeValid) ? 1 : 0));
2097 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag CodeLock", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::CodeLock) ? 1 : 0));
2098 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseLock", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseLock) ? 1 : 0));
2099 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfAmbiguity", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfAmbiguity) ? 1 : 0));
2100 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseHalfSub", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseHalfSub) ? 1 : 0));
2101 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag PhaseSlip", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PhaseSlip) ? 1 : 0));
2102 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - flag PseudorangeSmoothed", satId), static_cast<double>(static_cast<unsigned int>(satellite.flags & NAV::vendor::vectornav::RawMeas::SatRawElement::Flags::PseudorangeSmoothed) ? 1 : 0));
2103 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - pr", satId), satellite.pr);
2104 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - cp", satId), satellite.cp);
2105 dynData.emplace_back(fmt::format("GNSS2::RawMeas::{} - dp", satId), static_cast<double>(satellite.dp));
2106 }
2107 }
2108 }
2109
2110 return dynData;
2111 }
2112
2113 // ------------------------------------------ Public members ---------------------------------------------
2114
2115 /// @brief Binary Group 2 - Time Outputs
2116 std::shared_ptr<vendor::vectornav::TimeOutputs> timeOutputs = nullptr;
2117
2118 /// @brief Binary Group 3 - IMU Outputs
2119 std::shared_ptr<vendor::vectornav::ImuOutputs> imuOutputs = nullptr;
2120
2121 /// @brief Binary Group 4 - GNSS1 Outputs
2122 std::shared_ptr<vendor::vectornav::GnssOutputs> gnss1Outputs = nullptr;
2123
2124 /// @brief Binary Group 5 - Attitude Outputs
2125 std::shared_ptr<vendor::vectornav::AttitudeOutputs> attitudeOutputs = nullptr;
2126
2127 /// @brief Binary Group 6 - INS Outputs
2128 std::shared_ptr<vendor::vectornav::InsOutputs> insOutputs = nullptr;
2129
2130 /// @brief Binary Group 7 - GNSS2 Outputs
2131 std::shared_ptr<vendor::vectornav::GnssOutputs> gnss2Outputs = nullptr;
2132
2133 /// Position and rotation information for conversion from platform to body frame
2134 const ImuPos& imuPos;
2135 };
2136
2137 } // namespace NAV
2138