diff options
author | Cyan_Hsieh <cyanhsieh@google.com> | 2020-02-03 14:55:13 +0800 |
---|---|---|
committer | Cyan_Hsieh <cyanhsieh@google.com> | 2020-02-04 21:38:24 +0800 |
commit | 21b02b0b59e62e7712c1239e96d8ea1ab8ce9f0f (patch) | |
tree | 1c7a047a387e9fa1593b5cda05866e4b5707ae12 /android | |
parent | d1eea9d11b92e53e5c5930fb4da5430174d8d167 (diff) | |
parent | df7f25541d10514585e50372d8c2fea723008683 (diff) | |
download | gps-21b02b0b59e62e7712c1239e96d8ea1ab8ce9f0f.tar.gz |
Merge remote-tracking branch 'goog/qcom/release/LA.UM.8.1.C9.09.00.00.518.406' into qt-qpr1-dev
Conflicts:
android/1.0/Gnss.cpp
android/1.1/Gnss.cpp
android/2.0/Gnss.cpp
gnss/GnssAdapter.cpp
Bug: 148752159
Change-Id: Ifc50f4af34c0980973830793a30c9527461b9d7b
Diffstat (limited to 'android')
-rw-r--r-- | android/1.0/Gnss.cpp | 2 | ||||
-rw-r--r-- | android/1.1/Gnss.cpp | 2 | ||||
-rw-r--r-- | android/2.0/Gnss.cpp | 2 | ||||
-rw-r--r-- | android/2.0/location_api/LocationUtil.cpp | 38 | ||||
-rw-r--r-- | android/2.0/location_api/LocationUtil.h | 1 | ||||
-rw-r--r-- | android/2.0/location_api/MeasurementAPIClient.cpp | 36 |
6 files changed, 61 insertions, 20 deletions
diff --git a/android/1.0/Gnss.cpp b/android/1.0/Gnss.cpp index 8fe4d3f..adb5232 100644 --- a/android/1.0/Gnss.cpp +++ b/android/1.0/Gnss.cpp @@ -264,7 +264,7 @@ Return<bool> Gnss::injectLocation(double latitudeDegrees, Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int32_t uncertaintyMs) { - return false; + return true; } Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { diff --git a/android/1.1/Gnss.cpp b/android/1.1/Gnss.cpp index aa761e2..260f999 100644 --- a/android/1.1/Gnss.cpp +++ b/android/1.1/Gnss.cpp @@ -305,7 +305,7 @@ Return<bool> Gnss::injectLocation(double latitudeDegrees, Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int32_t uncertaintyMs) { - return false; + return true; } Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { diff --git a/android/2.0/Gnss.cpp b/android/2.0/Gnss.cpp index 8fa42ff..6f1abf4 100644 --- a/android/2.0/Gnss.cpp +++ b/android/2.0/Gnss.cpp @@ -330,7 +330,7 @@ Return<bool> Gnss::injectLocation(double latitudeDegrees, Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int32_t uncertaintyMs) { - return false; + return true; } Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { diff --git a/android/2.0/location_api/LocationUtil.cpp b/android/2.0/location_api/LocationUtil.cpp index 8a30066..7e6810c 100644 --- a/android/2.0/location_api/LocationUtil.cpp +++ b/android/2.0/location_api/LocationUtil.cpp @@ -81,21 +81,16 @@ void convertGnssLocation(Location& in, V1_0::GnssLocation& out) out.timestamp = static_cast<V1_0::GnssUtcTime>(in.timestamp); } -void convertGnssLocation(Location& in, V2_0::GnssLocation& out) +bool getCurrentTime(struct timespec& currentTime, int64_t& sinceBootTimeNanos) { - memset(&out, 0, sizeof(V2_0::GnssLocation)); - convertGnssLocation(in, out.v1_0); - struct timespec sinceBootTime; - struct timespec currentTime; struct timespec sinceBootTimeTest; - int64_t sinceBootTimeNanos = 0; bool clockGetTimeSuccess = false; const uint32_t MAX_TIME_DELTA_VALUE_NANOS = 10000; const uint32_t MAX_GET_TIME_COUNT = 20; /* Attempt to get CLOCK_REALTIME and CLOCK_BOOTIME in succession without an interruption - or context switch (for up to MAX_GET_TIME_COUNT times) to avoid errors in the calculation */ - for (uint32_t i=0; i < MAX_GET_TIME_COUNT; i++) { + or context switch (for up to MAX_GET_TIME_COUNT times) to avoid errors in the calculation */ + for (uint32_t i = 0; i < MAX_GET_TIME_COUNT; i++) { if (clock_gettime(CLOCK_BOOTTIME, &sinceBootTime) != 0) { break; }; @@ -105,24 +100,34 @@ void convertGnssLocation(Location& in, V2_0::GnssLocation& out) if (clock_gettime(CLOCK_BOOTTIME, &sinceBootTimeTest) != 0) { break; }; - sinceBootTimeNanos = sinceBootTime.tv_sec*1000000000 + sinceBootTime.tv_nsec; + sinceBootTimeNanos = sinceBootTime.tv_sec * 1000000000 + sinceBootTime.tv_nsec; int64_t sinceBootTimeTestNanos = - sinceBootTimeTest.tv_sec*1000000000 + sinceBootTimeTest.tv_nsec; + sinceBootTimeTest.tv_sec * 1000000000 + sinceBootTimeTest.tv_nsec; int64_t sinceBootTimeDeltaNanos = sinceBootTimeTestNanos - sinceBootTimeNanos; /* sinceBootTime and sinceBootTimeTest should have a close value if there was no - interruption or context switch between clock_gettime for CLOCK_BOOTIME and - clock_gettime for CLOCK_REALTIME */ + interruption or context switch between clock_gettime for CLOCK_BOOTIME and + clock_gettime for CLOCK_REALTIME */ if (sinceBootTimeDeltaNanos < MAX_TIME_DELTA_VALUE_NANOS) { clockGetTimeSuccess = true; break; } else { - LOC_LOGD("%s]: Delta:%" PRIi64 "ns time too large, retry number #%u...", - __FUNCTION__, sinceBootTimeDeltaNanos, i+1); + LOC_LOGd("Delta:%" PRIi64 "ns time too large, retry number #%u...", + sinceBootTimeDeltaNanos, i + 1); } } + return clockGetTimeSuccess; +} + +void convertGnssLocation(Location& in, V2_0::GnssLocation& out) +{ + memset(&out, 0, sizeof(V2_0::GnssLocation)); + convertGnssLocation(in, out.v1_0); + + struct timespec currentTime; + int64_t sinceBootTimeNanos; - if (clockGetTimeSuccess) { + if (getCurrentTime(currentTime, sinceBootTimeNanos)) { int64_t currentTimeNanos = currentTime.tv_sec*1000000000 + currentTime.tv_nsec; int64_t locationTimeNanos = in.timestamp*1000000; LOC_LOGD("%s]: sinceBootTimeNanos:%" PRIi64 " currentTimeNanos:%" PRIi64 "" @@ -142,8 +147,7 @@ void convertGnssLocation(Location& in, V2_0::GnssLocation& out) } } } else { - LOC_LOGE("%s]: Failed to calculate elapsedRealtimeNanos timestamp after %u tries", - __FUNCTION__, MAX_GET_TIME_COUNT); + LOC_LOGe("Failed to calculate elapsedRealtimeNanos timestamp"); } } diff --git a/android/2.0/location_api/LocationUtil.h b/android/2.0/location_api/LocationUtil.h index 8426de7..d3dce23 100644 --- a/android/2.0/location_api/LocationUtil.h +++ b/android/2.0/location_api/LocationUtil.h @@ -49,6 +49,7 @@ void convertGnssConstellationType(GnssSvType& in, V2_0::GnssConstellationType& o void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out); void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); +bool getCurrentTime(struct timespec& currentTime, int64_t& sinceBootTimeNanos); } // namespace implementation } // namespace V2_0 diff --git a/android/2.0/location_api/MeasurementAPIClient.cpp b/android/2.0/location_api/MeasurementAPIClient.cpp index dc972ec..b87e508 100644 --- a/android/2.0/location_api/MeasurementAPIClient.cpp +++ b/android/2.0/location_api/MeasurementAPIClient.cpp @@ -32,6 +32,7 @@ #include <log_util.h> #include <loc_cfg.h> +#include <inttypes.h> #include "LocationUtil.h" #include "MeasurementAPIClient.h" @@ -414,6 +415,41 @@ static void convertGnssData_2_0(GnssMeasurementsNotification& in, out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_2ND_CODE_LOCK; } convertGnssClock(in.clock, out.clock); + + const uint32_t UTC_TO_GPS_SECONDS = 315964800; + struct timespec currentTime; + int64_t sinceBootTimeNanos; + + if (getCurrentTime(currentTime, sinceBootTimeNanos) && + in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT && + in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT && + in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT && + in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT) { + int64_t currentTimeNanos = currentTime.tv_sec * 1000000000 + currentTime.tv_nsec; + int64_t measTimeNanos = (int64_t)in.clock.timeNs - (int64_t)in.clock.fullBiasNs + - (int64_t)in.clock.biasNs - (int64_t)in.clock.leapSecond * 1000000000 + + (int64_t)UTC_TO_GPS_SECONDS * 1000000000; + + LOC_LOGd("sinceBootTimeNanos:%" PRIi64 " currentTimeNanos:%" PRIi64 "" + " measTimeNanos:%" PRIi64 "", + sinceBootTimeNanos, currentTimeNanos, measTimeNanos); + if (currentTimeNanos >= measTimeNanos) { + int64_t ageTimeNanos = currentTimeNanos - measTimeNanos; + LOC_LOGD("%s]: ageTimeNanos:%" PRIi64 ")", __FUNCTION__, ageTimeNanos); + if (ageTimeNanos >= 0 && ageTimeNanos <= sinceBootTimeNanos) { + out.elapsedRealtime.flags |= ElapsedRealtimeFlags::HAS_TIMESTAMP_NS; + out.elapsedRealtime.timestampNs = sinceBootTimeNanos - ageTimeNanos; + out.elapsedRealtime.flags |= ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS; + // time uncertainty is 1 ms since it is calculated from utc time that is in ms + out.elapsedRealtime.timeUncertaintyNs = 1000000; + LOC_LOGd("timestampNs:%" PRIi64 ") timeUncertaintyNs:%" PRIi64 ")", + out.elapsedRealtime.timestampNs, + out.elapsedRealtime.timeUncertaintyNs); + } + } + } else { + LOC_LOGe("Failed to calculate elapsedRealtimeNanos timestamp"); + } } static void convertGnssMeasurementsCodeType(GnssMeasurementsCodeType& in, |