68 static const std::string
dts(
"%Y/%03j/%02H:%02M:%02S %P");
72 RinexNavDataFactory ::
75 supportedSignals.insert(
NavSignalID(SatelliteSystem::GPS,
79 supportedSignals.insert(
NavSignalID(SatelliteSystem::QZSS,
83 supportedSignals.insert(
NavSignalID(SatelliteSystem::Galileo,
87 supportedSignals.insert(
NavSignalID(SatelliteSystem::Galileo,
91 supportedSignals.insert(
NavSignalID(SatelliteSystem::Galileo,
95 supportedSignals.insert(
NavSignalID(SatelliteSystem::BeiDou,
99 supportedSignals.insert(
NavSignalID(SatelliteSystem::BeiDou,
102 NavType::BeiDou_D2));
106 bool RinexNavDataFactory ::
111 return process(filename, cb);
115 bool RinexNavDataFactory ::
116 process(
const std::string& filename,
120 bool processEph = (procNavTypes.count(NavMessageType::Ephemeris) > 0);
121 bool processHea = (procNavTypes.count(NavMessageType::Health) > 0);
122 bool processTim = (procNavTypes.count(NavMessageType::TimeOffset) > 0);
123 bool processIono = (procNavTypes.count(NavMessageType::Iono) > 0);
124 bool processISC = (procNavTypes.count(NavMessageType::ISC) > 0);
125 bool ionoProcessed =
false;
131 case NavValidityType::ValidOnly:
135 case NavValidityType::InvalidOnly:
157 if (!convertToOffset(head, navOut))
161 for (
auto& i : navOut)
165 if (i->validate() == expect)
183 if (processIono && !ionoProcessed)
189 ionoProcessed =
true;
193 if (!convertToIono(
data.time, head, ionoList))
197 for (
auto& i : ionoList)
201 if (i->validate() == expect)
225 if (!convertToOrbit(
data, eph))
230 if (!convertToHealth(
data, health))
235 if (!convertToISC(
data, isc))
242 if (eph->validate() == expect)
250 for (
const auto& hp : health)
252 if (hp->validate() == expect)
259 if (processISC && (isc !=
nullptr))
261 if (isc->validate() == expect)
277 for (
const auto& hp : health)
283 if (processISC && (isc !=
nullptr))
296 catch (std::exception& exc)
299 cerr << exc.
what() << endl;
304 cerr <<
"Unknown exception" << endl;
310 std::string RinexNavDataFactory ::
311 getFactoryFormats()
const
313 if (procNavTypes.empty() ||
314 (procNavTypes.count(NavMessageType::Ephemeris) > 0) ||
315 (procNavTypes.count(NavMessageType::Health) > 0) ||
316 (procNavTypes.count(NavMessageType::Iono) > 0) ||
317 (procNavTypes.count(NavMessageType::TimeOffset) > 0))
319 return "RINEX2, RINEX3";
325 bool RinexNavDataFactory ::
337 case SatelliteSystem::GPS:
338 case SatelliteSystem::QZSS:
339 navOut = std::make_shared<GPSLNavEph>();
340 gps =
dynamic_cast<GPSLNavEph*
>(navOut.get());
342 fillNavData(navIn, navOut);
344 fixTimeGPS(navIn, *gps);
345 gps->
health = ((navIn.
health == 0) ? SVHealth::Healthy :
346 SVHealth::Unhealthy);
347 convertToOrbitDataKepler(navIn, gps);
361 if (navIn.
sat.
system == SatelliteSystem::GPS)
374 case SatelliteSystem::Galileo:
378 navOut = std::make_shared<GalINavEph>();
379 galINav =
dynamic_cast<GalINavEph*
>(navOut.get());
381 fillNavData(navIn, navOut);
383 fixTimeGalileo(navIn, *galINav);
389 convertToOrbitDataKepler(navIn, galINav);
403 (navIn.
health >> 1) & 0x03);
409 (navIn.
health >> 6) & 0x01);
411 (navIn.
health >> 7) & 0x03);
416 galINav->
health = GalINavHealth::galHealth(
421 galINav->
health = GalINavHealth::galHealth(
428 navOut = std::make_shared<GalFNavEph>();
429 galFNav =
dynamic_cast<GalFNavEph*
>(navOut.get());
431 fillNavData(navIn, navOut);
433 fixTimeGalileo(navIn, *galFNav);
442 convertToOrbitDataKepler(navIn, galFNav);
456 (navIn.
health >> 3) & 0x01);
458 (navIn.
health >> 4) & 0x03);
459 galFNav->
health = GalINavHealth::galHealth(
469 case SatelliteSystem::BeiDou:
472 navOut = std::make_shared<BDSD2NavEph>();
473 bdsD2Nav =
dynamic_cast<BDSD2NavEph*
>(navOut.get());
475 fillNavData(navIn, navOut);
477 fixTimeBeiDou(navIn, *bdsD2Nav);
479 bdsD2Nav->
health = ((navIn.
health == 0) ? SVHealth::Healthy :
480 SVHealth::Unhealthy);
481 convertToOrbitDataKepler(navIn, bdsD2Nav);
502 navOut = std::make_shared<BDSD1NavEph>();
503 bdsD1Nav =
dynamic_cast<BDSD1NavEph*
>(navOut.get());
505 fillNavData(navIn, navOut);
507 fixTimeBeiDou(navIn, *bdsD1Nav);
509 bdsD1Nav->
health = ((navIn.
health == 0) ? SVHealth::Healthy :
510 SVHealth::Unhealthy);
511 convertToOrbitDataKepler(navIn, bdsD1Nav);
535 case SatelliteSystem::Glonass:
536 navOut = std::make_shared<GLOFNavEph>();
537 glo =
dynamic_cast<GLOFNavEph*
>(navOut.get());
539 fillNavData(navIn, navOut);
547 glo->
health= navIn.
health ? SVHealth::Unhealthy : SVHealth::Healthy;
555 glo->
pos[0] = navIn.
px;
556 glo->
pos[1] = navIn.
py;
557 glo->
pos[2] = navIn.
pz;
558 glo->
vel[0] = navIn.
vx;
559 glo->
vel[1] = navIn.
vy;
560 glo->
vel[2] = navIn.
vz;
561 glo->
acc[0] = navIn.
ax;
562 glo->
acc[1] = navIn.
ay;
563 glo->
acc[2] = navIn.
az;
597 void RinexNavDataFactory ::
609 navOut->
M0 = navIn.
M0;
610 navOut->
dn = navIn.
dn;
617 navOut->
i0 = navIn.
i0;
627 bool RinexNavDataFactory ::
638 unsigned healthBits = 0;
641 case SatelliteSystem::GPS:
642 case SatelliteSystem::QZSS:
643 health = std::make_shared<GPSLNavHealth>();
646 fillNavData(navIn, health);
649 healthOut.push_back(health);
651 case SatelliteSystem::Galileo:
659 convertToHealthE1B(navIn, healthOut);
660 convertToHealthE5a(navIn, healthOut);
661 convertToHealthE5b(navIn, healthOut);
663 case SatelliteSystem::BeiDou:
666 health = std::make_shared<BDSD2NavHealth>();
669 fillNavData(navIn, health);
673 healthOut.push_back(health);
677 health = std::make_shared<BDSD1NavHealth>();
680 fillNavData(navIn, health);
684 healthOut.push_back(health);
687 case SatelliteSystem::Glonass:
688 health = std::make_shared<GLOFNavHealth>();
691 fillNavData(navIn, health);
694 healthOut.push_back(health);
705 void RinexNavDataFactory ::
721 NavDataPtr health = std::make_shared<GalINavHealth>();
724 fillNavData(navIn, health);
730 (navIn.
health >> 1) & 0x03);
738 healthOut.push_back(health);
743 void RinexNavDataFactory ::
749 NavDataPtr health = std::make_shared<GalFNavHealth>();
752 fillNavData(navIn, health);
756 (navIn.
health >> 3) & 0x01);
758 (navIn.
health >> 4) & 0x03);
772 healthOut.push_back(health);
776 void RinexNavDataFactory ::
783 NavDataPtr health = std::make_shared<GalINavHealth>();
786 fillNavData(navIn, health);
790 (navIn.
health >> 6) & 0x01);
792 (navIn.
health >> 7) & 0x03);
805 healthOut.push_back(health);
810 bool RinexNavDataFactory ::
815 std::shared_ptr<RinexTimeOffset> rto =
816 std::make_shared<RinexTimeOffset>(mti.second, navIn.
leapSeconds);
825 rto->timeStamp = mti.second.refTime;
830 switch (rto->timeStamp.getTimeSystem())
832 case TimeSystem::GPS:
833 rto->signal.system = SatelliteSystem::GPS;
835 case TimeSystem::GLO:
836 rto->signal.system = SatelliteSystem::Glonass;
838 case TimeSystem::GAL:
839 rto->signal.system = SatelliteSystem::Galileo;
841 case TimeSystem::QZS:
842 rto->signal.system = SatelliteSystem::QZSS;
844 case TimeSystem::BDT:
845 rto->signal.system = SatelliteSystem::BeiDou;
847 case TimeSystem::IRN:
848 rto->signal.system = SatelliteSystem::IRNSS;
851 rto->signal.system = SatelliteSystem::Unknown;
854 navOut.push_back(rto);
860 bool RinexNavDataFactory ::
864 std::map<std::string,IonoCorr>::const_iterator ai, bi;
869 std::shared_ptr<GPSLNavIono> iono(std::make_shared<GPSLNavIono>());
870 iono->timeStamp = when;
875 iono->signal.sat.id = 0;
876 iono->signal.sat.system = SatelliteSystem::GPS;
877 iono->signal.xmitSat.id = 0;
878 iono->signal.xmitSat.system = SatelliteSystem::GPS;
879 iono->signal.system = SatelliteSystem::GPS;
883 iono->signal.nav = NavType::GPSLNAV;
884 for (
unsigned i = 0; i < 4; i++)
886 iono->alpha[i] = ai->second.param[i];
887 iono->beta[i] = bi->second.param[i];
889 navOut.push_back(iono);
899 std::shared_ptr<GPSLNavHealth> health(
900 std::make_shared<GPSLNavHealth>());
905 health->timeStamp = bod;
906 health->signal.sat.id = 0;
907 health->signal.sat.system = SatelliteSystem::GPS;
908 health->signal.xmitSat.id = 0;
909 health->signal.xmitSat.system = SatelliteSystem::GPS;
910 health->signal.system = SatelliteSystem::GPS;
914 health->signal.nav = NavType::GPSLNAV;
916 health->svHealth = 0;
917 navOut.push_back(health);
927 std::shared_ptr<GalINavIono> iono(std::make_shared<GalINavIono>());
928 iono->timeStamp = when;
933 iono->signal.sat.id = 0;
934 iono->signal.sat.system = SatelliteSystem::Galileo;
935 iono->signal.xmitSat.id = 0;
936 iono->signal.xmitSat.system = SatelliteSystem::Galileo;
937 iono->signal.system = SatelliteSystem::Galileo;
941 iono->signal.nav = NavType::GalINAV;
942 for (
unsigned i = 0; i < 3; i++)
944 iono->ai[i] = ai->second.param[i];
946 navOut.push_back(iono);
948 std::shared_ptr<GalINavHealth> health(
949 std::make_shared<GalINavHealth>());
954 health->timeStamp = bod;
955 health->signal.sat.id = 0;
956 health->signal.sat.system = SatelliteSystem::Galileo;
957 health->signal.xmitSat.id = 0;
958 health->signal.xmitSat.system = SatelliteSystem::Galileo;
959 health->signal.system = SatelliteSystem::Galileo;
963 health->signal.nav = NavType::GalINAV;
966 health->sigHealthStatus = GalHealthStatus::OK;
967 health->dataValidityStatus = GalDataValid::Valid;
968 health->sisaIndex = 0;
969 navOut.push_back(health);
976 std::shared_ptr<BDSD1NavIono> iono(std::make_shared<BDSD1NavIono>());
977 iono->timeStamp = when;
982 iono->signal.sat.id = 0;
983 iono->signal.sat.system = SatelliteSystem::BeiDou;
984 iono->signal.xmitSat.id = 0;
985 iono->signal.xmitSat.system = SatelliteSystem::BeiDou;
986 iono->signal.system = SatelliteSystem::BeiDou;
988 iono->signal.obs =
ObsID(ObservationType::NavMsg, CarrierBand::B1,
990 iono->signal.nav = NavType::BeiDou_D1;
991 for (
unsigned i = 0; i < 4; i++)
993 iono->alpha[i] = ai->second.param[i];
994 iono->beta[i] = bi->second.param[i];
996 navOut.push_back(iono);
1006 std::shared_ptr<BDSD1NavHealth> health(
1007 std::make_shared<BDSD1NavHealth>());
1012 health->timeStamp = bod;
1013 health->signal.sat.id = 0;
1014 health->signal.sat.system = SatelliteSystem::BeiDou;
1015 health->signal.xmitSat.id = 0;
1016 health->signal.xmitSat.system = SatelliteSystem::BeiDou;
1017 health->signal.system = SatelliteSystem::BeiDou;
1019 health->signal.obs =
ObsID(ObservationType::NavMsg, CarrierBand::B1,
1021 health->signal.nav = NavType::BeiDou_D1;
1023 health->isAlmHealth =
false;
1024 health->satH1 =
false;
1025 navOut.push_back(health);
1031 bool RinexNavDataFactory ::
1041 case SatelliteSystem::GPS:
1042 case SatelliteSystem::QZSS:
1043 navOut = std::make_shared<GPSLNavISC>();
1044 gps =
dynamic_cast<GPSLNavISC*
>(navOut.get());
1046 fillNavData(navIn, navOut);
1055 if (navIn.
sat.
system == SatelliteSystem::GPS)
1065 case SatelliteSystem::Galileo:
1070 navOut = std::make_shared<GalINavISC>();
1071 galI =
dynamic_cast<GalINavISC*
>(navOut.get());
1073 fillNavData(navIn, navOut);
1079 case SatelliteSystem::BeiDou:
1082 navOut = std::make_shared<BDSD2NavISC>();
1085 fillNavData(navIn, navOut);
1092 navOut = std::make_shared<BDSD1NavISC>();
1095 fillNavData(navIn, navOut);
1101 case SatelliteSystem::Glonass:
1114 void RinexNavDataFactory ::
1119 case SatelliteSystem::GPS:
1120 case SatelliteSystem::QZSS:
1124 if (navIn.
sat.
system == SatelliteSystem::QZSS)
1125 navOut->timeStamp.setTimeSystem(TimeSystem::QZS);
1127 navOut->signal.sat = navIn.
sat;
1128 navOut->signal.xmitSat = navIn.
sat;
1133 navOut->signal.nav = NavType::GPSLNAV;
1135 case SatelliteSystem::Galileo:
1143 navOut->signal.sat = navIn.
sat;
1144 navOut->signal.xmitSat = navIn.
sat;
1152 navOut->signal.obs =
ObsID(ObservationType::NavMsg,
1155 navOut->signal.nav = NavType::GalINAV;
1159 navOut->signal.obs =
ObsID(ObservationType::NavMsg,
1161 TrackingCode::E5aI);
1162 navOut->signal.nav = NavType::GalFNAV;
1166 navOut->signal.obs =
ObsID(ObservationType::NavMsg,
1168 TrackingCode::E5bI);
1169 navOut->signal.nav = NavType::GalINAV;
1172 case SatelliteSystem::BeiDou:
1177 navOut->signal.sat = navIn.
sat;
1178 navOut->signal.xmitSat = navIn.
sat;
1181 navOut->signal.obs =
ObsID(ObservationType::NavMsg, CarrierBand::B1,
1187 navOut->signal.nav = NavType::BeiDou_D2;
1191 navOut->signal.nav = NavType::BeiDou_D1;
1194 case SatelliteSystem::Glonass:
1198 unsigned tkSOD = navIn.
MFtime % 86400;
1200 navOut->timeStamp = tmp;
1202 navOut->signal.sat = navIn.
sat;
1203 navOut->signal.xmitSat = navIn.
sat;
1206 navOut->signal.obs =
ObsID(ObservationType::NavMsg, CarrierBand::G1,
1207 TrackingCode::Standard, navIn.
freqNum);
1208 navOut->signal.nav = NavType::GloCivilF;
1218 void RinexNavDataFactory ::
1221 long longToc = (long) navIn.
Toc;
1222 long fullXmitWeekNum = navIn.
weeknum;
1244 long xmit = adjHOWtime - (adjHOWtime % 30);
1245 double xmitSOW = (double) xmit;
1256 double timeDiff = navIn.
Toe - xmitSOW;
1257 short epochWeek = fullXmitWeekNum;
1272 void RinexNavDataFactory ::
1284 void RinexNavDataFactory ::
1292 uint8_t RinexNavDataFactory ::
1293 decodeSISA(
double accuracy)
1303 return (uint8_t)(accuracy*100.0+0.5);
1306 return (uint8_t)(((accuracy+0.5)*50)+0.5);
1309 return (uint8_t)(((accuracy+2)*25)+0.5);
1312 return (uint8_t)((100+(accuracy-2)/0.16)+0.5);
1317 double RinexNavDataFactory ::
1318 encodeSISA(uint8_t sisa)
1329 return sisa / 100.0;
1333 return ((sisa-50)*0.02) + 0.5;
1335 else if (sisa < 100)
1337 return ((sisa-75)*0.04) + 1.0;
1339 else if (sisa < 126)
1341 return ((sisa-100)*0.16) + 2.0;