void CT_LbsClientPosTp2::CheckPositionSatelliteInfoL(TPositionSatelliteInfo& aSatelliteInfo) { CheckPositionCourseInfoL(aSatelliteInfo); if((TUint)aSatelliteInfo.NumSatellitesUsed() != KNumberOfSatellitesUsed || aSatelliteInfo.SatelliteTime() != TTime(KSatelliteTime) || (TUint)aSatelliteInfo.NumSatellitesInView() != KNumberOfSatellitesInView || aSatelliteInfo.HorizontalDoP() != KHorizontalDoPValue || aSatelliteInfo.VerticalDoP() != KVerticalDoPValue || aSatelliteInfo.TimeDoP() != KTimeDoPValue) { _LIT(KErrBasicSat, "Basic satellite information not correct"); LogErrorAndLeaveL(KErrBasicSat); } TInt sats = aSatelliteInfo.NumSatellitesInView(); for (int i = 0; i < sats; i++) { TSatelliteData satelliteData; TInt err = aSatelliteInfo.GetSatelliteData(i,satelliteData); if (err != KErrNone) { _LIT(KErrGetSat, "Not possible to get satellite data, error code = %d"); TBuf<100> buf; buf.Format(KErrGetSat, err); LogErrorAndLeaveL(buf); } if ( (i%2) == 0 ) { if( satelliteData.SatelliteId() != (KSatelliteId +i) || satelliteData.Azimuth() != KAzimuth || satelliteData.Elevation() != KElevation || satelliteData.IsUsed() != KIsUsed || satelliteData.SignalStrength() != KSignalStrength) { _LIT(KErrSatDataEven, "Incorrect satellite data on even satellites"); LogErrorAndLeaveL(KErrSatDataEven); } } else { if( satelliteData.SatelliteId() != (KSatelliteId +i) || satelliteData.Azimuth() != KAzimuthOdd || satelliteData.Elevation() != KElevationOdd || satelliteData.IsUsed() != KIsUsedOdd || satelliteData.SignalStrength() != KSignalStrengthOdd) { _LIT(KErrSatDataOdd, "Incorrect satellite data on odd satellites"); LogErrorAndLeaveL(KErrSatDataOdd); } } } }
void XQLocationPrivate::DeliverPositionerResults(TPositionSatelliteInfo aPositionInfo) { TPosition pos; aPositionInfo.GetPosition(pos); // Handle speed reporting float speed = 0; if (speedAvailable) { // Positioning module is able to offer speed information TCourse course; aPositionInfo.GetCourse(course); speed = course.Speed(); if (isnan(speed)) { speed = 0; } } else { // Positioning module does not offer speed information // => Speed is calculated using position information & timestamps TTime posTime; TTimeIntervalSeconds interval; for (int i = iPositions.Count()-1 ; i >= 0; i--) { if (pos.Time().SecondsFrom(iPositions[i].Time(),interval) == KErrNone) { if (interval.Int() > 10) { pos.Speed(iPositions[i], speed); break; } } } while (iPositions.Count() > 0) { if (pos.Time().SecondsFrom(iPositions[0].Time(),interval) == KErrNone) { if (interval.Int() > 60) { iPositions.Remove(0); } else { break; } } } if (iPositions.Count() > 0) { if (pos.Time().SecondsFrom(iPositions[iPositions.Count()-1].Time(),interval) == KErrNone) { if (interval.Int() > 1) { iPositions.Append(pos); } } } else { iPositions.Append(pos); } // Accept speed from range 0.01 m/s (0.036 km/h) to 200 m/s (720 km/h) if (speed < 0.01 || speed > 200) { speed = 0; } } if (speed != iPreviousSpeed) { emit ipParent->speedChanged(speed); } iPreviousSpeed = speed; // Handle satellite information reporting if (satelliteInfoAvailable) { if (aPositionInfo.NumSatellitesInView() != iPreviousNumSatellitesInView) { emit ipParent->numberOfSatellitesInViewChanged(aPositionInfo.NumSatellitesInView()); } iPreviousNumSatellitesInView = aPositionInfo.NumSatellitesInView(); if (aPositionInfo.NumSatellitesUsed() != iPreviousNumSatellitesUsed) { emit ipParent->numberOfSatellitesUsedChanged(aPositionInfo.NumSatellitesUsed()); } iPreviousNumSatellitesUsed = aPositionInfo.NumSatellitesUsed(); } // Handle position information reporting if (iPreviousPosition.Latitude() != pos.Latitude() || iPreviousPosition.Longitude() != pos.Longitude() || iPreviousPosition.Altitude() != pos.Altitude()) { if (!isnan(pos.Latitude()) || !isnan(pos.Longitude()) || !isnan(pos.Altitude())) { emit ipParent->locationChanged(pos.Latitude(),pos.Longitude(),pos.Altitude(),speed); } if (iPreviousPosition.Latitude() != pos.Latitude()) { if (!isnan(pos.Latitude())) { emit ipParent->latitudeChanged(pos.Latitude(),pos.HorizontalAccuracy()); } } if (iPreviousPosition.Longitude() != pos.Longitude()) { if (!isnan(pos.Longitude())) { emit ipParent->longitudeChanged(pos.Longitude(),pos.HorizontalAccuracy()); } } if (iPreviousPosition.Altitude() != pos.Altitude()) { if (!isnan(pos.Altitude())) { emit ipParent->altitudeChanged(pos.Altitude(),pos.VerticalAccuracy()); } } } iPreviousPosition = pos; if (iSingleUpdate) { stopUpdates(); iSingleUpdate = EFalse; } }