INSTINCT Code Coverage Report


Directory: src/
File: Nodes/DataProvider/GNSS/FileReader/RinexNavFile.cpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 567 743 76.3%
Functions: 23 28 82.1%
Branches: 1194 2541 47.0%

Line Branch Exec Source
1 // This file is part of INSTINCT, the INS Toolkit for Integrated
2 // Navigation Concepts and Training by the Institute of Navigation of
3 // the University of Stuttgart, Germany.
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9 #include "RinexNavFile.hpp"
10
11 #include <bitset>
12
13 #include "internal/NodeManager.hpp"
14 namespace nm = NAV::NodeManager;
15 #include "internal/FlowManager.hpp"
16
17 #include "util/StringUtil.hpp"
18
19 #include "Navigation/GNSS/Core/SatelliteSystem.hpp"
20 #include "Navigation/Atmosphere/Ionosphere/IonosphericCorrections.hpp"
21 #include "Navigation/GNSS/Satellite/Ephemeris/GPSEphemeris.hpp"
22 #include "Navigation/GNSS/Satellite/Ephemeris/GalileoEphemeris.hpp"
23 #include "Navigation/GNSS/Satellite/Ephemeris/GLONASSEphemeris.hpp"
24 #include "Navigation/GNSS/Satellite/Ephemeris/BDSEphemeris.hpp"
25 #include "Navigation/GNSS/Satellite/Ephemeris/QZSSEphemeris.hpp"
26
27 namespace NAV
28 {
29 160 RinexNavFile::RinexNavFile()
30
3/6
✓ Branch 1 taken 160 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 160 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 160 times.
✗ Branch 9 not taken.
160 : Node(typeStatic())
31 {
32 LOG_TRACE("{}: called", name);
33
34 160 _hasConfig = true;
35 160 _guiConfigDefaultWindowSize = { 517, 87 };
36
37
5/10
✓ Branch 2 taken 160 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 160 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 160 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 160 times.
✓ Branch 15 taken 160 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
640 nm::CreateOutputPin(this, GnssNavInfo::type().c_str(), Pin::Type::Object, { GnssNavInfo::type() }, &_gnssNavInfo);
38 320 }
39
40 416 RinexNavFile::~RinexNavFile()
41 {
42 LOG_TRACE("{}: called", nameId());
43 416 }
44
45 272 std::string RinexNavFile::typeStatic()
46 {
47
1/2
✓ Branch 1 taken 272 times.
✗ Branch 2 not taken.
544 return "RinexNavFile";
48 }
49
50 std::string RinexNavFile::type() const
51 {
52 return typeStatic();
53 }
54
55 112 std::string RinexNavFile::category()
56 {
57
1/2
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
224 return "Data Provider";
58 }
59
60 void RinexNavFile::guiConfig()
61 {
62 if (auto res = FileReader::guiConfig(R"(Rinex Nav (.nav .rnx .gal .geo .glo .*N .*P){.nav,.rnx,.gal,.geo,.glo,(.+[.]\d\d?[Nn]),(.+[.]\d\d?[Ll]),(.+[.]\d\d?[Pp])},.*)",
63 { ".nav", ".rnx", ".gal", ".geo", ".glo", "(.+[.]\\d\\d?[Nn])", "(.+[.]\\d\\d?[Ll])", "(.+[.]\\d\\d?[Pp])" }, size_t(id), nameId()))
64 {
65 LOG_DEBUG("{}: Path changed to {}", nameId(), _path);
66 flow::ApplyChanges();
67 if (res == FileReader::PATH_CHANGED)
68 {
69 doReinitialize();
70 }
71 else
72 {
73 doDeinitialize();
74 }
75 }
76 ImGui::Text("Supported versions: ");
77 std::ranges::for_each(_supportedVersions, [](double x) {
78 ImGui::SameLine();
79 ImGui::Text("%0.2f", x);
80 });
81 }
82
83 [[nodiscard]] json RinexNavFile::save() const
84 {
85 LOG_TRACE("{}: called", nameId());
86
87 json j;
88
89 j["FileReader"] = FileReader::save();
90
91 return j;
92 }
93
94 48 void RinexNavFile::restore(json const& j)
95 {
96 LOG_TRACE("{}: called", nameId());
97
98
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 if (j.contains("FileReader"))
99 {
100 48 FileReader::restore(j.at("FileReader"));
101 }
102 48 }
103
104 48 bool RinexNavFile::initialize()
105 {
106 LOG_TRACE("{}: called", nameId());
107
108 {
109 // The guards needs to be released before FileReader::initialize()
110
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 auto guard = requestOutputValueLock(OUTPUT_PORT_INDEX_GNSS_NAV_INFO);
111 48 _gnssNavInfo.reset();
112 48 }
113 48 _version = 0.0;
114 48 _sbasNotSupportedWarned = false;
115
116
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
48 if (!FileReader::initialize())
117 {
118 return false;
119 }
120
121 48 readOrbits();
122
123 48 return true;
124 }
125
126 48 void RinexNavFile::deinitialize()
127 {
128 LOG_TRACE("{}: called", nameId());
129
130 48 FileReader::deinitialize();
131 48 }
132
133 96 bool RinexNavFile::resetNode()
134 {
135 LOG_TRACE("{}: called", nameId());
136
137 96 FileReader::resetReader();
138
139 96 return true;
140 }
141
142 48 FileReader::FileType RinexNavFile::determineFileType()
143 {
144 351 auto extHeaderLabel = [](const std::string& line) {
145
1/2
✓ Branch 2 taken 351 times.
✗ Branch 3 not taken.
351 return str::trim_copy(std::string_view(line).substr(60, 20));
146 };
147
148
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 std::filesystem::path filepath = getFilepath();
149
150
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 auto filestreamHeader = std::ifstream(filepath);
151
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 if (filestreamHeader.good())
152 {
153 48 std::string line;
154 // --------------------------------------- RINEX VERSION / TYPE ------------------------------------------
155
5/6
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 48 times.
✓ Branch 4 taken 60 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 60 times.
✓ Branch 7 taken 48 times.
108 while (line.find("RINEX VERSION / TYPE") == std::string::npos && !filestreamHeader.eof())
156 {
157
1/2
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
60 std::getline(filestreamHeader, line);
158 }
159
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
48 if (filestreamHeader.eof())
160 {
161 LOG_ERROR("{}: Not a valid RINEX NAV file. Could not read 'RINEX VERSION / TYPE' line.", nameId());
162 return FileReader::FileType::NONE;
163 }
164
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 str::rtrim(line);
165
3/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 48 times.
48 if (str::rtrim_copy(line).size() != 80)
166 {
167 LOG_ERROR("{}: Not a valid RINEX NAV file. Lines should be 80 characters long but the file has {}.", nameId(), line.size() - 1);
168 return FileReader::FileType::NONE;
169 }
170
171
2/4
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 48 times.
48 if (extHeaderLabel(line) != "RINEX VERSION / TYPE")
172 {
173 LOG_ERROR("{}: Not a valid RINEX NAV file. Could not read 'RINEX VERSION / TYPE' line.", nameId());
174 return FileReader::FileType::NONE;
175 }
176
177
3/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
48 _version = std::stod(str::trim_copy(line.substr(0, 20))); // FORMAT: F9.2,11X
178
2/4
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
48 if (!_supportedVersions.contains(_version))
179 {
180 LOG_ERROR("{}: RINEX version {} is not supported. Supported versions are [{}]", nameId(),
181 _version, fmt::join(_supportedVersions.begin(), _supportedVersions.end(), ", "));
182 _version = 0.0;
183 return FileReader::FileType::NONE;
184 }
185
186
2/4
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
48 std::string fileType = str::trim_copy(line.substr(20, 20)); // FORMAT: A1,19X
187
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 if (fileType.at(0) != 'N' // N: GNSS NAV DATA
188
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 && fileType != "NAVIGATION DATA"
189
5/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 46 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
50 && fileType != "GLONASS NAV DATA")
190 {
191 LOG_ERROR("{}: Not a valid RINEX NAV file. File type '{}' not recognized.", nameId(), fileType);
192 doDeinitialize();
193 return FileReader::FileType::NONE;
194 }
195 48 std::string satSystem;
196
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 44 times.
48 if (_version < 3.0)
197 {
198
3/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
4 if (fileType == "NAVIGATION DATA")
199 {
200
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 satSystem = 'G';
201 }
202
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 else if (fileType == "GLONASS NAV DATA")
203 {
204
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 satSystem = 'R';
205 }
206 else if (fileType.at(0) == 'N')
207 {
208 satSystem = fileType.substr(3, 3);
209 }
210 }
211 else
212 {
213
2/4
✓ Branch 1 taken 44 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 44 times.
✗ Branch 5 not taken.
44 satSystem = str::trim_copy(line.substr(40, 20)); // FORMAT: A1,19X
214 }
215
8/14
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 40 times.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 48 times.
48 if (satSystem.empty() || (SatelliteSystem::fromChar(satSystem.at(0)) == SatSys_None && satSystem.at(0) != 'M'))
216 {
217 LOG_ERROR("{}: Not a valid RINEX NAV file. Satellite System '{}' not recognized.", nameId(), satSystem);
218 doDeinitialize();
219 return FileReader::FileType::NONE;
220 }
221 // ---------------------------------------- PGM / RUN BY / DATE ------------------------------------------
222
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 std::getline(filestreamHeader, line);
223
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 str::rtrim(line);
224
2/4
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 48 times.
48 if (extHeaderLabel(line) != "PGM / RUN BY / DATE")
225 {
226 LOG_ERROR("{}: Not a valid RINEX NAV file. Could not read 'PGM / RUN BY / DATE' line.", nameId());
227 return FileReader::FileType::NONE;
228 }
229
230 // ----------------------------------------- END OF HEADER -------------------------------------------
231
5/10
✓ Branch 1 taken 255 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 255 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 255 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 255 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 255 times.
✗ Branch 12 not taken.
255 while (std::getline(filestreamHeader, line) && !filestreamHeader.eof())
232 {
233
1/2
✓ Branch 1 taken 255 times.
✗ Branch 2 not taken.
255 str::rtrim(line);
234
3/4
✓ Branch 2 taken 255 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✓ Branch 6 taken 207 times.
255 if (extHeaderLabel(line) == "END OF HEADER")
235 {
236 48 return FileReader::FileType::ASCII;
237 }
238 }
239 LOG_ERROR("{}: Not a valid RINEX NAV file. Could not read 'END OF HEADER' line.", nameId());
240 return FileReader::FileType::NONE;
241 48 }
242
243 LOG_ERROR("{}: Could not determine file type because file could not be opened '{}' line.", nameId(), filepath.string());
244 return FileReader::FileType::NONE;
245 48 }
246
247 namespace
248 {
249
250 303 std::string_view extHeaderLabel(const std::string& line)
251 {
252
2/4
✓ Branch 1 taken 303 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 303 times.
✗ Branch 6 not taken.
606 return line.size() >= 60 ? str::trim_copy(std::string_view(line).substr(60, 20))
253 303 : std::string_view{};
254 };
255
256 } // namespace
257
258 48 void RinexNavFile::executeHeaderParser(double version)
259 {
260
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 44 times.
48 if (version < 3.0)
261 {
262 4 parseHeader2();
263 }
264
2/2
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 5 times.
44 else if (version < 4.0)
265 {
266 39 parseHeader3();
267 }
268
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 else if (version == 4.0)
269 {
270 5 parseHeader4();
271 }
272 else
273 {
274 LOG_ERROR("{}: Unsupported RINEX version {}.", nameId(), version);
275 // return nullptr;
276 }
277 48 }
278
279 48 void RinexNavFile::executeOrbitParser(double version)
280 {
281
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 44 times.
48 if (version < 3.0)
282 {
283 4 parseOrbit2();
284 }
285
2/2
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 5 times.
44 else if (version < 4.0)
286 {
287 39 parseOrbit3();
288 }
289
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 else if (version == 4.0)
290 {
291 5 parseOrbit4();
292 }
293 else
294 {
295 LOG_ERROR("{}: Unsupported RINEX version {}.", nameId(), version);
296 // return nullptr;
297 }
298 48 }
299
300 4 void RinexNavFile::parseHeader2()
301 {
302 4 std::string line;
303 // --------------------------------------- RINEX VERSION / TYPE ------------------------------------------
304
6/8
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 4 times.
8 while (line.find("RINEX VERSION / TYPE") == std::string::npos && !eof())
305 {
306
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 getline(line);
307 }
308 4 SatelliteSystem satSys = SatSys_None;
309
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
4 LOG_DEBUG("{}: Version: {:3.2f}", nameId(), _version); // FORMAT: F9.2,11X
310
7/14
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
8 if ((line.substr(20, 15) == "N: GPS NAV DATA" || line.substr(20, 15) == "NAVIGATION DATA")
311
17/32
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 3 times.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 3 times.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✓ Branch 34 taken 4 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
8 && (line.substr(40, 3) == "GPS" || str::trim_copy(line.substr(40, 3)).empty()))
312 {
313
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
2 LOG_DEBUG("{}: SatSys : {}", nameId(), "G: GPS"); // FORMAT: A1,19X
314 2 satSys = GPS;
315 2 _gnssNavInfo.satelliteSystems |= satSys;
316 }
317
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
2 else if (line.substr(20, 16) == "GLONASS NAV DATA")
318 {
319
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
2 LOG_DEBUG("{}: SatSys : {}", nameId(), "R: GLONASS"); // FORMAT: A1,19X
320 2 satSys = GLO;
321 2 _gnssNavInfo.satelliteSystems |= satSys;
322 }
323 // #######################################################################################################
324
6/12
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 24 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 24 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 24 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 24 times.
✗ Branch 14 not taken.
24 while (getline(line) && !eof())
325 {
326
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 str::rtrim(line);
327
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 auto headerLabel = extHeaderLabel(line);
328
2/2
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 4 times.
24 if (headerLabel == "PGM / RUN BY / DATE")
329 {
330 // Name of program creating current file
331 LOG_DATA("{}: Program: {}", nameId(), str::trim_copy(line.substr(0, 20))); // FORMAT: A20
332 // Name of agency creating current file
333 LOG_DATA("{}: Run by : {}", nameId(), str::trim_copy(line.substr(20, 20))); // FORMAT: A20
334 // Date and time of file creation
335 LOG_DATA("{}: Date : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A20
336 }
337
2/2
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 4 times.
20 else if (headerLabel == "COMMENT")
338 {
339 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
340 }
341
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
16 else if (headerLabel == "IONOSPHERIC CORR")
342 {
343 auto correctionType = str::trim_copy(line.substr(0, 4)); // FORMAT: A4,1X,
344 std::array<double, 4> values{};
345 values[0] = str::stod(str::replaceAll_copy(line.substr(5, 12), "d", "e", str::IgnoreCase), 0.0); // FORMAT: 4D12.4
346 values[1] = str::stod(str::replaceAll_copy(line.substr(17, 12), "d", "e", str::IgnoreCase), 0.0);
347 values[2] = str::stod(str::replaceAll_copy(line.substr(29, 12), "d", "e", str::IgnoreCase), 0.0);
348 values[3] = str::stod(str::replaceAll_copy(line.substr(41, 12), "d", "e", str::IgnoreCase), 0.0);
349
350 auto satSys = SatelliteSystem::fromString(correctionType.substr(0, 3));
351 IonosphericCorrections::AlphaBeta alphaBeta = (correctionType.size() == 4 && correctionType.at(3) == 'B')
352 ? IonosphericCorrections::Beta
353 : IonosphericCorrections::Alpha;
354 _gnssNavInfo.ionosphericCorrections.insert(satSys, alphaBeta, values);
355 LOG_DATA("{}: Ionospheric Correction: {}-{}: [{}]", nameId(),
356 std::string(satSys), alphaBeta == IonosphericCorrections::Alpha ? "Alpha" : "Beta",
357 fmt::join(values.begin(), values.end(), ", "));
358 }
359
6/6
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 12 times.
16 else if (headerLabel == "ION ALPHA" || headerLabel == "ION BETA")
360 {
361
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 auto correctionType = headerLabel.substr(4, 1);
362
6/12
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
20 auto valuesStr = str::split_wo_empty(str::replaceAll_copy(line.substr(4, 60 - 4), "d", "e", str::IgnoreCase), " ");
363 4 std::array<double, 4> values{};
364
2/2
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 4 times.
20 for (size_t i = 0; i < valuesStr.size(); i++)
365 {
366
3/6
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
16 values.at(i) = std::stod(valuesStr.at(i));
367 }
368
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
4 IonosphericCorrections::AlphaBeta alphaBeta = correctionType == "B" ? IonosphericCorrections::Beta
369 4 : IonosphericCorrections::Alpha;
370
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 _gnssNavInfo.ionosphericCorrections.insert(satSys, alphaBeta, values);
371 LOG_DATA("{}: Ionospheric Correction: {}-{}: [{}]", nameId(),
372 std::string(satSys), alphaBeta == IonosphericCorrections::Alpha ? "Alpha" : "Beta",
373 fmt::join(values.begin(), values.end(), ", "));
374 4 }
375 12 else if (headerLabel == "TIME SYSTEM CORR"
376
5/6
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 10 times.
12 || headerLabel == "CORR TO SYSTEM TIME")
377 {
378
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
6 auto tau_c = str::stod(str::replaceAll_copy(line.substr(21, 19), "d", "e", str::IgnoreCase), 0.0);
379 LOG_DATA("{}: tau_c {}", nameId(), tau_c);
380
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (tau_c != 0)
381 {
382
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 _gnssNavInfo.timeSysCorr[{ satSys.getTimeSystem(), UTC }] = { .a0 = tau_c, .a1 = 0 };
383 }
384 }
385
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
10 else if (headerLabel == "DELTA-UTC: A0,A1,T,W")
386 {
387
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
8 auto a0 = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
388 LOG_DATA("{}: a0 {}", nameId(), a0);
389
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
6 auto a1 = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
390 LOG_DATA("{}: a1 {}", nameId(), a1);
391
392
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if (a0 != 0 || a1 != 0)
393 {
394
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 _gnssNavInfo.timeSysCorr[{ satSys.getTimeSystem(), UTC }] = { .a0 = a0, .a1 = a1 };
395 }
396 }
397
2/2
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
8 else if (headerLabel == "LEAP SECONDS")
398 {
399 LOG_DATA("{}: Leap seconds: {}", nameId(), std::stoi(line.substr(0, 6)));
400 }
401
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 else if (headerLabel == "END OF HEADER")
402 {
403 4 break;
404 }
405 }
406 4 }
407
408 39 void RinexNavFile::parseHeader3()
409 {
410 39 std::string line;
411 // --------------------------------------- RINEX VERSION / TYPE ------------------------------------------
412
6/8
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 39 times.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 51 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 51 times.
✓ Branch 9 taken 39 times.
90 while (line.find("RINEX VERSION / TYPE") == std::string::npos && !eof())
413 {
414
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 getline(line);
415 }
416 39 SatelliteSystem satSys = SatSys_None;
417
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 39 times.
✗ Branch 9 not taken.
39 LOG_DEBUG("{}: Version: {:3.2f}", nameId(), _version); // FORMAT: F9.2,11X
418
5/10
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 39 times.
✗ Branch 15 not taken.
39 LOG_DEBUG("{}: SatSys : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A1,19X
419 // #######################################################################################################
420
6/12
✓ Branch 1 taken 264 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 264 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 264 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 264 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 264 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 264 times.
✗ Branch 14 not taken.
264 while (getline(line) && !eof())
421 {
422
1/2
✓ Branch 1 taken 264 times.
✗ Branch 2 not taken.
264 str::rtrim(line);
423
1/2
✓ Branch 1 taken 264 times.
✗ Branch 2 not taken.
264 auto headerLabel = extHeaderLabel(line);
424
2/2
✓ Branch 2 taken 225 times.
✓ Branch 3 taken 39 times.
264 if (headerLabel == "PGM / RUN BY / DATE")
425 {
426 // Name of program creating current file
427 LOG_DATA("{}: Program: {}", nameId(), str::trim_copy(line.substr(0, 20))); // FORMAT: A20
428 // Name of agency creating current file
429 LOG_DATA("{}: Run by : {}", nameId(), str::trim_copy(line.substr(20, 20))); // FORMAT: A20
430 // Date and time of file creation
431 LOG_DATA("{}: Date : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A20
432 }
433
2/2
✓ Branch 2 taken 212 times.
✓ Branch 3 taken 13 times.
225 else if (headerLabel == "COMMENT")
434 {
435 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
436 }
437
2/2
✓ Branch 2 taken 102 times.
✓ Branch 3 taken 110 times.
212 else if (headerLabel == "IONOSPHERIC CORR")
438 {
439
2/4
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
102 auto correctionType = str::trim_copy(line.substr(0, 4)); // FORMAT: A4,1X,
440 102 std::array<double, 4> values{};
441
4/8
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 102 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 102 times.
✗ Branch 11 not taken.
408 values[0] = str::stod(str::replaceAll_copy(line.substr(5, 12), "d", "e", str::IgnoreCase), 0.0); // FORMAT: 4D12.4
442
4/8
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 102 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 102 times.
✗ Branch 11 not taken.
408 values[1] = str::stod(str::replaceAll_copy(line.substr(17, 12), "d", "e", str::IgnoreCase), 0.0);
443
4/8
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 102 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 102 times.
✗ Branch 11 not taken.
408 values[2] = str::stod(str::replaceAll_copy(line.substr(29, 12), "d", "e", str::IgnoreCase), 0.0);
444
4/8
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 102 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 102 times.
✗ Branch 11 not taken.
306 values[3] = str::stod(str::replaceAll_copy(line.substr(41, 12), "d", "e", str::IgnoreCase), 0.0);
445
446
2/4
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 102 times.
✗ Branch 5 not taken.
102 auto satSys = SatelliteSystem::fromString(correctionType.substr(0, 3));
447
3/4
✓ Branch 2 taken 92 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 46 times.
✓ Branch 5 taken 46 times.
194 IonosphericCorrections::AlphaBeta alphaBeta = (correctionType.size() == 4 && correctionType.at(3) == 'B')
448
2/2
✓ Branch 0 taken 92 times.
✓ Branch 1 taken 10 times.
194 ? IonosphericCorrections::Beta
449 102 : IonosphericCorrections::Alpha;
450
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
102 _gnssNavInfo.ionosphericCorrections.insert(satSys, alphaBeta, values);
451 LOG_DATA("{}: Ionospheric Correction: {}-{}: [{}]", nameId(),
452 std::string(satSys), alphaBeta == IonosphericCorrections::Alpha ? "Alpha" : "Beta",
453 fmt::join(values.begin(), values.end(), ", "));
454 102 }
455
3/6
✓ Branch 2 taken 110 times.
✗ Branch 3 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 110 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 110 times.
110 else if (headerLabel == "ION ALPHA" || headerLabel == "ION BETA")
456 {
457 auto correctionType = headerLabel.substr(4, 1);
458 auto valuesStr = str::split_wo_empty(str::replaceAll_copy(line.substr(4, 60 - 4), "d", "e", str::IgnoreCase), " ");
459 std::array<double, 4> values{};
460 for (size_t i = 0; i < valuesStr.size(); i++)
461 {
462 values.at(i) = std::stod(valuesStr.at(i));
463 }
464 IonosphericCorrections::AlphaBeta alphaBeta = correctionType == "B" ? IonosphericCorrections::Beta
465 : IonosphericCorrections::Alpha;
466 _gnssNavInfo.ionosphericCorrections.insert(satSys, alphaBeta, values);
467 LOG_DATA("{}: Ionospheric Correction: {}-{}: [{}]", nameId(),
468 std::string(satSys), alphaBeta == IonosphericCorrections::Alpha ? "Alpha" : "Beta",
469 fmt::join(values.begin(), values.end(), ", "));
470 }
471 110 else if (headerLabel == "TIME SYSTEM CORR"
472
5/6
✓ Branch 0 taken 68 times.
✓ Branch 1 taken 42 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 68 times.
✓ Branch 6 taken 42 times.
✓ Branch 7 taken 68 times.
110 || headerLabel == "CORR TO SYSTEM TIME")
473 {
474
2/4
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
42 auto correctionType = str::trim_copy(line.substr(0, 4)); // FORMAT: A4,1X,
475 LOG_DATA("{}: Time System Correction: {}", nameId(), correctionType);
476
477 42 std::array<size_t, 2> x{ 5, 22 };
478 42 std::array<size_t, 2> n{ 17, 16 };
479
480
2/4
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42 times.
42 if (correctionType == "SBUT")
481 {
482 x = { 7, 26 };
483 n = { 19, 19 };
484 }
485
3/4
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 37 times.
42 else if (correctionType == "GLUT")
486 {
487 5 x = { 5, 24 };
488 5 n = { 19, 19 };
489 }
490
491
4/8
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 42 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 42 times.
✗ Branch 13 not taken.
168 auto a0 = str::stod(str::replaceAll_copy(line.substr(x[0], n[0]), "d", "e", str::IgnoreCase), std::nan(""));
492 LOG_DATA("{}: a0 {}", nameId(), a0);
493
4/8
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 42 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 42 times.
✗ Branch 13 not taken.
126 auto a1 = str::stod(str::replaceAll_copy(line.substr(x[1], n[1]), "d", "e", str::IgnoreCase), std::nan(""));
494 LOG_DATA("{}: a1 {}", nameId(), a1);
495
496
3/6
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 42 times.
✗ Branch 7 not taken.
42 if (!std::isnan(a0) && !std::isnan(a1))
497 {
498 42 std::pair<TimeSystem, TimeSystem> timeSystems;
499
3/4
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 28 times.
42 if (correctionType == "GPUT") { timeSystems = { GPST, UTC }; }
500
3/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 23 times.
28 else if (correctionType == "GLUT") { timeSystems = { GLNT, UTC }; }
501
3/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 13 times.
23 else if (correctionType == "GAUT") { timeSystems = { GST, UTC }; }
502
3/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 8 times.
13 else if (correctionType == "BDUT") { timeSystems = { BDT, UTC }; }
503
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
8 else if (correctionType == "QZUT") { timeSystems = { QZSST, UTC }; }
504
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
8 else if (correctionType == "IRUT") { timeSystems = { IRNSST, UTC }; }
505 // else if (correctionType == "SBUT") { timeSystems = { SBAST, UTC }; }
506
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
8 else if (correctionType == "GLGP") { timeSystems = { GLNT, GPST }; }
507
3/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 3 times.
8 else if (correctionType == "GAGP") { timeSystems = { GST, GPST }; }
508
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 else if (correctionType == "GPGA") { timeSystems = { GST, GPST }; } // Pre RINEX 3.04
509 else if (correctionType == "QZGP") { timeSystems = { QZSST, GPST }; }
510 else if (correctionType == "IRGP") { timeSystems = { IRNSST, GPST }; }
511 else
512 {
513 LOG_TRACE("{}: Time System Correction '{}' not implemented yet", nameId(), correctionType);
514 continue;
515 }
516
1/2
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
42 _gnssNavInfo.timeSysCorr[timeSystems] = { .a0 = a0, .a1 = a1 };
517 }
518 42 }
519
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 68 times.
68 else if (headerLabel == "DELTA-UTC: A0,A1,T,W")
520 {
521 auto a0 = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
522 LOG_DATA("{}: a0 {}", nameId(), a0);
523 auto a1 = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
524 LOG_DATA("{}: a1 {}", nameId(), a1);
525
526 if (a0 != 0 || a1 != 0)
527 {
528 _gnssNavInfo.timeSysCorr[{ satSys.getTimeSystem(), UTC }] = { .a0 = a0, .a1 = a1 };
529 }
530 }
531
2/2
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 29 times.
68 else if (headerLabel == "LEAP SECONDS")
532 {
533 LOG_DATA("{}: Leap seconds: {}", nameId(), std::stoi(line.substr(0, 6)));
534 }
535
1/2
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
39 else if (headerLabel == "END OF HEADER")
536 {
537 39 break;
538 }
539 }
540 39 }
541
542 5 void RinexNavFile::parseHeader4()
543 {
544 5 std::string line;
545 // --------------------------------------- RINEX VERSION / TYPE ------------------------------------------
546
6/8
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 9 taken 5 times.
10 while (line.find("RINEX VERSION / TYPE") == std::string::npos && !eof())
547 {
548
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 getline(line);
549 }
550 // SatelliteSystem satSys = SatSys_None;
551
3/6
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
5 LOG_DEBUG("{}: Version: {:3.2f}", nameId(), _version); // FORMAT: F9.2,11X
552
5/10
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 5 times.
✗ Branch 15 not taken.
5 LOG_DEBUG("{}: SatSys : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A1,19X
553 // #######################################################################################################
554
6/12
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 15 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 14 not taken.
15 while (getline(line) && !eof())
555 {
556
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 str::rtrim(line);
557
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 auto headerLabel = extHeaderLabel(line);
558
2/2
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 5 times.
15 if (headerLabel == "PGM / RUN BY / DATE")
559 {
560 // Name of program creating current file
561 LOG_DATA("{}: Program: {}", nameId(), str::trim_copy(line.substr(0, 20))); // FORMAT: A20
562 // Name of agency creating current file
563 LOG_DATA("{}: Run by : {}", nameId(), str::trim_copy(line.substr(20, 20))); // FORMAT: A20
564 // Date and time of file creation
565 LOG_DATA("{}: Date : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A20
566 }
567
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 else if (headerLabel == "COMMENT")
568 {
569 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
570 }
571
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 else if (headerLabel == "REC # / TYPE / VERS") // Not in mixed station files
572 {
573 // Receiver number of station
574 LOG_DATA("{}: Receiver number : {}", nameId(), str::trim_copy(line.substr(0, 20))); // FORMAT: A20
575 // Receiver type of station
576 LOG_DATA("{}: Receiver type : {}", nameId(), str::trim_copy(line.substr(20, 20))); // FORMAT: A20
577 // Receiver software version of station
578 LOG_DATA("{}: Receiver version : {}", nameId(), str::trim_copy(line.substr(40, 20))); // FORMAT: A20
579 }
580
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
10 else if (headerLabel == "Merged File")
581 {
582 if (!str::trim_copy(line.substr(0, 9)).empty())
583 {
584 // Numbers of files merged
585 LOG_DATA("{}: Number of files merged : {}", nameId(), str::trim_copy(line.substr(0, 9))); // FORMAT: I9
586 }
587 }
588
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 else if (headerLabel == "DOI")
589 {
590 // Digital Object Identifier
591 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
592 }
593
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 else if (headerLabel == "LICENSE OF USE")
594 {
595 // License of Use
596 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
597 }
598
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 else if (headerLabel == "LICENSE OF USE")
599 {
600 // License of Use
601 LOG_DATA("{}: Comment: {}", nameId(), line.substr(0, 60)); // FORMAT: A60
602 }
603
2/2
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
10 else if (headerLabel == "LEAP SECONDS")
604 {
605 LOG_DATA("{}: Leap seconds: {}", nameId(), std::stoi(line.substr(0, 6))); // I6
606 }
607
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 else if (headerLabel == "END OF HEADER")
608 {
609 5 break;
610 }
611 }
612 5 }
613
614 4 void RinexNavFile::parseOrbit2()
615 {
616 4 std::string line;
617
618 try
619 {
620
8/12
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 13 times.
✓ Branch 7 taken 4 times.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 13 times.
✓ Branch 14 taken 4 times.
17 while (getline(line) && !eof())
621 {
622
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
13 if (line.size() > 82)
623 {
624 abortReading();
625 return;
626 } // 80 + \n\r
627
628 // -------------------------------------- SV / EPOCH / SV CLK ----------------------------------------
629
630 // Satellite system (G), sat number (PRN) - A1,I2.2,
631 // Satellite system (E), satellite number - A1,I2.2,
632 // Satellite system (R), satellite number (slot number in sat. constellation) - A1,I2.2,
633 // Satellite system (J), Satellite PRN-192 - A1,I2,
634 // Satellite system (C), sat number (PRN) - A1,I2.2,
635 // Satellite system (S), satellite number (slot number in sat. constellation) - A1,I2.2,
636 // Satellite system (I), sat number (PRN) - A1,I2.2,
637 13 SatelliteSystem satSys = SatSys_None;
638
639 // Offset for RINEX 2.xx versions. Has only 3 leading spaces
640 13 satSys = _gnssNavInfo.satelliteSystems;
641
642
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
13 if (satSys == SatSys_None) { continue; } // To intercept comment lines
643
644
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 auto satNumStr = line.substr(0, 2);
645
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 if (satNumStr == " ") { continue; }
646
647 13 auto satNum = static_cast<uint8_t>(str::stoi(satNumStr, 0));
648
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if (satNum == 0) { continue; }
649 // Epoch: Toc - Time of Clock (GPS) year (4 digits) - 1X,I4,
650 // month, day, hour, minute, second - 5(1X,I2.2),
651
3/6
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
13 auto timeSplit = str::split_wo_empty(line.substr(2, 20), " ");
652
3/4
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
13 auto timeSystem = satSys == GLO ? UTC : satSys.getTimeSystem();
653
654
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
13 int year = std::stoi(timeSplit.at(0));
655
656 // RINEX 2.xx has 2-Digit Years
657
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 year += (year >= 80 ? 1900 : 2000);
658
659 InsTime epoch{ static_cast<uint16_t>(year),
660
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 static_cast<uint16_t>(std::stoi(timeSplit.at(1))),
661
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 static_cast<uint16_t>(std::stoi(timeSplit.at(2))),
662
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 static_cast<uint16_t>(std::stoi(timeSplit.at(3))),
663
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 static_cast<uint16_t>(std::stoi(timeSplit.at(4))),
664 26 std::stold(timeSplit.at(5)),
665
7/14
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 13 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 13 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
65 timeSystem };
666
667 LOG_DATA("{}: {}-{} {} (read as {} time)", nameId(), satSys, satNum, epoch.toYMDHMS(), std::string(timeSystem));
668
669
7/10
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 6 times.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 7 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 7 times.
13 if (satSys == GPS || satSys == GAL || satSys == QZSS || satSys == BDS) // NOLINT(misc-redundant-expression) // bugged warning
670 {
671 // Polynomial coefficients for clock correction
672 6 std::array<double, 3> a{};
673 // SV clock bias [seconds]
674
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 a[0] = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
675 // SV clock drift [sec/sec]
676
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 a[1] = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
677 // SV clock drift rate [sec/sec^2]
678
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
18 a[2] = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
679
680 LOG_DATA("{}: clkBias {}, clkDrift {}, clkDriftRate {}", nameId(), a[0], a[1], a[2]);
681
682 // ------------------------------------ BROADCAST ORBIT - 1 --------------------------------------
683
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
684
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
685 {
686 abortReading();
687 return;
688 } // 80 + \n\r
689
690 // GPS/QZSS: Issue of Data, Ephemeris (IODE)
691 // GAL: IODnav Issue of Data of the nav batch
692 // BDS: AODE Age of Data, Ephemeris (as specified in BeiDou ICD Table Section 5.2.4.11 Table 5-8)
693 // and field range is: 0-31.
694 // IRNSS: IODEC Issue of Data, Ephemeris and Clock
695
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 auto IODE_IODnav_AODE_IODEC = static_cast<size_t>(std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase)));
696 // Crs (meters)
697
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Crs = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
698 // Delta n (radians/sec)
699
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double delta_n = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
700 // M0 (radians)
701
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
18 double M_0 = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
702
703 LOG_DATA("{}: IODE_IODnav_AODE_IODEC {}, Crs {}, Delta_n {}, M0 {}", nameId(), IODE_IODnav_AODE_IODEC, Crs, delta_n, M_0);
704
705 // ------------------------------------ BROADCAST ORBIT - 2 --------------------------------------
706
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
707
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
708 {
709 abortReading();
710 return;
711 } // 80 + \n\r
712
713 // Cuc (radians)
714
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Cuc = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
715 // e Eccentricity
716
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double e = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
717 // Cus (radians)
718
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Cus = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
719 // sqrt(A) (sqrt(m))
720
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
18 double sqrt_A = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
721
722 LOG_DATA("{}: Cuc {}, e {}, Cus {}, sqrt_A {}", nameId(), Cuc, e, Cus, sqrt_A);
723
724 // ------------------------------------ BROADCAST ORBIT - 3 --------------------------------------
725
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
726
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
727 {
728 abortReading();
729 return;
730 } // 80 + \n\r
731
732 // Toe Time of Ephemeris (sec of GPS week)
733
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double toeSec = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
734 // Cic (radians)
735
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Cic = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
736 // OMEGA0 (radians)
737
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Omega_0 = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
738 // Cis (radians)
739
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
18 double Cis = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
740
741 LOG_DATA("{}: toe {}, Cic {}, Omega_0 {}, Cis {}", nameId(), toeSec, Cic, Omega_0, Cis);
742
743 // ------------------------------------ BROADCAST ORBIT - 4 --------------------------------------
744
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
745
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
746 {
747 abortReading();
748 return;
749 } // 80 + \n\r
750
751 // i0 (radians)
752
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double i_0 = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
753 // Crc (meters)
754
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double Crc = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
755 // omega (radians)
756
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double omega = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
757 // OMEGA DOT (radians/sec)
758
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
18 double Omega_dot = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
759
760 LOG_DATA("{}: i_0 {}, Crc {}, omega {}, Omega_dot {}", nameId(), i_0, Crc, omega, Omega_dot);
761
762 // ------------------------------------ BROADCAST ORBIT - 5 --------------------------------------
763
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
764
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
765 {
766 abortReading();
767 return;
768 } // 80 + \n\r
769
770 // IDOT (radians/sec)
771
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double i_dot = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
772 // GPS: Codes on L2 channel
773 // QZSS: Codes on L2 channel (fixed to 2, see IS-QZSS-PNT 4.1.2.7)
774 // GAL: Data sources (FLOAT --> INTEGER)
775 // Bit 0 set: I/NAV E1-B
776 // Bit 1 set: F/NAV E5a-I
777 // Bit 2 set: I/NAV E5b-I
778 // Bits 0 and 2 : Both can be set if the navigation messages were merged, however, bits 0-2
779 // cannot all be set, as the I/NAV and F/NAV messages contain different information
780 // Bit 3 reserved for Galileo internal use
781 // Bit 4 reserved for Galileo internal use
782 // Bit 8 set: af0-af2, Toc, SISA are for E5a,E1
783 // Bit 9 set: af0-af2, Toc, SISA are for E5b,E1
784 // Bits 8-9 : exclusive (only one bit can be set)
785 // BDS/IRNSS: Spare
786
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
18 auto codesOnL2Channel_dataSources = static_cast<uint16_t>(str::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase), 0));
787
788 // GPS Week # (to go with TOE) Continuous number, not mod(1024)!
789
5/10
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6 times.
✗ Branch 15 not taken.
24 auto gpsWeek = static_cast<int32_t>(str::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase), epoch.toGPSweekTow().gpsWeek));
790
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (satSys == BDS) { gpsWeek += InsTimeUtil::DIFF_BDT_WEEK_TO_GPST_WEEK; }
791
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 auto toe = InsTime(0, gpsWeek, toeSec, satSys.getTimeSystem());
792
793 // GPS: L2 P data flag
794 // QZSS: L2P data flag set to 1 since QZSS does not track L2P
795 // GAL/BDS/IRNSS: Spare
796
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
18 bool L2PdataFlag = static_cast<bool>(str::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase), 0.0));
797
798 LOG_DATA("{}: i_dot {}, codesOnL2Channel/dataSources {} ({}), gpsWeek {}, L2PdataFlag {}", nameId(),
799 i_dot, codesOnL2Channel_dataSources, std::bitset<10>(codesOnL2Channel_dataSources).to_string(), gpsWeek, L2PdataFlag);
800
801 // ------------------------------------ BROADCAST ORBIT - 6 --------------------------------------
802
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
803
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
804 {
805 abortReading();
806 return;
807 } // 80 + \n\r
808
809 // GPS: SV accuracy (meters) See GPS ICD 200H Section 20.3.3.3.1.3 use specified equations to define
810 // nominal values, N = 0-6: use 2(1+N/2) (round to one decimal place i.e. 2.8, 5.7 and 11.3) ,
811 // N= 7-15:use 2 (N-2), 8192 specifies use at own risk
812 // QZSS: SV accuracy (meters) (IS -QZSS-PNT, Section 5.4.3.1) which refers to: IS GPS 200H Section 20.3.3.3.1.3
813 // use specified equations to define nominal values, N = 0-6: use 2(1+N/2) (round to one decimal
814 // place i.e. 2.8, 5.7 and 11.3) , N= 7-15:use 2 (N-2), 8192 specifies use at own risk
815 // IRNSS: User Range Accuracy(m), See IRNSS ICD Section 6.2.1.4 , use specified equations to define
816 // nominal values, N = 0-6: use 2(1+N/2) (round to one decimal place i.e. 2.8, 5.7 and 11.3) ,
817 // N= 7-15:use 2 (N-2), 8192 specifies use at own risk
818
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 double signalAccuracy = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase));
819 // GPS/QZSS: SV health (bits 17-22 w 3 sf 1)
820 // GAL: SV health (FLOAT converted to INTEGER) See Galileo ICD Section 5.1.9.3
821 // Bit 0: E1B DVS Bits 1-2: E1B HS Bit 3: E5a DVS
822 // Bits 4-5: E5a HS Bit 6: E5b DVS Bits 7-8: E5b HS
823 // BDS: SatH1
824 // IRNSS: Health (Sub frame 1,bits 155(most significant) and 156(least significant)),
825 // where 0 = L5 and S healthy, 1 = L5 healthy and S unhealthy, 2= L5 unhealthy
826 // and S healthy, 3= both L5 and S unhealthy
827
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
24 auto svHealth = static_cast<uint16_t>(std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase)));
828 // GPS: TGD (seconds)
829 // QZSS: TGD (seconds) The QZSS ICD specifies a do not use bit pattern "10000000" this condition is represented by a blank field.
830 // GAL: BGD E5a/E1 (seconds)
831 // BDS: TGD1 B1/B3 (seconds)
832
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
24 double tgd_bgd5a_TGD1 = str::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase), 0.0);
833
834 // GPS/QZSS: IODC Issue of Data, Clock
835 // GAL: BGD E5b/E1 (seconds)
836 // BDS: TGD2 B2/B3 (seconds)
837 // IRNSS: Blank
838
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
18 double IODC_bgd5b_TGD2 = str::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase), 0.0);
839
840 LOG_DATA("{}: svAccuracy {}, svHealth {}, TGD {}, IODC {}", nameId(), signalAccuracy, svHealth, tgd_bgd5a_TGD1, IODC_bgd5b_TGD2);
841
842 // ------------------------------------ BROADCAST ORBIT - 7 --------------------------------------
843
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 getline(line);
844
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (line.size() > 82)
845 {
846 abortReading();
847 return;
848 } // 80 + \n\r
849
850 // Transmission time of message (sec of GPS week, derived e.g.from Z-count in Hand Over Word (HOW))
851
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
24 [[maybe_unused]] auto transmissionTime = str::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase), 0.0);
852 // GPS/QZSS: Fit Interval in hours see section 6.11. (BNK).
853 // GAL: Spare
854 // BDS: AODC Age of Data Clock (as specified in BeiDou ICD Table Section 5.2.4.9 Table 5-6) and field range is: 0-31.
855
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
18 auto fitInterval_AODC = str::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase), 0.0);
856 // Spare
857 // std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
858 // Spare
859 // std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
860
861 LOG_DATA("{}: transmissionTime {}, fitInterval/AODC {}", nameId(), transmissionTime, fitInterval_AODC);
862
863
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 if (satSys == GPS)
864 {
865
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
6 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GPSEphemeris>(epoch, toe,
866 IODE_IODnav_AODE_IODEC, IODC_bgd5b_TGD2, a,
867 sqrt_A, e, i_0, Omega_0, omega, M_0,
868 delta_n, Omega_dot, i_dot, Cus, Cuc,
869 Cis, Cic, Crs, Crc,
870 signalAccuracy, svHealth,
871 codesOnL2Channel_dataSources, L2PdataFlag,
872 tgd_bgd5a_TGD1, fitInterval_AODC));
873 }
874 else if (satSys == GAL)
875 {
876 // The same satellite can appear multiple times with different dataSource bits
877 // We want to prefer 'I/NAV E1-B' (Bit 0 set) over 'F/NAV E5a-I' (Bit 1 set) or 'I/NAV E5b-I' (Bit 2 set)
878
879 if (_gnssNavInfo.satellites().contains({ satSys, satNum }) // We have this satellite already
880 && !std::bitset<10>(codesOnL2Channel_dataSources)[0]) // This message is not 'I/NAV E1-B'
881 {
882 const auto& navData = _gnssNavInfo.satellites().at({ satSys, satNum }).getNavigationData();
883 auto existingEph = std::ranges::find_if(navData, [&](const std::shared_ptr<SatNavData>& satNavData) {
884 return satNavData->type == SatNavData::GalileoEphemeris && satNavData->refTime == epoch
885 && std::dynamic_pointer_cast<GalileoEphemeris>(satNavData)->dataSource[0];
886 });
887 if (existingEph != navData.end()) // There is already a 'I/NAV E1-B' message
888 {
889 LOG_DATA("{}: Skipping ephemeris data because of dataSource priority", nameId());
890 continue;
891 }
892 }
893
894 GalileoEphemeris::SvHealth health = { .E5a_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b000001000) >> 3),
895 .E5b_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b001000000) >> 6),
896 .E1B_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b000000001) >> 0),
897 .E5a_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b000110000) >> 4),
898 .E5b_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b110000000) >> 7),
899 .E1B_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b000000110) >> 1) };
900 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GalileoEphemeris>(epoch, toe, IODE_IODnav_AODE_IODEC, a,
901 sqrt_A, e, i_0, Omega_0, omega, M_0,
902 delta_n, Omega_dot, i_dot, Cus, Cuc,
903 Cis, Cic, Crs, Crc,
904 codesOnL2Channel_dataSources, signalAccuracy, health,
905 tgd_bgd5a_TGD1, IODC_bgd5b_TGD2));
906 }
907 else if (satSys == BDS)
908 {
909 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<BDSEphemeris>(satNum, epoch, toe,
910 IODE_IODnav_AODE_IODEC, fitInterval_AODC, a,
911 sqrt_A, e, i_0, Omega_0, omega, M_0,
912 delta_n, Omega_dot, i_dot, Cus, Cuc,
913 Cis, Cic, Crs, Crc,
914 signalAccuracy, svHealth,
915 tgd_bgd5a_TGD1, IODC_bgd5b_TGD2));
916 }
917 else if (satSys == QZSS)
918 {
919 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<QZSSEphemeris>(epoch, toe,
920 IODE_IODnav_AODE_IODEC, IODC_bgd5b_TGD2, a,
921 sqrt_A, e, i_0, Omega_0, omega, M_0,
922 delta_n, Omega_dot, i_dot, Cus, Cuc,
923 Cis, Cic, Crs, Crc,
924 signalAccuracy, svHealth,
925 codesOnL2Channel_dataSources, L2PdataFlag,
926 tgd_bgd5a_TGD1, fitInterval_AODC));
927 }
928 }
929
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
7 else if (satSys == GLO || satSys == SBAS) // NOLINT(misc-redundant-expression) // bugged warning
930 {
931 // TODO: Offset
932
933
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 Eigen::Vector3d pos;
934
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 Eigen::Vector3d vel;
935
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 Eigen::Vector3d accelLuniSolar;
936
937 7 double tau_c{};
938 // Coefficient of linear polynomial of time system difference [s]
939
3/6
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
7 if (_gnssNavInfo.timeSysCorr.contains({ satSys.getTimeSystem(), UTC }))
940 {
941
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
7 tau_c = _gnssNavInfo.timeSysCorr.at({ satSys.getTimeSystem(), UTC }).a0;
942 }
943
944 // GLO: SV clock bias (sec) (-TauN)
945 // SBAS: SV clock bias (sec) (aGf0)
946
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
28 double m_tau_n = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase));
947 // GLO: SV relative frequency bias (+GammaN)
948 // SBAS: SV relative frequency bias (aGf1)
949
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
28 double gamma_n = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase));
950 // GLO: Message frame time (tk+nd*86400) in seconds of the UTC week
951 // SBAS: Transmission time of message (start of the message) in GPS seconds of the week
952
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
21 [[maybe_unused]] auto msgFrameTime = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
953 LOG_DATA("{}: clkBias {}, relFreqBias {}, msgFrameTime {}", nameId(), m_tau_n, gamma_n, msgFrameTime);
954
955 // ------------------------------------ BROADCAST ORBIT - 1 --------------------------------------
956
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 getline(line);
957
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if (line.size() > 82)
958 {
959 abortReading();
960 return;
961 } // 80 + \n\r
962
963 // Satellite position X (km)
964
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 pos.x() = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase)) * 1e3;
965 // velocity X dot (km/sec)
966
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 vel.x() = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase)) * 1e3;
967 // X acceleration (km/sec2)
968
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 accelLuniSolar.x() = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase)) * 1e3;
969 // GLO: health (0=healthy, 1=unhealthy) (MSB of 3-bit Bn)
970 // SBAS: Health: SBAS: See Section 8.3.3 bit mask for: health, health availability and User Range Accuracy.
971
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
21 [[maybe_unused]] auto health = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
972
973 LOG_DATA("{}: satPosX {}, velX {}, accelX {}, health {}", nameId(), pos.x(), vel.x(), accelLuniSolar.x(), health);
974
975 // ------------------------------------ BROADCAST ORBIT - 2 --------------------------------------
976
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 getline(line);
977
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if (line.size() > 82)
978 {
979 abortReading();
980 return;
981 } // 80 + \n\r
982
983 // Satellite position Y (km)
984
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 pos.y() = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase)) * 1e3;
985 // velocity Y dot (km/sec)
986
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 vel.y() = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase)) * 1e3;
987 // Y acceleration (km/sec2)
988
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 accelLuniSolar.y() = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase)) * 1e3;
989 // GLO: frequency number(-7...+13) (-7...+6 ICD 5.1)
990 // SBAS: Accuracy code (URA, meters)
991
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
21 double frequencyNumber_accuracyCode = std::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase));
992
993 LOG_DATA("{}: satPosY {}, velY {}, accelY {}, freqNum/accuracyCode {}", nameId(), pos.y(), vel.y(), accelLuniSolar.y(), frequencyNumber_accuracyCode);
994
995 // ------------------------------------ BROADCAST ORBIT - 3 --------------------------------------
996
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 getline(line);
997
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if (line.size() > 82)
998 {
999 abortReading();
1000 return;
1001 } // 80 + \n\r
1002
1003 // Satellite position Z (km)
1004
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 pos.z() = std::stod(str::replaceAll_copy(line.substr(3, 19), "d", "e", str::IgnoreCase)) * 1e3;
1005 // velocity Z dot (km/sec)
1006
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 vel.z() = std::stod(str::replaceAll_copy(line.substr(22, 19), "d", "e", str::IgnoreCase)) * 1e3;
1007 // Z acceleration (km/sec2)
1008
6/12
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
28 accelLuniSolar.z() = std::stod(str::replaceAll_copy(line.substr(41, 19), "d", "e", str::IgnoreCase)) * 1e3;
1009 // GLO: Age of oper. information (days) (E)
1010 // SBAS: IODN (Issue of Data Navigation, DO229, 8 first bits after Message Type if MT9)
1011
4/8
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
21 [[maybe_unused]] auto ageOfOperation_IODN = str::stod(str::replaceAll_copy(line.substr(60, 19), "d", "e", str::IgnoreCase), 0.0);
1012
1013 LOG_DATA("{}: satPosZ {}, velZ {}, accelZ {}, ageOfOperation/IODN {}", nameId(), pos.z(), vel.z(), accelLuniSolar.z(), ageOfOperation_IODN);
1014
1015
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 if (satSys == GLO)
1016 {
1017
1/2
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GLONASSEphemeris>(epoch, tau_c,
1018
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
14 -m_tau_n, gamma_n, static_cast<bool>(health),
1019 pos, vel, accelLuniSolar,
1020 frequencyNumber_accuracyCode));
1021 }
1022 else if (satSys == SBAS && !_sbasNotSupportedWarned)
1023 {
1024 LOG_WARN("SBAS is not yet supported. Therefore the Navigation file data will be skipped.");
1025 _sbasNotSupportedWarned = true;
1026 }
1027 }
1028 13 }
1029 }
1030 catch (const std::exception& e)
1031 {
1032 abortReading();
1033 }
1034 4 }
1035
1036 39 void RinexNavFile::parseOrbit3()
1037 {
1038 39 std::string line;
1039 try
1040 {
1041
8/12
✓ Branch 1 taken 6621 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6621 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6586 times.
✓ Branch 7 taken 35 times.
✓ Branch 9 taken 6585 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6585 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6586 times.
✓ Branch 14 taken 34 times.
6620 while (getline(line) && !eof())
1042 {
1043
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 6584 times.
6586 if (line.size() > 82)
1044 {
1045
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 abortReading();
1046 2 return;
1047 } // 80 + \n\r
1048
1049 // -------------------------------------- SV / EPOCH / SV CLK ----------------------------------------
1050
1051 // Satellite system (G), sat number (PRN) - A1,I2.2,
1052 // Satellite system (E), satellite number - A1,I2.2,
1053 // Satellite system (R), satellite number (slot number in sat. constellation) - A1,I2.2,
1054 // Satellite system (J), Satellite PRN-192 - A1,I2,
1055 // Satellite system (C), sat number (PRN) - A1,I2.2,
1056 // Satellite system (S), satellite number (slot number in sat. constellation) - A1,I2.2,
1057 // Satellite system (I), sat number (PRN) - A1,I2.2,
1058 6584 SatelliteSystem satSys = SatSys_None;
1059
1060
2/4
✓ Branch 1 taken 6584 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6584 times.
✗ Branch 5 not taken.
6584 satSys = SatelliteSystem::fromChar(line.at(0));
1061 6584 _gnssNavInfo.satelliteSystems |= satSys;
1062
1063
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 6577 times.
13143 if (satSys == SatSys_None) { continue; } // To intercept comment lines
1064
1065
1/2
✓ Branch 1 taken 6576 times.
✗ Branch 2 not taken.
6577 auto satNumStr = line.substr(1, 2);
1066
2/4
✓ Branch 1 taken 6577 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6577 times.
6576 if (satNumStr == " ") { continue; }
1067
1068 6577 auto satNum = static_cast<uint8_t>(str::stoi(satNumStr, 0));
1069
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6576 times.
6576 if (satNum == 0) { continue; }
1070
1071
4/4
✓ Branch 1 taken 6574 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6559 times.
✓ Branch 4 taken 15 times.
6576 if (parseEphemeris(line, satSys, satNum))
1072 {
1073 6559 continue;
1074 }
1075 6576 }
1076 }
1077
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 catch (const std::exception& e)
1078 {
1079
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 abortReading();
1080 2 }
1081 39 }
1082
1083 5 void RinexNavFile::parseOrbit4()
1084 {
1085 5 std::string line;
1086 try
1087 {
1088
8/12
✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 64 times.
✓ Branch 7 taken 5 times.
✓ Branch 9 taken 64 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✓ Branch 14 taken 5 times.
74 while (getline(line) && !eof())
1089 {
1090
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 64 times.
64 if (line.size() > 82)
1091 {
1092 abortReading();
1093 return;
1094 } // 80 + \n\r
1095
1096
2/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 64 times.
✗ Branch 4 not taken.
64 if (line.at(0) == '>')
1097 {
1098 // -------------------------------------- Type / SV / MSSG ----------------------------------------
1099
1100 // Satellite system (G), sat number (PRN) - A1,I2.2,
1101 // Satellite system (E), satellite number - A1,I2.2,
1102 // Satellite system (R), satellite number (slot number in sat. constellation) - A1,I2.2,
1103 // Satellite system (J), Satellite PRN-192 - A1,I2,
1104 // Satellite system (C), sat number (PRN) - A1,I2.2,
1105 // Satellite system (S), satellite number (slot number in sat. constellation) - A1,I2.2,
1106 // Satellite system (I), sat number (PRN) - A1,I2.2,
1107
1108 64 SatelliteSystem satSys = SatSys_None;
1109
2/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
64 satSys = SatelliteSystem::fromChar(line.at(6));
1110 64 _gnssNavInfo.satelliteSystems |= satSys;
1111
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 64 times.
101 if (satSys == SatSys_None) { continue; } // To intercept comment lines
1112
1113
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 auto satNumStr = line.substr(7, 2);
1114
2/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
64 if (satNumStr == " ") { continue; }
1115
1116 64 auto satNum = static_cast<uint8_t>(str::stoi(satNumStr, 0));
1117
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (satNum == 0) { continue; }
1118
1119
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 std::string msgType = line.substr(2, 3);
1120
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 NavMsgType navMsgType = getNavMsgType(msgType);
1121
1122 // std::string satMsgType = line.substr(10, 4);
1123
1124
3/5
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
64 switch (navMsgType)
1125 {
1126 41 case NavMsgType::EPH:
1127 {
1128 // Code for EPH
1129
1/2
✓ Branch 1 taken 41 times.
✗ Branch 2 not taken.
41 getline(line);
1130
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 41 times.
41 if (line.size() > 82)
1131 {
1132 abortReading();
1133 return;
1134 }
1135
1136
7/16
✓ Branch 1 taken 41 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 41 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 41 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 41 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 41 times.
✓ Branch 15 taken 41 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 41 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
41 if (satSys != SatelliteSystem::fromChar(line.at(0)) || satNumStr != line.substr(1, 2)) { continue; }
1137
1138
3/4
✓ Branch 1 taken 41 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 37 times.
✓ Branch 4 taken 4 times.
41 if (parseEphemeris(line, satSys, satNum))
1139 {
1140 37 continue;
1141 }
1142 }
1143 4 break;
1144 18 case NavMsgType::STO:
1145 {
1146 // Code for STO
1147
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 getline(line);
1148
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
18 if (line.size() > 82)
1149 {
1150 abortReading();
1151 return;
1152 }
1153
1154 // Epoch: Toc - Time of Clock (GPS) year (4 digits) - 4X,I4,
1155 // month, day, hour, minute, second - 5(1X,I2.2),
1156
3/6
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 18 times.
✗ Branch 8 not taken.
18 auto timeSplit = str::split_wo_empty(line.substr(4, 20), " ");
1157
3/4
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 14 times.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
18 auto timeSystem = satSys == GLO ? UTC : satSys.getTimeSystem();
1158
1159
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 int year = std::stoi(timeSplit.at(0));
1160
1161 InsTime epoch{ static_cast<uint16_t>(year),
1162
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 static_cast<uint16_t>(std::stoi(timeSplit.at(1))),
1163
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 static_cast<uint16_t>(std::stoi(timeSplit.at(2))),
1164
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 static_cast<uint16_t>(std::stoi(timeSplit.at(3))),
1165
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 static_cast<uint16_t>(std::stoi(timeSplit.at(4))),
1166 36 std::stold(timeSplit.at(5)),
1167
7/14
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 18 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 18 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 18 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 18 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 18 times.
✗ Branch 20 not taken.
90 timeSystem };
1168
1169 LOG_DATA("{}: {}-{} {} (read as {} time)", nameId(), satSys, satNum, epoch.toYMDHMS(), std::string(timeSystem));
1170
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 auto correctionType = str::trim_copy(line.substr(24, 4)); // FORMAT: 1X,A18
1171 LOG_DATA("{}: Time System Correction: {}", nameId(), correctionType);
1172
1173
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 getline(line);
1174
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
18 if (line.size() > 82)
1175 {
1176 abortReading();
1177 return;
1178 }
1179
1180 // auto t_tm = str::stod(str::trim_copy(line.substr(4, 19)), std::nan(""));
1181 // LOG_DATA("{}: t_tm {}", nameId(), t_tm);
1182
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 auto a0 = str::stod(str::trim_copy(line.substr(23, 19)), std::nan(""));
1183 LOG_DATA("{}: a0 {}", nameId(), a0);
1184
2/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
18 auto a1 = str::stod(str::trim_copy(line.substr(42, 19)), std::nan(""));
1185 LOG_DATA("{}: a1 {}", nameId(), a1);
1186 // auto a2 = str::stod(str::trim_copy(line.substr(61, 19)), std::nan(""));
1187 // LOG_DATA("{}: a2 {}", nameId(), a2);
1188
1189
3/6
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
18 if (!std::isnan(a0) && !std::isnan(a1))
1190 {
1191 18 std::pair<TimeSystem, TimeSystem> timeSystems;
1192
3/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 16 times.
18 if (correctionType == "GPUT")
1193 {
1194 2 timeSystems = { GPST, UTC };
1195 }
1196
3/4
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 14 times.
16 else if (correctionType == "GLUT")
1197 {
1198 2 timeSystems = { GLNT, UTC };
1199 }
1200
3/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
14 else if (correctionType == "GAUT")
1201 {
1202 8 timeSystems = { GST, UTC };
1203 }
1204
3/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 4 times.
6 else if (correctionType == "BDUT")
1205 {
1206 2 timeSystems = { BDT, UTC };
1207 }
1208
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 else if (correctionType == "QZUT")
1209 {
1210 timeSystems = { QZSST, UTC };
1211 }
1212
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 else if (correctionType == "IRUT")
1213 {
1214 timeSystems = { IRNSST, UTC };
1215 }
1216 // else if (correctionType == "SBUT") { timeSystems = { SBAST, UTC }; }
1217
3/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
4 else if (correctionType == "GLGP")
1218 {
1219 2 timeSystems = { GLNT, GPST };
1220 }
1221
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 else if (correctionType == "GAGP")
1222 {
1223 2 timeSystems = { GST, GPST };
1224 }
1225 else if (correctionType == "GPGA")
1226 {
1227 timeSystems = { GST, GPST };
1228 } // Pre RINEX 3.04
1229 else if (correctionType == "QZGP")
1230 {
1231 timeSystems = { QZSST, GPST };
1232 }
1233 else if (correctionType == "IRGP")
1234 {
1235 timeSystems = { IRNSST, GPST };
1236 }
1237 else
1238 {
1239 LOG_TRACE("{}: Time System Correction '{}' not implemented yet", nameId(), correctionType);
1240 continue;
1241 }
1242
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 _gnssNavInfo.timeSysCorr[timeSystems] = { .a0 = a0, .a1 = a1 };
1243 }
1244 18 }
1245 18 break;
1246 case NavMsgType::EOP:
1247 // Code for EOP
1248 // TODO: Implement EOP
1249 break;
1250 5 case NavMsgType::ION:
1251 {
1252 // Code for ION
1253
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 getline(line);
1254
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
5 if (line.size() > 82)
1255 {
1256 abortReading();
1257 return;
1258 }
1259
1260 // Epoch: t_tm - Transmission timne of ION data, year (4 digits) - 4X,I4,
1261 // month, day, hour, minute, second - 5(1X,I2.2),
1262
3/6
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
5 auto timeSplit = str::split_wo_empty(line.substr(4, 20), " ");
1263
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
5 auto timeSystem = satSys == GLO ? UTC : satSys.getTimeSystem();
1264
1265
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 int year = std::stoi(timeSplit.at(0));
1266
1267 InsTime t_tm{ static_cast<uint16_t>(year),
1268
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 static_cast<uint16_t>(std::stoi(timeSplit.at(1))),
1269
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 static_cast<uint16_t>(std::stoi(timeSplit.at(2))),
1270
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 static_cast<uint16_t>(std::stoi(timeSplit.at(3))),
1271
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 static_cast<uint16_t>(std::stoi(timeSplit.at(4))),
1272 10 std::stold(timeSplit.at(5)),
1273
7/14
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
25 timeSystem };
1274
1275 LOG_DATA("{}: {}-{} {} (read as {} time)", nameId(), satSys, satNum, t_tm.toYMDHMS(), std::string(timeSystem));
1276
1277 // TODO: Destinction of BDS unclear in RINEX versin 4.00 BDGIM or Klobuchar model
1278 // Klobuchar
1279
8/10
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 2 times.
5 if (satSys == GPS || satSys == QZSS || satSys == IRNSS || satSys == BDS) // NOLINT(misc-redundant-expression) // bugged warning
1280 {
1281 3 std::array<double, 4> alpha{};
1282 3 std::array<double, 4> beta{};
1283
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 alpha[0] = str::stod(str::trim_copy(line.substr(23, 19)), 0.0);
1284
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 alpha[1] = str::stod(str::trim_copy(line.substr(42, 19)), 0.0);
1285
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 alpha[2] = str::stod(str::trim_copy(line.substr(61, 19)), 0.0);
1286
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 getline(line);
1287
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (line.size() > 82)
1288 {
1289 abortReading();
1290 return;
1291 }
1292
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 alpha[3] = str::stod(str::trim_copy(line.substr(4, 19)), 0.0);
1293
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 beta[0] = str::stod(str::trim_copy(line.substr(23, 19)), 0.0);
1294
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 beta[1] = str::stod(str::trim_copy(line.substr(42, 19)), 0.0);
1295
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 beta[2] = str::stod(str::trim_copy(line.substr(61, 19)), 0.0);
1296
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 getline(line);
1297
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (line.size() > 82)
1298 {
1299 abortReading();
1300 return;
1301 }
1302
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 beta[3] = str::stod(str::trim_copy(line.substr(4, 19)), 0.0);
1303
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 _gnssNavInfo.ionosphericCorrections.insert(satSys, IonosphericCorrections::Alpha, alpha);
1304
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 _gnssNavInfo.ionosphericCorrections.insert(satSys, IonosphericCorrections::Beta, beta);
1305 LOG_DATA("{}: Ionospheric Correction: {}-Alpha: [{}]", nameId(),
1306 std::string(satSys), fmt::join(alpha.begin(), alpha.end(), ", "));
1307 LOG_DATA("{}: Ionospheric Correction: {}-Beta: [{}]", nameId(),
1308 std::string(satSys), fmt::join(beta.begin(), beta.end(), ", "));
1309
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 [[maybe_unused]] auto regionCode = str::stod(str::trim_copy(line.substr(23, 19)), std::nan(""));
1310 }
1311
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 else if (satSys == GAL) // Nequick-G
1312 {
1313 2 std::array<double, 4> alpha{};
1314
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 alpha[0] = str::stod(str::trim_copy(line.substr(23, 19)), 0.0);
1315
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 alpha[1] = str::stod(str::trim_copy(line.substr(42, 19)), 0.0);
1316
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 alpha[2] = str::stod(str::trim_copy(line.substr(61, 19)), 0.0);
1317
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 getline(line);
1318
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if (line.size() > 82)
1319 {
1320 abortReading();
1321 return;
1322 }
1323 // TODO: Change Correction format to support Nequick-G
1324 // This is a hack this data is not an alpha value but a disturbance flag
1325
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 alpha[3] = str::stod(str::trim_copy(line.substr(4, 19)), 0.0);
1326
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 _gnssNavInfo.ionosphericCorrections.insert(satSys, IonosphericCorrections::Alpha, alpha);
1327 LOG_DATA("{}: Ionospheric Correction: {}-Alpha: [{}]", nameId(),
1328 std::string(satSys), fmt::join(alpha.begin(), alpha.end(), ", "));
1329 } /*
1330 else if (satSys == BDS) // BDGIM
1331 {
1332 // TODO: Implement Beidou ION message
1333 }*/
1334 else
1335 {
1336 continue;
1337 }
1338 5 }
1339 5 break;
1340 default:
1341 // Abort
1342 break;
1343 }
1344 101 }
1345 }
1346 }
1347 catch (const std::exception& e)
1348 {
1349 abortReading();
1350 }
1351 5 }
1352
1353 6617 bool RinexNavFile::parseEphemeris(std::string& line, SatelliteSystem satSys, uint8_t satNum)
1354 {
1355 // Epoch: Toc - Time of Clock (GPS) year (4 digits) - 1X,I4,
1356 // month, day, hour, minute, second - 5(1X,I2.2),
1357
3/6
✓ Branch 1 taken 6617 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6617 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6617 times.
✗ Branch 8 not taken.
6617 auto timeSplit = str::split_wo_empty(line.substr(3, 20), " ");
1358
3/4
✓ Branch 1 taken 3621 times.
✓ Branch 2 taken 2995 times.
✓ Branch 5 taken 2997 times.
✗ Branch 6 not taken.
6617 auto timeSystem = satSys == GLO ? UTC : satSys.getTimeSystem();
1359
1360
2/4
✓ Branch 1 taken 6617 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6617 times.
✗ Branch 5 not taken.
6618 int year = std::stoi(timeSplit.at(0));
1361
1362 InsTime epoch{ static_cast<uint16_t>(year),
1363
1/2
✓ Branch 1 taken 6618 times.
✗ Branch 2 not taken.
6615 static_cast<uint16_t>(std::stoi(timeSplit.at(1))),
1364
1/2
✓ Branch 1 taken 6616 times.
✗ Branch 2 not taken.
6618 static_cast<uint16_t>(std::stoi(timeSplit.at(2))),
1365
1/2
✓ Branch 1 taken 6617 times.
✗ Branch 2 not taken.
6616 static_cast<uint16_t>(std::stoi(timeSplit.at(3))),
1366
1/2
✓ Branch 1 taken 6616 times.
✗ Branch 2 not taken.
6616 static_cast<uint16_t>(std::stoi(timeSplit.at(4))),
1367 13232 std::stold(timeSplit.at(5)),
1368
7/14
✓ Branch 1 taken 6615 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6618 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6616 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6616 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6616 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6616 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6618 times.
✗ Branch 20 not taken.
33084 timeSystem };
1369
1370 LOG_DATA("{}: {}-{} {} (read as {} time)", nameId(), satSys, satNum, epoch.toYMDHMS(), std::string(timeSystem));
1371
1372
10/10
✓ Branch 1 taken 5419 times.
✓ Branch 2 taken 1199 times.
✓ Branch 4 taken 3791 times.
✓ Branch 5 taken 1628 times.
✓ Branch 7 taken 3787 times.
✓ Branch 8 taken 4 times.
✓ Branch 10 taken 160 times.
✓ Branch 11 taken 3627 times.
✓ Branch 12 taken 2991 times.
✓ Branch 13 taken 3627 times.
6618 if (satSys == GPS || satSys == GAL || satSys == QZSS || satSys == BDS) // NOLINT(misc-redundant-expression) // bugged warning
1373 {
1374 // Polynomial coefficients for clock correction
1375 2991 std::array<double, 3> a{};
1376 // SV clock bias [seconds]
1377
5/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2991 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2991 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2991 times.
✗ Branch 14 not taken.
11964 a[0] = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1378 // SV clock drift [sec/sec]
1379
5/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2991 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2991 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2991 times.
✗ Branch 14 not taken.
11962 a[1] = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1380 // SV clock drift rate [sec/sec^2]
1381
5/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2991 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2991 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2991 times.
✗ Branch 14 not taken.
8972 a[2] = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1382
1383 LOG_DATA("{}: clkBias {}, clkDrift {}, clkDriftRate {}", nameId(), a[0], a[1], a[2]);
1384
1385 // ------------------------------------ BROADCAST ORBIT - 1 --------------------------------------
1386
1/2
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
2991 getline(line);
1387
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2991 times.
2991 if (line.size() > 82)
1388 {
1389 abortReading();
1390 19 return false;
1391 } // 80 + \n\r
1392
1393 // GPS/QZSS: Issue of Data, Ephemeris (IODE)
1394 // GAL: IODnav Issue of Data of the nav batch
1395 // BDS: AODE Age of Data, Ephemeris (as specified in BeiDou ICD Table Section 5.2.4.11 Table 5-8)
1396 // and field range is: 0-31.
1397 // IRNSS: IODEC Issue of Data, Ephemeris and Clock
1398
5/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2991 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2991 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2991 times.
✗ Branch 14 not taken.
11964 auto IODE_IODnav_AODE_IODEC = static_cast<size_t>(std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase)));
1399 // Crs (meters)
1400
5/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2991 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2991 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2991 times.
✗ Branch 14 not taken.
11964 double Crs = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1401 // Delta n (radians/sec)
1402
7/10
✓ Branch 1 taken 2991 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2991 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2990 times.
✓ Branch 8 taken 1 times.
✓ Branch 10 taken 2990 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✓ Branch 14 taken 1 times.
11966 double delta_n = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1403 // M0 (radians)
1404
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
8967 double M_0 = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1405
1406 LOG_DATA("{}: IODE_IODnav_AODE_IODEC {}, Crs {}, Delta_n {}, M0 {}", nameId(), IODE_IODnav_AODE_IODEC, Crs, delta_n, M_0);
1407
1408 // ------------------------------------ BROADCAST ORBIT - 2 --------------------------------------
1409
1/2
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
2989 getline(line);
1410
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2989 times.
2989 if (line.size() > 82)
1411 {
1412 abortReading();
1413 return false;
1414 } // 80 + \n\r
1415
1416 // Cuc (radians)
1417
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11956 double Cuc = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase));
1418 // e Eccentricity
1419
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11956 double e = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1420 // Cus (radians)
1421
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11956 double Cus = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1422 // sqrt(A) (sqrt(m))
1423
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
8967 double sqrt_A = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1424
1425 LOG_DATA("{}: Cuc {}, e {}, Cus {}, sqrt_A {}", nameId(), Cuc, e, Cus, sqrt_A);
1426
1427 // ------------------------------------ BROADCAST ORBIT - 3 --------------------------------------
1428
1/2
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
2989 getline(line);
1429
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2989 times.
2989 if (line.size() > 82)
1430 {
1431 abortReading();
1432 return false;
1433 } // 80 + \n\r
1434
1435 // Toe Time of Ephemeris (sec of GPS week)
1436
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11955 double toeSec = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase));
1437 // Cic (radians)
1438
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11954 double Cic = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1439 // OMEGA0 (radians)
1440
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2989 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
11956 double Omega_0 = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1441 // Cis (radians)
1442
5/10
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2989 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2989 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2989 times.
✗ Branch 14 not taken.
8967 double Cis = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1443
1444 LOG_DATA("{}: toe {}, Cic {}, Omega_0 {}, Cis {}", nameId(), toeSec, Cic, Omega_0, Cis);
1445
1446 // ------------------------------------ BROADCAST ORBIT - 4 --------------------------------------
1447
1/2
✓ Branch 1 taken 2989 times.
✗ Branch 2 not taken.
2989 getline(line);
1448
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2988 times.
2989 if (line.size() > 82)
1449 {
1450
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 abortReading();
1451 1 return false;
1452 } // 80 + \n\r
1453
1454 // i0 (radians)
1455
5/10
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2988 times.
✗ Branch 14 not taken.
11952 double i_0 = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase));
1456 // Crc (meters)
1457
5/10
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2988 times.
✗ Branch 14 not taken.
11952 double Crc = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1458 // omega (radians)
1459
5/10
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2988 times.
✗ Branch 14 not taken.
11952 double omega = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1460 // OMEGA DOT (radians/sec)
1461
5/10
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2988 times.
✗ Branch 14 not taken.
8964 double Omega_dot = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1462
1463 LOG_DATA("{}: i_0 {}, Crc {}, omega {}, Omega_dot {}", nameId(), i_0, Crc, omega, Omega_dot);
1464
1465 // ------------------------------------ BROADCAST ORBIT - 5 --------------------------------------
1466
1/2
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
2988 getline(line);
1467
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2988 times.
2988 if (line.size() > 82)
1468 {
1469 abortReading();
1470 return false;
1471 } // 80 + \n\r
1472
1473 // IDOT (radians/sec)
1474
5/10
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2988 times.
✗ Branch 14 not taken.
11952 double i_dot = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase));
1475 // GPS: Codes on L2 channel
1476 // QZSS: Codes on L2 channel (fixed to 2, see IS-QZSS-PNT 4.1.2.7)
1477 // GAL: Data sources (FLOAT --> INTEGER)
1478 // Bit 0 set: I/NAV E1-B
1479 // Bit 1 set: F/NAV E5a-I
1480 // Bit 2 set: I/NAV E5b-I
1481 // Bits 0 and 2 : Both can be set if the navigation messages were merged, however, bits 0-2
1482 // cannot all be set, as the I/NAV and F/NAV messages contain different information
1483 // Bit 3 reserved for Galileo internal use
1484 // Bit 4 reserved for Galileo internal use
1485 // Bit 8 set: af0-af2, Toc, SISA are for E5a,E1
1486 // Bit 9 set: af0-af2, Toc, SISA are for E5b,E1
1487 // Bits 8-9 : exclusive (only one bit can be set)
1488 // BDS/IRNSS: Spare
1489
4/8
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
8964 auto codesOnL2Channel_dataSources = static_cast<uint16_t>(str::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase), 0));
1490
1491 // GPS Week # (to go with TOE) Continuous number, not mod(1024)!
1492
5/10
✓ Branch 2 taken 2988 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2987 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2988 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2988 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2988 times.
✗ Branch 15 not taken.
11951 auto gpsWeek = static_cast<int32_t>(str::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase), epoch.toGPSweekTow().gpsWeek));
1493
2/2
✓ Branch 1 taken 160 times.
✓ Branch 2 taken 2828 times.
2988 if (satSys == BDS) { gpsWeek += InsTimeUtil::DIFF_BDT_WEEK_TO_GPST_WEEK; }
1494
2/4
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
2988 auto toe = InsTime(0, gpsWeek, toeSec, satSys.getTimeSystem());
1495
1496 // GPS: L2 P data flag
1497 // QZSS: L2P data flag set to 1 since QZSS does not track L2P
1498 // GAL/BDS/IRNSS: Spare
1499
4/8
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2988 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2988 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2988 times.
✗ Branch 11 not taken.
8964 bool L2PdataFlag = static_cast<bool>(str::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase), 0.0));
1500
1501 LOG_DATA("{}: i_dot {}, codesOnL2Channel/dataSources {} ({}), gpsWeek {}, L2PdataFlag {}", nameId(),
1502 i_dot, codesOnL2Channel_dataSources, std::bitset<10>(codesOnL2Channel_dataSources).to_string(), gpsWeek, L2PdataFlag);
1503
1504 // ------------------------------------ BROADCAST ORBIT - 6 --------------------------------------
1505
1/2
✓ Branch 1 taken 2988 times.
✗ Branch 2 not taken.
2988 getline(line);
1506
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2987 times.
2988 if (line.size() > 82)
1507 {
1508
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 abortReading();
1509 1 return false;
1510 } // 80 + \n\r
1511
1512 // GPS: SV accuracy (meters) See GPS ICD 200H Section 20.3.3.3.1.3 use specified equations to define
1513 // nominal values, N = 0-6: use 2(1+N/2) (round to one decimal place i.e. 2.8, 5.7 and 11.3) ,
1514 // N= 7-15:use 2 (N-2), 8192 specifies use at own risk
1515 // QZSS: SV accuracy (meters) (IS -QZSS-PNT, Section 5.4.3.1) which refers to: IS GPS 200H Section 20.3.3.3.1.3
1516 // use specified equations to define nominal values, N = 0-6: use 2(1+N/2) (round to one decimal
1517 // place i.e. 2.8, 5.7 and 11.3) , N= 7-15:use 2 (N-2), 8192 specifies use at own risk
1518 // IRNSS: User Range Accuracy(m), See IRNSS ICD Section 6.2.1.4 , use specified equations to define
1519 // nominal values, N = 0-6: use 2(1+N/2) (round to one decimal place i.e. 2.8, 5.7 and 11.3) ,
1520 // N= 7-15:use 2 (N-2), 8192 specifies use at own risk
1521
5/10
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2987 times.
✗ Branch 14 not taken.
11948 double signalAccuracy = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase));
1522 // GPS/QZSS: SV health (bits 17-22 w 3 sf 1)
1523 // GAL: SV health (FLOAT converted to INTEGER) See Galileo ICD Section 5.1.9.3
1524 // Bit 0: E1B DVS Bits 1-2: E1B HS Bit 3: E5a DVS
1525 // Bits 4-5: E5a HS Bit 6: E5b DVS Bits 7-8: E5b HS
1526 // BDS: SatH1
1527 // IRNSS: Health (Sub frame 1,bits 155(most significant) and 156(least significant)),
1528 // where 0 = L5 and S healthy, 1 = L5 healthy and S unhealthy, 2= L5 unhealthy
1529 // and S healthy, 3= both L5 and S unhealthy
1530
5/10
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2987 times.
✗ Branch 14 not taken.
11948 auto svHealth = static_cast<uint16_t>(std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase)));
1531 // GPS: TGD (seconds)
1532 // QZSS: TGD (seconds) The QZSS ICD specifies a do not use bit pattern "10000000" this condition is represented by a blank field.
1533 // GAL: BGD E5a/E1 (seconds)
1534 // BDS: TGD1 B1/B3 (seconds)
1535
4/8
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
11948 double tgd_bgd5a_TGD1 = str::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase), 0.0);
1536
1537 // GPS/QZSS: IODC Issue of Data, Clock
1538 // GAL: BGD E5b/E1 (seconds)
1539 // BDS: TGD2 B2/B3 (seconds)
1540 // IRNSS: Blank
1541
4/8
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
8961 double IODC_bgd5b_TGD2 = str::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase), 0.0);
1542
1543 LOG_DATA("{}: svAccuracy {}, svHealth {}, TGD {}, IODC {}", nameId(), signalAccuracy, svHealth, tgd_bgd5a_TGD1, IODC_bgd5b_TGD2);
1544
1545 // ------------------------------------ BROADCAST ORBIT - 7 --------------------------------------
1546
1/2
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
2987 getline(line);
1547
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2987 times.
2987 if (line.size() > 82)
1548 {
1549 abortReading();
1550 return false;
1551 } // 80 + \n\r
1552
1553 // Transmission time of message (sec of GPS week, derived e.g.from Z-count in Hand Over Word (HOW))
1554
4/8
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
11948 [[maybe_unused]] auto transmissionTime = str::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase), 0.0);
1555 // GPS/QZSS: Fit Interval in hours see section 6.11. (BNK).
1556 // GAL: Spare
1557 // BDS: AODC Age of Data Clock (as specified in BeiDou ICD Table Section 5.2.4.9 Table 5-6) and field range is: 0-31.
1558
4/8
✓ Branch 1 taken 2987 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2987 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2987 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2987 times.
✗ Branch 11 not taken.
8961 auto fitInterval_AODC = str::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase), 0.0);
1559 // Spare
1560 // std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1561 // Spare
1562 // std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1563
1564 LOG_DATA("{}: transmissionTime {}, fitInterval/AODC {}", nameId(), transmissionTime, fitInterval_AODC);
1565
1566
2/2
✓ Branch 1 taken 1199 times.
✓ Branch 2 taken 1788 times.
2987 if (satSys == GPS)
1567 {
1568
2/4
✓ Branch 1 taken 1199 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1199 times.
✗ Branch 7 not taken.
1199 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GPSEphemeris>(epoch, toe,
1569 IODE_IODnav_AODE_IODEC, IODC_bgd5b_TGD2, a,
1570 sqrt_A, e, i_0, Omega_0, omega, M_0,
1571 delta_n, Omega_dot, i_dot, Cus, Cuc,
1572 Cis, Cic, Crs, Crc,
1573 signalAccuracy, svHealth,
1574 codesOnL2Channel_dataSources, L2PdataFlag,
1575 tgd_bgd5a_TGD1, fitInterval_AODC));
1576 }
1577
2/2
✓ Branch 1 taken 1624 times.
✓ Branch 2 taken 164 times.
1788 else if (satSys == GAL)
1578 {
1579 // The same satellite can appear multiple times with different dataSource bits
1580 // We want to prefer 'I/NAV E1-B' (Bit 0 set) over 'F/NAV E5a-I' (Bit 1 set) or 'I/NAV E5b-I' (Bit 2 set)
1581
1582
1/2
✓ Branch 2 taken 1624 times.
✗ Branch 3 not taken.
1624 if (_gnssNavInfo.satellites().contains({ satSys, satNum }) // We have this satellite already
1583
8/10
✓ Branch 1 taken 1523 times.
✓ Branch 2 taken 101 times.
✓ Branch 6 taken 21 times.
✓ Branch 7 taken 1502 times.
✓ Branch 8 taken 1523 times.
✓ Branch 9 taken 101 times.
✓ Branch 11 taken 21 times.
✓ Branch 12 taken 1603 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
3248 && !std::bitset<10>(codesOnL2Channel_dataSources)[0]) // This message is not 'I/NAV E1-B'
1584 {
1585
2/4
✓ Branch 3 taken 21 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 21 times.
✗ Branch 7 not taken.
21 const auto& navData = _gnssNavInfo.satellites().at({ satSys, satNum }).getNavigationData();
1586
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 auto existingEph = std::ranges::find_if(navData, [&](const std::shared_ptr<SatNavData>& satNavData) {
1587
2/2
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 7 times.
25 return satNavData->type == SatNavData::GalileoEphemeris && satNavData->refTime == epoch
1588
7/8
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 17 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 18 times.
✓ Branch 10 taken 7 times.
✓ Branch 12 taken 18 times.
✓ Branch 13 taken 7 times.
50 && std::dynamic_pointer_cast<GalileoEphemeris>(satNavData)->dataSource[0];
1589 });
1590
2/2
✓ Branch 2 taken 17 times.
✓ Branch 3 taken 4 times.
21 if (existingEph != navData.end()) // There is already a 'I/NAV E1-B' message
1591 {
1592 LOG_DATA("{}: Skipping ephemeris data because of dataSource priority", nameId());
1593 17 return false;
1594 }
1595 }
1596
1597 1607 GalileoEphemeris::SvHealth health = { .E5a_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b000001000) >> 3),
1598 1607 .E5b_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b001000000) >> 6),
1599 1607 .E1B_DataValidityStatus = static_cast<GalileoEphemeris::SvHealth::DataValidityStatus>((svHealth & 0b000000001) >> 0),
1600 1607 .E5a_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b000110000) >> 4),
1601 1607 .E5b_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b110000000) >> 7),
1602 1607 .E1B_SignalHealthStatus = static_cast<GalileoEphemeris::SvHealth::SignalHealthStatus>((svHealth & 0b000000110) >> 1) };
1603
2/4
✓ Branch 1 taken 1607 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1607 times.
✗ Branch 7 not taken.
1607 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GalileoEphemeris>(epoch, toe, IODE_IODnav_AODE_IODEC, a,
1604 sqrt_A, e, i_0, Omega_0, omega, M_0,
1605 delta_n, Omega_dot, i_dot, Cus, Cuc,
1606 Cis, Cic, Crs, Crc,
1607 codesOnL2Channel_dataSources, signalAccuracy, health,
1608 tgd_bgd5a_TGD1, IODC_bgd5b_TGD2));
1609 }
1610
2/2
✓ Branch 1 taken 160 times.
✓ Branch 2 taken 4 times.
164 else if (satSys == BDS)
1611 {
1612
2/4
✓ Branch 1 taken 160 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 160 times.
✗ Branch 7 not taken.
160 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<BDSEphemeris>(satNum, epoch, toe,
1613 IODE_IODnav_AODE_IODEC, fitInterval_AODC, a,
1614 sqrt_A, e, i_0, Omega_0, omega, M_0,
1615 delta_n, Omega_dot, i_dot, Cus, Cuc,
1616 Cis, Cic, Crs, Crc,
1617 signalAccuracy, svHealth,
1618 tgd_bgd5a_TGD1, IODC_bgd5b_TGD2));
1619 }
1620
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 else if (satSys == QZSS)
1621 {
1622
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
4 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<QZSSEphemeris>(epoch, toe,
1623 IODE_IODnav_AODE_IODEC, IODC_bgd5b_TGD2, a,
1624 sqrt_A, e, i_0, Omega_0, omega, M_0,
1625 delta_n, Omega_dot, i_dot, Cus, Cuc,
1626 Cis, Cic, Crs, Crc,
1627 signalAccuracy, svHealth,
1628 codesOnL2Channel_dataSources, L2PdataFlag,
1629 tgd_bgd5a_TGD1, fitInterval_AODC));
1630 }
1631 }
1632
4/6
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 3621 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3627 times.
✗ Branch 7 not taken.
3627 else if (satSys == GLO || satSys == SBAS) // NOLINT(misc-redundant-expression) // bugged warning
1633 {
1634 // TODO: Offset
1635
1636
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 Eigen::Vector3d pos;
1637
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 Eigen::Vector3d vel;
1638
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 Eigen::Vector3d accelLuniSolar;
1639
1640 3627 double tau_c{};
1641 // Coefficient of linear polynomial of time system difference [s]
1642
4/6
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3627 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 527 times.
✓ Branch 8 taken 3100 times.
3627 if (_gnssNavInfo.timeSysCorr.contains({ satSys.getTimeSystem(), UTC }))
1643 {
1644
2/4
✓ Branch 1 taken 527 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 527 times.
✗ Branch 6 not taken.
527 tau_c = _gnssNavInfo.timeSysCorr.at({ satSys.getTimeSystem(), UTC }).a0;
1645 }
1646
1647 // GLO: SV clock bias (sec) (-TauN)
1648 // SBAS: SV clock bias (sec) (aGf0)
1649
5/10
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
14508 double m_tau_n = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1650 // GLO: SV relative frequency bias (+GammaN)
1651 // SBAS: SV relative frequency bias (aGf1)
1652
5/10
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
14508 double gamma_n = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1653 // GLO: Message frame time (tk+nd*86400) in seconds of the UTC week
1654 // SBAS: Transmission time of message (start of the message) in GPS seconds of the week
1655
5/10
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
10881 [[maybe_unused]] auto msgFrameTime = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1656 LOG_DATA("{}: clkBias {}, relFreqBias {}, msgFrameTime {}", nameId(), m_tau_n, gamma_n, msgFrameTime);
1657
1658 // ------------------------------------ BROADCAST ORBIT - 1 --------------------------------------
1659
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 getline(line);
1660
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3627 times.
3627 if (line.size() > 82)
1661 {
1662 abortReading();
1663 return false;
1664 } // 80 + \n\r
1665
1666 // Satellite position X (km)
1667
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 pos.x() = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase)) * 1e3;
1668 // velocity X dot (km/sec)
1669
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 vel.x() = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase)) * 1e3;
1670 // X acceleration (km/sec2)
1671
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 accelLuniSolar.x() = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase)) * 1e3;
1672 // GLO: health (0=healthy, 1=unhealthy) (MSB of 3-bit Bn)
1673 // SBAS: Health: SBAS: See Section 8.3.3 bit mask for: health, health availability and User Range Accuracy.
1674
5/10
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
10881 [[maybe_unused]] auto health = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1675
1676 LOG_DATA("{}: satPosX {}, velX {}, accelX {}, health {}", nameId(), pos.x(), vel.x(), accelLuniSolar.x(), health);
1677
1678 // ------------------------------------ BROADCAST ORBIT - 2 --------------------------------------
1679
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 getline(line);
1680
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3627 times.
3627 if (line.size() > 82)
1681 {
1682 abortReading();
1683 return false;
1684 } // 80 + \n\r
1685
1686 // Satellite position Y (km)
1687
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 pos.y() = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase)) * 1e3;
1688 // velocity Y dot (km/sec)
1689
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 vel.y() = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase)) * 1e3;
1690 // Y acceleration (km/sec2)
1691
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 accelLuniSolar.y() = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase)) * 1e3;
1692 // GLO: frequency number(-7...+13) (-7...+6 ICD 5.1)
1693 // SBAS: Accuracy code (URA, meters)
1694
5/10
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
10881 double frequencyNumber_accuracyCode = std::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase));
1695
1696 LOG_DATA("{}: satPosY {}, velY {}, accelY {}, freqNum/accuracyCode {}", nameId(), pos.y(), vel.y(), accelLuniSolar.y(), frequencyNumber_accuracyCode);
1697
1698 // ------------------------------------ BROADCAST ORBIT - 3 --------------------------------------
1699
1/2
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
3627 getline(line);
1700
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3627 times.
3627 if (line.size() > 82)
1701 {
1702 abortReading();
1703 return false;
1704 } // 80 + \n\r
1705
1706 // Satellite position Z (km)
1707
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 pos.z() = std::stod(str::replaceAll_copy(line.substr(4, 19), "d", "e", str::IgnoreCase)) * 1e3;
1708 // velocity Z dot (km/sec)
1709
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 vel.z() = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase)) * 1e3;
1710 // Z acceleration (km/sec2)
1711
6/12
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3627 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3627 times.
✗ Branch 17 not taken.
14508 accelLuniSolar.z() = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase)) * 1e3;
1712 // GLO: Age of oper. information (days) (E)
1713 // SBAS: IODN (Issue of Data Navigation, DO229, 8 first bits after Message Type if MT9)
1714
4/8
✓ Branch 1 taken 3627 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3627 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3627 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3627 times.
✗ Branch 11 not taken.
10881 [[maybe_unused]] auto ageOfOperation_IODN = str::stod(str::replaceAll_copy(line.substr(61, 19), "d", "e", str::IgnoreCase), 0.0);
1715
1716 LOG_DATA("{}: satPosZ {}, velZ {}, accelZ {}, ageOfOperation/IODN {}", nameId(), pos.z(), vel.z(), accelLuniSolar.z(), ageOfOperation_IODN);
1717
1718 // ------------------------------------ BROADCAST ORBIT - 4 --------------------------------------
1719 // since version 3.05 GLONASS has an additional line
1720
6/6
✓ Branch 1 taken 3621 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3609 times.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 3615 times.
3627 if (satSys == GLO && _version >= 3.05)
1721 {
1722
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 getline(line);
1723
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
12 if (line.size() > 82)
1724 {
1725 abortReading();
1726 return false;
1727 } // 80 + \n\r
1728
1729 // status flags (FLOAT converted to INTEGER) (can be blank)
1730 // M Bit 7-8: GLO type indicator (00=GLO, 01=GLO-M/K)
1731 // P4 Bit 6: GLO-M/K only, 1=data updated, 0=data not updated
1732 // P3 Bit 5: num of satellites in current frame alamanc (0=4 sats, 1=5 sats)
1733 // P2 Bit 4: indicate even (0) or odd (1) of time interval
1734 // P1 Bit 2-3: update and validity interval (00=0 min, 01=30 min, 10=45 min, 11=60 min)
1735 // P Bit 0-1: GLO-M/K only, time offset parameters tau_c, tau_GPS source (00=ground, 01 = tau_c ground, tau_GPS on-board, 10 = tau_c on-board, tau_GPS ground, 11 = on-board)
1736
5/10
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
48 [[maybe_unused]] double statusFlags = str::stod(str::replaceAll_copy(str::trim_copy(line.substr(4, 19)), "d", "e", str::IgnoreCase), std::nan(""));
1737 // L1/L2 group delay difference Δτ [sec]
1738
5/10
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
48 [[maybe_unused]] double L1L2groupDelayDifference = std::stod(str::replaceAll_copy(line.substr(23, 19), "d", "e", str::IgnoreCase));
1739 // URAI raw accuracy index F_T (GLO-M/K only)r
1740
5/10
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
48 [[maybe_unused]] double URAI = std::stod(str::replaceAll_copy(line.substr(42, 19), "d", "e", str::IgnoreCase));
1741 // health flags (FLOAT converted to INTEGER) (can be blank)
1742 // l(3) Bit 2: GLO-M/K only, health bit of string 3
1743 // A_C Bit 1: 1=almanac health reported in ephemerides record, 0=not reported
1744 // C Bit 0: almanac health bit (1=healthy, 0=not healthy)
1745
5/10
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
48 [[maybe_unused]] double healthFlags = str::stod(str::replaceAll_copy(str::trim_copy(line.substr(61, 19)), "d", "e", str::IgnoreCase), std::nan(""));
1746
1747 LOG_DATA("{}: statusFlags {}, L1L2groupDelayDifference {}, URAI {}, healthFlags {}", nameId(), statusFlags, L1L2groupDelayDifference, URAI, healthFlags);
1748 }
1749
1750
2/2
✓ Branch 1 taken 3621 times.
✓ Branch 2 taken 6 times.
3627 if (satSys == GLO)
1751 {
1752
1/2
✓ Branch 3 taken 3621 times.
✗ Branch 4 not taken.
3621 _gnssNavInfo.addSatelliteNavData({ satSys, satNum }, std::make_shared<GLONASSEphemeris>(epoch, tau_c,
1753
1/2
✓ Branch 1 taken 3621 times.
✗ Branch 2 not taken.
7242 -m_tau_n, gamma_n, static_cast<bool>(health),
1754 pos, vel, accelLuniSolar,
1755 frequencyNumber_accuracyCode));
1756 }
1757
5/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 4 times.
6 else if (satSys == SBAS && !_sbasNotSupportedWarned)
1758 {
1759
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 LOG_WARN("SBAS is not yet supported. Therefore the Navigation file data will be skipped.");
1760 2 _sbasNotSupportedWarned = true;
1761 }
1762 }
1763 6597 return true;
1764 6618 }
1765
1766 48 void RinexNavFile::readHeader()
1767 {
1768 LOG_TRACE("{}: called", nameId());
1769
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 auto guard = requestOutputValueLock(OUTPUT_PORT_INDEX_GNSS_NAV_INFO);
1770
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 executeHeaderParser(_version);
1771 48 }
1772
1773 48 void RinexNavFile::readOrbits()
1774 {
1775 LOG_TRACE("{}: called", nameId());
1776
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 auto guard = requestOutputValueLock(OUTPUT_PORT_INDEX_GNSS_NAV_INFO);
1777
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 executeOrbitParser(_version);
1778 48 }
1779
1780 } // namespace NAV
1781