Support the location injection in AIDL HAL
Bug: 213225295
Test: atest VtsHalGnssTargetTest
Change-Id: Iff9fca55722af9bad6cc50f0170e4e1a069d05d6
diff --git a/gnss/common/utils/default/GnssReplayUtils.cpp b/gnss/common/utils/default/GnssReplayUtils.cpp
index e3f4ff8..5356477 100644
--- a/gnss/common/utils/default/GnssReplayUtils.cpp
+++ b/gnss/common/utils/default/GnssReplayUtils.cpp
@@ -41,7 +41,7 @@
bool ReplayUtils::isNMEA(const std::string& inputStr) {
return !inputStr.empty() && (inputStr.find("$GPRMC,", 0) != std::string::npos ||
- inputStr.find("$GPRMA,", 0) != std::string::npos);
+ inputStr.find("$GPGGA,", 0) != std::string::npos);
}
} // namespace common
diff --git a/gnss/common/utils/default/NmeaFixInfo.cpp b/gnss/common/utils/default/NmeaFixInfo.cpp
index c7ee134..22aef90 100644
--- a/gnss/common/utils/default/NmeaFixInfo.cpp
+++ b/gnss/common/utils/default/NmeaFixInfo.cpp
@@ -34,6 +34,9 @@
namespace gnss {
namespace common {
+using aidl::android::hardware::gnss::ElapsedRealtime;
+using aidl::android::hardware::gnss::GnssLocation;
+
NmeaFixInfo::NmeaFixInfo() : hasGMCRecord(false), hasGGARecord(false) {}
float NmeaFixInfo::getAltitudeMeters() const {
@@ -237,6 +240,40 @@
}
/**
+ * Convert V2_0::GnssLocation to aidl::GnssLocation.
+ */
+std::unique_ptr<GnssLocation> NmeaFixInfo::getAidlLocationFromInputStr(
+ const std::string& inputStr) {
+ std::unique_ptr<V2_0::GnssLocation> locationV2 = getLocationFromInputStr(inputStr);
+ if (locationV2 == nullptr) {
+ return nullptr;
+ }
+
+ ElapsedRealtime elapsedRealtime = {
+ .flags = ElapsedRealtime::HAS_TIMESTAMP_NS | ElapsedRealtime::HAS_TIME_UNCERTAINTY_NS,
+ .timestampNs = ::android::elapsedRealtimeNano(),
+ // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
+ // In an actual implementation provide an estimate of the synchronization uncertainty
+ // or don't set the field.
+ .timeUncertaintyNs = 1020400};
+
+ GnssLocation location = {
+ .gnssLocationFlags = locationV2->v1_0.gnssLocationFlags,
+ .latitudeDegrees = locationV2->v1_0.latitudeDegrees,
+ .longitudeDegrees = locationV2->v1_0.longitudeDegrees,
+ .altitudeMeters = locationV2->v1_0.altitudeMeters,
+ .speedMetersPerSec = locationV2->v1_0.speedMetersPerSec,
+ .bearingDegrees = locationV2->v1_0.bearingDegrees,
+ .horizontalAccuracyMeters = locationV2->v1_0.horizontalAccuracyMeters,
+ .verticalAccuracyMeters = locationV2->v1_0.verticalAccuracyMeters,
+ .speedAccuracyMetersPerSecond = locationV2->v1_0.speedAccuracyMetersPerSecond,
+ .bearingAccuracyDegrees = locationV2->v1_0.bearingAccuracyDegrees,
+ .timestampMillis = locationV2->v1_0.timestamp,
+ .elapsedRealtime = elapsedRealtime};
+ return std::make_unique<GnssLocation>(location);
+}
+
+/**
* Parses the input string in NMEA format and convert to GnssLocation.
*/
std::unique_ptr<V2_0::GnssLocation> NmeaFixInfo::toGnssLocation() const {
diff --git a/gnss/common/utils/default/include/NmeaFixInfo.h b/gnss/common/utils/default/include/NmeaFixInfo.h
index 5c27045..4073361 100644
--- a/gnss/common/utils/default/include/NmeaFixInfo.h
+++ b/gnss/common/utils/default/include/NmeaFixInfo.h
@@ -22,6 +22,7 @@
#include <hidl/Status.h>
#include <ctime>
#include <string>
+#include "aidl/android/hardware/gnss/IGnss.h"
namespace android {
namespace hardware {
namespace gnss {
@@ -45,6 +46,8 @@
public:
static std::unique_ptr<V2_0::GnssLocation> getLocationFromInputStr(const std::string& inputStr);
+ static std::unique_ptr<aidl::android::hardware::gnss::GnssLocation> getAidlLocationFromInputStr(
+ const std::string& inputStr);
private:
static void splitStr(const std::string& line, const char& delimiter,