Add IGnssDebug AIDL HAL

Bug: 205185369
Test: atest VtsHalGnssTargetTest
Change-Id: I78d9641b1cf3d39af9671805ce4e48cd358fa45c
This commit is contained in:
Joe Huang
2021-11-16 23:09:11 +08:00
parent e96f78f340
commit 202b02de56
10 changed files with 458 additions and 0 deletions

View File

@@ -44,6 +44,7 @@ interface IGnss {
@nullable android.hardware.gnss.IGnssGeofence getExtensionGnssGeofence();
@nullable android.hardware.gnss.IGnssNavigationMessageInterface getExtensionGnssNavigationMessage();
android.hardware.gnss.IAGnss getExtensionAGnss();
android.hardware.gnss.IGnssDebug getExtensionGnssDebug();
const int ERROR_INVALID_ARGUMENT = 1;
const int ERROR_ALREADY_INIT = 2;
const int ERROR_GENERIC = 3;

View File

@@ -0,0 +1,94 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
///////////////////////////////////////////////////////////////////////////////
// This file is a snapshot of an AIDL file. Do not edit it manually. There are
// two cases:
// 1). this is a frozen version file - do not edit this in any case.
// 2). this is a 'current' file. If you make a backwards compatible change to
// the interface (from the latest frozen version), the build system will
// prompt you to update this file with `m <name>-update-api`.
//
// You must not make a backward incompatible change to any AIDL file built
// with the aidl_interface module type with versions property set. The module
// type is used to build AIDL files in a way that they can be used across
// independently updatable components of the system. If a device is shipped
// with such a backward incompatible change, it has a high risk of breaking
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.gnss;
@VintfStability
interface IGnssDebug {
android.hardware.gnss.IGnssDebug.DebugData getDebugData();
@Backing(type="int") @VintfStability
enum SatelliteEphemerisType {
EPHEMERIS = 0,
ALMANAC_ONLY = 1,
NOT_AVAILABLE = 2,
}
@Backing(type="int") @VintfStability
enum SatelliteEphemerisSource {
DEMODULATED = 0,
SUPL_PROVIDED = 1,
OTHER_SERVER_PROVIDED = 2,
OTHER = 3,
}
@Backing(type="int") @VintfStability
enum SatelliteEphemerisHealth {
GOOD = 0,
BAD = 1,
UNKNOWN = 2,
}
@VintfStability
parcelable TimeDebug {
long timeEstimateMs;
float timeUncertaintyNs;
float frequencyUncertaintyNsPerSec;
}
@VintfStability
parcelable PositionDebug {
boolean valid;
double latitudeDegrees;
double longitudeDegrees;
float altitudeMeters;
float speedMetersPerSec;
float bearingDegrees;
double horizontalAccuracyMeters;
double verticalAccuracyMeters;
double speedAccuracyMetersPerSecond;
double bearingAccuracyDegrees;
float ageSeconds;
}
@VintfStability
parcelable SatelliteData {
int svid;
android.hardware.gnss.GnssConstellationType constellation;
android.hardware.gnss.IGnssDebug.SatelliteEphemerisType ephemerisType;
android.hardware.gnss.IGnssDebug.SatelliteEphemerisSource ephemerisSource;
android.hardware.gnss.IGnssDebug.SatelliteEphemerisHealth ephemerisHealth;
float ephemerisAgeSeconds;
boolean serverPredictionIsAvailable;
float serverPredictionAgeSeconds;
}
@VintfStability
parcelable DebugData {
android.hardware.gnss.IGnssDebug.PositionDebug position;
android.hardware.gnss.IGnssDebug.TimeDebug time;
List<android.hardware.gnss.IGnssDebug.SatelliteData> satelliteDataArray;
}
}

View File

@@ -20,6 +20,7 @@ import android.hardware.gnss.IAGnss;
import android.hardware.gnss.IGnssBatching;
import android.hardware.gnss.IGnssCallback;
import android.hardware.gnss.IGnssConfiguration;
import android.hardware.gnss.IGnssDebug;
import android.hardware.gnss.IGnssGeofence;
import android.hardware.gnss.IGnssMeasurementInterface;
import android.hardware.gnss.IGnssNavigationMessageInterface;
@@ -134,4 +135,13 @@ interface IGnss {
* @return The IAGnss interface.
*/
IAGnss getExtensionAGnss();
/**
* This method returns the IGnssDebug interface.
*
* This method must return non-null.
*
* @return Handle to the IGnssDebug interface.
*/
IGnssDebug getExtensionGnssDebug();
}

View File

@@ -0,0 +1,208 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.gnss;
import android.hardware.gnss.GnssConstellationType;
/**
* Extended interface for GNSS Debug support
*
* This information is used for debugging purpose, e.g., shown in a bugreport to
* describe the chipset states including time, position, and satellite data.
*/
@VintfStability
interface IGnssDebug {
/** Satellite's ephemeris type */
@VintfStability
@Backing(type="int")
enum SatelliteEphemerisType {
EPHEMERIS = 0,
ALMANAC_ONLY = 1,
NOT_AVAILABLE = 2,
}
/** Satellite's ephemeris source */
@VintfStability
@Backing(type="int")
enum SatelliteEphemerisSource {
DEMODULATED = 0,
SUPL_PROVIDED = 1,
OTHER_SERVER_PROVIDED = 2,
OTHER = 3,
}
/** Satellite's ephemeris health */
@VintfStability
@Backing(type="int")
enum SatelliteEphemerisHealth {
GOOD = 0,
BAD = 1,
UNKNOWN = 2,
}
/**
* Provides the current best known UTC time estimate.
* If no fresh information is available, e.g. after a delete all,
* then whatever the effective defaults are on the device must be
* provided (e.g. Jan. 1, 2017, with an uncertainty of 5 years) expressed
* in the specified units.
*/
@VintfStability
parcelable TimeDebug {
/** UTC time estimate in milliseconds. */
long timeEstimateMs;
/** 68% time error estimate in nanoseconds. */
float timeUncertaintyNs;
/**
* 68% error estimate in local clock drift,
* in nanoseconds per second (also known as parts per billion - ppb.)
*/
float frequencyUncertaintyNsPerSec;
}
@VintfStability
parcelable PositionDebug {
/**
* Validity of the data in this struct. False only if no
* latitude/longitude information is known.
*/
boolean valid;
/** Latitude expressed in degrees */
double latitudeDegrees;
/** Longitude expressed in degrees */
double longitudeDegrees;
/** Altitude above ellipsoid expressed in meters */
float altitudeMeters;
/** Represents horizontal speed in meters per second. */
float speedMetersPerSec;
/** Represents heading in degrees. */
float bearingDegrees;
/**
* Estimated horizontal accuracy of position expressed in meters,
* radial, 68% confidence.
*/
double horizontalAccuracyMeters;
/**
* Estimated vertical accuracy of position expressed in meters, with
* 68% confidence.
*/
double verticalAccuracyMeters;
/**
* Estimated speed accuracy in meters per second with 68% confidence.
*/
double speedAccuracyMetersPerSecond;
/**
* Estimated bearing accuracy degrees with 68% confidence.
*/
double bearingAccuracyDegrees;
/**
* Time duration before this report that this position information was
* valid. This can, for example, be a previous injected location with
* an age potentially thousands of seconds old, or
* extrapolated to the current time (with appropriately increased
* accuracy estimates), with a (near) zero age.
*/
float ageSeconds;
}
@VintfStability
parcelable SatelliteData {
/** Satellite vehicle ID number */
int svid;
/** Defines the constellation type of the given SV. */
GnssConstellationType constellation;
/**
* Defines the standard broadcast ephemeris or almanac availability for
* the satellite. To report status of predicted orbit and clock
* information, see the serverPrediction fields below.
*/
SatelliteEphemerisType ephemerisType;
/** Defines the ephemeris source of the satellite. */
SatelliteEphemerisSource ephemerisSource;
/**
* Defines whether the satellite is known healthy
* (safe for use in location calculation.)
*/
SatelliteEphemerisHealth ephemerisHealth;
/**
* Time duration from this report (current time), minus the
* effective time of the ephemeris source (e.g. TOE, TOA.)
* Set to 0 when ephemerisType is NOT_AVAILABLE.
*/
float ephemerisAgeSeconds;
/**
* True if a server has provided a predicted orbit and clock model for
* this satellite.
*/
boolean serverPredictionIsAvailable;
/**
* Time duration from this report (current time) minus the time of the
* start of the server predicted information. For example, a 1 day
* old prediction would be reported as 86400 seconds here.
*/
float serverPredictionAgeSeconds;
}
/**
* Provides a set of debug information that is filled by the GNSS chipset
* when the method getDebugData() is invoked.
*/
@VintfStability
parcelable DebugData {
/** Current best known position. */
PositionDebug position;
/** Current best know time estimate */
TimeDebug time;
/**
* Provides a list of the available satellite data, for all
* satellites and constellations the device can track,
* including GnssConstellationType UNKNOWN.
*/
List<SatelliteData> satelliteDataArray;
}
/**
* This methods requests position, time and satellite ephemeris debug information
* from the HAL.
*
* @return ret debugData information from GNSS Hal that contains the current best
* known position, best known time estimate and a complete list of
* constellations that the device can track.
*/
DebugData getDebugData();
}

View File

@@ -58,6 +58,7 @@ cc_binary {
"AGnss.cpp",
"Gnss.cpp",
"GnssBatching.cpp",
"GnssDebug.cpp",
"GnssGeofence.cpp",
"GnssHidlHal.cpp",
"GnssNavigationMessageInterface.cpp",

View File

@@ -21,6 +21,7 @@
#include "AGnss.h"
#include "GnssBatching.h"
#include "GnssConfiguration.h"
#include "GnssDebug.h"
#include "GnssGeofence.h"
#include "GnssMeasurementInterface.h"
#include "GnssNavigationMessageInterface.h"
@@ -120,4 +121,11 @@ ndk::ScopedAStatus Gnss::getExtensionGnssNavigationMessage(
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus Gnss::getExtensionGnssDebug(std::shared_ptr<IGnssDebug>* iGnssDebug) {
ALOGD("Gnss::getExtensionGnssDebug");
*iGnssDebug = SharedRefBase::make<GnssDebug>();
return ndk::ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::gnss

View File

@@ -20,6 +20,7 @@
#include <aidl/android/hardware/gnss/BnGnss.h>
#include <aidl/android/hardware/gnss/BnGnssBatching.h>
#include <aidl/android/hardware/gnss/BnGnssConfiguration.h>
#include <aidl/android/hardware/gnss/BnGnssDebug.h>
#include <aidl/android/hardware/gnss/BnGnssMeasurementInterface.h>
#include <aidl/android/hardware/gnss/BnGnssPowerIndication.h>
#include <aidl/android/hardware/gnss/BnGnssPsds.h>
@@ -46,6 +47,7 @@ class Gnss : public BnGnss {
ndk::ScopedAStatus getExtensionGnssNavigationMessage(
std::shared_ptr<IGnssNavigationMessageInterface>* iGnssNavigationMessage) override;
ndk::ScopedAStatus getExtensionAGnss(std::shared_ptr<IAGnss>* iAGnss) override;
ndk::ScopedAStatus getExtensionGnssDebug(std::shared_ptr<IGnssDebug>* iGnssDebug) override;
std::shared_ptr<GnssConfiguration> mGnssConfiguration;
std::shared_ptr<GnssPowerIndication> mGnssPowerIndication;

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "GnssDebugAidl"
#include "GnssDebug.h"
#include <log/log.h>
#include "MockLocation.h"
namespace aidl::android::hardware::gnss {
ndk::ScopedAStatus GnssDebug::getDebugData(DebugData* debugData) {
ALOGD("GnssDebug::getDebugData");
PositionDebug positionDebug = {.valid = true,
.latitudeDegrees = 37.4219999,
.longitudeDegrees = -122.0840575,
.altitudeMeters = 1.60062531,
.speedMetersPerSec = 0,
.bearingDegrees = 0,
.horizontalAccuracyMeters = 5,
.verticalAccuracyMeters = 5,
.speedAccuracyMetersPerSecond = 1,
.bearingAccuracyDegrees = 90,
.ageSeconds = 0.99};
TimeDebug timeDebug = {.timeEstimateMs = 1519930775453L,
.timeUncertaintyNs = 1000,
.frequencyUncertaintyNsPerSec = 5.0e4};
std::vector<SatelliteData> satelliteDataArrayDebug = {};
debugData->position = positionDebug;
debugData->time = timeDebug;
debugData->satelliteDataArray = satelliteDataArrayDebug;
return ndk::ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::gnss

View File

@@ -0,0 +1,28 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <aidl/android/hardware/gnss/BnGnssDebug.h>
namespace aidl::android::hardware::gnss {
struct GnssDebug : public BnGnssDebug {
public:
ndk::ScopedAStatus getDebugData(DebugData* debugData) override;
};
} // namespace aidl::android::hardware::gnss

View File

@@ -19,10 +19,12 @@
#include <android/hardware/gnss/IAGnss.h>
#include <android/hardware/gnss/IGnss.h>
#include <android/hardware/gnss/IGnssBatching.h>
#include <android/hardware/gnss/IGnssDebug.h>
#include <android/hardware/gnss/IGnssMeasurementCallback.h>
#include <android/hardware/gnss/IGnssMeasurementInterface.h>
#include <android/hardware/gnss/IGnssPowerIndication.h>
#include <android/hardware/gnss/IGnssPsds.h>
#include <cutils/properties.h>
#include "AGnssCallbackAidl.h"
#include "GnssBatchingCallback.h"
#include "GnssGeofenceCallback.h"
@@ -43,6 +45,7 @@ using android::hardware::gnss::IGnss;
using android::hardware::gnss::IGnssBatching;
using android::hardware::gnss::IGnssBatchingCallback;
using android::hardware::gnss::IGnssConfiguration;
using android::hardware::gnss::IGnssDebug;
using android::hardware::gnss::IGnssGeofence;
using android::hardware::gnss::IGnssGeofenceCallback;
using android::hardware::gnss::IGnssMeasurementCallback;
@@ -55,6 +58,12 @@ using android::hardware::gnss::SatellitePvt;
using GnssConstellationTypeAidl = android::hardware::gnss::GnssConstellationType;
static bool IsAutomotiveDevice() {
char buffer[PROPERTY_VALUE_MAX] = {0};
property_get("ro.hardware.type", buffer, "");
return strncmp(buffer, "automotive", PROPERTY_VALUE_MAX) == 0;
}
/*
* SetupTeardownCreateCleanup:
* Requests the gnss HAL then calls cleanup
@@ -820,3 +829,50 @@ TEST_P(GnssHalTest, TestAGnssExtension) {
status = iAGnss->setServer(AGnssType::SUPL, String16("supl.google.com"), 7275);
ASSERT_TRUE(status.isOk());
}
/*
* GnssDebugValuesSanityTest:
* Ensures that GnssDebug values make sense.
*/
TEST_P(GnssHalTest, GnssDebugValuesSanityTest) {
if (aidl_gnss_hal_->getInterfaceVersion() == 1) {
return;
}
sp<IGnssDebug> iGnssDebug;
auto status = aidl_gnss_hal_->getExtensionGnssDebug(&iGnssDebug);
ASSERT_TRUE(status.isOk());
if (!IsAutomotiveDevice() && gnss_cb_->info_cbq_.calledCount() > 0) {
ASSERT_TRUE(iGnssDebug != nullptr);
IGnssDebug::DebugData data;
auto status = iGnssDebug->getDebugData(&data);
ASSERT_TRUE(status.isOk());
if (data.position.valid) {
ASSERT_TRUE(data.position.latitudeDegrees >= -90 &&
data.position.latitudeDegrees <= 90);
ASSERT_TRUE(data.position.longitudeDegrees >= -180 &&
data.position.longitudeDegrees <= 180);
ASSERT_TRUE(data.position.altitudeMeters >= -1000 && // Dead Sea: -414m
data.position.altitudeMeters <= 20000); // Mount Everest: 8850m
ASSERT_TRUE(data.position.speedMetersPerSec >= 0 &&
data.position.speedMetersPerSec <= 600);
ASSERT_TRUE(data.position.bearingDegrees >= -360 &&
data.position.bearingDegrees <= 360);
ASSERT_TRUE(data.position.horizontalAccuracyMeters > 0 &&
data.position.horizontalAccuracyMeters <= 20000000);
ASSERT_TRUE(data.position.verticalAccuracyMeters > 0 &&
data.position.verticalAccuracyMeters <= 20000);
ASSERT_TRUE(data.position.speedAccuracyMetersPerSecond > 0 &&
data.position.speedAccuracyMetersPerSecond <= 500);
ASSERT_TRUE(data.position.bearingAccuracyDegrees > 0 &&
data.position.bearingAccuracyDegrees <= 180);
ASSERT_TRUE(data.position.ageSeconds >= 0);
}
ASSERT_TRUE(data.time.timeEstimateMs >= 1483228800000); // Jan 01 2017 00:00:00 GMT.
ASSERT_TRUE(data.time.timeUncertaintyNs > 0);
ASSERT_TRUE(data.time.frequencyUncertaintyNsPerSec > 0 &&
data.time.frequencyUncertaintyNsPerSec <= 2.0e5); // 200 ppm
}
}