예제 #1
0
   // Try to convert the given pages into an EngEphemeris object. Returns true
   // upon success.
   bool makeEngEphemeris(EngEphemeris& eph, const EphemerisPages& pages)
   {
      EphemerisPages::const_iterator sf[4];

      sf[1] = pages.find(1);
      if (sf[1] == pages.end())
         return false;
      
      sf[2] = pages.find(2);
      if (sf[2] == pages.end())
         return false;

      sf[3] = pages.find(3);
      if (sf[3] == pages.end())
         return false;

      long t1 = sf[1]->second.getHOWTime();
      long t2 = sf[2]->second.getHOWTime();
      long t3 = sf[3]->second.getHOWTime();
      if (t2 != t1+6 || t3 != t1+12)
         return false;

      int prn = sf[1]->second.prn;
      int week = sf[1]->second.time.GPSfullweek();
      long sfa[10];
      long long_sfa[10];

      for (int i=1; i<=3; i++)
      {
         sf[i]->second.fillArray(sfa);
         for( int j = 0; j < 10; j++ )
            long_sfa[j] = static_cast<long>( sfa[j] );
         if (!eph.addSubframe(long_sfa, week, prn, 0))
            return false;
      }

      if (eph.isData(1) && eph.isData(2) && eph.isData(3))
         return true;

      return false;
   }
예제 #2
0
void MinSfTest::process()
{
   if (debugLevel)
      cout << "Setting up input file: " 
           <<  inputOption.getValue().front() << endl;
   FileFilterFrame<FICStream, FICData>
      input(inputOption.getValue().front());
   
   printf(" input.getDataCount() after init: %d\n", input.getDataCount());
   if(debugLevel)
      cout << "Setting up output file: "
           << outputOption.getValue().front() << endl;
           
   fp.open( outputOption.getValue().front().c_str() );
   if ( !fp.is_open() )
   {
      printf(" Failed to open output file.\n");
      exit(1);
   }
           
      // filter the FIC data for the requested vlock(s)
   std::list<long> blockList;
   blockList.push_back(109);
   input.filter(FICDataFilterBlock(blockList));
   input.sort(FICDataOperatorLessThanBlock109());
   input.unique(FICDataUniqueBlock109());
   
      //some hand waving for the data conversion
   if(debugLevel)
      cout << "Reading the input data." << endl;
   list<FICData>& ficList = input.getData();
   list<FICData>::iterator itr = ficList.begin();
   
   DayTime earliest( DayTime::END_OF_TIME );
   DayTime latest( DayTime::BEGINNING_OF_TIME );
   int count = 0;
   int numMismatches = 0;
   int numMismatchEph = 0; 
   while (itr != ficList.end())
   {
      EngEphemeris ee(*itr);

      bc109.addEphemeris( ee );

      DayTime ct = ee.getEpochTime();
      if (ct>latest) latest = ct;
      if (ct<earliest) earliest = ct;
      
         // Following code simulates a situation where only words 3-10
         // and the estimated time of receipt are available.
      DayTime timeOfReceipt = ee.getTransmitTime();
      FICData& fic = *itr;
      long sf1min[8];
      long sf2min[8];
      long sf3min[8];
      int wrdCnt = 8;
      int i;
      for (i=0; i<wrdCnt; ++i) sf1min[i] = fic.i[4+i];   
      for (i=0; i<wrdCnt; ++i) sf2min[i] = fic.i[14+i];   
      for (i=0; i<wrdCnt; ++i) sf3min[i] = fic.i[24+i];  

      EngEphemeris eeMin;
      short PRNID = (short) fic.i[1];
      eeMin.addIncompleteSF1Thru3( sf1min, sf2min, sf3min,
             (long) timeOfReceipt.GPSsecond(), timeOfReceipt.GPSfullweek(),
             PRNID, 0 );
      minRaw.addEphemeris( eeMin );
      
         // Compare non-orbit portions of the two objects
      bool mismatch = false;
      for (int i=1; i<=3; ++i)
      {
         if (!ee.isData(i) || !eeMin.isData(i))
         {
            mismatch = true;
            fp << "ERROR: not all subframes are claimed available.";
         }
      }
      
      if (ee.getIODC()!=eeMin.getIODC()) 
      {
         mismatch = true;
         fp << "ERROR: IODCs do not match."; 
      }
      if (ee.getIODE()!=eeMin.getIODE()) 
      {
         mismatch = true;
         fp << "ERROR: IODCs do not match."; 
      }
      if (ee.getFitInterval() != eeMin.getFitInterval() )
      {
         mismatch = true;
         fp << "ERROR: fit intervals do not match.";
      }
      if (ee.getCodeFlags()!=eeMin.getCodeFlags() )
      {
         mismatch = true;
         fp << "ERROR: code flags do not match.";
      }
      if (ee.getL2Pdata()!=eeMin.getL2Pdata() )
      {
         mismatch = true;
         fp << "ERROR: L2P data flags do not match.";
      }
      if (ee.getAccuracy()!=eeMin.getAccuracy() )
      {
         mismatch = true;
         fp << "ERROR: accuracy values do not match.";
      }
      if (ee.getAccFlag()!=eeMin.getAccFlag() )
      {
         mismatch = true;
         fp << "ERROR: accuracy flags do not match.";
      }
      if (ee.getHealth()!=eeMin.getHealth() )
      {
         mismatch = true;
         fp << "ERROR: health values do not match.";
      }
      if (ee.getFitInt()!=eeMin.getFitInt() )
      {
         mismatch = true;
         fp << "ERROR: Fit interval values do not match.";
      }

      if (mismatch)
      {
         fp << " PRNID: " << PRNID << ", IODC: 0x " << hex << ee.getIODC() << dec << endl;
         numMismatches++;
      }
      
      itr++;
      count++;
   }
   cout << "Number of Block 109 records read: " << count << endl;
   if (numMismatches!=0)
   {
      printf("Errors detected.  Some ephemerides did not match in both forms.\n");
      printf("Number of mismatches: %d\n",numMismatches);
   }
   fp << "Number of mismatches detected: " << numMismatches << endl;
   if (debugLevel) cout << "done." << endl;
   

      // Generate test positions for PRN 1 and PRN 31 at
      // earliest epoch, latest epoch, and middle of the time span.
   try
   {
      double timeDuration = latest - earliest;
      DayTime middle( earliest );
      middle += (timeDuration/2);

      short IODC109 = -1;
      short IODCMin = -1;
      short PRNID = 1;
      printf("--- PRN 1 Examples ---\n");
      printf("\nEarliest time\n");
      fp << "--- PRN 1 Examples ---" << endl;
      fp << endl << "Earliest time" << endl;
      testXvt( PRNID, earliest );
      printf("\nMiddle time\n");
      fp << endl << "Middle time" << endl;
      testXvt( PRNID, middle );
      printf("\nLatest time\n");
      fp << endl << "Latest time" << endl;
      testXvt( PRNID, latest );

      PRNID = 31;      
      printf("\n--- PRN 31 Examples ---\n");
      printf("\nEarliest time\n");
      fp << endl << "--- PRN 31 Examples ---" << endl;
      fp << endl << "Earliest time" << endl;
      testXvt( PRNID, earliest );
      printf("\nMiddle time\n");
      fp << endl << "Middle time" << endl;
      testXvt( PRNID, middle );
      printf("\nLatest time\n");
      fp << endl << "Latest time" << endl;
      testXvt( PRNID, latest );
   }
   catch (gpstk::Exception& e)
   {
      cout << e << endl;
   }
   
   printf("\nBCEphemerisStore directly from existing FIC handlers.\n");
   fp << endl << "BCEphemerisStore directly from existing FIC handlers." << endl;
   bc109.dump(1, fp);
   printf("BCEphemerisStore from new method.\n");
   fp << endl << "BCEphemerisStore from new method." << endl;
   minRaw.dump(1, fp);
   
      // write the file data
   if (debugLevel) cout << "Conversion complete." << endl;
}