def process(self,gnssRaw): # clean invalid data in gnssRaw gnssRaw = self.filterValid(gnssRaw) # gnssRaw : dict allRxMilliseconds = gnssRaw['allRxMillis'].astype(np.float64) self.FctSeconds = np.unique(allRxMilliseconds) * 1e-3 self.Svid = gnssRaw['Svid'] nmeas = len(self.Svid) self._prepData(nmeas,gnssRaw) # GPS week number weekNumber = np.floor( - gnssRaw['FullBiasNanos'] * 1e-9 / GnssConstants.WEEKSEC) # GPS day number # dayNumber = np.floor( - gnssRaw['FullBiasNanos']*1e-9 / GnssConstants.DAYSEC) # GPS time of week towSeconds = (gnssRaw['TimeNanos'] - gnssRaw['BiasNanos']) * 1e-9 # compute time of measurement relative to start of week # subtract big longs (i.e. time from 1980) before casting time of week as double weekNumberNanos = np.int64(weekNumber * GnssConstants.WEEKSEC * 1e9) # compute tRxNanos using gnssRaw.FullBiasNanos(1), so that # tRxNanos includes rx clock drift since the first epoch: tRxNanos = gnssRaw['TimeNanos'] - self.fullBiasNanos - weekNumberNanos gnssRaw['State'] = gnssRaw['State'].astype(np.int) State = gnssRaw['State'][0] if not ((State & 2**3) or (State & 2**7)) : raise Exception('gnssRaw.State[0] must have bits 0 and (3 or 7) before calling Process') if not(np.all(tRxNanos >= 0)): raise Exception('tRxNanos should be >= 0') tRxGnssSeconds = tRxNanos - gnssRaw['TimeOffsetNanos'] - gnssRaw['BiasNanos'] tRxSeconds = np.zeros(tRxGnssSeconds.shape) # tRx at positions of GPS gpspos = ((gnssRaw['ConstellationType'] == 1) * (gnssRaw['State'] & 2**3))!=0 tRxSeconds[gpspos] = np.mod(tRxGnssSeconds[gpspos],GnssConstants.WEEKSEC*1e9)*1e-9 # tRx at position of BDS bdspos = ((gnssRaw['ConstellationType'] == 5) * (gnssRaw['State'] & 2**3))!=0 tRxSeconds[bdspos] = np.mod(tRxGnssSeconds[bdspos],GnssConstants.WEEKSEC*1e9)*1e-9 - 14 # tRx at position of GEO galpos = ((gnssRaw['ConstellationType'] == 6) * (gnssRaw['State'] & 2**3))!=0 tRxSeconds[galpos] = np.mod(tRxGnssSeconds[galpos],GnssConstants.MILLISEC*1e9)*1e-9 # tRx at positions of GLO glspos = ((gnssRaw['ConstellationType'] == 3) * (gnssRaw['State'] & 2**7))!=0 utctime = Time.Gps2Utc(weekNumber,towSeconds,allRxMilliseconds*1e-3) leapsecs = Time.LeapSeconds(utctime) tRxSeconds[glspos] = np.mod(tRxGnssSeconds[glspos],GnssConstants.DAYSEC*1e9)*1e-9 + (3*60*60 - leapsecs[glspos]) tTxSeconds = (gnssRaw['ReceivedSvTimeNanos'] + gnssRaw['TimeOffsetNanos'])*1e-9 prSeconds = tRxSeconds - tTxSeconds tRxSeconds[glspos==0],prSeconds[glspos==0] = self.checkGpsTimeRollover(tRxSeconds[glspos==0],prSeconds[glspos==0],'week') tRxSeconds[glspos],prSeconds[glspos] = self.checkGpsTimeRollover(tRxSeconds[glspos],prSeconds[glspos],'day') PrM = prSeconds * GnssConstants.LIGHTSPEED PrSigmaM = gnssRaw['ReceivedSvTimeUncertaintyNanos'] * 1e-9 * GnssConstants.LIGHTSPEED PrrMps = gnssRaw['PseudorangeRateMetersPerSecond'] PrrSigmaMps = gnssRaw['PseudorangeRateUncertaintyMetersPerSecond'] AdrM = gnssRaw['AccumulatedDeltaRangeMeters'] AdrSigmaM = gnssRaw["AccumulatedDeltaRangeUncertaintyMeters"] AdrState = gnssRaw['AccumulatedDeltaRangeState'] Cn0DbHz = gnssRaw['Cn0DbHz'] ConstellationType = gnssRaw['ConstellationType'] CarrierFrequencyHz = gnssRaw['CarrierFrequencyHz'] self.fctTime = weekNumber[0] * GnssConstants.WEEKSEC + tRxSeconds[gpspos][0] self.GpsTime = Time.Fct2Ymdhms(np.array([self.fctTime]))[0] self.tRxSeconds = tRxSeconds self.tTxSeconds = tTxSeconds self.PrM = PrM self.PrSigmaM = PrSigmaM self.PrrMps = PrrMps self.PrrSigmaMps= PrrSigmaMps self.AdrM = AdrM self.AdrSigmaM = AdrSigmaM self.AdrState = AdrState self.Cn0DbHz = Cn0DbHz self.ConstellationType = ConstellationType self.CarrierFrequencyHz = CarrierFrequencyHz self.ClkDCount = gnssRaw['HardwareClockDiscontinuityCount'][0] if gnssRaw['HardwareClockDiscontinuityCount'][0] != gnssRaw['HardwareClockDiscontinuityCount'][-1]: raise Exception('HardwareClockDiscontinuityCount changed within the same epoch') self.freqSign(gnssRaw) self.DelPrM = self._getDelPr() # self.PhaseMeas = self._getPhaseMeas() # self.PhaseMeas = self.AdrM / AdrMconstBias.getStandardWaveL(self.freqNum,self.ConstellationType,self.CarrierFrequencyHz) self.PhaseMeas = self.AdrM / AdrMconstBias.getStandardWaveL(self.freqNum,self.ConstellationType,self.Svid) self.PhaseMeas[(self.AdrState & 2**0) == 0] = np.nan self.iepoch += 1 return None