summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorCyan_Hsieh <cyanhsieh@google.com>2020-02-03 14:55:13 +0800
committerCyan_Hsieh <cyanhsieh@google.com>2020-02-04 21:38:24 +0800
commit21b02b0b59e62e7712c1239e96d8ea1ab8ce9f0f (patch)
tree1c7a047a387e9fa1593b5cda05866e4b5707ae12 /android
parentd1eea9d11b92e53e5c5930fb4da5430174d8d167 (diff)
parentdf7f25541d10514585e50372d8c2fea723008683 (diff)
downloadgps-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.cpp2
-rw-r--r--android/1.1/Gnss.cpp2
-rw-r--r--android/2.0/Gnss.cpp2
-rw-r--r--android/2.0/location_api/LocationUtil.cpp38
-rw-r--r--android/2.0/location_api/LocationUtil.h1
-rw-r--r--android/2.0/location_api/MeasurementAPIClient.cpp36
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,