55 bool PNBGPSLNavDataFactory ::
59 if (navIn->getNavID().navType != NavType::GPSLNAV)
69 unsigned long svid = 0;
71 bool checkParity =
false, expParity =
false;
74 case NavValidityType::ValidOnly:
78 case NavValidityType::InvalidOnly:
89 for (
unsigned i = 0, j = 0; i < 300; i += 30, j++)
91 sf[j] = navIn->asUnsignedLong(i, 30, 1);
94 bool parity = EngNav::checkParity(sf);
95 if (parity != expParity)
104 rv = processEph(sfid, navIn, navOut);
127 rv = processAlmOrb(
svid, navIn, navOut);
132 rv = processSVID51(navIn, navOut);
137 rv = processSVID63(navIn, navOut);
139 else if ((
svid == 56) || (useQZSS && (
svid == 61)))
142 rv = processSVID56(navIn, navOut);
162 catch (std::exception& exc)
165 cerr << exc.
what() << endl;
170 cerr <<
"Unknown exception" << endl;
176 bool PNBGPSLNavDataFactory ::
181 navIn->getobsID(), navIn->getNavID());
187 NavDataPtr p1 = std::make_shared<GPSLNavHealth>();
188 p1->timeStamp = navIn->getTransmitTime();
193 navOut.push_back(p1);
198 NavDataPtr p2 = std::make_shared<GPSLNavISC>();
200 isc->
timeStamp = navIn->getTransmitTime();
212 navOut.push_back(p2);
215 if (!PNBNavDataFactory::processEph)
220 if (ephAcc.find(key) == ephAcc.end())
224 ephAcc[key].resize(3);
225 ephAcc[key][sfid-1] = navIn;
230 std::vector<PackedNavBitsPtr> &ephSF(ephAcc[key]);
231 ephSF[sfid-1] = navIn;
233 if (!ephSF[
sf1] || !ephSF[
sf2] || !ephSF[
sf3] ||
234 (ephSF[
sf1]->getNumBits() != 300) ||
235 (ephSF[
sf2]->getNumBits() != 300) ||
236 (ephSF[
sf3]->getNumBits() != 300))
250 unsigned long iodc, iode2, iode3;
254 if ((iodc != iode2) || (iodc != iode3))
262 NavDataPtr p0 = std::make_shared<GPSLNavEph>();
271 eph->
xmit2 = ephSF[
sf2]->getTransmitTime();
272 eph->
xmit3 = ephSF[
sf3]->getTransmitTime();
278 long refWeek = refTime.
week;
350 SVHealth::Unhealthy);
363 navOut.push_back(p0);
370 bool PNBGPSLNavDataFactory ::
374 SatID xmitSat(navIn->getsatSys());
377 NavSatelliteID key(0, xmitSat, navIn->getobsID(), navIn->getNavID());
380 NavSatelliteID sat(prn, xmitSat, navIn->getobsID(), navIn->getNavID());
387 NavDataPtr p1 = std::make_shared<GPSLNavHealth>();
388 p1->timeStamp = navIn->getTransmitTime();
393 navOut.push_back(p1);
395 if (!PNBNavDataFactory::processAlm)
403 NavDataPtr p0 = std::make_shared<GPSLNavAlm>();
404 p0->timeStamp = navIn->getTransmitTime();
405 p0->signal =
NavMessageID(sat, NavMessageType::Almanac);
421 alm->
xmitTime = navIn->getTransmitTime();
433 alm->
i0 = GPSLNavData::refioffsetQZSS + alm->
deltai;
434 alm->
ecc += GPSLNavData::refEccQZSS;
439 alm->
i0 = GPSLNavData::refioffsetGPS + alm->
deltai;
445 SVHealth::Unhealthy);
454 alm->
af0 = navIn->asSignedDouble(af0start,af0num,2,
ascaf0);
459 if ((fullWNaMap.find(xmitSat.
id) != fullWNaMap.end()) &&
460 (fullWNaMap[xmitSat.
id].sow == alm->
toa))
462 alm->
Toe = alm->
Toc = fullWNaMap[xmitSat.
id];
465 navOut.push_back(p0);
470 almAcc[key].push_back(p0);
476 bool PNBGPSLNavDataFactory ::
482 SatID xmitSat(navIn->getsatSys());
484 NavID navid(navIn->getNavID());
488 if (PNBNavDataFactory::processAlm)
496 long refWeek = ws.
week;
499 fullWNaMap[xmitSat.
id].weekRolloverAdj(ws);
504 for (
auto i = ndpl.begin(); i != ndpl.end();)
509 alm->
Toe = alm->
Toc = fullWNaMap[xmitSat.
id];
512 navOut.push_back(*i);
529 if (!PNBNavDataFactory::processHea)
535 unsigned startPRN = 1, endPRN = 24;
545 for (
unsigned prn = startPRN, bit = 90; prn <= endPRN;
548 NavDataPtr p1 = std::make_shared<GPSLNavHealth>();
549 NavDataPtr p2 = std::make_shared<GPSLNavHealth>();
550 NavDataPtr p3 = std::make_shared<GPSLNavHealth>();
551 NavDataPtr p4 = std::make_shared<GPSLNavHealth>();
552 p1->timeStamp = navIn->getTransmitTime();
555 NavMessageType::Health);
557 navIn->asUnsignedLong(bit+0, 6, 1);
559 navOut.push_back(p1);
560 if ((prn+1) > endPRN)
562 p2->
timeStamp = navIn->getTransmitTime();
565 NavMessageType::Health);
567 navIn->asUnsignedLong(bit+6, 6, 1);
569 navOut.push_back(p2);
570 if ((prn+2) > endPRN)
572 p3->
timeStamp = navIn->getTransmitTime();
575 NavMessageType::Health);
577 navIn->asUnsignedLong(bit+12, 6, 1);
579 navOut.push_back(p3);
580 if ((prn+3) > endPRN)
582 p4->
timeStamp = navIn->getTransmitTime();
585 NavMessageType::Health);
587 navIn->asUnsignedLong(bit+18, 6, 1);
589 navOut.push_back(p4);
595 bool PNBGPSLNavDataFactory ::
603 if (!PNBNavDataFactory::processHea)
608 SatID xmitSat(navIn->getsatSys());
610 NavID navid(navIn->getNavID());
611 NavDataPtr p0 = std::make_shared<GPSLNavHealth>();
612 p0->timeStamp = navIn->getTransmitTime();
615 NavMessageType::Health);
618 navIn->asUnsignedLong(228, 6, 1);
620 navOut.push_back(p0);
621 for (
unsigned prn = 26, bit = 240; prn <= 32; prn += 4, bit += 30)
623 NavDataPtr p1 = std::make_shared<GPSLNavHealth>();
624 NavDataPtr p2 = std::make_shared<GPSLNavHealth>();
625 NavDataPtr p3 = std::make_shared<GPSLNavHealth>();
627 p1->timeStamp = navIn->getTransmitTime();
630 NavMessageType::Health);
632 navIn->asUnsignedLong(bit+0, 6, 1);
634 navOut.push_back(p1);
635 p2->
timeStamp = navIn->getTransmitTime();
638 NavMessageType::Health);
640 navIn->asUnsignedLong(bit+6, 6, 1);
642 navOut.push_back(p2);
643 p3->
timeStamp = navIn->getTransmitTime();
646 NavMessageType::Health);
648 navIn->asUnsignedLong(bit+12, 6, 1);
650 navOut.push_back(p3);
655 p4 = std::make_shared<GPSLNavHealth>();
656 p4->timeStamp = navIn->getTransmitTime();
659 NavMessageType::Health);
661 navIn->asUnsignedLong(bit+18, 6, 1);
663 navOut.push_back(p4);
670 bool PNBGPSLNavDataFactory ::
677 if (PNBNavDataFactory::processIono)
679 NavDataPtr p1 = std::make_shared<GPSLNavIono>();
680 p1->timeStamp = navIn->getTransmitTime();
683 navIn->getobsID(), navIn->getNavID()),
684 NavMessageType::Iono);
703 navOut.push_back(p1);
705 if (!PNBNavDataFactory::processTim)
710 NavDataPtr p0 = std::make_shared<GPSLNavTimeOffset>();
711 p0->timeStamp = navIn->getTransmitTime();
714 navIn->getobsID(), navIn->getNavID()),
715 NavMessageType::TimeOffset);
728 to->
a0 = navIn->asSignedDouble(a0start,a0num,2,
ascA0);
737 long refWeek = ws.
week;
750 navOut.push_back(p0);
755 void PNBGPSLNavDataFactory ::
756 dumpState(std::ostream& s)
759 s <<
"fullWNaMap.size() = " << fullWNaMap.size() <<
" (expect 32)" << endl
760 <<
"almAcc.size() = " << almAcc.size() <<
" (expect 32)" << endl;
761 for (
const auto& i : almAcc)
763 s <<
" almAcc[" << i.first <<
"].size() = " << i.second.size()
766 s <<
"ephAcc.size() = " << ephAcc.size() <<
" (expect 32)" << endl;
767 for (
const auto& i : ephAcc)
769 s <<
" ephAcc[" << i.first <<
"].size() = " << i.second.size()
771 for (
unsigned j = 0; j < i.second.size(); j++)
773 s <<
" ephAcc[" << i.first <<
"][" << j <<
"] = ";
777 s << i.second[j]->getNumBits() <<
" bits";
784 void PNBGPSLNavDataFactory ::