50 static const std::string
dts(
"%Y/%03j/%02H:%02M:%02S %P");
92 if ((when < nf->beginFit) || (when >
nf->endFit))
118 : map(
nullptr), finished(
true)
120 FindMatches(
NavMap *theMap,
const NavMap::iterator& theIt)
121 : map(theMap), finished(
false), it(theIt)
127 typedef std::list<FindMatches> MatchList;
133 if (dataIt ==
data.end())
150 for (NavSatMap::iterator sati = dataIt->second.begin();
151 sati != dataIt->second.end(); sati++)
153 if (sati->first != nmid)
159 NavMap::iterator nmi = sati->second.lower_bound(when);
160 if (nmi == sati->second.end())
162 nmi = std::prev(nmi);
167 << (nmi != sati->second.end()));
168 DEBUGTRACE(
"(nmi->second->getUserTime() > when) = "
169 << (nmi->second->getUserTime() > when));
170 while ((nmi != sati->second.end()) &&
171 (nmi->second->getUserTime() > when))
174 nmi = (nmi == sati->second.begin() ? sati->second.end()
176 if (nmi != sati->second.end())
183 if (nmi != sati->second.end())
185 itList.push_back(FindMatches(&(sati->second), nmi));
196 auto sati = dataIt->second.find(nmid);
197 if (sati != dataIt->second.end())
200 NavMap::iterator nmi = sati->second.lower_bound(when);
201 if (nmi == sati->second.end())
203 nmi = std::prev(nmi);
207 while ((nmi != sati->second.end()) &&
208 (nmi->second->getUserTime() > when))
210 nmi = (nmi == sati->second.begin() ? sati->second.end()
212 if (nmi != sati->second.end())
219 if (nmi != sati->second.end())
221 itList.push_back(FindMatches(&(sati->second), nmi));
233 DEBUGTRACE(
"itList.size() = " << itList.size());
236 bool done = itList.empty();
240 for (
auto& imi : itList)
248 else if ((imi.it != imi.map->end()) &&
249 (imi.it->second->getUserTime() < mostRecent))
255 else if (((imi.it != imi.map->end()) &&
256 (imi.it->second->getUserTime() > when)) ||
260 imi.it = (imi.it == imi.map->begin()
262 : std::prev(imi.it));
265 else if (imi.it == imi.map->end())
274 if (imi.it->second->getUserTime() > mostRecent)
276 mostRecent = imi.it->second->getUserTime();
312 FindMatches(
NavNearMap *theMap,
const NavNearMap::iterator& theIt,
314 : map(theMap), itGT(theIt), when(t)
317 itLT = (itGT == theMap->begin() ? theMap->end() : std::prev(itGT));
320 double getDistGT()
const
321 {
return itGT == map->end() ? 999e99 : fabs(itGT->first - when); }
322 double getDistLT()
const
323 {
return itLT == map->end() ? 999e99 : fabs(itLT->first - when); }
325 NavNearMap::iterator itGT, itLT;
328 typedef std::list<FindMatches> MatchList;
349 for (NavNearSatMap::iterator sati = dataIt->second.begin();
350 sati != dataIt->second.end(); sati++)
352 if (sati->first != nmid)
356 NavNearMap::iterator nmi = sati->second.lower_bound(when);
357 itList.push_back(FindMatches(&(sati->second), nmi, when));
363 auto sati = dataIt->second.find(nmid);
364 if (sati != dataIt->second.end())
367 NavNearMap::iterator nmi = sati->second.lower_bound(when);
368 itList.push_back(FindMatches(&(sati->second), nmi, when));
375 bool done = itList.empty();
379 for (
auto& imi : itList)
382 if ((imi.itGT == imi.map->end()) && (imi.itLT == imi.map->end()))
396 if ((imi.itGT != imi.map->end()) &&
397 ((imi.itLT == imi.map->end()) ||
398 (fabs(imi.itGT->first - when) < fabs(imi.itLT->first - when))))
401 for (
auto& ndpli : imi.itGT->second)
417 for (
auto& ndpli : imi.itLT->second)
428 imi.itLT = (imi.itLT == imi.map->begin()
430 : std::prev(imi.itLT));
481 auto oemi = odi->second.lower_bound(whenny);
482 if (oemi == odi->second.end())
484 DEBUGTRACE(
"got end right away, backing up one");
485 oemi = std::prev(oemi);
491 if (oemi == odi->second.end())
497 else if (oemi->first > whenny)
501 oemi = (oemi == odi->second.begin()
502 ? odi->second.end() : std::prev(oemi));
513 for (
const auto& omi : oemi->second)
523 if (omi.second->validate() &&
matchHealth(todp,xmitHealth))
530 if (!omi.second->validate() &&
546 DEBUGTRACE(
"didn't find any acceptable data");
547 oemi = (oemi == odi->second.begin()
548 ? odi->second.end() : std::prev(oemi));
559 for (
auto mti =
data.begin(); mti !=
data.end();)
561 for (
auto sati = mti->second.begin(); sati != mti->second.end();)
563 auto ti1 = sati->second.lower_bound(fromTime);
564 auto ti2 = sati->second.lower_bound(toTime);
565 sati->second.erase(ti1,ti2);
567 if (sati->second.empty())
569 sati = mti->second.erase(sati);
577 if (mti->second.empty())
579 mti =
data.erase(mti);
591 for (
auto sati = mti->second.begin(); sati != mti->second.end();)
594 for (
auto cti = sati->second.begin(); cti != sati->second.end();)
597 for (
auto ndpli = cti->second.begin();
598 ndpli != cti->second.end();)
600 if (((*ndpli)->timeStamp < toTime) &&
601 ((*ndpli)->timeStamp >= fromTime))
603 ndpli = cti->second.erase(ndpli);
611 if (cti->second.empty())
613 cti = sati->second.erase(cti);
621 if (sati->second.empty())
623 sati = mti->second.erase(sati);
631 if (mti->second.empty())
645 for (
auto cti = ocmi->second.begin(); cti != ocmi->second.end();)
648 for (
auto sati = cti->second.begin(); sati != cti->second.end();)
650 if ((sati->second->timeStamp < toTime) &&
651 (sati->second->timeStamp >= fromTime))
653 sati = cti->second.erase(sati);
661 if (cti->second.empty())
663 cti = ocmi->second.erase(cti);
671 if (ocmi->second.empty())
688 for (
auto mti =
data.begin(); mti !=
data.end();)
690 for (
auto sati = mti->second.begin(); sati != mti->second.end();)
692 if (sati->first != satID)
698 auto ti1 = sati->second.lower_bound(fromTime);
699 auto ti2 = sati->second.lower_bound(toTime);
700 sati->second.erase(ti1,ti2);
702 if (sati->second.empty())
704 sati = mti->second.erase(sati);
712 if (mti->second.empty())
714 mti =
data.erase(mti);
726 for (
auto sati = mti->second.begin(); sati != mti->second.end();)
728 if (sati->first != satID)
735 for (
auto cti = sati->second.begin(); cti != sati->second.end();)
738 for (
auto ndpli = cti->second.begin();
739 ndpli != cti->second.end();)
741 if (((*ndpli)->timeStamp < toTime) &&
742 ((*ndpli)->timeStamp >= fromTime))
744 ndpli = cti->second.erase(ndpli);
752 if (cti->second.empty())
754 cti = sati->second.erase(cti);
762 if (sati->second.empty())
764 sati = mti->second.erase(sati);
772 if (mti->second.empty())
786 for (
auto cti = ocmi->second.begin(); cti != ocmi->second.end();)
789 for (
auto sati = cti->second.begin(); sati != cti->second.end();)
791 if (sati->first != satID)
797 if ((sati->second->timeStamp < toTime) &&
798 (sati->second->timeStamp >= fromTime))
800 sati = cti->second.erase(sati);
808 if (cti->second.empty())
810 cti = ocmi->second.erase(cti);
818 if (ocmi->second.empty())
835 return edit(fromTime, toTime, satMatch);
860 <<
" nearest = " <<
nd->getNearTime());
863 SatID xsat(
nd->signal.xmitSat);
870 if (
auto stodp = std::dynamic_pointer_cast<StdNavTimeOffset>(
nd))
872 auto result =
touBySV[xsat].insert(stodp);
883 if (
auto stodp = std::dynamic_pointer_cast<StdNavTimeOffset>(
nd))
885 auto result =
touBySig[
nd->signal].insert(stodp);
906 nd->timeStamp,
nd->timeStamp);
916 anyTimeStamp(
nd->timeStamp);
921 if (anyTimeStamp < anyFirst)
923 if (anyTimeStamp > anyLast)
927 if ((
nf =
dynamic_cast<NavFit*
>(
nd.get())) !=
nullptr)
932 else if ((odp =
dynamic_cast<OrbitData*
>(
nd.get())) !=
nullptr)
940 navMap[
nd->signal.messageType][
nd->signal][
nd->getUserTime()] =
nd;
941 navNearMap[
nd->signal.messageType][
nd->signal][
nd->getNearTime()]
947 for (
const auto& ci : conversions)
949 ofsMap[ci][
nd->getUserTime()][
nd->signal] =
nd;
1008 for (
const auto& mti :
data)
1010 for (
const auto& satIt : mti.second)
1012 rv += satIt.second.size();
1042 auto dataIt =
data.find(i);
1043 if (dataIt ==
data.end())
1052 for (
const auto& sati : dataIt->second)
1057 key.
system = sati.first.system;
1059 if (sati.first == key)
1061 DEBUGTRACE(
"matches " << sati.second.size() <<
" x "
1063 rv += sati.second.size();
1132 std::set<NavSignalID> uniques;
1133 for (
const auto& mti :
data)
1135 for (
const auto& satIt : mti.second)
1137 uniques.insert(satIt.first);
1140 return uniques.size();
1147 std::set<NavSatelliteID> uniques;
1148 for (
const auto& mti :
data)
1150 for (
const auto& satIt : mti.second)
1152 uniques.insert(satIt.first);
1155 return uniques.size();
1189 if ((when < nf->beginFit) || (when >
nf->endFit))
1197 rv = ndp->validate();
1200 rv = !ndp->validate();
1243 DEBUGTRACE(
"assuming health matches for missing sat ID");
1261 rv = (xmitHealth == orb->
health);
1264 else if ((glof =
dynamic_cast<GLOFNavData*
>(ndp)) !=
nullptr)
1266 rv = (xmitHealth == glof->
health);
1269 else if ((gloc =
dynamic_cast<GLOCNavData*
>(ndp)) !=
nullptr)
1275 else if ((hea =
dynamic_cast<NavHealthData*
>(ndp)) !=
nullptr)
1314 << (rv ?
"matches" :
"does not match"));
1330 return i->second.first;
1339 return i->second.second;
1352 for (
const auto& i : tmp)
1363 auto nmmi =
data.find(nmt);
1364 if (nmmi !=
data.end())
1366 for (
const auto& nsmi : nmmi->second)
1368 auto ti1 = nsmi.second.lower_bound(fromTime);
1369 if ((ti1 != nsmi.second.end()) && (ti1->first < toTime))
1371 rv.insert(nsmi.first);
1384 for (
const auto& nmmi :
data)
1386 for (
const auto& nsmi : nmmi.second)
1388 auto ti1 = nsmi.second.lower_bound(fromTime);
1389 if ((ti1 != nsmi.second.end()) && (ti1->first < toTime))
1391 rv.insert(nsmi.first.sat);
1405 auto nmmi =
data.find(nmt);
1406 if (nmmi !=
data.end())
1408 for (
const auto& nsmi : nmmi->second)
1410 auto ti1 = nsmi.second.lower_bound(fromTime);
1411 if ((ti1 != nsmi.second.end()) && (ti1->first < toTime))
1413 rv.insert(nsmi.first.sat);
1426 for (
const auto& nmmi :
data)
1428 for (
const auto& nsmi : nmmi.second)
1430 auto ti1 = nsmi.second.lower_bound(fromTime);
1431 if ((ti1 != nsmi.second.end()) && (ti1->first < toTime))
1445 if (nmmi !=
data.end())
1447 auto nsmi = nmmi->second.find(nmid);
1448 if (nsmi != nmmi->second.end())
1450 return &nsmi->second;
1463 for (
const auto& nmmi :
data)
1465 for (
const auto& nsami : nmmi.second)
1472 << nsami.second.size() <<
" objects" << std::endl;
1483 << nsami.second.size() <<
" entries." << std::endl
1484 <<
"SVN PRN Begin Fit Toe End Fit"
1485 <<
" URA IODC Health" << std::endl;
1486 for (
const auto& cti : nsami.second)
1488 cti.second->dump(s, dl);
1492 for (
const auto& cti : nsami.second)
1496 <<
printTime(cti.first,
"%Y %2m %2d %02H:%02M:%04.1f")
1501 for (
const auto& cti : nsami.second)
1503 cti.second->dump(s,dl);
1514 const std::shared_ptr<StdNavTimeOffset>& right)
const
1516 if (left->refTime < right->refTime)
return true;
1517 if (right->refTime < left->refTime)
return false;
1518 if (left->a0 < right->a0)
return true;
1519 if (right->a0 < left->a0)
return false;
1520 if (left->a1 < right->a1)
return true;
1521 if (right->a1 < left->a1)
return false;
1522 if (left->a2 < right->a2)
return true;