63 bool PNBBDSD1NavDataFactory ::
67 if ((navIn->getNavID().navType != NavType::BeiDou_D1) ||
68 (navIn->getNumBits() != 300))
76 unsigned long sfid = navIn->asUnsignedLong(
81 bool checkParity =
false, expParity =
false;
84 case NavValidityType::ValidOnly:
88 case NavValidityType::InvalidOnly:
102 rv = processEph(sfid, navIn, navOut);
109 if ((pnum >= 1) && (pnum <= 24))
111 rv = processAlm(sfid, pnum, navIn, navOut);
119 if (((pnum >= 1) && (pnum <= 6)) ||
120 ((pnum >= 11) && (pnum <= 23)))
122 rv = processAlm(sfid, pnum, navIn, navOut);
126 rv = processSF5Pg7(navIn, navOut);
130 rv = processSF5Pg8(navIn, navOut);
134 rv = processSF5Pg9(navIn, navOut);
138 rv = processSF5Pg10(navIn, navOut);
142 rv = processSF5Pg24(navIn, navOut);
156 catch (std::exception& exc)
159 cerr << exc.
what() << endl;
164 cerr <<
"Unknown exception" << endl;
170 bool PNBBDSD1NavDataFactory ::
174 SatID xmitSat(navIn->getsatSys());
177 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
178 if (PNBNavDataFactory::processAlm || PNBNavDataFactory::processHea)
182 if ((sfid == 4) && (pnum >= 11) && (pnum <= 24))
184 amEpIDMap[key].t = navIn->getTransmitTime();
194 if (!PNBNavDataFactory::processAlm)
200 if ((sfid == 5) && (pnum >= 11) && (pnum <= 23))
212 if (((navIn->getTransmitTime() - amEpIDMap[key].t) != 6.0) ||
213 !amEpIDMap[key].isExpanded())
223 unsigned long svid = pnum;
226 if ((pnum >= 1) && (pnum <= 6))
230 else if ((pnum >= 11) && (pnum <= 23))
266 auto alm = std::make_shared<BDSD1NavAlm>();
267 alm->isDefault = isAlmDefault(navIn);
270 alm->timeStamp = navIn->getTransmitTime();
271 alm->signal =
NavMessageID(sat, NavMessageType::Almanac);
274 alm->xmitTime = alm->timeStamp;
280 alm->A = alm->Ahalf * alm->Ahalf;
298 unsigned long toaab = navIn->asUnsignedLong(
asbtoa,
anbtoa,1);
306 alm->i0 = BDSD1NavData::refioffset + alm->deltai;
308 if (!finishAlm(alm,
false, key, navOut))
309 almAcc[key].push_back(alm);
314 bool PNBBDSD1NavDataFactory ::
315 processEph(
unsigned long sfid,
318 if ((sfid < 1) || (sfid > 3))
321 constexpr
double sf = 0.1e-9;
323 navIn->getobsID(), navIn->getNavID());
328 std::shared_ptr<BDSD1NavHealth> hea =
329 std::make_shared<BDSD1NavHealth>();
330 hea->timeStamp = navIn->getTransmitTime();
331 hea->signal =
NavMessageID(key, NavMessageType::Health);
332 hea->isAlmHealth =
false;
333 hea->satH1 = navIn->asBool(
esbSatH1);
335 navOut.push_back(hea);
337 if (PNBNavDataFactory::processIono)
339 std::shared_ptr<BDSD1NavIono> iono =
340 std::make_shared<BDSD1NavIono>();
341 iono->timeStamp = navIn->getTransmitTime();
344 navIn->getobsID(), navIn->getNavID()),
345 NavMessageType::Iono);
365 navOut.push_back(iono);
367 if (PNBNavDataFactory::processISC)
369 std::shared_ptr<BDSD1NavISC> isc = std::make_shared<BDSD1NavISC>();
370 isc->timeStamp = navIn->getTransmitTime();
373 navIn->getobsID(), navIn->getNavID()),
374 NavMessageType::ISC);
383 navOut.push_back(isc);
386 if (!PNBNavDataFactory::processEph)
391 if (ephAcc.find(key) == ephAcc.end())
395 ephAcc[key].resize(3);
396 ephAcc[key][sfid-1] = navIn;
401 std::vector<PackedNavBitsPtr> &ephSF(ephAcc[key]);
402 ephSF[sfid-1] = navIn;
404 if (!ephSF[
sf1] || !ephSF[
sf2] || !ephSF[
sf3] ||
405 (ephSF[
sf1]->getNumBits() != 300) ||
406 (ephSF[
sf2]->getNumBits() != 300) ||
407 (ephSF[
sf3]->getNumBits() != 300))
421 uint32_t sow1, sow2, sow3;
426 if (((sow3 - sow2) != 6) || ((sow2 - sow1) != 6))
433 std::shared_ptr<BDSD1NavEph> eph = std::make_shared<BDSD1NavEph>();
435 eph->timeStamp = ephSF[
sf1]->getTransmitTime();
436 eph->signal =
NavMessageID(key, NavMessageType::Ephemeris);
440 eph->xmitTime = eph->timeStamp;
448 double toe = ldexp((
double)toeI,
esctoe);
483 eph->A = eph->Ahalf * eph->Ahalf;
491 eph->OMEGAdot = ephSF[
esiOMEGAdotm]->asDoubleSemiCircles(
514 eph->health = ((eph->satH1 ==
false) ? SVHealth::Healthy :
515 SVHealth::Unhealthy);
522 eph->xmit2 = ephSF[
sf2]->getTransmitTime();
523 eph->xmit3 = ephSF[
sf3]->getTransmitTime();
526 navOut.push_back(eph);
533 bool PNBBDSD1NavDataFactory ::
536 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
564 SatID xmitSat(navIn->getsatSys());
565 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
566 finishAlm(
false, key, navOut);
572 bool PNBBDSD1NavDataFactory ::
575 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
593 if (PNBNavDataFactory::processAlm)
598 SatID xmitSat(navIn->getsatSys());
600 NavID navid(navIn->getNavID());
615 long refWeek = ws.
week;
625 finishAlm(
true, key, navOut);
631 bool PNBBDSD1NavDataFactory ::
634 if (PNBNavDataFactory::processTim)
636 constexpr
double sf = 0.1;
645 std::shared_ptr<BDSD1NavTimeOffset> gps =
646 std::make_shared<BDSD1NavTimeOffset>();
647 gps->timeStamp = navIn->getTransmitTime();
650 navIn->getobsID(), navIn->getNavID()),
651 NavMessageType::TimeOffset);
652 gps->tgt = TimeSystem::GPS;
658 if (!factControl.bdsTimeZZfilt || (gps->a0 != 0.0) || (gps->a1 != 0.0))
660 navOut.push_back(gps);
664 std::shared_ptr<BDSD1NavTimeOffset> gal =
665 std::make_shared<BDSD1NavTimeOffset>();
666 gal->timeStamp = navIn->getTransmitTime();
669 navIn->getobsID(), navIn->getNavID()),
670 NavMessageType::TimeOffset);
671 gal->tgt = TimeSystem::GAL;
677 if (!factControl.bdsTimeZZfilt || (gal->a0 != 0.0) || (gal->a1 != 0.0))
679 navOut.push_back(gal);
683 std::shared_ptr<BDSD1NavTimeOffset> glo =
684 std::make_shared<BDSD1NavTimeOffset>();
685 glo->timeStamp = navIn->getTransmitTime();
688 navIn->getobsID(), navIn->getNavID()),
689 NavMessageType::TimeOffset);
690 glo->tgt = TimeSystem::GLO;
696 if (!factControl.bdsTimeZZfilt || (glo->a0 != 0.0) || (glo->a1 != 0.0))
698 navOut.push_back(glo);
705 bool PNBBDSD1NavDataFactory ::
708 if (PNBNavDataFactory::processTim)
710 std::shared_ptr<BDSD1NavTimeOffset> to =
711 std::make_shared<BDSD1NavTimeOffset>();
712 to->timeStamp = navIn->getTransmitTime();
715 navIn->getobsID(), navIn->getNavID()),
716 NavMessageType::TimeOffset);
717 to->tgt = TimeSystem::UTC;
729 long refWeek = ref.
week;
742 if (!factControl.bdsTimeZZfilt || (to->a0 != 0.0) || (to->a1 != 0.0))
744 navOut.push_back(to);
751 bool PNBBDSD1NavDataFactory ::
754 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
799 SatID xmitSat(navIn->getsatSys());
800 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
801 finishAlm(
false, key, navOut);
807 void PNBBDSD1NavDataFactory ::
809 unsigned long subjID,
810 unsigned startBit1,
unsigned numBits1,
811 unsigned startBit2,
unsigned numBits2)
813 std::shared_ptr<BDSD1NavHealth> hea = std::make_shared<BDSD1NavHealth>();
814 hea->timeStamp = navIn->getTransmitTime();
818 NavMessageType::Health);
822 hea->svHealth = navIn->asUnsignedLong(startBit1, numBits1, startBit2,
827 hea->svHealth = navIn->asUnsignedLong(startBit1, numBits1,
h2scHea20);
829 heaAcc[hea->signal] = hea->svHealth;
831 if (PNBNavDataFactory::processHea)
833 navOut.push_back(hea);
838 bool PNBBDSD1NavDataFactory ::
844 static const PackedNavBits defPage(navIn->getsatSys(), navIn->getobsID(),
845 navIn->getNavID(), navIn->getRxID(),
846 navIn->getTransmitTime(),
847 navIn->getNumBits(),
false);
851 return defPage.
matchBits(*navIn, 90, 289);
855 void PNBBDSD1NavDataFactory ::
864 void PNBBDSD1NavDataFactory ::
869 for (
auto i = ndpl.begin(); i != ndpl.end();)
871 if (finishAlm(*i, fromWNa, key, navOut))
884 bool PNBBDSD1NavDataFactory ::
888 if (alm->isDefault && (heaAcc.find(alm->signal) != heaAcc.end()))
891 if (navValidity != NavValidityType::ValidOnly)
894 alm->healthBits = heaAcc[alm->signal];
896 alm->health = ((alm->healthBits == 0) ? SVHealth::Healthy :
897 SVHealth::Unhealthy);
900 navOut.push_back(alm);
907 else if ((fullWNaMap.find(key.
xmitSat.
id) != fullWNaMap.end()) &&
908 (fullWNaMap[key.
xmitSat.
id].sow == alm->toa) &&
909 (heaAcc.find(alm->signal) != heaAcc.end()))
912 alm->Toe = alm->Toc = fullWNaMap[key.
xmitSat.
id];
913 alm->healthBits = heaAcc[alm->signal];
915 alm->health = ((alm->healthBits == 0) ? SVHealth::Healthy :
916 SVHealth::Unhealthy);
919 navOut.push_back(alm);
923 (fullWNaMap.find(key.
xmitSat.
id) != fullWNaMap.end()) &&
924 (fullWNaMap[key.
xmitSat.
id].sow != alm->toa))
951 void PNBBDSD1NavDataFactory ::
952 dumpState(std::ostream& s)
955 unsigned long total = 0;
956 s <<
"fullWNaMap.size() = " << fullWNaMap.size() << endl
957 <<
"almAcc.size() = " << almAcc.size() << endl;
958 for (
const auto& i : almAcc)
960 total += i.second.size();
961 for (
const auto& p : i.second)
963 s << p->signal <<
" toa=" << p->toa << endl;
968 s <<
"almAcc total size = " << total << endl
969 <<
"ephAcc.size() = " << ephAcc.size() << endl;
970 for (
const auto& i : ephAcc)
972 s <<
" ephAcc[" << i.first <<
"].size() = " << i.second.size()
974 for (
unsigned j = 0; j < i.second.size(); j++)
976 s <<
" ephAcc[" << i.first <<
"][" << j <<
"] = ";
980 s << i.second[j]->getNumBits() <<
" bits";