Merge "Support the location injection in AIDL HAL"

This commit is contained in:
TreeHugger Robot 2022-01-13 18:17:44 +00:00 committed by Android (Google) Code Review
commit 227a0d5fe4
5 changed files with 59 additions and 3 deletions

View file

@ -20,6 +20,7 @@
#include <inttypes.h>
#include <log/log.h>
#include "AGnss.h"
#include "DeviceFileReader.h"
#include "GnssBatching.h"
#include "GnssConfiguration.h"
#include "GnssDebug.h"
@ -28,10 +29,13 @@
#include "GnssNavigationMessageInterface.h"
#include "GnssPsds.h"
#include "GnssVisibilityControl.h"
#include "NmeaFixInfo.h"
#include "Utils.h"
namespace aidl::android::hardware::gnss {
using ::android::hardware::gnss::common::NmeaFixInfo;
using ::android::hardware::gnss::common::Utils;
using ndk::ScopedAStatus;
using GnssSvInfo = IGnssCallback::GnssSvInfo;
@ -62,6 +66,12 @@ ScopedAStatus Gnss::setCallback(const std::shared_ptr<IGnssCallback>& callback)
return ScopedAStatus::ok();
}
std::unique_ptr<GnssLocation> Gnss::getLocationFromHW() {
std::string inputStr =
::android::hardware::gnss::common::DeviceFileReader::Instance().getLocationData();
return ::android::hardware::gnss::common::NmeaFixInfo::getAidlLocationFromInputStr(inputStr);
}
ScopedAStatus Gnss::start() {
ALOGD("start()");
if (mIsActive) {
@ -82,9 +92,14 @@ ScopedAStatus Gnss::start() {
auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList());
this->reportSvStatus(svStatus);
auto currentLocation = getLocationFromHW();
mGnssPowerIndication->notePowerConsumption();
const auto location = Utils::getMockLocation();
this->reportLocation(location);
if (currentLocation != nullptr) {
this->reportLocation(*currentLocation);
} else {
const auto location = Utils::getMockLocation();
this->reportLocation(location);
}
std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMs));
}
});

View file

@ -79,6 +79,7 @@ class Gnss : public BnGnss {
std::vector<IGnssCallback::GnssSvInfo> filterBlocklistedSatellites(
std::vector<IGnssCallback::GnssSvInfo> gnssSvInfoList);
void reportGnssStatusValue(const IGnssCallback::GnssStatusValue gnssStatusValue) const;
std::unique_ptr<GnssLocation> getLocationFromHW();
static std::shared_ptr<IGnssCallback> sGnssCallback;

View file

@ -41,7 +41,7 @@ bool ReplayUtils::isGnssRawMeasurement(const std::string& inputStr) {
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

View file

@ -34,6 +34,9 @@ namespace hardware {
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 {
@ -236,6 +239,40 @@ std::unique_ptr<V2_0::GnssLocation> NmeaFixInfo::getLocationFromInputStr(
return nmeaFixInfo.toGnssLocation();
}
/**
* 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.
*/

View file

@ -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 @@ class NmeaFixInfo {
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,