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 |