70 bool PNBBDSD2NavDataFactory ::
74 if ((navIn->getNavID().navType != NavType::BeiDou_D2) ||
75 (navIn->getNumBits() != 300))
84 unsigned long sfid = navIn->asUnsignedLong(
89 bool checkParity =
false, expParity =
false;
92 case NavValidityType::ValidOnly:
96 case NavValidityType::InvalidOnly:
109 rv = processEph(pgid, navIn, navOut);
115 rv = processSF5Pg35(navIn, navOut);
119 rv = processSF5Pg36(navIn, navOut);
121 else if (((pgid >= 37) && (pgid <= 60)) ||
122 ((pgid >= 95) && (pgid <= 100)) ||
123 ((pgid >= 103) && (pgid <= 115)))
125 rv = processAlm(pgid, navIn, navOut);
127 else if (pgid == 101)
129 rv = processSF5Pg101(navIn, navOut);
131 else if (pgid == 102)
133 rv = processSF5Pg102(navIn, navOut);
135 else if (pgid == 116)
137 rv = processSF5Pg116(navIn, navOut);
152 catch (std::exception& exc)
155 cerr << exc.
what() << endl;
160 cerr <<
"Unknown exception" << endl;
166 bool PNBBDSD2NavDataFactory ::
170 SatID xmitSat(navIn->getsatSys());
173 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
174 if (PNBNavDataFactory::processAlm || PNBNavDataFactory::processHea)
185 if (((pnum >= 37) && (pnum <= 60)) ||
186 ((pnum >= 95) && (pnum <= 100)))
188 amEpIDMap[key].setValues(navIn->getTransmitTime(),
193 if (!PNBNavDataFactory::processAlm)
199 if ((pnum >= 103) && (pnum <= 115))
204 if (!amEpIDMap[key].isExpanded(navIn->getTransmitTime()))
212 unsigned long svid = pnum;
215 if ((pnum >= 37) && (pnum <= 60))
219 else if ((pnum >= 95) && (pnum <= 100))
223 else if ((pnum >= 103) && (pnum <= 115))
253 auto alm = std::make_shared<BDSD2NavAlm>();
254 alm->isDefault = isAlmDefault(navIn);
257 alm->timeStamp = navIn->getTransmitTime();
258 alm->signal =
NavMessageID(sat, NavMessageType::Almanac);
261 alm->xmitTime = alm->timeStamp;
267 alm->A = alm->Ahalf * alm->Ahalf;
285 unsigned long toaab = navIn->asUnsignedLong(
asbtoa,
anbtoa,1);
293 alm->i0 = BDSD2NavData::refioffset + alm->deltai;
295 if (!finishAlm(alm,
false, key, navOut))
296 almAcc[key].push_back(alm);
301 bool PNBBDSD2NavDataFactory ::
302 processEph(
unsigned long pgid,
306 constexpr
double sf = 0.1e-9;
307 if ((pgid < 1) || (pgid > 10))
310 navIn->getobsID(), navIn->getNavID());
313 if (PNBNavDataFactory::processISC)
315 std::shared_ptr<BDSD2NavISC> isc = std::make_shared<BDSD2NavISC>();
316 isc->timeStamp = navIn->getTransmitTime();
319 navIn->getobsID(), navIn->getNavID()),
320 NavMessageType::ISC);
328 navOut.push_back(isc);
332 std::shared_ptr<BDSD2NavHealth> hea =
333 std::make_shared<BDSD2NavHealth>();
334 hea->timeStamp = navIn->getTransmitTime();
335 hea->signal =
NavMessageID(key, NavMessageType::Health);
336 hea->isAlmHealth =
false;
339 navOut.push_back(hea);
342 else if ((pgid == 2) && PNBNavDataFactory::processIono)
344 std::shared_ptr<BDSD2NavIono> iono =
345 std::make_shared<BDSD2NavIono>();
346 iono->timeStamp = navIn->getTransmitTime();
349 navIn->getobsID(), navIn->getNavID()),
350 NavMessageType::Iono);
372 navOut.push_back(iono);
374 if (!PNBNavDataFactory::processEph)
379 if (ephAcc.find(key) == ephAcc.end())
383 ephAcc[key].resize(10);
384 ephAcc[key][pgid-1] = navIn;
389 std::vector<PackedNavBitsPtr> &ephSF(ephAcc[key]);
390 ephSF[pgid-1] = navIn;
392 for (
unsigned i = 0; i < 10; i++)
400 if (!ephSF[i] || (ephSF[i]->getNumBits() != 300))
419 unsigned long sowA, sowB;
436 if ((sowB - sowA) != 3)
445 std::shared_ptr<BDSD2NavEph> eph = std::make_shared<BDSD2NavEph>();
447 eph->timeStamp = ephSF[
pg1]->getTransmitTime();
448 eph->signal =
NavMessageID(key, NavMessageType::Ephemeris);
452 eph->xmitTime = eph->timeStamp;
461 eph->Cuc = PackedNavBits::asSignedDouble
483 eph->M0 =
PI * PackedNavBits::asSignedDouble
494 eph->Ahalf = PackedNavBits::asUnsignedDouble
499 eph->A = eph->Ahalf * eph->Ahalf;
501 eph->OMEGA0 =
PI * PackedNavBits::asSignedDouble
506 eph->i0 =
PI * PackedNavBits::asSignedDouble
511 eph->w =
PI * PackedNavBits::asSignedDouble
516 eph->OMEGAdot =
PI * PackedNavBits::asSignedDouble
526 eph->af1 = PackedNavBits::asSignedDouble
541 eph->health = ((eph->satH1 ==
false) ? SVHealth::Healthy :
542 SVHealth::Unhealthy);
550 navOut.push_back(eph);
557 bool PNBBDSD2NavDataFactory ::
560 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
588 SatID xmitSat(navIn->getsatSys());
589 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
590 finishAlm(
false, key, navOut);
596 bool PNBBDSD2NavDataFactory ::
599 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
617 if (PNBNavDataFactory::processAlm)
622 SatID xmitSat(navIn->getsatSys());
624 NavID navid(navIn->getNavID());
639 long refWeek = ws.
week;
649 finishAlm(
true, key, navOut);
655 bool PNBBDSD2NavDataFactory ::
658 if (PNBNavDataFactory::processTim)
660 constexpr
double sf = 0.1;
669 std::shared_ptr<BDSD2NavTimeOffset> gps =
670 std::make_shared<BDSD2NavTimeOffset>();
671 gps->timeStamp = navIn->getTransmitTime();
674 navIn->getobsID(), navIn->getNavID()),
675 NavMessageType::TimeOffset);
676 gps->tgt = TimeSystem::GPS;
682 if (!filterTimeOffset(gps->a0, gps->a1))
684 navOut.push_back(gps);
688 std::shared_ptr<BDSD2NavTimeOffset> gal =
689 std::make_shared<BDSD2NavTimeOffset>();
690 gal->timeStamp = navIn->getTransmitTime();
693 navIn->getobsID(), navIn->getNavID()),
694 NavMessageType::TimeOffset);
695 gal->tgt = TimeSystem::GAL;
701 if (!filterTimeOffset(gal->a0, gal->a1))
703 navOut.push_back(gal);
707 std::shared_ptr<BDSD2NavTimeOffset> glo =
708 std::make_shared<BDSD2NavTimeOffset>();
709 glo->timeStamp = navIn->getTransmitTime();
712 navIn->getobsID(), navIn->getNavID()),
713 NavMessageType::TimeOffset);
714 glo->tgt = TimeSystem::GLO;
720 if (!filterTimeOffset(glo->a0, glo->a1))
722 navOut.push_back(glo);
729 bool PNBBDSD2NavDataFactory ::
732 if (PNBNavDataFactory::processTim)
734 std::shared_ptr<BDSD2NavTimeOffset> to =
735 std::make_shared<BDSD2NavTimeOffset>();
736 to->timeStamp = navIn->getTransmitTime();
739 navIn->getobsID(), navIn->getNavID()),
740 NavMessageType::TimeOffset);
741 to->tgt = TimeSystem::UTC;
753 long refWeek = ref.
week;
766 if (!factControl.bdsTimeZZfilt || (to->a0 != 0.0) || (to->a1 != 0.0))
768 navOut.push_back(to);
775 bool PNBBDSD2NavDataFactory ::
778 if (PNBNavDataFactory::processHea || PNBNavDataFactory::processAlm)
823 SatID xmitSat(navIn->getsatSys());
824 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
825 finishAlm(
false, key, navOut);
831 void PNBBDSD2NavDataFactory ::
833 unsigned long subjID,
834 unsigned startBit1,
unsigned numBits1,
835 unsigned startBit2,
unsigned numBits2)
837 std::shared_ptr<BDSD2NavHealth> hea = std::make_shared<BDSD2NavHealth>();
838 hea->timeStamp = navIn->getTransmitTime();
842 NavMessageType::Health);
846 hea->svHealth = navIn->asUnsignedLong(startBit1, numBits1, startBit2,
851 hea->svHealth = navIn->asUnsignedLong(startBit1, numBits1,
h2scHea20);
853 heaAcc[hea->signal] = hea->svHealth;
855 if (PNBNavDataFactory::processHea)
857 navOut.push_back(hea);
862 bool PNBBDSD2NavDataFactory ::
869 navIn->getNavID(), navIn->getRxID(),
870 navIn->getTransmitTime(), navIn->getNumBits(),
875 return defPage.
matchBits(*navIn, 90, 289);
879 void PNBBDSD2NavDataFactory ::
888 void PNBBDSD2NavDataFactory ::
893 for (
auto i = ndpl.begin(); i != ndpl.end();)
895 if (finishAlm(*i, fromWNa, key, navOut))
908 bool PNBBDSD2NavDataFactory ::
912 if (alm->isDefault && (heaAcc.find(alm->signal) != heaAcc.end()))
915 if (navValidity != NavValidityType::ValidOnly)
918 alm->healthBits = heaAcc[alm->signal];
920 alm->health = ((alm->healthBits == 0) ? SVHealth::Healthy :
921 SVHealth::Unhealthy);
924 navOut.push_back(alm);
931 else if ((fullWNaMap.find(key.
xmitSat.
id) != fullWNaMap.end()) &&
932 (fullWNaMap[key.
xmitSat.
id].sow == alm->toa) &&
933 (heaAcc.find(alm->signal) != heaAcc.end()))
936 alm->Toe = alm->Toc = fullWNaMap[key.
xmitSat.
id];
937 alm->healthBits = heaAcc[alm->signal];
939 alm->health = ((alm->healthBits == 0) ? SVHealth::Healthy :
940 SVHealth::Unhealthy);
943 navOut.push_back(alm);
947 (fullWNaMap.find(key.
xmitSat.
id) != fullWNaMap.end()) &&
948 (fullWNaMap[key.
xmitSat.
id].sow != alm->toa))
975 void PNBBDSD2NavDataFactory ::
976 dumpState(std::ostream& s)
979 unsigned long total = 0;
980 s <<
"fullWNaMap.size() = " << fullWNaMap.size() << endl
981 <<
"almAcc.size() = " << almAcc.size() << endl;
982 for (
const auto& i : almAcc)
984 total += i.second.size();
985 for (
const auto& p : i.second)
987 s << p->signal <<
" toa=" << p->toa << endl;
992 s <<
"almAcc total size = " << total << endl
993 <<
"ephAcc.size() = " << ephAcc.size() << endl;
994 for (
const auto& i : ephAcc)
996 s <<
" ephAcc[" << i.first <<
"].size() = " << i.second.size()
998 for (
unsigned j = 0; j < i.second.size(); j++)
1000 s <<
" ephAcc[" << i.first <<
"][" << j <<
"] = ";
1004 s << i.second[j]->getNumBits() <<
" bits";
1011 PNBBDSD2NavDataFactory::AmEpID ::
1017 mfStart.setTimeSystem(TimeSystem::Any);
1018 mfEnd.setTimeSystem(TimeSystem::Any);
1022 bool PNBBDSD2NavDataFactory::AmEpID ::
1025 return ((amEpID == 0x03) &&
1031 void PNBBDSD2NavDataFactory::AmEpID ::
1036 tmod.
sow -= fmod(tmod.
sow,360.0);
1037 mfStart = mfEnd = tmod;