NavDataFactoryWithStore_T.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 
26 //==============================================================================
27 //
28 // This software was developed by Applied Research Laboratories at the
29 // University of Texas at Austin, under contract to an agency or agencies
30 // within the U.S. Department of Defense. The U.S. Government retains all
31 // rights to use, duplicate, distribute, disclose, or release this software.
32 //
33 // Pursuant to DoD Directive 523024
34 //
35 // DISTRIBUTION STATEMENT A: This software has been approved for public
36 // release, distribution is unlimited.
37 //
38 //==============================================================================
40 #include "GPSWeekSecond.hpp"
41 #include "CivilTime.hpp"
42 #include "GALWeekSecond.hpp"
43 #include "BDSWeekSecond.hpp"
44 #include "GPSLNavEph.hpp"
45 #include "GPSLNavAlm.hpp"
46 #include "GPSLNavHealth.hpp"
47 #include "GPSLNavTimeOffset.hpp"
48 #include "TestUtil.hpp"
49 // #include "BasicTimeSystemConverter.hpp"
50 #include "TimeString.hpp"
51 
52 namespace gnsstk
53 {
54  std::ostream& operator<<(std::ostream& s, gnsstk::SatelliteSystem e)
55  {
56  s << StringUtils::asString(e);
57  return s;
58  }
59 
60  std::ostream& operator<<(std::ostream& s, gnsstk::CarrierBand e)
61  {
62  s << StringUtils::asString(e);
63  return s;
64  }
65 
66  std::ostream& operator<<(std::ostream& s, gnsstk::TrackingCode e)
67  {
68  s << StringUtils::asString(e);
69  return s;
70  }
71 
72  std::ostream& operator<<(std::ostream& s, gnsstk::NavType e)
73  {
74  s << StringUtils::asString(e);
75  return s;
76  }
77 
78  std::ostream& operator<<(std::ostream& s, gnsstk::NavMessageType e)
79  {
80  s << StringUtils::asString(e);
81  return s;
82  }
83 }
84 
85 
88 {
89 public:
91  {}
93  gnsstk::NavDataPtr clone() const override
94  { return std::make_shared<FakeODK>(*this); }
95  bool validate() const override
96  { return true; }
97  bool getXvt(const gnsstk::CommonTime& when, gnsstk::Xvt& xvt,
98  const gnsstk::ObsID& oid = gnsstk::ObsID()) override
99  { GNSSTK_THROW(gnsstk::Exception("Not implemented")); }
100  double svRelativity(const gnsstk::CommonTime& when) const override
101  { GNSSTK_THROW(gnsstk::Exception("Not implemented")); }
102 };
103 
107 {
108 public:
111  { return data; }
113  { return nearestData; }
114  bool addDataSource(const std::string& source) override
115  { return false; }
116  size_t sizeNearest() const
117  {
118  size_t rv = 0;
119  for (const auto& nnmi : nearestData)
120  {
121  for (const auto& nnsmi : nnmi.second)
122  {
123  for (const auto& nnmi : nnsmi.second)
124  {
125  rv += nnmi.second.size();
126  }
127  }
128  }
129  return rv;
130  }
131  size_t numSatellitesNearest() const
132  {
133  size_t rv = 0;
134  for (const auto& nnmi : nearestData)
135  {
136  rv += nnmi.second.size();
137  }
138  return rv;
139  }
140  std::string getFactoryFormats() const override
141  { return "BUNK"; }
142 };
143 
144 
146 {
147 public:
150 
151  unsigned addNavDataTest();
152  unsigned addNavDataTimeTest();
153  unsigned findTest();
154  unsigned find2Test();
155  unsigned findNearestTest();
157  unsigned findXmitHealthTest();
158  unsigned getOffsetTest();
159  unsigned getOffset2Test();
160  unsigned editTest();
161  unsigned clearTest();
162  unsigned getAvailableSatsTest();
163  unsigned getIndexSetTest();
164  unsigned isPresentTest();
165  unsigned countTest();
166  unsigned getFirstLastTimeTest();
167 
169  void fillFactory(gnsstk::TestUtil& testFramework, TestClass& fact);
171  void fillFactoryXmitHealth(gnsstk::TestUtil& testFramework, TestClass& fact);
173  void addData(gnsstk::TestUtil& testFramework, TestClass& fact,
174  const gnsstk::CommonTime& ct, unsigned long sat,
175  unsigned long xmitSat,
182  void fillSignal(gnsstk::NavSignalID& signal,
187  void fillSat(gnsstk::NavSatelliteID& satellite,
188  unsigned long sat,
189  unsigned long xmitSat,
195  void checkForEmpty(gnsstk::TestUtil& testFramework, TestClass& fact);
196 
199 };
200 
201 
204  : gws(2101,3450.0),
205  ct(gws),
206  gws5(2101,3894.0),
207  ct5(gws5)
208 {
209  // 3450 / 750 = 4.6, so 4 full master frames before gws
210  // 3450 % 750 = 450 / 30 = 15 so page 15.
211  // add 14*30 + 24 seconds and that should be alm 5 transmit time. I think.
212  // = 3894
213 }
214 
215 
218 {
219  TUDEF("NavDataFactoryWithStore", "addNavData");
220 
221  TestClass fact;
222 
223  // NavData is abstract so we instantiate a GPSLNavEph instead
226  std::shared_ptr<gnsstk::GPSLNavEph> navOut =
227  std::make_shared<gnsstk::GPSLNavEph>();
228  navOut->timeStamp = ct;
229  navOut->xmitTime = ct;
230  navOut->xmit2 = ct + 6;
231  navOut->xmit3 = ct + 12;
232  navOut->signal.messageType = gnsstk::NavMessageType::Ephemeris;
233  navOut->signal.sat = subjID;
234  navOut->signal.xmitSat = xmitID;
235  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
236  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
239  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
240 
241  TUASSERT(fact.addNavData(navOut));
242  TUASSERTE(size_t, 1, fact.size());
243 
244  gnsstk::NavMessageMap &nmm(fact.getData());
245  for (auto& nmmi : nmm)
246  {
247  for (auto& nsatmi : nmmi.second)
248  {
250  nsatmi.first.system);
252  nsatmi.first.obs.band);
254  nsatmi.first.obs.code);
257  nsatmi.first.system);
259  nsatmi.first.obs.band);
261  nsatmi.first.obs.code);
263  nsatmi.first.nav);
264  TUASSERTE(gnsstk::SatID, subjID, nsatmi.first.sat);
265  TUASSERTE(gnsstk::SatID, xmitID, nsatmi.first.xmitSat);
266  for (auto& nmi : nsatmi.second)
267  {
268  TUASSERTE(gnsstk::CommonTime, ct+18, nmi.first);
269  }
270  }
271  }
272 
273  TURETURN();
274 }
275 
276 
279 {
280  TUDEF("NavDataFactoryWithStore", "addNavData");
281 
282  TestClass fact;
283  // test ordering with multiple time systems
284  // gnsstk::BasicTimeSystemConverter btsc;
286  bt0(gnsstk::GPSWeekSecond(2020, 54321)),
287  bt1(gnsstk::GPSWeekSecond(2020, 54327)),
288  bt2(gnsstk::GALWeekSecond(996, 54329)),
289  bt3(gnsstk::BDSWeekSecond(664, 54328)),
290  bt4(gnsstk::GPSWeekSecond(2020, 60480)),
291  et0(bt0 + 7200),
292  et1(bt1 + 7200),
293  et2(bt2 + 3600),
294  et3(bt3 + 14400),
295  et4(bt4 + 7200);
296 
297  // std::cout << bt0 << " " << et0 << std::endl << bt1 << " " << et1 << std::endl << bt2 << " " << et2 << std::endl << bt3 << " " << et3 << std::endl << bt4 << " " << et4 << std::endl;
298  // bt0.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
299  // bt1.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
300  // bt2.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
301  // bt3.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
302  // bt4.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
303  // et0.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
304  // et1.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
305  // et2.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
306  // et3.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
307  // et4.changeTimeSystem(gnsstk::TimeSystem::UTC, &btsc);
308  // std::cout << bt0 << " " << et0 << std::endl << bt1 << " " << et1 << std::endl << bt2 << " " << et2 << std::endl << bt3 << " " << et3 << std::endl << bt4 << " " << et4 << std::endl;
309 
310  // add 5 NavDataPtr objects not in time order
311  // #1
314  gnsstk::NavDataPtr navOut = std::make_shared<FakeODK>();
315  dynamic_cast<FakeODK*>(navOut.get())->beginFit = bt3;
316  dynamic_cast<FakeODK*>(navOut.get())->endFit = et3;
318  navOut->signal.sat = subjID;
319  navOut->signal.xmitSat = xmitID;
320  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
321  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
324  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
325  TUASSERT(fact.addNavData(navOut));
326  // #2
327  navOut = std::make_shared<FakeODK>();
328  dynamic_cast<FakeODK*>(navOut.get())->beginFit = bt2;
329  dynamic_cast<FakeODK*>(navOut.get())->endFit = et2;
331  navOut->signal.sat = subjID;
332  navOut->signal.xmitSat = xmitID;
333  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
334  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
337  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
338  TUASSERT(fact.addNavData(navOut));
339  // #3
340  navOut = std::make_shared<FakeODK>();
341  dynamic_cast<FakeODK*>(navOut.get())->beginFit = bt4;
342  dynamic_cast<FakeODK*>(navOut.get())->endFit = et4;
343  navOut->signal.messageType = gnsstk::NavMessageType::Ephemeris;
344  navOut->signal.sat = subjID;
345  navOut->signal.xmitSat = xmitID;
346  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
347  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
350  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
351  TUASSERT(fact.addNavData(navOut));
352  // #4
353  navOut = std::make_shared<FakeODK>();
354  dynamic_cast<FakeODK*>(navOut.get())->beginFit = bt0;
355  dynamic_cast<FakeODK*>(navOut.get())->endFit = et0;
357  navOut->signal.sat = subjID;
358  navOut->signal.xmitSat = xmitID;
359  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
360  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
363  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
364  TUASSERT(fact.addNavData(navOut));
365  // #5
366  navOut = std::make_shared<FakeODK>();
367  dynamic_cast<FakeODK*>(navOut.get())->beginFit = bt1;
368  dynamic_cast<FakeODK*>(navOut.get())->endFit = et1;
370  navOut->signal.sat = subjID;
371  navOut->signal.xmitSat = xmitID;
372  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
373  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
376  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
377  TUASSERT(fact.addNavData(navOut));
378 
379  TUASSERTE(gnsstk::CommonTime, bt3, fact.getInitialTime());
380  TUASSERTE(gnsstk::CommonTime, et3, fact.getFinalTime());
381 
382  TURETURN();
383 }
384 
385 
388 {
389  TUDEF("NavDataFactoryWithStore", "find");
390 
391  TestClass fact1;
392  gnsstk::NavMessageID nmid1a;
393  gnsstk::NavDataPtr result;
394  TUCATCH(fillFactory(testFramework, fact1));
395  TUCATCH(fillSat(nmid1a, 23, 32));
397  gnsstk::CommonTime ect(ct-3600); // make the base time match the ephemeris
398  // check basic time stamps that should work
399  TUASSERT(fact1.find(nmid1a, ect+35, result, gnsstk::SVHealth::Any,
402  TUASSERT(fact1.find(nmid1a, ect+30, result, gnsstk::SVHealth::Any,
405  TUASSERT(fact1.find(nmid1a, ect+60, result, gnsstk::SVHealth::Any,
408  // check time stamps that don't work
409  TUASSERT(!fact1.find(nmid1a, ect, result, gnsstk::SVHealth::Any,
412  // time edge cases.
413  TUASSERT(!fact1.find(nmid1a, ect+17, result, gnsstk::SVHealth::Any,
416  TUASSERT(fact1.find(nmid1a, ect+18, result, gnsstk::SVHealth::Any,
419  // test validity flags
420  TUASSERT(fact1.find(nmid1a, ect+30, result, gnsstk::SVHealth::Any,
423  TUASSERT(!fact1.find(nmid1a, ect+30, result, gnsstk::SVHealth::Any,
426 
427  TURETURN();
428 }
429 
430 
433 {
434  TUDEF("NavDataFactoryWithStore", "find");
435  TestClass uut;
436  using SS = gnsstk::SatelliteSystem;
437  using CB = gnsstk::CarrierBand;
438  using TC = gnsstk::TrackingCode;
439  using NT = gnsstk::NavType;
440  using SH = gnsstk::SVHealth;
441  using MT = gnsstk::NavMessageType;
442  using VT = gnsstk::NavValidityType;
443  using SO = gnsstk::NavSearchOrder;
444  gnsstk::CommonTime refsf1ct = gnsstk::GPSWeekSecond(2101, 0);
445  // between copies 2 and 3, or i==57
446  gnsstk::CommonTime unhealthyStart = gnsstk::GPSWeekSecond(2101, 1710);
447  gnsstk::CommonTime refpg2ct = gnsstk::GPSWeekSecond(2101, 54);
448  gnsstk::CommonTime findTime1 = gnsstk::GPSWeekSecond(2101, 3838);
449  gnsstk::NavMessageID findNMID1a(
450  gnsstk::NavSatelliteID(2, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
451  MT::Almanac);
452  gnsstk::NavMessageID findNMID2a(
453  gnsstk::NavSatelliteID(2, SS::GPS, CB::Any, TC::Any, NT::Any),
454  MT::Almanac);
455  gnsstk::NavMessageID findNMID3a(
456  gnsstk::NavSatelliteID(2, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
457  MT::Almanac);
458  gnsstk::NavMessageID findNMID4a(
459  gnsstk::NavSatelliteID(2, 1, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
460  MT::Almanac);
461  gnsstk::NavMessageID findNMID5a(
462  gnsstk::NavSatelliteID(2, 3, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
463  MT::Almanac);
464  gnsstk::NavMessageID findNMID1h(
465  gnsstk::NavSatelliteID(1, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
466  MT::Health);
467  gnsstk::NavMessageID findNMID1L1CAe(
468  gnsstk::NavSatelliteID(1, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
469  MT::Ephemeris);
470  gnsstk::NavMessageID findNMID1L2Ye(
471  gnsstk::NavSatelliteID(1, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
472  MT::Ephemeris);
473  gnsstk::NavMessageID findNMID3L1CAe(
474  gnsstk::NavSatelliteID(3, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
475  MT::Ephemeris);
476  gnsstk::NavMessageID findNMID3e(
477  gnsstk::NavSatelliteID(3, SS::GPS, CB::Any, TC::Any, NT::Any),
478  MT::Ephemeris);
479  gnsstk::NavMessageID findNMID3L2Ye(
480  gnsstk::NavSatelliteID(3, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
481  MT::Ephemeris);
482  // fill with "almanac pages"
483  for (unsigned i = 0; i < 10; i++)
484  {
485  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L1,
486  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
487  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L1,
488  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
489  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L2,
490  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
491  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L1,
492  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
493  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L1,
494  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
495  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L2,
496  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
497  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L1,
498  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
499  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L1,
500  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
501  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L2,
502  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
503  }
504  TUASSERTE(size_t, 90, uut.size());
505  // add "ephemeris health"
506  for (unsigned i = 0; i < 228; i++)
507  {
508  // health data
509  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
510  TC::CA, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
511  MT::Health);
512  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
513  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
514  MT::Health);
515  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
516  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
517  MT::Health);
518  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
519  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
520  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
521  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
522  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
523  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
524  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
525  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
526  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
527  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
528  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
529  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
530  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
531  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
532  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
533  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
534  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
535  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
536  // ephemeris data
537  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
538  TC::CA, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
539  MT::Ephemeris);
540  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
541  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
542  MT::Ephemeris);
543  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
544  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
545  MT::Ephemeris);
546  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
547  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
548  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
549  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
550  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
551  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
552  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
553  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
554  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
555  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
556  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
557  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
558  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
559  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
560  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
561  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
562  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
563  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
564  }
565  TUASSERTE(size_t, 5562, uut.size());
566  gnsstk::NavDataPtr result;
568  // check find almanac with no restrictions on health or validity
569  TUASSERTE(bool, true,
570  uut.find(findNMID1a,findTime1,result,SH::Any,VT::Any,SO::User));
571  gnsstk::CommonTime expTime1(gnsstk::GPSWeekSecond(2101, 3804));
572  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
573  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
574  TUASSERTE(int, 2, result->signal.sat.id);
575  TUASSERTE(bool, false, result->signal.sat.wildId);
576  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
577  TUASSERTE(bool, false, result->signal.sat.wildSys);
578  TUASSERTE(int, 1, result->signal.xmitSat.id);
579  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
580  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
581  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
582  TUASSERTE(SS, SS::GPS, result->signal.system);
583  TUASSERTE(CB, CB::L1, result->signal.obs.band);
584  TUASSERTE(TC, TC::CA, result->signal.obs.code);
585  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
586  // look for health data before and after the state transition
587  TUASSERTE(bool, true,
588  uut.find(findNMID1h,gnsstk::GPSWeekSecond(2101,1710),result,
589  SH::Any,VT::Any,SO::User));
590  // result->dump(std::cerr, gnsstk::DumpDetail::Full);
591  if (result)
592  {
593  hea = dynamic_cast<gnsstk::GPSLNavHealth*>(result.get());
594  TUASSERTE(unsigned, 0, hea->svHealth);
595  }
596  TUASSERTE(bool, true,
597  uut.find(findNMID1h,gnsstk::GPSWeekSecond(2101,1716),result,
598  SH::Any, VT::Any,SO::User));
599  // result->dump(std::cerr, gnsstk::DumpDetail::Full);
600  if (result)
601  {
602  hea = dynamic_cast<gnsstk::GPSLNavHealth*>(result.get());
603  TUASSERTE(unsigned, 1, hea->svHealth);
604  }
605  // Look for healthy almanac data after the transition to
606  // unhealthy. This should result in ignoring the almanac
607  // transmitted by PRN 1, since PRN 1 is unhealthy at this time,
608  // and returning the almanac transmitted by PRN 3 instead.
609  TUASSERTE(bool, true,
610  uut.find(findNMID1a,findTime1,result,SH::Healthy,VT::Any,
611  SO::User));
612  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
613  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
614  TUASSERTE(int, 2, result->signal.sat.id);
615  TUASSERTE(bool, false, result->signal.sat.wildId);
616  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
617  TUASSERTE(bool, false, result->signal.sat.wildSys);
618  TUASSERTE(int, 3, result->signal.xmitSat.id);
619  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
620  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
621  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
622  TUASSERTE(SS, SS::GPS, result->signal.system);
623  TUASSERTE(CB, CB::L1, result->signal.obs.band);
624  TUASSERTE(TC, TC::CA, result->signal.obs.code);
625  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
626  // Look for healthy almanac data after the transition to
627  // unhealthy with wildcards in the signal (band, code, nav).
628  // Should yield the same results as above because of ordering.
629  TUASSERTE(bool, true,
630  uut.find(findNMID2a,findTime1,result,SH::Healthy,VT::Any,
631  SO::User));
632  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
633  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
634  TUASSERTE(int, 2, result->signal.sat.id);
635  TUASSERTE(bool, false, result->signal.sat.wildId);
636  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
637  TUASSERTE(bool, false, result->signal.sat.wildSys);
638  TUASSERTE(int, 3, result->signal.xmitSat.id);
639  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
640  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
641  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
642  TUASSERTE(SS, SS::GPS, result->signal.system);
643  TUASSERTE(CB, CB::L1, result->signal.obs.band);
644  TUASSERTE(TC, TC::CA, result->signal.obs.code);
645  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
646  // Look for almanac data after the transition to unhealthy where
647  // we don't care about the health but we do specifically want
648  // L2-Y, so we expect xmit PRN = 1, L2/Y/LNav
649  TUASSERTE(bool, true,
650  uut.find(findNMID3a,findTime1,result,SH::Any,VT::Any,
651  SO::User));
652  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
653  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
654  TUASSERTE(int, 2, result->signal.sat.id);
655  TUASSERTE(bool, false, result->signal.sat.wildId);
656  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
657  TUASSERTE(bool, false, result->signal.sat.wildSys);
658  TUASSERTE(int, 1, result->signal.xmitSat.id);
659  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
660  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
661  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
662  TUASSERTE(SS, SS::GPS, result->signal.system);
663  TUASSERTE(CB, CB::L2, result->signal.obs.band);
664  TUASSERTE(TC, TC::Y, result->signal.obs.code);
665  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
666  // Look for almanac data after the transition to unhealthy where
667  // we do want healthy transmit satellites and do specifically
668  // want L2-Y, so we expect xmit PRN = 3, L2/Y/LNav
669  TUASSERTE(bool, true,
670  uut.find(findNMID3a,findTime1,result,SH::Healthy,VT::Any,
671  SO::User));
672  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
673  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
674  TUASSERTE(int, 2, result->signal.sat.id);
675  TUASSERTE(bool, false, result->signal.sat.wildId);
676  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
677  TUASSERTE(bool, false, result->signal.sat.wildSys);
678  TUASSERTE(int, 3, result->signal.xmitSat.id);
679  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
680  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
681  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
682  TUASSERTE(SS, SS::GPS, result->signal.system);
683  TUASSERTE(CB, CB::L2, result->signal.obs.band);
684  TUASSERTE(TC, TC::Y, result->signal.obs.code);
685  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
686  // Look for almanac data after the transition to unhealthy where
687  // we want the most recent almanac transmitted by PRN 1 when it
688  // was healthy, so we expect xmit PRN = 1, L2/Y/LNav at time 2*750+54
689  gnsstk::CommonTime expTime2(gnsstk::GPSWeekSecond(2101, 1554));
690  TUASSERTE(bool, true,
691  uut.find(findNMID4a,findTime1,result,SH::Healthy,VT::Any,
692  SO::User));
693  TUASSERTE(gnsstk::CommonTime, expTime2, result->timeStamp);
694  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
695  TUASSERTE(int, 2, result->signal.sat.id);
696  TUASSERTE(bool, false, result->signal.sat.wildId);
697  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
698  TUASSERTE(bool, false, result->signal.sat.wildSys);
699  TUASSERTE(int, 1, result->signal.xmitSat.id);
700  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
701  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
702  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
703  TUASSERTE(SS, SS::GPS, result->signal.system);
704  TUASSERTE(CB, CB::L2, result->signal.obs.band);
705  TUASSERTE(TC, TC::Y, result->signal.obs.code);
706  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
707  // Look for almanac data after the transition to unhealthy where
708  // we want the most recent almanac transmitted by PRN 1 when it
709  // was UNhealthy, so we expect xmit PRN = 1, L2/Y/LNav at time 5*750+54
710  TUASSERTE(bool, true,
711  uut.find(findNMID4a,findTime1,result,SH::Unhealthy,VT::Any,
712  SO::User));
713  TUASSERTE(gnsstk::CommonTime, expTime1, result->timeStamp);
714  TUASSERTE(MT, MT::Almanac, result->signal.messageType);
715  TUASSERTE(int, 2, result->signal.sat.id);
716  TUASSERTE(bool, false, result->signal.sat.wildId);
717  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
718  TUASSERTE(bool, false, result->signal.sat.wildSys);
719  TUASSERTE(int, 1, result->signal.xmitSat.id);
720  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
721  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
722  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
723  TUASSERTE(SS, SS::GPS, result->signal.system);
724  TUASSERTE(CB, CB::L2, result->signal.obs.band);
725  TUASSERTE(TC, TC::Y, result->signal.obs.code);
726  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
727  // Look for almanac data transmitted by PRN 3 when it was
728  // UNhealthy, which it isn't, so we expect no results.
729  TUASSERTE(bool, false,
730  uut.find(findNMID5a,findTime1,result,SH::Unhealthy,VT::Any,
731  SO::User));
732  // Look for ephemeris data from PRN 1 L1 CA
733  TUASSERTE(bool, true,
734  uut.find(findNMID1L1CAe,findTime1,result,SH::Any,VT::Any,
735  SO::User));
736  gnsstk::CommonTime expTime1Eph(gnsstk::GPSWeekSecond(2101, 3210));
737  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
738  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
739  TUASSERTE(int, 1, result->signal.sat.id);
740  TUASSERTE(bool, false, result->signal.sat.wildId);
741  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
742  TUASSERTE(bool, false, result->signal.sat.wildSys);
743  TUASSERTE(int, 1, result->signal.xmitSat.id);
744  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
745  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
746  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
747  TUASSERTE(SS, SS::GPS, result->signal.system);
748  TUASSERTE(CB, CB::L1, result->signal.obs.band);
749  TUASSERTE(TC, TC::CA, result->signal.obs.code);
750  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
751  // Look for ephemeris data from PRN 3 L1 CA (Healthy)
752  TUASSERTE(bool, true,
753  uut.find(findNMID3L1CAe,findTime1,result,SH::Healthy,VT::Any,
754  SO::User));
755  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
756  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
757  TUASSERTE(int, 3, result->signal.sat.id);
758  TUASSERTE(bool, false, result->signal.sat.wildId);
759  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
760  TUASSERTE(bool, false, result->signal.sat.wildSys);
761  TUASSERTE(int, 3, result->signal.xmitSat.id);
762  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
763  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
764  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
765  TUASSERTE(SS, SS::GPS, result->signal.system);
766  TUASSERTE(CB, CB::L1, result->signal.obs.band);
767  TUASSERTE(TC, TC::CA, result->signal.obs.code);
768  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
769  // Look for ephemeris data from PRN 3 any any (Healthy)
770  TUASSERTE(bool, true,
771  uut.find(findNMID3e,findTime1,result,SH::Healthy,VT::Any,
772  SO::User));
773  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
774  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
775  TUASSERTE(int, 3, result->signal.sat.id);
776  TUASSERTE(bool, false, result->signal.sat.wildId);
777  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
778  TUASSERTE(bool, false, result->signal.sat.wildSys);
779  TUASSERTE(int, 3, result->signal.xmitSat.id);
780  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
781  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
782  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
783  TUASSERTE(SS, SS::GPS, result->signal.system);
784  TUASSERTE(CB, CB::L1, result->signal.obs.band);
785  TUASSERTE(TC, TC::CA, result->signal.obs.code);
786  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
787  // Look for ephemeris data from PRN 1 L2 Y
788  TUASSERTE(bool, true,
789  uut.find(findNMID1L2Ye,findTime1,result,SH::Any,VT::Any,
790  SO::User));
791  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
792  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
793  TUASSERTE(int, 1, result->signal.sat.id);
794  TUASSERTE(bool, false, result->signal.sat.wildId);
795  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
796  TUASSERTE(bool, false, result->signal.sat.wildSys);
797  TUASSERTE(int, 1, result->signal.xmitSat.id);
798  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
799  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
800  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
801  TUASSERTE(SS, SS::GPS, result->signal.system);
802  TUASSERTE(CB, CB::L2, result->signal.obs.band);
803  TUASSERTE(TC, TC::Y, result->signal.obs.code);
804  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
805  // Look for ephemeris data from PRN 3 L2 Y (Healthy)
806  TUASSERTE(bool, true,
807  uut.find(findNMID3L2Ye,findTime1,result,SH::Healthy,VT::Any,
808  SO::User));
809  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
810  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
811  TUASSERTE(int, 3, result->signal.sat.id);
812  TUASSERTE(bool, false, result->signal.sat.wildId);
813  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
814  TUASSERTE(bool, false, result->signal.sat.wildSys);
815  TUASSERTE(int, 3, result->signal.xmitSat.id);
816  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
817  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
818  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
819  TUASSERTE(SS, SS::GPS, result->signal.system);
820  TUASSERTE(CB, CB::L2, result->signal.obs.band);
821  TUASSERTE(TC, TC::Y, result->signal.obs.code);
822  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
823  // Look for ephemeris data from PRN 1 L2 Y (Healthy)
824  TUASSERTE(bool, true,
825  uut.find(findNMID1L2Ye,findTime1,result,SH::Healthy,VT::Any,
826  SO::User));
827  gnsstk::CommonTime expTime2Eph(gnsstk::GPSWeekSecond(2100, 602880));
828  TUASSERTE(gnsstk::CommonTime, expTime2Eph, result->timeStamp);
829  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
830  TUASSERTE(int, 1, result->signal.sat.id);
831  TUASSERTE(bool, false, result->signal.sat.wildId);
832  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
833  TUASSERTE(bool, false, result->signal.sat.wildSys);
834  TUASSERTE(int, 1, result->signal.xmitSat.id);
835  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
836  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
837  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
838  TUASSERTE(SS, SS::GPS, result->signal.system);
839  TUASSERTE(CB, CB::L2, result->signal.obs.band);
840  TUASSERTE(TC, TC::Y, result->signal.obs.code);
841  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
842  // Look for ephemeris data from PRN 1 L2 Y (Unhealthy)
843  TUASSERTE(bool, true,
844  uut.find(findNMID1L2Ye,findTime1,result,SH::Unhealthy,VT::Any,
845  SO::User));
846  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
847  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
848  TUASSERTE(int, 1, result->signal.sat.id);
849  TUASSERTE(bool, false, result->signal.sat.wildId);
850  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
851  TUASSERTE(bool, false, result->signal.sat.wildSys);
852  TUASSERTE(int, 1, result->signal.xmitSat.id);
853  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
854  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
855  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
856  TUASSERTE(SS, SS::GPS, result->signal.system);
857  TUASSERTE(CB, CB::L2, result->signal.obs.band);
858  TUASSERTE(TC, TC::Y, result->signal.obs.code);
859  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
860  // Look for ephemeris data from PRN 3 L2 Y (Unhealthy)
861  TUASSERTE(bool, false,
862  uut.find(findNMID3L2Ye,findTime1,result,SH::Unhealthy,VT::Any,
863  SO::User));
864  TURETURN();
865 }
866 
867 
870 {
871  TUDEF("NavDataFactoryWithStore", "findNearest");
872  TestClass uut;
873  using SS = gnsstk::SatelliteSystem;
874  using CB = gnsstk::CarrierBand;
875  using TC = gnsstk::TrackingCode;
876  using NT = gnsstk::NavType;
877  using SH = gnsstk::SVHealth;
878  using MT = gnsstk::NavMessageType;
879  using VT = gnsstk::NavValidityType;
880  using SO = gnsstk::NavSearchOrder;
881  gnsstk::CommonTime refsf1ct = gnsstk::GPSWeekSecond(2101, 0);
882  // between copies 2 and 3, or i==57
883  gnsstk::CommonTime unhealthyStart = gnsstk::GPSWeekSecond(2101, 1710);
884  gnsstk::CommonTime refpg2ct = gnsstk::GPSWeekSecond(2101, 54);
885  gnsstk::CommonTime findTime1 = gnsstk::GPSWeekSecond(2101, 3838);
886  gnsstk::CommonTime findTime2 = gnsstk::GPSWeekSecond(2101, 3000);
887  gnsstk::NavMessageID findNMID1a(
888  gnsstk::NavSatelliteID(2, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
889  MT::Almanac);
890  gnsstk::NavMessageID findNMID2a(
891  gnsstk::NavSatelliteID(2, SS::GPS, CB::Any, TC::Any, NT::Any),
892  MT::Almanac);
893  gnsstk::NavMessageID findNMID3a(
894  gnsstk::NavSatelliteID(2, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
895  MT::Almanac);
896  gnsstk::NavMessageID findNMID4a(
897  gnsstk::NavSatelliteID(2, 1, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
898  MT::Almanac);
899  gnsstk::NavMessageID findNMID5a(
900  gnsstk::NavSatelliteID(2, 3, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
901  MT::Almanac);
902  gnsstk::NavMessageID findNMID1h(
903  gnsstk::NavSatelliteID(1, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
904  MT::Health);
905  gnsstk::NavMessageID findNMID1L1CAe(
906  gnsstk::NavSatelliteID(1, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
907  MT::Ephemeris);
908  gnsstk::NavMessageID findNMID1L2Ye(
909  gnsstk::NavSatelliteID(1, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
910  MT::Ephemeris);
911  gnsstk::NavMessageID findNMID3L1CAe(
912  gnsstk::NavSatelliteID(3, SS::GPS, CB::L1, TC::CA, NT::GPSLNAV),
913  MT::Ephemeris);
914  gnsstk::NavMessageID findNMID3e(
915  gnsstk::NavSatelliteID(3, SS::GPS, CB::Any, TC::Any, NT::Any),
916  MT::Ephemeris);
917  gnsstk::NavMessageID findNMID3L2Ye(
918  gnsstk::NavSatelliteID(3, SS::GPS, CB::L2, TC::Y, NT::GPSLNAV),
919  MT::Ephemeris);
920  // fill with "almanac pages"
921  for (unsigned i = 0; i <= 10; i++)
922  {
923  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L1,
924  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
925  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L1,
926  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
927  addData(testFramework, uut, refpg2ct + (750*i), 2, 1, SS::GPS, CB::L2,
928  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
929  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L1,
930  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
931  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L1,
932  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
933  addData(testFramework, uut, refpg2ct + (750*i), 2, 3, SS::GPS, CB::L2,
934  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
935  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L1,
936  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Almanac);
937  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L1,
938  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
939  addData(testFramework, uut, refpg2ct + (750*i), 2, 4, SS::GPS, CB::L2,
940  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Almanac);
941  }
942  TUASSERTE(size_t, 99, uut.size());
943  // add "ephemeris health"
944  for (unsigned i = 0; i <= 251; i++)
945  {
946  // health data
947  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
948  TC::CA, NT::GPSLNAV,
949  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
950  MT::Health);
951  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
952  TC::Y, NT::GPSLNAV,
953  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
954  MT::Health);
955  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
956  TC::Y, NT::GPSLNAV,
957  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
958  MT::Health);
959  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
960  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
961  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
962  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
963  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
964  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
965  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
966  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
967  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
968  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
969  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
970  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
971  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
972  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
973  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
974  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
975  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
976  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
977  // ephemeris data
978  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
979  TC::CA, NT::GPSLNAV,
980  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
981  MT::Ephemeris);
982  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
983  TC::Y, NT::GPSLNAV,
984  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
985  MT::Ephemeris);
986  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
987  TC::Y, NT::GPSLNAV,
988  ((i >= 57 && i < 240) ? SH :: Unhealthy : SH::Healthy),
989  MT::Ephemeris);
990  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
991  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
992  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
993  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
994  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
995  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
996  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
997  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
998  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
999  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1000  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
1001  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1002  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1003  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1004  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1005  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1006  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
1007  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1008  }
1009  TUASSERTE(size_t, 6147, uut.size());
1010  gnsstk::NavDataPtr result;
1011  gnsstk::GPSLNavHealth *hea;
1013  // Look for ephemeris data from PRN 1 L1 CA
1014  TUASSERTE(bool, true,
1015  uut.find(findNMID1L1CAe,findTime1,result,SH::Any,VT::Any,
1016  SO::Nearest));
1017  gnsstk::CommonTime expTime1Eph(gnsstk::GPSWeekSecond(2101, 3600));
1018  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1019  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1020  TUASSERTE(int, 1, result->signal.sat.id);
1021  TUASSERTE(bool, false, result->signal.sat.wildId);
1022  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1023  TUASSERTE(bool, false, result->signal.sat.wildSys);
1024  TUASSERTE(int, 1, result->signal.xmitSat.id);
1025  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1026  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1027  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1028  TUASSERTE(SS, SS::GPS, result->signal.system);
1029  TUASSERTE(CB, CB::L1, result->signal.obs.band);
1030  TUASSERTE(TC, TC::CA, result->signal.obs.code);
1031  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1032  // Look for ephemeris data from PRN 3 L1 CA (Healthy)
1033  TUASSERTE(bool, true,
1034  uut.find(findNMID3L1CAe,findTime1,result,SH::Healthy,VT::Any,
1035  SO::Nearest));
1036  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1037  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1038  TUASSERTE(int, 3, result->signal.sat.id);
1039  TUASSERTE(bool, false, result->signal.sat.wildId);
1040  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1041  TUASSERTE(bool, false, result->signal.sat.wildSys);
1042  TUASSERTE(int, 3, result->signal.xmitSat.id);
1043  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1044  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1045  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1046  TUASSERTE(SS, SS::GPS, result->signal.system);
1047  TUASSERTE(CB, CB::L1, result->signal.obs.band);
1048  TUASSERTE(TC, TC::CA, result->signal.obs.code);
1049  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1050  // Look for ephemeris data from PRN 3 any any (Healthy)
1051  TUASSERTE(bool, true,
1052  uut.find(findNMID3e,findTime1,result,SH::Healthy,VT::Any,
1053  SO::Nearest));
1054  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1055  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1056  TUASSERTE(int, 3, result->signal.sat.id);
1057  TUASSERTE(bool, false, result->signal.sat.wildId);
1058  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1059  TUASSERTE(bool, false, result->signal.sat.wildSys);
1060  TUASSERTE(int, 3, result->signal.xmitSat.id);
1061  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1062  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1063  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1064  TUASSERTE(SS, SS::GPS, result->signal.system);
1065  TUASSERTE(CB, CB::L1, result->signal.obs.band);
1066  TUASSERTE(TC, TC::CA, result->signal.obs.code);
1067  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1068  // Look for ephemeris data from PRN 1 L2 Y
1069  TUASSERTE(bool, true,
1070  uut.find(findNMID1L2Ye,findTime1,result,SH::Any,VT::Any,
1071  SO::Nearest));
1072  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1073  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1074  TUASSERTE(int, 1, result->signal.sat.id);
1075  TUASSERTE(bool, false, result->signal.sat.wildId);
1076  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1077  TUASSERTE(bool, false, result->signal.sat.wildSys);
1078  TUASSERTE(int, 1, result->signal.xmitSat.id);
1079  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1080  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1081  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1082  TUASSERTE(SS, SS::GPS, result->signal.system);
1083  TUASSERTE(CB, CB::L2, result->signal.obs.band);
1084  TUASSERTE(TC, TC::Y, result->signal.obs.code);
1085  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1086  // Look for ephemeris data from PRN 3 L2 Y (Healthy)
1087  TUASSERTE(bool, true,
1088  uut.find(findNMID3L2Ye,findTime1,result,SH::Healthy,VT::Any,
1089  SO::Nearest));
1090  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1091  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1092  TUASSERTE(int, 3, result->signal.sat.id);
1093  TUASSERTE(bool, false, result->signal.sat.wildId);
1094  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1095  TUASSERTE(bool, false, result->signal.sat.wildSys);
1096  TUASSERTE(int, 3, result->signal.xmitSat.id);
1097  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1098  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1099  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1100  TUASSERTE(SS, SS::GPS, result->signal.system);
1101  TUASSERTE(CB, CB::L2, result->signal.obs.band);
1102  TUASSERTE(TC, TC::Y, result->signal.obs.code);
1103  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1104  // Look for ephemeris data from PRN 1 L2 Y (Healthy)
1105  TUASSERTE(bool, true,
1106  uut.find(findNMID1L2Ye,findTime1,result,SH::Healthy,VT::Any,
1107  SO::Nearest));
1108  TUASSERTE(gnsstk::CommonTime, expTime1Eph, result->timeStamp);
1109  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1110  TUASSERTE(int, 1, result->signal.sat.id);
1111  TUASSERTE(bool, false, result->signal.sat.wildId);
1112  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1113  TUASSERTE(bool, false, result->signal.sat.wildSys);
1114  TUASSERTE(int, 1, result->signal.xmitSat.id);
1115  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1116  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1117  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1118  TUASSERTE(SS, SS::GPS, result->signal.system);
1119  TUASSERTE(CB, CB::L2, result->signal.obs.band);
1120  TUASSERTE(TC, TC::Y, result->signal.obs.code);
1121  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1122  // Look for ephemeris data from PRN 1 L2 Y (Healthy) at an earlier time
1123  TUASSERTE(bool, true,
1124  uut.find(findNMID1L2Ye,findTime2,result,SH::Healthy,VT::Any,
1125  SO::Nearest));
1126  gnsstk::CommonTime expTime2Eph(gnsstk::GPSWeekSecond(2100, 601200));
1127  TUASSERTE(gnsstk::CommonTime, expTime2Eph, result->timeStamp);
1128  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1129  TUASSERTE(int, 1, result->signal.sat.id);
1130  TUASSERTE(bool, false, result->signal.sat.wildId);
1131  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1132  TUASSERTE(bool, false, result->signal.sat.wildSys);
1133  TUASSERTE(int, 1, result->signal.xmitSat.id);
1134  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1135  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1136  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1137  TUASSERTE(SS, SS::GPS, result->signal.system);
1138  TUASSERTE(CB, CB::L2, result->signal.obs.band);
1139  TUASSERTE(TC, TC::Y, result->signal.obs.code);
1140  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1141  // Look for ephemeris data from PRN 1 L2 Y (Unhealthy)
1142  TUASSERTE(bool, true,
1143  uut.find(findNMID1L2Ye,findTime1,result,SH::Unhealthy,VT::Any,
1144  SO::Nearest));
1145  // this is the first of the unhealthy data
1146  gnsstk::CommonTime expTime3Eph(gnsstk::GPSWeekSecond(2100, 602910));
1147  TUASSERTE(gnsstk::CommonTime, expTime3Eph, result->timeStamp);
1148  TUASSERTE(MT, MT::Ephemeris, result->signal.messageType);
1149  TUASSERTE(int, 1, result->signal.sat.id);
1150  TUASSERTE(bool, false, result->signal.sat.wildId);
1151  TUASSERTE(SS, SS::GPS, result->signal.sat.system);
1152  TUASSERTE(bool, false, result->signal.sat.wildSys);
1153  TUASSERTE(int, 1, result->signal.xmitSat.id);
1154  TUASSERTE(bool, false, result->signal.xmitSat.wildId);
1155  TUASSERTE(SS, SS::GPS, result->signal.xmitSat.system);
1156  TUASSERTE(bool, false, result->signal.xmitSat.wildSys);
1157  TUASSERTE(SS, SS::GPS, result->signal.system);
1158  TUASSERTE(CB, CB::L2, result->signal.obs.band);
1159  TUASSERTE(TC, TC::Y, result->signal.obs.code);
1160  TUASSERTE(NT, NT::GPSLNAV, result->signal.nav);
1161  // Look for ephemeris data from PRN 3 L2 Y (Unhealthy)
1162  TUASSERTE(bool, false,
1163  uut.find(findNMID3L2Ye,findTime1,result,SH::Unhealthy,VT::Any,
1164  SO::Nearest));
1165  TURETURN();
1166 }
1167 
1168 
1171 {
1172  TUDEF("NavDataFactoryWithStore", "getOffset");
1173  TestClass fact1;
1174  gnsstk::NavDataPtr navOut = std::make_shared<gnsstk::GPSLNavTimeOffset>();
1175  navOut->timeStamp = ct;
1176  navOut->signal.messageType = gnsstk::NavMessageType::TimeOffset;
1177  gnsstk::GPSLNavTimeOffset *toptr = dynamic_cast<gnsstk::GPSLNavTimeOffset*>(
1178  navOut.get());
1179  fillSat(navOut->signal, 23, 23);
1180  toptr->deltatLS = 23; // set a simple, easy to verify value.
1181  toptr->refTime = ct;
1182  TUASSERT(fact1.addNavData(navOut));
1184  gnsstk::NavDataPtr result;
1185  double offset;
1187  ct+35, result, gnsstk::SVHealth::Any,
1189  top = dynamic_cast<gnsstk::TimeOffsetData*>(result.get());
1191  ct+35, offset));
1192  TUASSERTFE(23.0, offset);
1193  // reverse the conversion and expect negative.
1195  ct+35, result, gnsstk::SVHealth::Any,
1197  top = dynamic_cast<gnsstk::TimeOffsetData*>(result.get());
1198  gnsstk::CommonTime utc35(ct+35);
1201  utc35, offset));
1202  TUASSERTFE(-23.0, offset);
1203  // expect this to not work
1205  utc35, result, gnsstk::SVHealth::Any,
1207  TURETURN();
1208 }
1209 
1210 
1213 {
1214  TUDEF("NavDataFactoryWithStore", "getOffset");
1215  TestClass uut;
1216  using SS = gnsstk::SatelliteSystem;
1217  using CB = gnsstk::CarrierBand;
1218  using TC = gnsstk::TrackingCode;
1219  using NT = gnsstk::NavType;
1220  using SH = gnsstk::SVHealth;
1221  using MT = gnsstk::NavMessageType;
1222  using VT = gnsstk::NavValidityType;
1223  using SO = gnsstk::NavSearchOrder;
1224  gnsstk::CommonTime refsf1ct = gnsstk::GPSWeekSecond(2101, 0);
1225  // between copies 2 and 3, or i==57
1226  gnsstk::CommonTime unhealthyStart = gnsstk::GPSWeekSecond(2101, 1710);
1227  gnsstk::CommonTime refpg56ct = gnsstk::GPSWeekSecond(2101, 528);
1228  gnsstk::CommonTime findTime1 = gnsstk::GPSWeekSecond(2101, 3838);
1229  gnsstk::CommonTime findTime2 = gnsstk::GPSWeekSecond(2101, 0);
1230  gnsstk::CommonTime findTime3 = gnsstk::GPSWeekSecond(2101, 7300);
1231  // fill with "almanac pages"
1232  for (unsigned i = 0; i < 10; i++)
1233  {
1234  addData(testFramework, uut, refpg56ct + (750*i), 2, 1, SS::GPS, CB::L1,
1235  TC::CA, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1236  addData(testFramework, uut, refpg56ct + (750*i), 2, 1, SS::GPS, CB::L1,
1237  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1238  addData(testFramework, uut, refpg56ct + (750*i), 2, 1, SS::GPS, CB::L2,
1239  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1240  addData(testFramework, uut, refpg56ct + (750*i), 2, 3, SS::GPS, CB::L1,
1241  TC::CA, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1242  addData(testFramework, uut, refpg56ct + (750*i), 2, 3, SS::GPS, CB::L1,
1243  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1244  addData(testFramework, uut, refpg56ct + (750*i), 2, 3, SS::GPS, CB::L2,
1245  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1246  addData(testFramework, uut, refpg56ct + (750*i), 2, 4, SS::GPS, CB::L1,
1247  TC::CA, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1248  addData(testFramework, uut, refpg56ct + (750*i), 2, 4, SS::GPS, CB::L1,
1249  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1250  addData(testFramework, uut, refpg56ct + (750*i), 2, 4, SS::GPS, CB::L2,
1251  TC::Y, NT::GPSLNAV, SH::Healthy, MT::TimeOffset);
1252  }
1253  TUASSERTE(size_t, 90, uut.size());
1254  // add "ephemeris health"
1255  for (unsigned i = 0; i < 228; i++)
1256  {
1257  // health data
1258  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
1259  TC::CA, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1260  MT::Health);
1261  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
1262  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1263  MT::Health);
1264  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
1265  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1266  MT::Health);
1267  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
1268  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
1269  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
1270  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1271  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
1272  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1273  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
1274  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
1275  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
1276  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1277  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
1278  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1279  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1280  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Health);
1281  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1282  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1283  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
1284  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Health);
1285  // ephemeris data
1286  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
1287  TC::CA, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1288  MT::Ephemeris);
1289  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L1,
1290  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1291  MT::Ephemeris);
1292  addData(testFramework, uut, refsf1ct + (30*i), 1, 1, SS::GPS, CB::L2,
1293  TC::Y, NT::GPSLNAV, (i >= 57 ? SH :: Unhealthy : SH::Healthy),
1294  MT::Ephemeris);
1295  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
1296  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1297  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L1,
1298  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1299  addData(testFramework, uut, refsf1ct + (30*i), 2, 2, SS::GPS, CB::L2,
1300  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1301  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
1302  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1303  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L1,
1304  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1305  addData(testFramework, uut, refsf1ct + (30*i), 3, 3, SS::GPS, CB::L2,
1306  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1307  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1308  TC::CA, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1309  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L1,
1310  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1311  addData(testFramework, uut, refsf1ct + (30*i), 4, 4, SS::GPS, CB::L2,
1312  TC::Y, NT::GPSLNAV, SH::Healthy, MT::Ephemeris);
1313  }
1314  TUASSERTE(size_t, 5562, uut.size());
1316  gnsstk::NavDataPtr result;
1317  double offset;
1318  // check getOffset with no restrictions on health or validity
1319  TUASSERTE(bool, true,
1321  findTime1,result,SH::Any,VT::Any));
1322  top = dynamic_cast<gnsstk::TimeOffsetData*>(result.get());
1324  findTime1, offset));
1325  TUASSERTFE(1, offset); // PRN == offset == 1
1326  // check getOffset requiring data from a healthy SV
1327  TUASSERTE(bool, true,
1329  findTime1,result,SH::Healthy,VT::Any));
1330  top = dynamic_cast<gnsstk::TimeOffsetData*>(result.get());
1332  findTime1, offset));
1333  TUASSERTFE(3, offset); // PRN == offset == 3
1334  // check getOffset with time prior to earliest data
1335  TUASSERTE(bool, false,
1337  findTime2,result,SH::Any,VT::Any));
1338  // check getOffset with time after most recent data
1339  TUASSERTE(bool, true,
1341  findTime3,result,SH::Any,VT::Any));
1342  top = dynamic_cast<gnsstk::TimeOffsetData*>(result.get());
1344  findTime3, offset));
1345  TUASSERTFE(1, offset); // PRN == offset == 1
1346  TURETURN();
1347 }
1348 
1349 
1352 {
1353  TUDEF("NavDataFactoryWithStore", "edit");
1354 
1355  // First check the plain edit
1356  TestClass fact1;
1357  gnsstk::CommonTime ect(ct-3600); // make the base time match the ephemeris
1358  TUCATCH(fillFactory(testFramework, fact1));
1359  // verify initial conditions
1360  TUASSERTE(size_t, 8, fact1.size());
1361  TUASSERTE(size_t, 2, fact1.numSignals());
1362  TUASSERTE(size_t, 3, fact1.numSatellites());
1363  TUASSERTE(size_t, 8, fact1.sizeNearest());
1364  TUASSERTE(size_t, 3, fact1.numSatellitesNearest());
1365  // remove nothing
1367  TUASSERTE(size_t, 8, fact1.size());
1368  TUASSERTE(size_t, 2, fact1.numSignals());
1369  TUASSERTE(size_t, 3, fact1.numSatellites());
1370  TUASSERTE(size_t, 8, fact1.sizeNearest());
1371  TUASSERTE(size_t, 3, fact1.numSatellitesNearest());
1372  checkForEmpty(testFramework, fact1);
1373  // remove messages at ect
1374  TUCATCH(fact1.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+30));
1375  TUASSERTE(size_t, 5, fact1.size());
1376  TUASSERTE(size_t, 2, fact1.numSignals());
1377  TUASSERTE(size_t, 3, fact1.numSatellites());
1378  TUASSERTE(size_t, 5, fact1.sizeNearest());
1379  TUASSERTE(size_t, 3, fact1.numSatellitesNearest());
1380  checkForEmpty(testFramework, fact1);
1381  // remove messages at ect+30
1382  TUCATCH(fact1.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+60));
1383  TUASSERTE(size_t, 2, fact1.size());
1384  TUASSERTE(size_t, 1, fact1.numSignals());
1385  TUASSERTE(size_t, 1, fact1.numSatellites());
1386  TUASSERTE(size_t, 2, fact1.sizeNearest());
1387  TUASSERTE(size_t, 1, fact1.numSatellitesNearest());
1388  checkForEmpty(testFramework, fact1);
1389  // remove messages at ect+60
1390  TUCATCH(fact1.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+90));
1391  TUASSERTE(size_t, 1, fact1.size());
1392  TUASSERTE(size_t, 1, fact1.numSignals());
1393  TUASSERTE(size_t, 1, fact1.numSatellites());
1394  TUASSERTE(size_t, 1, fact1.sizeNearest());
1395  TUASSERTE(size_t, 1, fact1.numSatellitesNearest());
1396  checkForEmpty(testFramework, fact1);
1397  // remove messages at ect+90
1398  TUCATCH(fact1.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+120));
1399  TUASSERTE(size_t, 0, fact1.size());
1400  TUASSERTE(size_t, 0, fact1.numSignals());
1401  TUASSERTE(size_t, 0, fact1.numSatellites());
1402  TUASSERTE(size_t, 0, fact1.sizeNearest());
1403  TUASSERTE(size_t, 0, fact1.numSatellitesNearest());
1404  checkForEmpty(testFramework, fact1);
1405 
1406  // Now check satellite editing
1407  TestClass fact2;
1408  gnsstk::NavSatelliteID satID2a, satID2b, satID2c, satID2d, satID2e;
1409  TUCATCH(fillFactory(testFramework, fact2));
1410  TUCATCH(fillSat(satID2a, 7, 7));
1411  TUCATCH(fillSat(satID2b, 99, 99));
1414  TUCATCH(fillSat(satID2d, 11, 11, gnsstk::SatelliteSystem::GPS,
1416  TUCATCH(fillSat(satID2e, 23, 32));
1417  // verify initial conditions
1418  TUASSERTE(size_t, 8, fact2.size());
1419  TUASSERTE(size_t, 2, fact2.numSignals());
1420  TUASSERTE(size_t, 3, fact2.numSatellites());
1421  TUASSERTE(size_t, 8, fact2.sizeNearest());
1422  TUASSERTE(size_t, 3, fact2.numSatellitesNearest());
1423  checkForEmpty(testFramework, fact2);
1424  // remove nothing
1425  TUCATCH(fact2.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect, satID2a));
1426  TUASSERTE(size_t, 8, fact2.size());
1427  TUASSERTE(size_t, 2, fact2.numSignals());
1428  TUASSERTE(size_t, 3, fact2.numSatellites());
1429  TUASSERTE(size_t, 8, fact2.sizeNearest());
1430  TUASSERTE(size_t, 3, fact2.numSatellitesNearest());
1431  checkForEmpty(testFramework, fact2);
1432  // remove nothing, this time because the satellite ID isn't present
1435  TUASSERTE(size_t, 8, fact2.size());
1436  TUASSERTE(size_t, 2, fact2.numSignals());
1437  TUASSERTE(size_t, 3, fact2.numSatellites());
1438  TUASSERTE(size_t, 8, fact2.sizeNearest());
1439  TUASSERTE(size_t, 3, fact2.numSatellitesNearest());
1440  checkForEmpty(testFramework, fact2);
1441  // remove nothing, this time because the signal isn't present
1444  TUASSERTE(size_t, 8, fact2.size());
1445  TUASSERTE(size_t, 2, fact2.numSignals());
1446  TUASSERTE(size_t, 3, fact2.numSatellites());
1447  TUASSERTE(size_t, 8, fact2.sizeNearest());
1448  TUASSERTE(size_t, 3, fact2.numSatellitesNearest());
1449  checkForEmpty(testFramework, fact2);
1450  // remove all sat 7 data
1453  TUASSERTE(size_t, 6, fact2.size());
1454  TUASSERTE(size_t, 2, fact2.numSignals());
1455  TUASSERTE(size_t, 2, fact2.numSatellites());
1456  TUASSERTE(size_t, 6, fact2.sizeNearest());
1457  TUASSERTE(size_t, 2, fact2.numSatellitesNearest());
1458  checkForEmpty(testFramework, fact2);
1459  // remove all sat 11 data
1462  TUASSERTE(size_t, 4, fact2.size());
1463  TUASSERTE(size_t, 1, fact2.numSignals());
1464  TUASSERTE(size_t, 1, fact2.numSatellites());
1465  TUASSERTE(size_t, 4, fact2.sizeNearest());
1466  TUASSERTE(size_t, 1, fact2.numSatellitesNearest());
1467  checkForEmpty(testFramework, fact2);
1468  // remove some of sat 23 data
1469  TUCATCH(fact2.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+30, satID2e));
1470  TUASSERTE(size_t, 3, fact2.size());
1471  TUASSERTE(size_t, 1, fact2.numSignals());
1472  TUASSERTE(size_t, 1, fact2.numSatellites());
1473  TUASSERTE(size_t, 3, fact2.sizeNearest());
1474  TUASSERTE(size_t, 1, fact2.numSatellitesNearest());
1475  checkForEmpty(testFramework, fact2);
1476  // remove the rest of sat 23 data
1479  TUASSERTE(size_t, 0, fact2.size());
1480  TUASSERTE(size_t, 0, fact2.numSignals());
1481  TUASSERTE(size_t, 0, fact2.numSatellites());
1482  TUASSERTE(size_t, 0, fact2.sizeNearest());
1483  TUASSERTE(size_t, 0, fact2.numSatellitesNearest());
1484  checkForEmpty(testFramework, fact2);
1485 
1486  // finally, check editing by signal
1487  TestClass fact3;
1488  gnsstk::NavSignalID sig3a, sig3b, sig3c;
1489  TUCATCH(fillFactory(testFramework, fact3));
1490  TUCATCH(fillSignal(sig3a));
1494  // verify initial conditions
1495  TUASSERTE(size_t, 8, fact3.size());
1496  TUASSERTE(size_t, 2, fact3.numSignals());
1497  TUASSERTE(size_t, 3, fact3.numSatellites());
1498  TUASSERTE(size_t, 8, fact3.sizeNearest());
1499  TUASSERTE(size_t, 3, fact3.numSatellitesNearest());
1500  checkForEmpty(testFramework, fact3);
1501  // remove nothing
1502  TUCATCH(fact3.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect, sig3a));
1503  TUASSERTE(size_t, 8, fact3.size());
1504  TUASSERTE(size_t, 2, fact3.numSignals());
1505  TUASSERTE(size_t, 3, fact3.numSatellites());
1506  TUASSERTE(size_t, 8, fact3.sizeNearest());
1507  TUASSERTE(size_t, 3, fact3.numSatellitesNearest());
1508  checkForEmpty(testFramework, fact3);
1509  // remove nothing, this time because the signal isn't present
1512  TUASSERTE(size_t, 8, fact3.size());
1513  TUASSERTE(size_t, 2, fact3.numSignals());
1514  TUASSERTE(size_t, 3, fact3.numSatellites());
1515  TUASSERTE(size_t, 8, fact3.sizeNearest());
1516  TUASSERTE(size_t, 3, fact3.numSatellitesNearest());
1517  checkForEmpty(testFramework, fact3);
1518  // remove all L1-Y data
1521  TUASSERTE(size_t, 6, fact3.size());
1522  TUASSERTE(size_t, 1, fact3.numSignals());
1523  TUASSERTE(size_t, 2, fact3.numSatellites());
1524  TUASSERTE(size_t, 6, fact3.sizeNearest());
1525  TUASSERTE(size_t, 2, fact3.numSatellitesNearest());
1526  checkForEmpty(testFramework, fact3);
1527  // remove some of L1-CA data
1528  TUCATCH(fact3.edit(gnsstk::CommonTime::BEGINNING_OF_TIME, ect+30, sig3a));
1529  TUASSERTE(size_t, 4, fact3.size());
1530  TUASSERTE(size_t, 1, fact3.numSignals());
1531  TUASSERTE(size_t, 2, fact3.numSatellites());
1532  TUASSERTE(size_t, 4, fact3.sizeNearest());
1533  TUASSERTE(size_t, 2, fact3.numSatellitesNearest());
1534  checkForEmpty(testFramework, fact3);
1535  // remove the rest of L1-CA data
1538  TUASSERTE(size_t, 0, fact3.size());
1539  TUASSERTE(size_t, 0, fact3.numSignals());
1540  TUASSERTE(size_t, 0, fact3.numSatellites());
1541  TUASSERTE(size_t, 0, fact3.sizeNearest());
1542  TUASSERTE(size_t, 0, fact3.numSatellitesNearest());
1543  checkForEmpty(testFramework, fact3);
1544 
1545  TURETURN();
1546 }
1547 
1548 
1551 {
1552  TUDEF("NavDataFactoryWithStore", "clear");
1553 
1554  TestClass fact;
1555 
1556  // NavData is abstract so we instantiate a GPSLNavEph instead
1557  gnsstk::NavDataPtr navOut = std::make_shared<gnsstk::GPSLNavEph>();
1558  navOut->timeStamp = ct;
1559  navOut->signal.messageType = gnsstk::NavMessageType::Ephemeris;
1560  navOut->signal.sat = gnsstk::SatID(23,gnsstk::SatelliteSystem::GPS);
1561  navOut->signal.xmitSat = gnsstk::SatID(32,gnsstk::SatelliteSystem::GPS);
1562  navOut->signal.system = gnsstk::SatelliteSystem::GPS;
1563  navOut->signal.obs = gnsstk::ObsID(gnsstk::ObservationType::NavMsg,
1566  navOut->signal.nav = gnsstk::NavType::GPSLNAV;
1567 
1568  TUASSERT(fact.addNavData(navOut));
1569  TUASSERTE(size_t, 1, fact.size());
1570  TUASSERTE(size_t, 1, fact.sizeNearest());
1571 
1572  fact.clear();
1573  TUASSERTE(size_t, 0, fact.size());
1574  TUASSERTE(size_t, 0, fact.sizeNearest());
1576  fact.getFinalTime());
1578  fact.getInitialTime());
1579 
1580  TURETURN();
1581 }
1582 
1583 
1586 {
1587  addData(testFramework, fact, ct+0, 23, 32);
1588  addData(testFramework, fact, ct+0, 7, 7);
1589  addData(testFramework, fact, ct+0, 11, 11, gnsstk::SatelliteSystem::GPS,
1591  addData(testFramework, fact, ct+30, 23, 32);
1592  addData(testFramework, fact, ct+30, 7, 7);
1593  addData(testFramework, fact, ct+30, 11, 11, gnsstk::SatelliteSystem::GPS,
1595  addData(testFramework, fact, ct+60, 23, 32);
1596  addData(testFramework, fact, ct+90, 23, 32);
1597 }
1598 
1599 
1601 addData(gnsstk::TestUtil& testFramework, TestClass& fact,
1602  const gnsstk::CommonTime& ct, unsigned long sat,
1603  unsigned long xmitSat, gnsstk::SatelliteSystem sys,
1606 {
1607  gnsstk::NavDataPtr navOut;
1608  gnsstk::GPSWeekSecond toe = ct;
1610  {
1611  navOut = std::make_shared<gnsstk::GPSLNavEph>();
1612  navOut->timeStamp = ct-3600;
1613  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->health = hea;
1614  toe.sow -= fmod(toe.sow,7200);
1615  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->Toe = toe;
1616  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->Toc = toe;
1617  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->xmitTime = ct-3600;
1618  dynamic_cast<gnsstk::GPSLNavEph*>(navOut.get())->xmit2 = ct-3594;
1619  dynamic_cast<gnsstk::GPSLNavEph*>(navOut.get())->xmit3 = ct-3588;
1620  dynamic_cast<gnsstk::GPSLNavEph*>(navOut.get())->fixFit();
1621  }
1622  else if (nmt == gnsstk::NavMessageType::Almanac)
1623  {
1624  navOut = std::make_shared<gnsstk::GPSLNavAlm>();
1625  navOut->timeStamp = ct;
1626  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->health = hea;
1627  toe.sow = toe.sow - fmod(toe.sow,86400) + (xmitSat == 3 ? 61000 : 61056);
1628  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->Toe = toe;
1629  dynamic_cast<gnsstk::OrbitDataKepler*>(navOut.get())->xmitTime = ct;
1630  dynamic_cast<gnsstk::GPSLNavAlm*>(navOut.get())->fixFit();
1631  }
1632  else if (nmt == gnsstk::NavMessageType::Health)
1633  {
1634  navOut = std::make_shared<gnsstk::GPSLNavHealth>();
1635  navOut->timeStamp = ct;
1636  gnsstk::GPSLNavHealth *hp =
1637  dynamic_cast<gnsstk::GPSLNavHealth*>(navOut.get());
1638  switch (hea)
1639  {
1641  hp->svHealth = 0;
1642  break;
1644  hp->svHealth = 1;
1645  break;
1646  default:
1647  TUFAIL("GPS can't handle health type " +
1649  break;
1650  }
1651  }
1652  else if (nmt == gnsstk::NavMessageType::TimeOffset)
1653  {
1654  navOut = std::make_shared<gnsstk::GPSLNavTimeOffset>();
1655  navOut->timeStamp = ct;
1657  dynamic_cast<gnsstk::GPSLNavTimeOffset*>(navOut.get());
1658  // Set deltatLS to the transmitting satellite which gives us
1659  // a means to determine if the expected time offset message
1660  // was used.
1661  to->deltatLS = xmitSat;
1662  // to->a0 = 0.0;
1663  // to->a1 = 0.0;
1664  // to->tot = 0.0;
1665  // to->wnt = 0;
1666  // to->wnLSF = 0;
1667  // to->dn = 0;
1668  // to->deltatLSF = 0.0;
1669  to->refTime = gnsstk::GPSWeekSecond(0,0);
1670  }
1671  navOut->signal.messageType = nmt;
1672  fillSat(navOut->signal, sat, xmitSat, sys, car, code, nav);
1673  TUASSERT(fact.addNavData(navOut));
1674 }
1675 
1676 
1680 {
1681  signal.system = sys;
1683  signal.nav = nav;
1684 }
1685 
1686 
1689  unsigned long sat, unsigned long xmitSat,
1692 {
1693  fillSignal(satellite, sys, car, code, nav);
1694  satellite.sat = gnsstk::SatID(sat,sys);
1695  satellite.xmitSat = gnsstk::SatID(xmitSat,sys);
1696 }
1697 
1698 
1701 {
1703  for (auto& nmmi : data)
1704  {
1705  TUASSERT(!nmmi.second.empty());
1706  for (auto& sati : nmmi.second)
1707  {
1708  TUASSERT(!sati.second.empty());
1709  }
1710  }
1711  gnsstk::NavNearMessageMap &nearestData(fact.getNearestData());
1712  for (auto& nnmmi : nearestData)
1713  {
1714  TUASSERT(!nnmmi.second.empty());
1715  for (auto& nnsmi : nnmmi.second)
1716  {
1717  TUASSERT(!nnsmi.second.empty());
1718  for (auto& nnmi : nnsmi.second)
1719  {
1720  TUASSERT(!nnmi.second.empty());
1721  }
1722  }
1723  }
1724 }
1725 
1726 
1729 {
1730  // test almanac for prn 5 (subframe 5 page 5)
1731  // one copy broadcast by prn 1 which is healthy
1732  // one copy broadcast by prn 2 which is unhealthy
1733  // first add PRN 1 ephemeris
1734  addData(testFramework, fact, ct, 1, 1);
1735  // then add PRN 2 unhealthy ephemeris
1736  addData(testFramework, fact, ct, 2, 2, gnsstk::SatelliteSystem::GPS,
1739  // add the almanac data... Note the unhealthy here refers to PRN 5
1740  addData(testFramework, fact, ct5, 5, 2, gnsstk::SatelliteSystem::GPS,
1744  addData(testFramework, fact, ct5, 5, 1, gnsstk::SatelliteSystem::GPS,
1748  // finally, add health data, without which the find method won't
1749  // give the expected results when searching for specific health status
1750  addData(testFramework, fact, ct, 1, 1, gnsstk::SatelliteSystem::GPS,
1754  addData(testFramework, fact, ct, 2, 2, gnsstk::SatelliteSystem::GPS,
1758 }
1759 
1760 
1763 {
1764  TUDEF("NavDataFactoryWithStore", "find");
1765  TestClass fact1;
1766  gnsstk::NavMessageID nmid1a;
1767  gnsstk::NavDataPtr result;
1768  TUCATCH(fillFactoryXmitHealth(testFramework, fact1));
1769  TUASSERTE(size_t, 6, fact1.size());
1770  TUCATCH(fillSat(nmid1a, 5, 0));
1771  nmid1a.xmitSat.wildId = true;
1773  // make sure we get something with no filters
1774  TUASSERT(fact1.find(nmid1a, ct5+7, result, gnsstk::SVHealth::Any,
1777  result.reset();
1778  // ask for almanac data from a healthy SV
1779  TUASSERT(fact1.find(nmid1a, ct5+7, result, gnsstk::SVHealth::Healthy,
1782  // we asked for almanac from healthy SV, so we should have
1783  // gotten the data from PRN 1
1784  TUASSERTE(int, 1, result->signal.xmitSat.id);
1785  result.reset();
1786  // ask for almanac data from an unhealthy SV
1787  TUASSERT(fact1.find(nmid1a, ct5+7, result, gnsstk::SVHealth::Unhealthy,
1790  // we asked for almanac from unhealthy SV, so we should have
1791  // gotten the data from PRN 2
1792  TUASSERTE(int, 2, result->signal.xmitSat.id);
1793  result.reset();
1794  TURETURN();
1795 }
1796 
1797 
1800 {
1801  TUDEF("NavDataFactoryWithStore", "getAvailableSats");
1802  TestClass uut;
1803  TUCATCH(fillFactory(testFramework, uut));
1805  gnsstk::NavSatelliteID sat1, sat2, sat3;
1806  fillSat(sat1, 23, 32);
1807  fillSat(sat2, 7, 7);
1808  fillSat(sat3, 11, 11, gnsstk::SatelliteSystem::GPS,
1810  // test over entire time span
1811  TUCATCH(satset = uut.getAvailableSats(
1814  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1815  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1816  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1817  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1818  TUCATCH(satset = uut.getAvailableSats(
1822  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1823  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1824  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1825  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1826  TUCATCH(satset = uut.getAvailableSats(
1830  TUASSERTE(bool, true, satset.empty());
1831  // test with time span before any data
1832  TUCATCH(satset = uut.getAvailableSats(
1833  gnsstk::CivilTime(2020,4,12,0,56,0,gnsstk::TimeSystem::GPS),
1834  gnsstk::CivilTime(2020,4,12,0,57,0,gnsstk::TimeSystem::GPS)));
1835  TUASSERTE(bool, true, satset.empty());
1836  // test with time span after all data
1837  TUCATCH(satset = uut.getAvailableSats(
1838  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS),
1839  gnsstk::CivilTime(2020,4,12,2,0,0,gnsstk::TimeSystem::GPS)));
1840  TUASSERTE(bool, true, satset.empty());
1841  // test with a time span that will get all satellites even
1842  // though it's only partial coverage.
1843  TUCATCH(satset = uut.getAvailableSats(
1844  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1845  gnsstk::CivilTime(2020,4,11,23,58,0,gnsstk::TimeSystem::GPS)));
1846  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1847  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1848  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1849  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1850  // test with a time span that will only get one satellite
1851  TUCATCH(satset = uut.getAvailableSats(
1852  gnsstk::CivilTime(2020,4,11,23,59,0,gnsstk::TimeSystem::GPS),
1853  gnsstk::CivilTime(2020,4,12,0,0,0,gnsstk::TimeSystem::GPS)));
1854  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1855  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.size());
1856  // test with a time span that is in the middle of the data time
1857  // span, but without any matches
1858  TUCATCH(satset = uut.getAvailableSats(
1859  gnsstk::CivilTime(2020,4,11,23,57,50,gnsstk::TimeSystem::GPS),
1860  gnsstk::CivilTime(2020,4,11,23,58,10,gnsstk::TimeSystem::GPS)));
1861  TUASSERTE(bool, true, satset.empty());
1862  TURETURN();
1863 }
1864 
1865 
1868 {
1869  TUDEF("NavDataFactoryWithStore", "getIndexSet");
1870  TestClass uut;
1871  TUCATCH(fillFactory(testFramework, uut));
1872  std::set<gnsstk::SatID> satset;
1877  // test over entire time span
1878  TUCATCH(satset = uut.getIndexSet(
1881  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1882  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1883  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1884  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1885  TUCATCH(satset = uut.getIndexSet(
1889  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1890  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1891  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1892  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1893  TUCATCH(satset = uut.getIndexSet(
1897  TUASSERTE(bool, true, satset.empty());
1898  // test with time span before any data
1899  TUCATCH(satset = uut.getIndexSet(
1900  gnsstk::CivilTime(2020,4,12,0,56,0,gnsstk::TimeSystem::GPS),
1901  gnsstk::CivilTime(2020,4,12,0,57,0,gnsstk::TimeSystem::GPS)));
1902  TUASSERTE(bool, true, satset.empty());
1903  // test with time span after all data
1904  TUCATCH(satset = uut.getIndexSet(
1905  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS),
1906  gnsstk::CivilTime(2020,4,12,2,0,0,gnsstk::TimeSystem::GPS)));
1907  TUASSERTE(bool, true, satset.empty());
1908  // test with a time span that will get all satellites even
1909  // though it's only partial coverage.
1910  TUCATCH(satset = uut.getIndexSet(
1911  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1912  gnsstk::CivilTime(2020,4,11,23,58,0,gnsstk::TimeSystem::GPS)));
1913  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1914  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat2));
1915  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat3));
1916  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 3, satset.size());
1917  // test with a time span that will only get one satellite
1918  TUCATCH(satset = uut.getIndexSet(
1919  gnsstk::CivilTime(2020,4,11,23,59,0,gnsstk::TimeSystem::GPS),
1920  gnsstk::CivilTime(2020,4,12,0,0,0,gnsstk::TimeSystem::GPS)));
1921  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.count(sat1));
1922  TUASSERTE(gnsstk::NavSatelliteIDSet::size_type, 1, satset.size());
1923  // test with a time span that is in the middle of the data time
1924  // span, but without any matches
1925  TUCATCH(satset = uut.getIndexSet(
1926  gnsstk::CivilTime(2020,4,11,23,57,50,gnsstk::TimeSystem::GPS),
1927  gnsstk::CivilTime(2020,4,11,23,58,10,gnsstk::TimeSystem::GPS)));
1928  TUASSERTE(bool, true, satset.empty());
1929  TURETURN();
1930 }
1931 
1932 
1935 {
1936  TUDEF("NavDataFactoryWithStore", "isPresent");
1937  TestClass uut;
1938  TUCATCH(fillFactory(testFramework, uut));
1939  gnsstk::NavSatelliteID sat1, sat2, sat3,
1941  fillSat(sat1, 23, 32);
1942  fillSat(sat2, 7, 7);
1943  fillSat(sat3, 11, 11, gnsstk::SatelliteSystem::GPS,
1946  nmid1a(sat1, gnsstk::NavMessageType::Almanac),
1947  nmid2e(sat2, gnsstk::NavMessageType::Ephemeris),
1948  nmid2a(sat2, gnsstk::NavMessageType::Almanac),
1949  nmid3e(sat3, gnsstk::NavMessageType::Ephemeris),
1950  nmid3a(sat3, gnsstk::NavMessageType::Almanac),
1951  nmid4e(sat4, gnsstk::NavMessageType::Ephemeris);
1952  // test with time span before any data
1953  TUASSERTE(bool, false, uut.isPresent(
1954  nmid1e,
1955  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1956  gnsstk::CivilTime(2020,4,11,23,57,0,gnsstk::TimeSystem::GPS)));
1957  TUASSERTE(bool, false, uut.isPresent(
1958  nmid2e,
1959  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1960  gnsstk::CivilTime(2020,4,11,23,57,0,gnsstk::TimeSystem::GPS)));
1961  TUASSERTE(bool, false, uut.isPresent(
1962  nmid3e,
1963  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1964  gnsstk::CivilTime(2020,4,11,23,57,0,gnsstk::TimeSystem::GPS)));
1965  // test with time span after all data
1966  TUASSERTE(bool, true, uut.isPresent(
1967  nmid1e,
1968  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS),
1969  gnsstk::CivilTime(2020,4,12,2,0,0,gnsstk::TimeSystem::GPS)));
1970  TUASSERTE(bool, true, uut.isPresent(
1971  nmid2e,
1972  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS),
1973  gnsstk::CivilTime(2020,4,12,2,0,0,gnsstk::TimeSystem::GPS)));
1974  TUASSERTE(bool, true, uut.isPresent(
1975  nmid3e,
1976  gnsstk::CivilTime(2020,4,12,0,0,0,gnsstk::TimeSystem::GPS),
1977  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS)));
1978  // test with a time span that will get all satellites even
1979  // though it's only partial coverage.
1980  // uut.dump(std::cout, gnsstk::DumpDetail::Brief);
1981  TUASSERTE(bool, true, uut.isPresent(
1982  nmid1e,
1983  gnsstk::CivilTime(2020,4,12,0,56,0,gnsstk::TimeSystem::GPS),
1984  gnsstk::CivilTime(2020,4,12,0,58,19,gnsstk::TimeSystem::GPS)));
1985  TUASSERTE(bool, true, uut.isPresent(
1986  nmid2e,
1987  gnsstk::CivilTime(2020,4,12,0,56,0,gnsstk::TimeSystem::GPS),
1988  gnsstk::CivilTime(2020,4,12,0,58,19,gnsstk::TimeSystem::GPS)));
1989  TUASSERTE(bool, true, uut.isPresent(
1990  nmid3e,
1991  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
1992  gnsstk::CivilTime(2020,4,11,23,58,19,gnsstk::TimeSystem::GPS)));
1993  // test with a time span that only contains one satellite, but
1994  // prior valid ephemerides exist for the other two.
1995  TUASSERTE(bool, true, uut.isPresent(
1996  nmid1e,
1997  gnsstk::CivilTime(2020,4,12,0,59,0,gnsstk::TimeSystem::GPS),
1998  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS)));
1999  TUASSERTE(bool, true, uut.isPresent(
2000  nmid2e,
2001  gnsstk::CivilTime(2020,4,12,0,59,0,gnsstk::TimeSystem::GPS),
2002  gnsstk::CivilTime(2020,4,12,1,0,0,gnsstk::TimeSystem::GPS)));
2003  TUASSERTE(bool, true, uut.isPresent(
2004  nmid3e,
2005  gnsstk::CivilTime(2020,4,11,23,59,0,gnsstk::TimeSystem::GPS),
2006  gnsstk::CivilTime(2020,4,12,0,0,0,gnsstk::TimeSystem::GPS)));
2007  // test with a time span that is in the middle of the data time
2008  // span, but without any data contained within (which just
2009  // matches the prior available ephemerides)
2010  TUASSERTE(bool, true, uut.isPresent(
2011  nmid1e,
2012  gnsstk::CivilTime(2020,4,12,0,57,50,gnsstk::TimeSystem::GPS),
2013  gnsstk::CivilTime(2020,4,12,0,58,10,gnsstk::TimeSystem::GPS)));
2014  TUASSERTE(bool, true, uut.isPresent(
2015  nmid2e,
2016  gnsstk::CivilTime(2020,4,12,0,57,50,gnsstk::TimeSystem::GPS),
2017  gnsstk::CivilTime(2020,4,12,0,58,10,gnsstk::TimeSystem::GPS)));
2018  TUASSERTE(bool, true, uut.isPresent(
2019  nmid3e,
2020  gnsstk::CivilTime(2020,4,11,23,57,50,gnsstk::TimeSystem::GPS),
2021  gnsstk::CivilTime(2020,4,11,23,58,10,gnsstk::TimeSystem::GPS)));
2022  // test with wildcards
2023  TUASSERTE(bool, true, uut.isPresent(
2024  nmid4e,
2025  gnsstk::CivilTime(2020,4,11,23,56,0,gnsstk::TimeSystem::GPS),
2026  gnsstk::CivilTime(2020,4,11,23,58,0,gnsstk::TimeSystem::GPS)));
2027  TURETURN();
2028 }
2029 
2030 
2033 {
2034  TUDEF("NavDataFactoryWithStore", "count");
2035  TestClass uut;
2036  TUCATCH(fillFactory(testFramework, uut));
2037  size_t totalCount = uut.size();
2038  gnsstk::NavMessageID key1(
2047  key1.sat.makeWild();
2048  key1.xmitSat.makeWild();
2049  // key1, being a complete wildcard, should yield the same
2050  // results as size()
2051  TUASSERTE(size_t, totalCount, uut.count(key1));
2052 
2053  gnsstk::NavMessageID key2(
2062  // key2, is mostly a wildcard, but does specify the satellite
2063  // system as GPS, and should yield the same results as size()
2064  TUASSERTE(size_t, totalCount, uut.count(key2));
2065 
2066  gnsstk::NavMessageID key3(
2075  // we have nothing in the store for Galileo.
2076  TUASSERTE(size_t, 0, uut.count(key3));
2077 
2078  // count GPS L1
2079  gnsstk::NavMessageID key4(
2088  TUASSERTE(size_t, totalCount, uut.count(key4));
2089 
2090  // count GPS L2
2091  gnsstk::NavMessageID key5(
2100  TUASSERTE(size_t, 0, uut.count(key5));
2101 
2102  // count using SatelliteSystem only
2103  TUASSERTE(size_t, totalCount, uut.count(gnsstk::SatelliteSystem::GPS));
2104  TUASSERTE(size_t, 0, uut.count(gnsstk::SatelliteSystem::Galileo));
2105  // count using subject satellite
2106  TUASSERTE(size_t, 4,
2108  TUASSERTE(size_t, 0,
2110  // count using message type
2111  TUASSERTE(size_t, totalCount, uut.count(gnsstk::NavMessageType::Ephemeris));
2112  TUASSERTE(size_t, 0, uut.count(gnsstk::NavMessageType::Almanac));
2113 
2114  TURETURN();
2115 }
2116 
2117 
2120 {
2121  TUDEF("NavDataFactoryWithStore", "getFirstTime");
2122  TestClass uut;
2123  TUCATCH(fillFactory(testFramework, uut));
2126  sat11(11,gnsstk::SatelliteSystem::GPS),
2127  sat12(12,gnsstk::SatelliteSystem::GPS),
2129  TUASSERTE(gnsstk::CommonTime, ct-3600, uut.getFirstTime(sat23));
2130  TUASSERTE(gnsstk::CommonTime, ct-3510, uut.getLastTime(sat23));
2131  TUASSERTE(gnsstk::CommonTime, ct-3600, uut.getFirstTime(sat7));
2132  TUASSERTE(gnsstk::CommonTime, ct-3570, uut.getLastTime(sat7));
2133  TUASSERTE(gnsstk::CommonTime, ct-3600, uut.getFirstTime(sat11));
2134  TUASSERTE(gnsstk::CommonTime, ct-3570, uut.getLastTime(sat11));
2136  uut.getFirstTime(sat12));
2138  uut.getLastTime(sat12));
2140  uut.getFirstTime(sat23R));
2142  uut.getLastTime(sat23R));
2143  TURETURN();
2144 }
2145 
2146 
2147 int main()
2148 {
2149  NavDataFactoryWithStore_T testClass;
2150  unsigned errorTotal = 0;
2151 
2152  errorTotal += testClass.addNavDataTest();
2153  errorTotal += testClass.addNavDataTimeTest();
2154  errorTotal += testClass.editTest();
2155  errorTotal += testClass.clearTest();
2156  errorTotal += testClass.findTest();
2157  errorTotal += testClass.find2Test();
2158  errorTotal += testClass.findNearestTest();
2159  errorTotal += testClass.findXmitHealthTest();
2160  errorTotal += testClass.getOffsetTest();
2161  errorTotal += testClass.getOffset2Test();
2162  errorTotal += testClass.getAvailableSatsTest();
2163  errorTotal += testClass.getIndexSetTest();
2164  errorTotal += testClass.isPresentTest();
2165  errorTotal += testClass.countTest();
2166  errorTotal += testClass.getFirstLastTimeTest();
2167 
2168  std::cout << "Total Failures for " << __FILE__ << ": " << errorTotal
2169  << std::endl;
2170 
2171  return errorTotal;
2172 }
TestClass::addDataSource
bool addDataSource(const std::string &source) override
Definition: NavDataFactoryWithStore_T.cpp:114
gnsstk::NavDataPtr
std::shared_ptr< NavData > NavDataPtr
Factories instantiate these in response to find() requests.
Definition: NavData.hpp:62
gnsstk::NavSignalID::nav
NavType nav
Navigation message structure of this signal.
Definition: NavSignalID.hpp:96
NavDataFactoryWithStore_T::addNavDataTimeTest
unsigned addNavDataTimeTest()
Definition: NavDataFactoryWithStore_T.cpp:278
gnsstk::NavMessageID
Class used to identify/categorize navigation message data.
Definition: NavMessageID.hpp:52
gnsstk::GPSLNavHealth::svHealth
uint8_t svHealth
6-bit or 8-bit health.
Definition: GPSLNavHealth.hpp:80
NavDataFactoryWithStore_T
Definition: NavDataFactoryWithStore_T.cpp:145
gnsstk::SatID::makeWild
void makeWild()
Definition: SatID.cpp:74
NavDataFactoryWithStore_T::findTest
unsigned findTest()
Definition: NavDataFactoryWithStore_T.cpp:387
FakeODK
Used to test the proper setting of initialTime/finalTime.
Definition: NavDataFactoryWithStore_T.cpp:87
FakeODK::validate
bool validate() const override
Definition: NavDataFactoryWithStore_T.cpp:95
TUCATCH
#define TUCATCH(STATEMENT)
Definition: TestUtil.hpp:193
NavDataFactoryWithStore_T::getAvailableSatsTest
unsigned getAvailableSatsTest()
Definition: NavDataFactoryWithStore_T.cpp:1799
L1
gnsstk::Matrix< double > L1
Definition: Matrix_LUDecomp_T.cpp:46
NavDataFactoryWithStore_T::getIndexSetTest
unsigned getIndexSetTest()
Definition: NavDataFactoryWithStore_T.cpp:1867
gnsstk::NavMessageMap
std::map< NavMessageType, NavSatMap > NavMessageMap
Map nav message type to the rest of the storage.
Definition: NavData.hpp:71
TestClass::numSatellitesNearest
size_t numSatellitesNearest() const
Definition: NavDataFactoryWithStore_T.cpp:131
TUASSERTE
#define TUASSERTE(TYPE, EXP, GOT)
Definition: TestUtil.hpp:81
gnsstk::CarrierBand
CarrierBand
Definition: CarrierBand.hpp:54
gnsstk::NavMessageID::messageType
NavMessageType messageType
Definition: NavMessageID.hpp:97
TUFAIL
#define TUFAIL(MSG)
Definition: TestUtil.hpp:228
gnsstk::NavSatelliteID
Definition: NavSatelliteID.hpp:57
gnsstk::SatelliteSystem
SatelliteSystem
Supported satellite systems.
Definition: SatelliteSystem.hpp:55
gnsstk::TrackingCode::Y
@ Y
Encrypted legacy GPS precise code.
gnsstk::NavSatelliteIDSet
std::set< NavSatelliteID > NavSatelliteIDSet
Definition: NavSatelliteID.hpp:174
gnsstk::CarrierBand::Any
@ Any
Used to match any carrier band.
example5.oid
oid
Definition: example5.py:29
gnsstk::SatID
Definition: SatID.hpp:89
gnsstk::NavMessageType::Health
@ Health
SV health status information message.
FakeODK::clone
gnsstk::NavDataPtr clone() const override
Create a deep copy of this object.
Definition: NavDataFactoryWithStore_T.cpp:93
gnsstk::StringUtils::asString
std::string asString(IonexStoreStrategy e)
Convert a IonexStoreStrategy to a whitespace-free string name.
Definition: IonexStoreStrategy.cpp:46
gnsstk::SatID::wildId
bool wildId
If true, any satellite matches.
Definition: SatID.hpp:155
GPSLNavHealth.hpp
gnsstk::CommonTime::setTimeSystem
CommonTime & setTimeSystem(TimeSystem timeSystem)
Definition: CommonTime.hpp:195
NavDataFactoryWithStore_T::fillSat
void fillSat(gnsstk::NavSatelliteID &satellite, unsigned long sat, unsigned long xmitSat, gnsstk::SatelliteSystem sys=gnsstk::SatelliteSystem::GPS, gnsstk::CarrierBand car=gnsstk::CarrierBand::L1, gnsstk::TrackingCode code=gnsstk::TrackingCode::CA, gnsstk::NavType nav=gnsstk::NavType::GPSLNAV)
Definition: NavDataFactoryWithStore_T.cpp:1688
NavDataFactoryWithStore_T::clearTest
unsigned clearTest()
Definition: NavDataFactoryWithStore_T.cpp:1550
gnsstk::StdNavTimeOffset::deltatLS
double deltatLS
Current or past leap second count (UTC only).
Definition: StdNavTimeOffset.hpp:125
gnsstk::GALWeekSecond
Definition: GALWeekSecond.hpp:56
gnsstk::CommonTime::BEGINNING_OF_TIME
static const GNSSTK_EXPORT CommonTime BEGINNING_OF_TIME
earliest representable CommonTime
Definition: CommonTime.hpp:102
TestClass::getNearestData
gnsstk::NavNearMessageMap & getNearestData()
Definition: NavDataFactoryWithStore_T.cpp:112
main
int main()
Definition: NavDataFactoryWithStore_T.cpp:2147
FakeODK::svRelativity
double svRelativity(const gnsstk::CommonTime &when) const override
Definition: NavDataFactoryWithStore_T.cpp:100
gnsstk::SVHealth
SVHealth
Identify different types of SV health states.
Definition: SVHealth.hpp:52
gnsstk::NavValidityType
NavValidityType
Definition: NavValidityType.hpp:53
gnsstk::NavData::signal
NavMessageID signal
Source signal identification for this navigation message data.
Definition: NavData.hpp:175
gnsstk::NavSearchOrder
NavSearchOrder
Specify the behavior of nav data searches in NavLibrary/NavDataFactory.
Definition: NavSearchOrder.hpp:51
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::NavType::GPSLNAV
@ GPSLNAV
NavDataFactoryWithStore_T::ct5
gnsstk::CommonTime ct5
Definition: NavDataFactoryWithStore_T.cpp:198
gnsstk::CarrierBand::L2
@ L2
GPS L2, QZSS L2.
gnsstk::GPSWeekSecond
Definition: GPSWeekSecond.hpp:56
NavDataFactoryWithStore_T::gws5
gnsstk::GPSWeekSecond gws5
Definition: NavDataFactoryWithStore_T.cpp:197
gnsstk::Exception
Definition: Exception.hpp:151
gnsstk::ObservationType::NavMsg
@ NavMsg
Navigation Message data.
gnsstk::SatelliteSystem::GPS
@ GPS
gnsstk::SVHealth::Any
@ Any
Use in searches when you don't care about the SV health.
gnsstk::TrackingCode::CA
@ CA
Legacy GPS civil code.
NavDataFactoryWithStore_T::find2Test
unsigned find2Test()
Definition: NavDataFactoryWithStore_T.cpp:432
gnsstk::CommonTime::END_OF_TIME
static const GNSSTK_EXPORT CommonTime END_OF_TIME
latest representable CommonTime
Definition: CommonTime.hpp:104
gnsstk::NavType::Any
@ Any
Used to match any nav code.
gnsstk::NavSignalID::obs
ObsID obs
Carrier, tracking code, etc.
Definition: NavSignalID.hpp:95
gnsstk::NavSignalID::system
SatelliteSystem system
GNSS for this signal.
Definition: NavSignalID.hpp:94
TUASSERT
#define TUASSERT(EXPR)
Definition: TestUtil.hpp:63
gnsstk::TimeOffsetData::getOffset
virtual bool getOffset(TimeSystem fromSys, TimeSystem toSys, const CommonTime &when, double &offset) const =0
NavDataFactoryWithStore_T::gws
gnsstk::GPSWeekSecond gws
Definition: NavDataFactoryWithStore_T.cpp:197
TestUtil.hpp
NavDataFactoryWithStore_T::addData
void addData(gnsstk::TestUtil &testFramework, TestClass &fact, const gnsstk::CommonTime &ct, unsigned long sat, unsigned long xmitSat, gnsstk::SatelliteSystem sys=gnsstk::SatelliteSystem::GPS, gnsstk::CarrierBand car=gnsstk::CarrierBand::L1, gnsstk::TrackingCode code=gnsstk::TrackingCode::CA, gnsstk::NavType nav=gnsstk::NavType::GPSLNAV, gnsstk::SVHealth hea=gnsstk::SVHealth::Healthy, gnsstk::NavMessageType nmt=gnsstk::NavMessageType::Ephemeris)
Add a single NavData with the given parameters.
Definition: NavDataFactoryWithStore_T.cpp:1601
gnsstk::ObservationType::Any
@ Any
Used to match any observation type.
gnsstk::SVHealth::Healthy
@ Healthy
Satellite is in a healthy and useable state.
gnsstk::NavMessageType::Unknown
@ Unknown
Message type is not known or is uninitialized.
TestClass::getFactoryFormats
std::string getFactoryFormats() const override
Definition: NavDataFactoryWithStore_T.cpp:140
TURETURN
#define TURETURN()
Definition: TestUtil.hpp:232
gnsstk::NavValidityType::InvalidOnly
@ InvalidOnly
Only load/find nav messages that fail validity checks.
NavDataFactoryWithStore_T::findNearestTest
unsigned findNearestTest()
Definition: NavDataFactoryWithStore_T.cpp:869
gnsstk::SatelliteSystem::Unknown
@ Unknown
gnsstk::NavValidityType::ValidOnly
@ ValidOnly
Only load/find nav messages that pass validity checks.
TestClass::getData
gnsstk::NavMessageMap & getData()
Grant access to protected data.
Definition: NavDataFactoryWithStore_T.cpp:110
gnsstk::ObsID
Definition: ObsID.hpp:82
gnsstk::TimeOffsetData
Definition: TimeOffsetData.hpp:60
NavDataFactoryWithStore_T::getOffset2Test
unsigned getOffset2Test()
Definition: NavDataFactoryWithStore_T.cpp:1212
gnsstk::NavSatelliteID::sat
SatID sat
ID of satellite to which the nav data applies.
Definition: NavSatelliteID.hpp:169
gnsstk::operator<<
std::ostream & operator<<(std::ostream &s, const ObsEpoch &oe) noexcept
Definition: ObsEpochMap.cpp:54
gnsstk::CommonTime
Definition: CommonTime.hpp:84
gnsstk::WeekSecond::sow
double sow
Definition: WeekSecond.hpp:155
FakeODK::FakeODK
FakeODK()
Definition: NavDataFactoryWithStore_T.cpp:90
NavDataFactoryWithStore_T::fillFactoryXmitHealth
void fillFactoryXmitHealth(gnsstk::TestUtil &testFramework, TestClass &fact)
Fill fact with test data for findXmitHealthTest()
Definition: NavDataFactoryWithStore_T.cpp:1728
gnsstk::CarrierBand::L1
@ L1
GPS L1, Galileo E1, SBAS L1, QZSS L1, BeiDou L1.
gnsstk::Xvt
Definition: Xvt.hpp:60
CivilTime.hpp
gnsstk::NavValidityType::Any
@ Any
Load/find nav messages regardless of validity checks.
TUDEF
#define TUDEF(CLASS, METHOD)
Definition: TestUtil.hpp:56
NavDataFactoryWithStore_T::NavDataFactoryWithStore_T
NavDataFactoryWithStore_T()
Initialize time objects used for stamping fake nav data.
Definition: NavDataFactoryWithStore_T.cpp:203
TestClass::sizeNearest
size_t sizeNearest() const
Definition: NavDataFactoryWithStore_T.cpp:116
NavDataFactoryWithStore_T::fillFactory
void fillFactory(gnsstk::TestUtil &testFramework, TestClass &fact)
Fill fact with test data.
Definition: NavDataFactoryWithStore_T.cpp:1585
NavDataFactoryWithStore_T::ct
gnsstk::CommonTime ct
Definition: NavDataFactoryWithStore_T.cpp:198
NavDataFactoryWithStore_T::addNavDataTest
unsigned addNavDataTest()
Definition: NavDataFactoryWithStore_T.cpp:217
gnsstk::SatID::system
SatelliteSystem system
System for this satellite.
Definition: SatID.hpp:156
gnsstk::TimeSystem::UTC
@ UTC
Coordinated Universal Time (e.g., from NTP)
example3.data
data
Definition: example3.py:22
TestClass::isPresent
bool isPresent(const gnsstk::NavMessageID &nmid, const gnsstk::CommonTime &fromTime, const gnsstk::CommonTime &toTime) override
Definition: NavDataFactory_T.cpp:106
gnsstk::CivilTime
Definition: CivilTime.hpp:55
gnsstk::NavMessageType::TimeOffset
@ TimeOffset
Message containing information about time system offsets.
gnsstk::GPSLNavTimeOffset
Definition: GPSLNavTimeOffset.hpp:53
gnsstk::NavSignalID
Class used to identify navigation data signal types.
Definition: NavSignalID.hpp:54
GPSWeekSecond.hpp
gnsstk::TrackingCode
TrackingCode
Definition: TrackingCode.hpp:64
gnsstk::TimeSystem::GPS
@ GPS
GPS system time.
gnsstk::OrbitDataKepler
Base class for orbit information that uses Keplerian parameters.
Definition: OrbitDataKepler.hpp:52
gnsstk::NavMessageType
NavMessageType
Identify different types of navigation message data.
Definition: NavMessageType.hpp:59
gnsstk::NavMessageType::Ephemeris
@ Ephemeris
Precision orbits for the transmitting SV.
NavDataFactoryWithStore_T::isPresentTest
unsigned isPresentTest()
Definition: NavDataFactoryWithStore_T.cpp:1934
TestClass::getOffset
bool getOffset(gnsstk::TimeSystem fromSys, gnsstk::TimeSystem toSys, const gnsstk::CommonTime &when, gnsstk::NavDataPtr &offset, gnsstk::SVHealth xmitHealth, gnsstk::NavValidityType valid) override
Definition: NavDataFactory_T.cpp:71
NavDataFactoryWithStore_T::getOffsetTest
unsigned getOffsetTest()
Definition: NavDataFactoryWithStore_T.cpp:1170
TestClass
Make GroupPathCorrector instantiatable for testing.
Definition: GroupPathCorrector_T.cpp:56
BDSWeekSecond.hpp
TUASSERTFE
#define TUASSERTFE(EXP, GOT)
Definition: TestUtil.hpp:103
GNSSTK_THROW
#define GNSSTK_THROW(exc)
Definition: Exception.hpp:366
NavDataFactoryWithStore_T::editTest
unsigned editTest()
Definition: NavDataFactoryWithStore_T.cpp:1351
GPSLNavTimeOffset.hpp
NavDataFactoryWithStore_T::getFirstLastTimeTest
unsigned getFirstLastTimeTest()
Definition: NavDataFactoryWithStore_T.cpp:2119
gnsstk::SatelliteSystem::Glonass
@ Glonass
gnsstk::NavSearchOrder::User
@ User
Return the latest message before the search time.
NavDataFactoryWithStore_T::fillSignal
void fillSignal(gnsstk::NavSignalID &signal, gnsstk::SatelliteSystem sys=gnsstk::SatelliteSystem::GPS, gnsstk::CarrierBand car=gnsstk::CarrierBand::L1, gnsstk::TrackingCode code=gnsstk::TrackingCode::CA, gnsstk::NavType nav=gnsstk::NavType::GPSLNAV)
Definition: NavDataFactoryWithStore_T.cpp:1678
gnsstk::GPSLNavEph
Class containing data elements unique to GPS LNav ephemerides.
Definition: GPSLNavEph.hpp:51
gnsstk::BDSWeekSecond
Definition: BDSWeekSecond.hpp:56
gnsstk::NavID
Definition: NavID.hpp:61
gnsstk::NavType
NavType
Supported navigation types.
Definition: NavType.hpp:58
GPSLNavEph.hpp
TestClass::getAvailableSats
gnsstk::NavSatelliteIDSet getAvailableSats(const gnsstk::CommonTime &fromTime, const gnsstk::CommonTime &toTime) const override
Definition: NavDataFactory_T.cpp:84
gnsstk::NavNearMessageMap
std::map< NavMessageType, NavNearSatMap > NavNearMessageMap
Map nav message type to the rest of the storage.
Definition: NavData.hpp:81
L2
gnsstk::Matrix< double > L2
Definition: Matrix_LUDecomp_T.cpp:46
gnsstk::SVHealth::Unhealthy
@ Unhealthy
Satellite is unhealthy and should not be used.
NavDataFactoryWithStore_T::countTest
unsigned countTest()
Definition: NavDataFactoryWithStore_T.cpp:2032
gnsstk::XmitAnt::Any
@ Any
When making comparisons in ObsID, matches any enumeration.
GPSLNavAlm.hpp
NavDataFactoryWithStore.hpp
gnsstk::NavSatelliteID::xmitSat
SatID xmitSat
ID of the satellite transmitting the nav data.
Definition: NavSatelliteID.hpp:170
NavDataFactoryWithStore_T::checkForEmpty
void checkForEmpty(gnsstk::TestUtil &testFramework, TestClass &fact)
Check to make sure there are no empty maps in fact.
Definition: NavDataFactoryWithStore_T.cpp:1700
gnsstk::TestUtil
Definition: TestUtil.hpp:265
FakeODK::getXvt
bool getXvt(const gnsstk::CommonTime &when, gnsstk::Xvt &xvt, const gnsstk::ObsID &oid=gnsstk::ObsID()) override
Definition: NavDataFactoryWithStore_T.cpp:97
gnsstk::TimeSystem::BDT
@ BDT
BeiDou system Time.
gnsstk::GPSLNavAlm
Class containing data elements unique to GPS LNav almanac pages.
Definition: GPSLNavAlm.hpp:50
gnsstk::StdNavTimeOffset::refTime
CommonTime refTime
Reference time for computation.
Definition: StdNavTimeOffset.hpp:126
GALWeekSecond.hpp
gnsstk::TrackingCode::Any
@ Any
Used to match any tracking code.
NavDataFactoryWithStore_T::findXmitHealthTest
unsigned findXmitHealthTest()
Test find with various xmitHealth settings.
Definition: NavDataFactoryWithStore_T.cpp:1762
TimeString.hpp
TestClass::find
bool find(const gnsstk::NavMessageID &nmid, const gnsstk::CommonTime &when, gnsstk::NavDataPtr &navData, gnsstk::SVHealth xmitHealth, gnsstk::NavValidityType valid, gnsstk::NavSearchOrder order) override
Definition: NavDataFactory_T.cpp:67
gnsstk::SatelliteSystem::Galileo
@ Galileo
gnsstk::NavMessageType::Almanac
@ Almanac
Low-precision orbits for other than the transmitting SV.
gnsstk::CarrierBand::L5
@ L5
GPS L5, Galileo E5a, SBAS L5, QZSS L5, BeiDou B2a, NavIC L5.
gnsstk::NavDataFactoryWithStore
Definition: NavDataFactoryWithStore.hpp:63
gnsstk::GPSLNavHealth
Definition: GPSLNavHealth.hpp:51


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:40