| 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 "RINEXUtilities.hpp" | ||
| 10 | |||
| 11 | #include <sstream> | ||
| 12 | #include <locale> | ||
| 13 | |||
| 14 | #include <boost/date_time/posix_time/posix_time.hpp> // TODO: Remove 'boost.dateTime' from conan as soon as 'std::chrono::utc_clock' becomes available | ||
| 15 | #include <fmt/chrono.h> | ||
| 16 | #include <fmt/format.h> | ||
| 17 | using namespace fmt::literals; // NOLINT(google-build-using-namespace) | ||
| 18 | |||
| 19 | #include "internal/Version.hpp" | ||
| 20 | #include "Navigation/Math/Math.hpp" | ||
| 21 | #include "util/Logger.hpp" | ||
| 22 | |||
| 23 | namespace NAV | ||
| 24 | { | ||
| 25 | namespace vendor::RINEX | ||
| 26 | { | ||
| 27 | |||
| 28 | 36 | void ObsHeader::reset() | |
| 29 | { | ||
| 30 | 36 | satSys = SatSys_None; | |
| 31 | 36 | systemObsTypes.clear(); | |
| 32 | 36 | interval = 1e9; | |
| 33 | 36 | timeFirstObs.reset(); | |
| 34 | 36 | timeLastObs.reset(); | |
| 35 | 36 | satellites.clear(); | |
| 36 | 36 | timeSys = TimeSys_None; | |
| 37 | 36 | } | |
| 38 | |||
| 39 | 480715 | bool ObsHeader::addObsType(const Code& code, ObsType type) | |
| 40 | { | ||
| 41 |
3/6✓ Branch 1 taken 480715 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 480715 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 480715 times.
✗ Branch 8 not taken.
|
480715 | auto& obsDescriptions = systemObsTypes[code.getFrequency().getSatSys()]; |
| 42 |
1/2✓ Branch 1 taken 480715 times.
✗ Branch 2 not taken.
|
480715 | if (std::ranges::find_if(obsDescriptions, [&code, &type](const auto& obsDesc) { |
| 43 |
4/4✓ Branch 1 taken 1147161 times.
✓ Branch 2 taken 1242543 times.
✓ Branch 3 taken 480196 times.
✓ Branch 4 taken 666965 times.
|
2389704 | return obsDesc.code == code && obsDesc.type == type; |
| 44 | }) | ||
| 45 |
2/2✓ Branch 2 taken 519 times.
✓ Branch 3 taken 480196 times.
|
961430 | == obsDescriptions.end()) |
| 46 | { | ||
| 47 |
1/2✓ Branch 1 taken 519 times.
✗ Branch 2 not taken.
|
519 | obsDescriptions.push_back(ObservationDescription{ .type = type, .code = code }); |
| 48 | 519 | return true; | |
| 49 | } | ||
| 50 | 480196 | return false; | |
| 51 | } | ||
| 52 | |||
| 53 | 49 | std::string ObsHeader::generateHeader() const | |
| 54 | { | ||
| 55 | 49 | std::string str; | |
| 56 | |||
| 57 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineRinexVersionType(); |
| 58 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLinePgmRunByDate(); |
| 59 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineComments(); |
| 60 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineMarkerName(); |
| 61 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineMarkerNumber(); |
| 62 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineMarkerType(); |
| 63 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineObserverAgency(); |
| 64 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineRecNumTypeVers(); |
| 65 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineAntNumType(); |
| 66 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineApproxPositionXYZ(); |
| 67 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineAntennaDeltaHEN(); |
| 68 | // ANTENNA: DELTA X/Y/Z (optional) | ||
| 69 | // ANTENNA:PHASECENTER (optional) | ||
| 70 | // ANTENNA: B.SIGHT XYZ (optional) | ||
| 71 | // ANTENNA: ZERODIR AZI (optional) | ||
| 72 | // ANTENNA: ZERODIR XYZ (optional) | ||
| 73 | // CENTER OF MASS: XYZ (optional) | ||
| 74 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineSysNumObsType(); |
| 75 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineSignalStrengthUnit(); |
| 76 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineInterval(); |
| 77 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineTimeOfFirstObs(); |
| 78 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineTimeOfLastObs(); |
| 79 | // RCV CLOCK OFFS APPL (optional) | ||
| 80 | // SYS / DCBS APPLIED (optional) | ||
| 81 | // SYS / PCVS APPLIED (optional) | ||
| 82 | // SYS / SCALE FACTOR (optional) | ||
| 83 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineSysPhaseShift(); |
| 84 | // GLONASS SLOT / FRQ # (is mandatory, but a lot of receivers also do not write it. So we leave it out. Would require NAV information) | ||
| 85 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineGlonassCodPhsBis(); |
| 86 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineLeapSeconds(); |
| 87 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineNumSatellites(); |
| 88 | // PRN / # OF OBS (optional) | ||
| 89 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | str += headerLineEndOfHeader(); |
| 90 | |||
| 91 | 49 | return str; | |
| 92 | ✗ | } | |
| 93 | 61 | std::string ObsHeader::headerLineRinexVersionType() const | |
| 94 | { | ||
| 95 | 61 | std::string longSatSysString; | |
| 96 |
2/7✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 58 times.
|
61 | switch (static_cast<SatelliteSystem_>(satSys)) |
| 97 | { | ||
| 98 | ✗ | case GPS: | |
| 99 | ✗ | longSatSysString = "GPS"; | |
| 100 | ✗ | break; | |
| 101 | ✗ | case GAL: | |
| 102 | ✗ | longSatSysString = "GALILEO"; | |
| 103 | ✗ | break; | |
| 104 | 3 | case GLO: | |
| 105 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | longSatSysString = "GLONASS"; |
| 106 | 3 | break; | |
| 107 | ✗ | case BDS: | |
| 108 | ✗ | longSatSysString = "BEIDOU"; | |
| 109 | ✗ | break; | |
| 110 | ✗ | case QZSS: | |
| 111 | ✗ | longSatSysString = "QZSS"; | |
| 112 | ✗ | break; | |
| 113 | ✗ | case IRNSS: | |
| 114 | ✗ | longSatSysString = "IRNSS"; | |
| 115 | ✗ | break; | |
| 116 | 58 | default: | |
| 117 |
1/2✓ Branch 1 taken 58 times.
✗ Branch 2 not taken.
|
58 | longSatSysString = "MIXED"; |
| 118 | 58 | break; | |
| 119 | } | ||
| 120 | |||
| 121 |
2/4✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 61 times.
✗ Branch 7 not taken.
|
61 | return fmt::format("{version: 9.2f}{X:11}{fileType:<20}{satSys:1}: {satSysTxt:<17}{label:<20}\n", "X"_a = "", "label"_a = "RINEX VERSION / TYPE", |
| 122 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "version"_a = version, |
| 123 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "fileType"_a = "OBSERVATION DATA", |
| 124 |
2/4✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 61 times.
✗ Branch 6 not taken.
|
61 | "satSys"_a = satSys.toChar(), |
| 125 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
183 | "satSysTxt"_a = longSatSysString); |
| 126 | 61 | } | |
| 127 | 49 | std::string ObsHeader::headerLinePgmRunByDate() const | |
| 128 | { | ||
| 129 |
1/2✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
|
49 | std::stringstream ss; |
| 130 |
7/16✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 49 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 49 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 49 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 49 times.
✗ Branch 21 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
|
49 | ss.imbue(std::locale{ ss.getloc(), new boost::posix_time::time_facet{ "%Y%m%d %H%M%S" } }); |
| 131 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
|
49 | ss << boost::posix_time::second_clock::universal_time(); |
| 132 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | return fmt::format("{pgm:20}{runBy:20}{date} UTC {label:20}\n", "label"_a = "PGM / RUN BY / DATE", |
| 133 |
8/16✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 49 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 49 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 49 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 49 times.
✗ Branch 23 not taken.
✓ Branch 26 taken 49 times.
✗ Branch 27 not taken.
|
294 | "pgm"_a = "INSTINCT " + PROJECT_VERSION_STRING, |
| 134 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
98 | "runBy"_a = runBy.substr(0, 20), |
| 135 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
245 | "date"_a = ss.str()); // std::chrono::floor<std::chrono::seconds>(std::chrono::utc_clock::now()) |
| 136 | 49 | } | |
| 137 | 49 | std::string ObsHeader::headerLineComments() const | |
| 138 | { | ||
| 139 | 49 | std::string str; | |
| 140 |
2/2✓ Branch 4 taken 147 times.
✓ Branch 5 taken 49 times.
|
196 | for (const auto& comment : comments) |
| 141 | { | ||
| 142 |
1/2✓ Branch 2 taken 147 times.
✗ Branch 3 not taken.
|
294 | str += fmt::format("{comment:60}{label:<20}\n", "label"_a = "COMMENT", |
| 143 |
3/6✓ Branch 1 taken 147 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 147 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 147 times.
✗ Branch 9 not taken.
|
441 | "comment"_a = comment.substr(0, 60)); |
| 144 | } | ||
| 145 | 49 | return str; | |
| 146 | ✗ | } | |
| 147 | 49 | std::string ObsHeader::headerLineMarkerName() const | |
| 148 | { | ||
| 149 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | return fmt::format("{markerName:60}{label:<20}\n", "label"_a = "MARKER NAME", |
| 150 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "markerName"_a = markerName.substr(0, 60)); |
| 151 | } | ||
| 152 | 49 | std::string ObsHeader::headerLineMarkerNumber() const | |
| 153 | { | ||
| 154 |
1/2✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
|
49 | if (!markerNumber.empty()) |
| 155 | { | ||
| 156 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | return fmt::format("{markerNumber:60}{label:<20}\n", "label"_a = "MARKER NUMBER", |
| 157 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "markerNumber"_a = markerNumber.substr(0, 60)); |
| 158 | } | ||
| 159 | ✗ | return ""; | |
| 160 | } | ||
| 161 | 49 | std::string ObsHeader::headerLineMarkerType() const | |
| 162 | { | ||
| 163 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{markerType:20}{X:40}{label:<20}\n", "X"_a = "", "label"_a = "MARKER TYPE", |
| 164 | 49 | "markerType"_a = (markerType == MarkerTypes::USER_DEFINED | |
| 165 |
3/10✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 49 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
98 | ? markerTypeUser.substr(0, 20) |
| 166 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
196 | : NAV::to_string(markerType))); |
| 167 | } | ||
| 168 | 49 | std::string ObsHeader::headerLineObserverAgency() const | |
| 169 | { | ||
| 170 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | return fmt::format("{observer:20}{agency:40}{label:<20}\n", "label"_a = "OBSERVER / AGENCY", |
| 171 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | "observer"_a = observer.substr(0, 20), |
| 172 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "agency"_a = agency.substr(0, 40)); |
| 173 | } | ||
| 174 | 49 | std::string ObsHeader::headerLineRecNumTypeVers() const | |
| 175 | { | ||
| 176 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | return fmt::format("{rec:20}{type:20}{vers:20}{label:<20}\n", "label"_a = "REC # / TYPE / VERS", |
| 177 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | "rec"_a = receiverNumber.substr(0, 20), |
| 178 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
98 | "type"_a = receiverType.substr(0, 20), |
| 179 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
196 | "vers"_a = receiverVersion.substr(0, 20)); |
| 180 | } | ||
| 181 | 49 | std::string ObsHeader::headerLineAntNumType() const | |
| 182 | { | ||
| 183 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{ant:20}{type:20}{X:20}{label:<20}\n", "X"_a = "", "label"_a = "ANT # / TYPE", |
| 184 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | "ant"_a = antennaNumber.substr(0, 20), |
| 185 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "type"_a = antennaType.substr(0, 20)); |
| 186 | } | ||
| 187 | 49 | std::string ObsHeader::headerLineApproxPositionXYZ() const | |
| 188 | { | ||
| 189 |
1/2✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
|
49 | if (approxPositionEnabled) |
| 190 | { | ||
| 191 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{x:14.4f}{y:14.4f}{z:14.4f}{X:18}{label:<20}\n", "X"_a = "", "label"_a = "APPROX POSITION XYZ", |
| 192 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | "x"_a = approxPositionXYZ.x(), |
| 193 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | "y"_a = approxPositionXYZ.y(), |
| 194 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "z"_a = approxPositionXYZ.z()); |
| 195 | } | ||
| 196 | ✗ | return ""; | |
| 197 | } | ||
| 198 | 49 | std::string ObsHeader::headerLineAntennaDeltaHEN() const | |
| 199 | { | ||
| 200 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{antH:14.4f}{antE:14.4f}{antN:14.4f}{X:18}{label:<20}\n", "X"_a = "", "label"_a = "ANTENNA: DELTA H/E/N", |
| 201 |
1/2✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
|
49 | "antH"_a = antennaDeltaHeightEastNorth[0], |
| 202 |
1/2✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
|
49 | "antE"_a = antennaDeltaHeightEastNorth[1], |
| 203 |
1/2✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
|
147 | "antN"_a = antennaDeltaHeightEastNorth[2]); |
| 204 | } | ||
| 205 | 49 | std::string ObsHeader::headerLineSysNumObsType() const | |
| 206 | { | ||
| 207 | 49 | std::string str; | |
| 208 |
2/2✓ Branch 7 taken 53 times.
✓ Branch 8 taken 49 times.
|
102 | for (const auto& [satSys, types] : systemObsTypes) // SYS / # / OBS TYPES |
| 209 | { | ||
| 210 | 53 | bool firstLine = true; | |
| 211 |
2/2✓ Branch 1 taken 527 times.
✓ Branch 2 taken 53 times.
|
580 | for (size_t i = 0; i < types.size(); ++i) |
| 212 | { | ||
| 213 |
1/2✓ Branch 1 taken 527 times.
✗ Branch 2 not taken.
|
527 | const auto& obsDesc = types.at(i); |
| 214 |
2/2✓ Branch 0 taken 67 times.
✓ Branch 1 taken 460 times.
|
527 | if (i % 13 == 0) |
| 215 | { | ||
| 216 |
2/2✓ Branch 0 taken 53 times.
✓ Branch 1 taken 14 times.
|
67 | if (firstLine) |
| 217 | { | ||
| 218 |
1/2✓ Branch 2 taken 53 times.
✗ Branch 3 not taken.
|
106 | str += fmt::format("{sys:1}{X:2}{num:3}", "X"_a = "", |
| 219 |
2/4✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 53 times.
✗ Branch 6 not taken.
|
53 | "sys"_a = satSys.toChar(), |
| 220 |
2/4✓ Branch 3 taken 53 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 53 times.
✗ Branch 7 not taken.
|
106 | "num"_a = types.size()); |
| 221 | 53 | firstLine = false; | |
| 222 | } | ||
| 223 |
2/4✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 14 times.
✗ Branch 7 not taken.
|
28 | else { str += fmt::format("{X:6}", "X"_a = ""); } |
| 224 | } | ||
| 225 | |||
| 226 |
1/2✓ Branch 2 taken 527 times.
✗ Branch 3 not taken.
|
1054 | str += fmt::format("{X:1}{desc:3}", "X"_a = "", |
| 227 | 1054 | "desc"_a = vendor::RINEX::obsTypeToChar(obsDesc.type) | |
| 228 |
4/8✓ Branch 2 taken 527 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 527 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 527 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 527 times.
✗ Branch 12 not taken.
|
3162 | + fmt::format("{}", obsDesc.code).substr(1, 2)); |
| 229 | |||
| 230 |
6/6✓ Branch 0 taken 513 times.
✓ Branch 1 taken 14 times.
✓ Branch 3 taken 53 times.
✓ Branch 4 taken 460 times.
✓ Branch 5 taken 67 times.
✓ Branch 6 taken 460 times.
|
527 | if ((i + 1) % 13 == 0 || i == types.size() - 1) |
| 231 | { | ||
| 232 |
2/4✓ Branch 2 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 67 times.
✗ Branch 7 not taken.
|
134 | str += fmt::format("{X:{w}}{label:<20}\n", "X"_a = "", "label"_a = "SYS / # / OBS TYPES", |
| 233 |
2/4✓ Branch 2 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 67 times.
✗ Branch 6 not taken.
|
201 | "w"_a = 54 - 4 * ((i % 13) + 1)); |
| 234 | } | ||
| 235 | } | ||
| 236 | } | ||
| 237 | 49 | return str; | |
| 238 | ✗ | } | |
| 239 | 49 | std::string ObsHeader::headerLineSignalStrengthUnit() | |
| 240 | { | ||
| 241 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{sigUnit:20}{X:40}{label:<20}\n", "X"_a = "", "label"_a = "SIGNAL STRENGTH UNIT", |
| 242 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
147 | "sigUnit"_a = "DBHZ"); |
| 243 | } | ||
| 244 | 61 | std::string ObsHeader::headerLineInterval() const | |
| 245 | { | ||
| 246 |
4/6✓ Branch 0 taken 51 times.
✓ Branch 1 taken 10 times.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 51 times.
✗ Branch 9 not taken.
|
112 | if (interval == 1e9) { return fmt::format("{X:60}{label:<20}\n", "X"_a = "", "label"_a = "INTERVAL"); } |
| 247 |
2/4✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
|
10 | return fmt::format("{interval:10.3f}{X:50}{label:<20}\n", "X"_a = "", "label"_a = "INTERVAL", |
| 248 |
1/2✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
30 | "interval"_a = interval); |
| 249 | } | ||
| 250 | 49 | std::string ObsHeader::headerLineTimeOfFirstObs() const | |
| 251 | { | ||
| 252 |
1/2✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
|
49 | auto firstObsYMDHMS = timeFirstObs.toYMDHMS(timeSys, 7); |
| 253 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{y:6d}{m:6d}{d:6d}{h:6d}{min:6d}{sec:13.7f}{X:5}{sys:3}{X:9}{label:<20}\n", "X"_a = "", "label"_a = "TIME OF FIRST OBS", |
| 254 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "y"_a = firstObsYMDHMS.year, |
| 255 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "m"_a = firstObsYMDHMS.month, |
| 256 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "d"_a = firstObsYMDHMS.day, |
| 257 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "h"_a = firstObsYMDHMS.hour, |
| 258 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "min"_a = firstObsYMDHMS.min, |
| 259 |
1/2✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
|
49 | "sec"_a = static_cast<double>(firstObsYMDHMS.sec), |
| 260 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "sys"_a = vendor::RINEX::timeSystemString(timeSys)); |
| 261 | } | ||
| 262 | 61 | std::string ObsHeader::headerLineTimeOfLastObs() const | |
| 263 | { | ||
| 264 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | auto lastObsYMDHMS = timeLastObs.toYMDHMS(timeSys, 7); |
| 265 |
2/4✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 61 times.
✗ Branch 7 not taken.
|
61 | return fmt::format("{y:6d}{m:6d}{d:6d}{h:6d}{min:6d}{sec:13.7f}{X:5}{sys:3}{X:9}{label:<20}\n", "X"_a = "", "label"_a = "TIME OF LAST OBS", |
| 266 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "y"_a = lastObsYMDHMS.year, |
| 267 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "m"_a = lastObsYMDHMS.month, |
| 268 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "d"_a = lastObsYMDHMS.day, |
| 269 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "h"_a = lastObsYMDHMS.hour, |
| 270 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "min"_a = lastObsYMDHMS.min, |
| 271 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | "sec"_a = static_cast<double>(lastObsYMDHMS.sec), |
| 272 |
2/4✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 61 times.
✗ Branch 6 not taken.
|
183 | "sys"_a = vendor::RINEX::timeSystemString(timeSys)); |
| 273 | } | ||
| 274 | 49 | std::string ObsHeader::headerLineSysPhaseShift() | |
| 275 | { | ||
| 276 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
98 | return fmt::format("{X:60}{label:<20}\n", "X"_a = "", "label"_a = "SYS / PHASE SHIFT"); |
| 277 | } | ||
| 278 | 49 | std::string ObsHeader::headerLineGlonassCodPhsBis() | |
| 279 | { | ||
| 280 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
98 | return fmt::format("{X:60}{label:<20}\n", "X"_a = "", "label"_a = "GLONASS COD/PHS/BIS"); |
| 281 | } | ||
| 282 | 49 | std::string ObsHeader::headerLineLeapSeconds() const | |
| 283 | { | ||
| 284 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
49 | return fmt::format("{leap:6d}{X:54}{label:<20}\n", "X"_a = "", "label"_a = "LEAP SECONDS", |
| 285 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
147 | "leap"_a = timeFirstObs.leapGps2UTC()); |
| 286 | } | ||
| 287 | 61 | std::string ObsHeader::headerLineNumSatellites() const | |
| 288 | { | ||
| 289 |
2/4✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 61 times.
✗ Branch 7 not taken.
|
61 | return fmt::format("{nSat:6d}{X:54}{label:<20}\n", "X"_a = "", "label"_a = "# OF SATELLITES", |
| 290 |
1/2✓ Branch 3 taken 61 times.
✗ Branch 4 not taken.
|
183 | "nSat"_a = satellites.size()); |
| 291 | } | ||
| 292 | 49 | std::string ObsHeader::headerLineEndOfHeader() | |
| 293 | { | ||
| 294 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 49 times.
✗ Branch 7 not taken.
|
98 | return fmt::format("{X:60}{label:<20}\n", "X"_a = "", "label"_a = "END OF HEADER"); |
| 295 | } | ||
| 296 | |||
| 297 | 2037 | std::string ObsHeader::epochRecordLine(const InsTime& epochTime, size_t nSatellites) const | |
| 298 | { | ||
| 299 |
1/2✓ Branch 1 taken 2037 times.
✗ Branch 2 not taken.
|
2037 | auto timeYMDHMS = epochTime.toYMDHMS(timeSys, 7); |
| 300 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | return fmt::format("> {y:4d} {m:2d} {d:2d} {h:2d} {min:2d}{sec:11.7f} 0{numSat:3d}{X:6}{X:15}\n", "X"_a = "", |
| 301 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "y"_a = timeYMDHMS.year, |
| 302 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "m"_a = timeYMDHMS.month, |
| 303 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "d"_a = timeYMDHMS.day, |
| 304 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "h"_a = timeYMDHMS.hour, |
| 305 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "min"_a = timeYMDHMS.min, |
| 306 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
2037 | "sec"_a = static_cast<double>(timeYMDHMS.sec), |
| 307 |
1/2✓ Branch 2 taken 2037 times.
✗ Branch 3 not taken.
|
6111 | "numSat"_a = nSatellites); |
| 308 | } | ||
| 309 | |||
| 310 | ✗ | void to_json(json& j, const ObsHeader& obj) | |
| 311 | { | ||
| 312 | ✗ | j = json{ | |
| 313 | ✗ | { "version", obj.version }, | |
| 314 | ✗ | { "runBy", obj.runBy }, | |
| 315 | ✗ | { "comments", obj.comments }, | |
| 316 | ✗ | { "markerName", obj.markerName }, | |
| 317 | ✗ | { "markerNumber", obj.markerNumber }, | |
| 318 | ✗ | { "markerType", obj.markerType }, | |
| 319 | ✗ | { "markerTypeUser", obj.markerTypeUser }, | |
| 320 | ✗ | { "observer", obj.observer }, | |
| 321 | ✗ | { "agency", obj.agency }, | |
| 322 | ✗ | { "receiverNumber", obj.receiverNumber }, | |
| 323 | ✗ | { "receiverType", obj.receiverType }, | |
| 324 | ✗ | { "receiverVersion", obj.receiverVersion }, | |
| 325 | ✗ | { "antennaNumber", obj.antennaNumber }, | |
| 326 | ✗ | { "antennaType", obj.antennaType }, | |
| 327 | ✗ | { "approxPositionEnabled", obj.approxPositionEnabled }, | |
| 328 | ✗ | { "approxPositionXYZ", obj.approxPositionXYZ }, | |
| 329 | ✗ | { "antennaDeltaHeightEastNorth", obj.antennaDeltaHeightEastNorth }, | |
| 330 | ✗ | }; | |
| 331 | ✗ | } | |
| 332 | |||
| 333 | 12 | void from_json(const json& j, ObsHeader& obj) | |
| 334 | { | ||
| 335 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("version")) { j.at("version").get_to(obj.version); } |
| 336 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("runBy")) { j.at("runBy").get_to(obj.runBy); } |
| 337 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("comments")) { j.at("comments").get_to(obj.comments); } |
| 338 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("markerName")) { j.at("markerName").get_to(obj.markerName); } |
| 339 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("markerNumber")) { j.at("markerNumber").get_to(obj.markerNumber); } |
| 340 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("markerType")) { j.at("markerType").get_to(obj.markerType); } |
| 341 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("markerTypeUser")) { j.at("markerTypeUser").get_to(obj.markerTypeUser); } |
| 342 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("observer")) { j.at("observer").get_to(obj.observer); } |
| 343 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("agency")) { j.at("agency").get_to(obj.agency); } |
| 344 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("receiverNumber")) { j.at("receiverNumber").get_to(obj.receiverNumber); } |
| 345 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("receiverType")) { j.at("receiverType").get_to(obj.receiverType); } |
| 346 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("receiverVersion")) { j.at("receiverVersion").get_to(obj.receiverVersion); } |
| 347 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("antennaNumber")) { j.at("antennaNumber").get_to(obj.antennaNumber); } |
| 348 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("antennaType")) { j.at("antennaType").get_to(obj.antennaType); } |
| 349 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("approxPositionEnabled")) { j.at("approxPositionEnabled").get_to(obj.approxPositionEnabled); } |
| 350 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("approxPositionXYZ")) { j.at("approxPositionXYZ").get_to(obj.approxPositionXYZ); } |
| 351 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
12 | if (j.contains("antennaDeltaHeightEastNorth")) { j.at("antennaDeltaHeightEastNorth").get_to(obj.antennaDeltaHeightEastNorth); } |
| 352 | 12 | } | |
| 353 | 2855 | ObsType obsTypeFromChar(char c) | |
| 354 | { | ||
| 355 |
4/7✓ Branch 0 taken 787 times.
✓ Branch 1 taken 774 times.
✓ Branch 2 taken 606 times.
✓ Branch 3 taken 689 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
2855 | switch (c) |
| 356 | { | ||
| 357 | 787 | case 'C': | |
| 358 | 787 | return ObsType::C; | |
| 359 | 774 | case 'L': | |
| 360 | 774 | return ObsType::L; | |
| 361 | 606 | case 'D': | |
| 362 | 606 | return ObsType::D; | |
| 363 | 689 | case 'S': | |
| 364 | 689 | return ObsType::S; | |
| 365 | ✗ | case 'I': | |
| 366 | ✗ | return ObsType::I; | |
| 367 | ✗ | case 'X': | |
| 368 | ✗ | return ObsType::X; | |
| 369 | ✗ | default: | |
| 370 | ✗ | return ObsType::Error; | |
| 371 | } | ||
| 372 | } | ||
| 373 | |||
| 374 | 3381 | char obsTypeToChar(ObsType type) | |
| 375 | { | ||
| 376 |
4/7✓ Branch 0 taken 936 times.
✓ Branch 1 taken 923 times.
✓ Branch 2 taken 710 times.
✓ Branch 3 taken 818 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
3381 | switch (type) |
| 377 | { | ||
| 378 | 936 | case ObsType::C: | |
| 379 | 936 | return 'C'; | |
| 380 | 923 | case ObsType::L: | |
| 381 | 923 | return 'L'; | |
| 382 | 710 | case ObsType::D: | |
| 383 | 710 | return 'D'; | |
| 384 | 818 | case ObsType::S: | |
| 385 | 818 | return 'S'; | |
| 386 | ✗ | case ObsType::I: | |
| 387 | ✗ | return 'I'; | |
| 388 | ✗ | case ObsType::X: | |
| 389 | ✗ | return 'X'; | |
| 390 | ✗ | default: | |
| 391 | ✗ | return '\0'; | |
| 392 | } | ||
| 393 | } | ||
| 394 | |||
| 395 | 110 | std::string timeSystemString(TimeSystem timeSys) | |
| 396 | { | ||
| 397 |
3/7✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 72 times.
|
110 | switch (static_cast<TimeSystem_>(timeSys)) |
| 398 | { | ||
| 399 | 33 | case GPST: | |
| 400 |
1/2✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
|
66 | return "GPS"; |
| 401 | ✗ | case GST: | |
| 402 | ✗ | return "GAL"; | |
| 403 | 5 | case GLNT: | |
| 404 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
10 | return "GLO"; |
| 405 | ✗ | case BDT: | |
| 406 | ✗ | return "BDT"; | |
| 407 | ✗ | case QZSST: | |
| 408 | ✗ | return "QZS"; | |
| 409 | ✗ | case IRNSST: | |
| 410 | ✗ | return "IRN"; | |
| 411 | 72 | case UTC: | |
| 412 | case TimeSys_None: | ||
| 413 | default: | ||
| 414 | 72 | break; | |
| 415 | } | ||
| 416 |
1/2✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
|
144 | return "GPS"; |
| 417 | } | ||
| 418 | |||
| 419 | 13 | TimeSystem timeSystem(SatelliteSystem satSys) | |
| 420 | { | ||
| 421 |
2/7✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 11 times.
|
13 | switch (static_cast<SatelliteSystem_>(satSys)) |
| 422 | { | ||
| 423 | ✗ | case GPS: | |
| 424 | ✗ | return GPST; | |
| 425 | ✗ | case GAL: | |
| 426 | ✗ | return GST; | |
| 427 | 2 | case GLO: | |
| 428 | 2 | return GLNT; | |
| 429 | ✗ | case BDS: | |
| 430 | ✗ | return BDT; | |
| 431 | ✗ | case QZSS: | |
| 432 | ✗ | return QZSST; | |
| 433 | ✗ | case IRNSS: | |
| 434 | ✗ | return IRNSST; | |
| 435 | 11 | default: | |
| 436 | 11 | break; | |
| 437 | } | ||
| 438 | 11 | return GPST; | |
| 439 | } | ||
| 440 | |||
| 441 | 2850 | Frequency getFrequencyFromBand(SatelliteSystem satSys, int band) | |
| 442 | { | ||
| 443 |
8/11✓ Branch 0 taken 1053 times.
✓ Branch 1 taken 625 times.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 60 times.
✓ Branch 4 taken 444 times.
✓ Branch 5 taken 164 times.
✓ Branch 6 taken 339 times.
✓ Branch 7 taken 92 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
|
2850 | switch (band) |
| 444 | { | ||
| 445 | 1053 | case 1: | |
| 446 | // 1 = L1 (GPS, QZSS, SBAS, BDS) | ||
| 447 | // G1 (GLO) | ||
| 448 | // E1 (GAL) | ||
| 449 | // B1 (BDS) | ||
| 450 |
2/2✓ Branch 1 taken 314 times.
✓ Branch 2 taken 737 times.
|
1053 | if (satSys == GPS) |
| 451 | { | ||
| 452 | 314 | return Frequency_::G01; | |
| 453 | } | ||
| 454 |
2/2✓ Branch 1 taken 212 times.
✓ Branch 2 taken 525 times.
|
737 | if (satSys == QZSS) |
| 455 | { | ||
| 456 | 212 | return Frequency_::J01; | |
| 457 | } | ||
| 458 |
2/2✓ Branch 1 taken 60 times.
✓ Branch 2 taken 466 times.
|
525 | if (satSys == SBAS) |
| 459 | { | ||
| 460 | 60 | return Frequency_::S01; | |
| 461 | } | ||
| 462 |
2/2✓ Branch 1 taken 48 times.
✓ Branch 2 taken 417 times.
|
466 | if (satSys == BDS) |
| 463 | { | ||
| 464 | 48 | return Frequency_::B01; | |
| 465 | } | ||
| 466 |
2/2✓ Branch 1 taken 191 times.
✓ Branch 2 taken 225 times.
|
417 | if (satSys == GLO) |
| 467 | { | ||
| 468 | 191 | return Frequency_::R01; | |
| 469 | } | ||
| 470 |
1/2✓ Branch 1 taken 226 times.
✗ Branch 2 not taken.
|
225 | if (satSys == GAL) |
| 471 | { | ||
| 472 | 226 | return Frequency_::E01; | |
| 473 | } | ||
| 474 | ✗ | break; | |
| 475 | 625 | case 2: | |
| 476 | // 2 = L2 (GPS, QZSS) | ||
| 477 | // G2 (GLO) | ||
| 478 | // B1-2 (BDS) | ||
| 479 |
2/2✓ Branch 1 taken 287 times.
✓ Branch 2 taken 335 times.
|
625 | if (satSys == GPS) |
| 480 | { | ||
| 481 | 287 | return Frequency_::G02; | |
| 482 | } | ||
| 483 |
2/2✓ Branch 1 taken 32 times.
✓ Branch 2 taken 302 times.
|
335 | if (satSys == QZSS) |
| 484 | { | ||
| 485 | 32 | return Frequency_::J02; | |
| 486 | } | ||
| 487 |
2/2✓ Branch 1 taken 166 times.
✓ Branch 2 taken 137 times.
|
302 | if (satSys == GLO) |
| 488 | { | ||
| 489 | 166 | return Frequency_::R02; | |
| 490 | } | ||
| 491 |
1/2✓ Branch 1 taken 138 times.
✗ Branch 2 not taken.
|
137 | if (satSys == BDS) |
| 492 | { | ||
| 493 | 138 | return Frequency_::B02; | |
| 494 | } | ||
| 495 | ✗ | break; | |
| 496 | 80 | case 3: | |
| 497 | // 3 = G3 (GLO) | ||
| 498 |
1/2✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
|
80 | if (satSys == GLO) |
| 499 | { | ||
| 500 | 80 | return Frequency_::R03; | |
| 501 | } | ||
| 502 | ✗ | break; | |
| 503 | 60 | case 4: | |
| 504 | // 4 = G1a (GLO) | ||
| 505 |
1/2✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
|
60 | if (satSys == GLO) |
| 506 | { | ||
| 507 | 60 | return Frequency_::R04; | |
| 508 | } | ||
| 509 | ✗ | break; | |
| 510 | 444 | case 5: | |
| 511 | // 5 = L5 (GPS, QZSS, SBAS, IRNSS) | ||
| 512 | // E5a (GAL) | ||
| 513 | // B2/B2a (BDS) | ||
| 514 |
2/2✓ Branch 1 taken 92 times.
✓ Branch 2 taken 352 times.
|
444 | if (satSys == GPS) |
| 515 | { | ||
| 516 | 92 | return Frequency_::G05; | |
| 517 | } | ||
| 518 |
2/2✓ Branch 1 taken 120 times.
✓ Branch 2 taken 232 times.
|
352 | if (satSys == QZSS) |
| 519 | { | ||
| 520 | 120 | return Frequency_::J05; | |
| 521 | } | ||
| 522 |
2/2✓ Branch 1 taken 32 times.
✓ Branch 2 taken 200 times.
|
232 | if (satSys == SBAS) |
| 523 | { | ||
| 524 | 32 | return Frequency_::S05; | |
| 525 | } | ||
| 526 |
2/2✓ Branch 1 taken 32 times.
✓ Branch 2 taken 168 times.
|
200 | if (satSys == IRNSS) |
| 527 | { | ||
| 528 | 32 | return Frequency_::I05; | |
| 529 | } | ||
| 530 |
2/2✓ Branch 1 taken 120 times.
✓ Branch 2 taken 48 times.
|
168 | if (satSys == GAL) |
| 531 | { | ||
| 532 | 120 | return Frequency_::E05; | |
| 533 | } | ||
| 534 |
1/2✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
|
48 | if (satSys == BDS) |
| 535 | { | ||
| 536 | 48 | return Frequency_::B05; | |
| 537 | } | ||
| 538 | ✗ | break; | |
| 539 | 164 | case 6: | |
| 540 | // 6 = E6 (GAL) | ||
| 541 | // L6 (QZSS) | ||
| 542 | // B3 (BDS) | ||
| 543 | // G2a (GLO) | ||
| 544 |
2/2✓ Branch 1 taken 80 times.
✓ Branch 2 taken 84 times.
|
164 | if (satSys == GAL) |
| 545 | { | ||
| 546 | 80 | return Frequency_::E06; | |
| 547 | } | ||
| 548 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 2 taken 64 times.
|
84 | if (satSys == QZSS) |
| 549 | { | ||
| 550 | 20 | return Frequency_::J06; | |
| 551 | } | ||
| 552 |
2/2✓ Branch 1 taken 44 times.
✓ Branch 2 taken 20 times.
|
64 | if (satSys == BDS) |
| 553 | { | ||
| 554 | 44 | return Frequency_::B06; | |
| 555 | } | ||
| 556 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | if (satSys == GLO) |
| 557 | { | ||
| 558 | 20 | return Frequency_::R06; | |
| 559 | } | ||
| 560 | ✗ | break; | |
| 561 | 339 | case 7: | |
| 562 | // 7 = E5b (GAL) | ||
| 563 | // B2/B2b (BDS) | ||
| 564 |
2/2✓ Branch 1 taken 187 times.
✓ Branch 2 taken 152 times.
|
339 | if (satSys == GAL) |
| 565 | { | ||
| 566 | 187 | return Frequency_::E07; | |
| 567 | } | ||
| 568 |
1/2✓ Branch 1 taken 152 times.
✗ Branch 2 not taken.
|
152 | if (satSys == BDS) |
| 569 | { | ||
| 570 | 152 | return Frequency_::B07; | |
| 571 | } | ||
| 572 | ✗ | break; | |
| 573 | 92 | case 8: | |
| 574 | // 8 = E5a+b (GAL) | ||
| 575 | // B2a+b (BDS) | ||
| 576 |
1/2✓ Branch 1 taken 92 times.
✗ Branch 2 not taken.
|
92 | if (satSys == GAL) |
| 577 | { | ||
| 578 | 92 | return Frequency_::E08; | |
| 579 | } | ||
| 580 | ✗ | if (satSys == BDS) | |
| 581 | { | ||
| 582 | ✗ | return Frequency_::B08; | |
| 583 | } | ||
| 584 | ✗ | break; | |
| 585 | ✗ | case 9: | |
| 586 | // 9 = S (IRNSS) | ||
| 587 | ✗ | if (satSys == IRNSS) | |
| 588 | { | ||
| 589 | ✗ | return Frequency_::I09; | |
| 590 | } | ||
| 591 | ✗ | break; | |
| 592 | ✗ | case 0: | |
| 593 | // 0 for type X (all) | ||
| 594 | ✗ | break; | |
| 595 | ✗ | default: | |
| 596 | ✗ | break; | |
| 597 | } | ||
| 598 | |||
| 599 | ✗ | LOG_ERROR("Cannot find frequency for satellite system '{}' and band '{}'", satSys, band); | |
| 600 | ✗ | return Freq_None; | |
| 601 | } | ||
| 602 | |||
| 603 | } // namespace vendor::RINEX | ||
| 604 | |||
| 605 | ✗ | const char* to_string(vendor::RINEX::ObsHeader::MarkerTypes markerType) | |
| 606 | { | ||
| 607 | using MarkerTypes = NAV::vendor::RINEX::ObsHeader::MarkerTypes; | ||
| 608 | ✗ | switch (markerType) | |
| 609 | { | ||
| 610 | ✗ | case MarkerTypes::GEODETIC: | |
| 611 | ✗ | return "GEODETIC"; | |
| 612 | ✗ | case MarkerTypes::NON_GEODETIC: | |
| 613 | ✗ | return "NON_GEODETIC"; | |
| 614 | ✗ | case MarkerTypes::NON_PHYSICAL: | |
| 615 | ✗ | return "NON_PHYSICAL"; | |
| 616 | ✗ | case MarkerTypes::SPACEBORNE: | |
| 617 | ✗ | return "SPACEBORNE"; | |
| 618 | ✗ | case MarkerTypes::GROUND_CRAFT: | |
| 619 | ✗ | return "GROUND_CRAFT"; | |
| 620 | ✗ | case MarkerTypes::WATER_CRAFT: | |
| 621 | ✗ | return "WATER_CRAFT"; | |
| 622 | ✗ | case MarkerTypes::AIRBORNE: | |
| 623 | ✗ | return "AIRBORNE"; | |
| 624 | ✗ | case MarkerTypes::FIXED_BUOY: | |
| 625 | ✗ | return "FIXED_BUOY"; | |
| 626 | ✗ | case MarkerTypes::FLOATING_BUOY: | |
| 627 | ✗ | return "FLOATING_BUOY"; | |
| 628 | ✗ | case MarkerTypes::FLOATING_ICE: | |
| 629 | ✗ | return "FLOATING_ICE"; | |
| 630 | ✗ | case MarkerTypes::GLACIER: | |
| 631 | ✗ | return "GLACIER"; | |
| 632 | ✗ | case MarkerTypes::BALLISTIC: | |
| 633 | ✗ | return "BALLISTIC"; | |
| 634 | ✗ | case MarkerTypes::ANIMAL: | |
| 635 | ✗ | return "ANIMAL"; | |
| 636 | ✗ | case MarkerTypes::HUMAN: | |
| 637 | ✗ | return "HUMAN"; | |
| 638 | ✗ | case MarkerTypes::USER_DEFINED: | |
| 639 | ✗ | return "USER_DEFINED"; | |
| 640 | ✗ | case MarkerTypes::COUNT: | |
| 641 | ✗ | return ""; | |
| 642 | } | ||
| 643 | ✗ | return ""; | |
| 644 | } | ||
| 645 | |||
| 646 | ✗ | const char* tooltip(vendor::RINEX::ObsHeader::MarkerTypes markerType) | |
| 647 | { | ||
| 648 | using MarkerTypes = NAV::vendor::RINEX::ObsHeader::MarkerTypes; | ||
| 649 | ✗ | switch (markerType) | |
| 650 | { | ||
| 651 | ✗ | case MarkerTypes::GEODETIC: | |
| 652 | ✗ | return "Earth-fixed, high-precision monument"; | |
| 653 | ✗ | case MarkerTypes::NON_GEODETIC: | |
| 654 | ✗ | return "Earth-fixed, low-precision monument"; | |
| 655 | ✗ | case MarkerTypes::NON_PHYSICAL: | |
| 656 | ✗ | return "Generated from network processing"; | |
| 657 | ✗ | case MarkerTypes::SPACEBORNE: | |
| 658 | ✗ | return "Orbiting space vehicle"; | |
| 659 | ✗ | case MarkerTypes::GROUND_CRAFT: | |
| 660 | ✗ | return "Mobile terrestrial vehicle"; | |
| 661 | ✗ | case MarkerTypes::WATER_CRAFT: | |
| 662 | ✗ | return "Mobile water craft"; | |
| 663 | ✗ | case MarkerTypes::AIRBORNE: | |
| 664 | ✗ | return "Aircraft, balloon, etc."; | |
| 665 | ✗ | case MarkerTypes::FIXED_BUOY: | |
| 666 | ✗ | return "'Fixed' on water surface"; | |
| 667 | ✗ | case MarkerTypes::FLOATING_BUOY: | |
| 668 | ✗ | return "Floating on water surface"; | |
| 669 | ✗ | case MarkerTypes::FLOATING_ICE: | |
| 670 | ✗ | return "Floating ice sheet, etc."; | |
| 671 | ✗ | case MarkerTypes::GLACIER: | |
| 672 | ✗ | return "'Fixed' on a glacier"; | |
| 673 | ✗ | case MarkerTypes::BALLISTIC: | |
| 674 | ✗ | return "Rockets, shells, etc"; | |
| 675 | ✗ | case MarkerTypes::ANIMAL: | |
| 676 | ✗ | return "Animal carrying a receiver"; | |
| 677 | ✗ | case MarkerTypes::HUMAN: | |
| 678 | ✗ | return "Human being"; | |
| 679 | ✗ | case MarkerTypes::USER_DEFINED: | |
| 680 | ✗ | return "Users may define other project-dependent keywords"; | |
| 681 | ✗ | case MarkerTypes::COUNT: | |
| 682 | ✗ | return ""; | |
| 683 | } | ||
| 684 | ✗ | return ""; | |
| 685 | } | ||
| 686 | |||
| 687 | } // namespace NAV | ||
| 688 |