void processSubframes1to3(MDPNavSubframe& nav) { // For now, just look at L1 C/A navigation message if (nav.range != rcCA || nav.carrier != ccL1) return; NavIndex ni(RangeCarrierPair(nav.range, nav.carrier), nav.prn); ephData[ni] = nav; long sfa[10]; nav.fillArray(sfa); uint32_t uint_sfa[10]; for( int j = 0; j < 10; j++ ) uint_sfa[j] = static_cast<uint32_t>( sfa[j] ); numSubframesCollected++; if (gpstk::EngNav::checkParity(uint_sfa)) { paritySuccessCount++; ephPageStore[ni][nav.getSFID()] = nav; EngEphemeris engEph; if (makeEngEphemeris(engEph, ephPageStore[ni])) { currentPRN = engEph.getPRNID(); // debug if (firstNavSF) { earliestTime = engEph.getTransmitTime(); firstNavSF = false; } latestTime = engEph.getTransmitTime(); processEphemeris( engEph, ephPageStore[ni] ); } } else parityFailCount++; } // end of process(MDPNavSubframe)
void EphReader::read_mdp_data(const string& fn) { GPSEphemerisStore* bce; if (eph == NULL) { bce = new(GPSEphemerisStore); eph = dynamic_cast<EphemerisStore*>(bce); } else { if (typeid(*eph) != typeid(GPSEphemerisStore)) throw(FFStreamError("Don't mix nav data types...")); bce = dynamic_cast<GPSEphemerisStore*>(eph); } if (verboseLevel>2) cout << "Reading " << fn << " as MDP nav."<< endl; MDPStream mdps(fn.c_str(), ios::in); MDPHeader header; MDPNavSubframe nav; typedef pair<RangeCode, CarrierCode> RangeCarrierPair; typedef pair<RangeCarrierPair, short> NavIndex; typedef map<NavIndex, MDPNavSubframe> NavMap; NavMap ephData; map<NavIndex, EphemerisPages> ephPageStore; map<NavIndex, EngEphemeris> ephStore; bool firstEph=true; while (mdps >> header) if (header.id == MDPNavSubframe::myId) { mdps >> nav; if (!nav) { if (mdps && verboseLevel>2) cout << "Error decoding nav " << endl; } else { MDPNavSubframe tmp = nav; // First try the data assuming it is already upright tmp.cooked = true; bool parityGood = tmp.checkParity(); if (!parityGood) { if (verboseLevel>3 && firstEph) cout << "Raw subframe" << endl; nav.cooked = false; nav.cookSubframe(); parityGood = nav.checkParity(); } else { if (verboseLevel>3 && firstEph) cout << "Cooked subframe" << endl; } firstEph = false; if (!parityGood) { if (verboseLevel>2) cout << "Parity error" << endl; return; } short sfid = nav.getSFID(); if (sfid > 3) return; short week = static_cast<GPSWeekSecond>(nav.time).week; #pragma unused(week) long sow = nav.getHOWTime(); if (sow > FULLWEEK) { if (verboseLevel>2) cout << "Bad week" << endl; return; } if (verboseLevel>3) nav.dump(cout); if (nav.range != rcCA || nav.carrier != ccL1) return; NavIndex ni(RangeCarrierPair(nav.range, nav.carrier), nav.prn); ephData[ni] = nav; ephPageStore[ni][sfid] = nav; EngEphemeris engEph; if (makeEngEphemeris(engEph, ephPageStore[ni])) { bce->addEphemeris(RinexNavData(engEph)); ephPageStore[ni].clear(); } } }