Add IAGnssRil AIDL HAL (hardware/interfaces)

Bug: 205185251
Bug: 182975915
Test: atest VtsHalGnssTargetTest
Change-Id: Ie5746ae25db3beff20f1311f4ddaa592d8ca934b
This commit is contained in:
Shinru Han
2021-12-14 12:06:02 +08:00
parent 43d175037b
commit 5f33dbe46c
15 changed files with 526 additions and 1 deletions

View File

@@ -0,0 +1,79 @@
/*
* Copyright (C) 2022 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 IAGnssRil {
void setCallback(in android.hardware.gnss.IAGnssRilCallback callback);
void setRefLocation(in android.hardware.gnss.IAGnssRil.AGnssRefLocation agnssReflocation);
void setSetId(in android.hardware.gnss.IAGnssRil.SetIDType type, in @utf8InCpp String setid);
void updateNetworkState(in android.hardware.gnss.IAGnssRil.NetworkAttributes attributes);
const int NETWORK_CAPABILITY_NOT_METERED = 1;
const int NETWORK_CAPABILITY_NOT_ROAMING = 2;
@Backing(type="int") @VintfStability
enum AGnssRefLocationType {
GSM_CELLID = 1,
UMTS_CELLID = 2,
LTE_CELLID = 4,
NR_CELLID = 8,
}
@Backing(type="int") @VintfStability
enum SetIDType {
NONE = 0,
IMSI = 1,
MSISDM = 2,
}
@VintfStability
parcelable AGnssRefLocationCellID {
android.hardware.gnss.IAGnssRil.AGnssRefLocationType type;
int mcc;
int mnc;
int lac;
long cid;
int tac;
int pcid;
int arfcn;
}
@VintfStability
parcelable AGnssRefLocation {
android.hardware.gnss.IAGnssRil.AGnssRefLocationType type;
android.hardware.gnss.IAGnssRil.AGnssRefLocationCellID cellID;
}
@VintfStability
parcelable NetworkAttributes {
long networkHandle;
boolean isConnected;
int capabilities;
@utf8InCpp String apn;
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (C) 2022 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 IAGnssRilCallback {
void requestSetIdCb(in int setIdflag);
void requestRefLocCb();
}

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.IAGnssRil getExtensionAGnssRil();
android.hardware.gnss.IGnssDebug getExtensionGnssDebug();
android.hardware.gnss.visibility_control.IGnssVisibilityControl getExtensionGnssVisibilityControl();
void start();

View File

@@ -0,0 +1,163 @@
/*
* Copyright (C) 2022 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.IAGnssRilCallback;
import android.hardware.gnss.IAGnssRilCallback.SetIDType;
/**
* Extended interface for AGNSS RIL support. An Assisted GNSS Radio Interface
* Layer interface allows the GNSS chipset to request radio interface layer
* information from Android platform. Examples of such information are reference
* location, unique subscriber ID, phone number string and network availability changes.
*/
@VintfStability
interface IAGnssRil {
/** Network capability mode bitmask for not metered. */
const int NETWORK_CAPABILITY_NOT_METERED = 0x01;
/** Network capability mode bitmask for not roaming. */
const int NETWORK_CAPABILITY_NOT_ROAMING = 0x02;
/** AGNSS reference location type */
@VintfStability
@Backing(type="int")
enum AGnssRefLocationType {
GSM_CELLID = 1,
UMTS_CELLID = 2,
LTE_CELLID = 4,
NR_CELLID = 8,
}
/** SET ID type*/
@VintfStability
@Backing(type="int")
enum SetIDType {
NONE = 0,
IMSI = 1,
MSISDM = 2,
}
/** CellID for 2G, 3G ,LTE and NR used in AGNSS. */
@VintfStability
parcelable AGnssRefLocationCellID {
AGnssRefLocationType type;
/** Mobile Country Code. */
int mcc;
/** Mobile Network Code .*/
int mnc;
/**
* Location Area Code in 2G, 3G and LTE. In 3G lac is discarded. In LTE,
* lac is populated with tac, to ensure that we don't break old clients that
* might rely on the old (wrong) behavior.
*/
int lac;
/**
* Cell id in 2G. Utran Cell id in 3G. Cell Global Id EUTRA in LTE.
* Cell Global Id NR in 5G.
*/
long cid;
/** Tracking Area Code in LTE and NR. */
int tac;
/** Physical Cell id in LTE and NR (not used in 2G and 3G) */
int pcid;
/** Absolute Radio Frequency Channel Number in NR. */
int arfcn;
}
/** Represents ref locations */
@VintfStability
parcelable AGnssRefLocation {
AGnssRefLocationType type;
AGnssRefLocationCellID cellID;
}
/** Represents network connection status and capabilities. */
@VintfStability
parcelable NetworkAttributes {
/** Network handle of the network for use with the NDK API. */
long networkHandle;
/**
* True indicates that network connectivity exists and it is possible to
* establish connections and pass data. If false, only the networkHandle field
* is populated to indicate that this network has just disconnected.
*/
boolean isConnected;
/**
* A bitfield of flags indicating the capabilities of this network. The bit masks are
* defined in NETWORK_CAPABILITY_*.
*/
int capabilities;
/**
* Telephony preferred Access Point Name to use for carrier data connection when
* connected to a cellular network. Empty string, otherwise.
*/
@utf8InCpp String apn;
}
/**
* Opens the AGNSS interface and provides the callback routines
* to the implementation of this interface.
*
* @param callback Interface for AGnssRil callbacks.
*
*/
void setCallback(in IAGnssRilCallback callback);
/**
* Sets the reference location.
*
* @param agnssReflocation AGNSS reference location CellID.
*
*/
void setRefLocation(in AGnssRefLocation agnssReflocation);
/**
* Sets the SET ID.
*
* @param type Must be populated with either IMSI or MSISDN or NONE.
* @param setid If type is IMSI then setid is populated with
* a string representing the unique Subscriber ID, for example, the IMSI for
* a GMS phone. If type is MSISDN, then setid must contain
* the phone number string for line 1. For example, the MSISDN for a GSM phone.
* If the type is NONE, then the string must be empty.
*
*/
void setSetId(in SetIDType type, in @utf8InCpp String setid);
/**
* Notifies GNSS of network status changes.
*
* The framework calls this method to update the GNSS HAL implementation of network
* state changes.
*
* @param attributes Updated network attributes.
*
*/
void updateNetworkState(in NetworkAttributes attributes);
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright (C) 2022 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;
/**
* Callback for IAGnssRil interface. Used to request SET ID and
* Reference Location.
*/
@VintfStability
interface IAGnssRilCallback {
/**
* The Hal uses this API to request a SET ID.
*
* @param setIdflag A bitfield of IAGnssRil.SetIDType that is required by
* the HAL. The framework will inject an empty SET ID if the flag is NONE.
*
*/
void requestSetIdCb(in int setIdflag);
/**
* The Hal uses this API to request a reference location.
*/
void requestRefLocCb();
}

View File

@@ -18,6 +18,7 @@ package android.hardware.gnss;
import android.hardware.gnss.GnssLocation;
import android.hardware.gnss.IAGnss;
import android.hardware.gnss.IAGnssRil;
import android.hardware.gnss.IGnssBatching;
import android.hardware.gnss.IGnssCallback;
import android.hardware.gnss.IGnssConfiguration;
@@ -185,6 +186,13 @@ interface IGnss {
*/
IAGnss getExtensionAGnss();
/**
* This method returns the IAGnssRil interface.
*
* @return The IAGnssRil interface.
*/
IAGnssRil getExtensionAGnssRil();
/**
* This method returns the IGnssDebug interface.
*

View File

@@ -0,0 +1,55 @@
/*
* 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 "AGnssRilAidl"
#include "AGnssRil.h"
#include <log/log.h>
namespace aidl::android::hardware::gnss {
std::shared_ptr<IAGnssRilCallback> AGnssRil::sCallback = nullptr;
ndk::ScopedAStatus AGnssRil::setCallback(const std::shared_ptr<IAGnssRilCallback>& callback) {
ALOGD("AGnssRil::setCallback");
std::unique_lock<std::mutex> lock(mMutex);
sCallback = callback;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus AGnssRil::setRefLocation(const AGnssRefLocation& agnssReflocation) {
const AGnssRefLocationCellID& cellInfo = agnssReflocation.cellID;
ALOGD("AGnssRil::setRefLocation: type: %s, mcc: %d, mnc: %d, lac: %d, cid: %ld, tac: %d, pcid: "
"%d, arfcn: %d",
toString(agnssReflocation.type).c_str(), cellInfo.mcc, cellInfo.mnc, cellInfo.lac,
cellInfo.cid, cellInfo.tac, cellInfo.pcid, cellInfo.arfcn);
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus AGnssRil::setSetId(SetIDType type, const std::string& setid) {
ALOGD("AGnssRil::setSetId: type:%s, setid: %s", toString(type).c_str(), setid.c_str());
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus AGnssRil::updateNetworkState(const NetworkAttributes& attributes) {
ALOGD("AGnssRil::updateNetworkState: networkHandle: %ld, isConnected: %d, capabilities: %d, "
"apn: %s",
attributes.networkHandle, attributes.isConnected, attributes.capabilities,
attributes.apn.c_str());
return ndk::ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::gnss

View File

@@ -0,0 +1,37 @@
/*
* 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/BnAGnssRil.h>
namespace aidl::android::hardware::gnss {
struct AGnssRil : public BnAGnssRil {
public:
ndk::ScopedAStatus setCallback(const std::shared_ptr<IAGnssRilCallback>& callback) override;
ndk::ScopedAStatus setRefLocation(const AGnssRefLocation& agnssReflocation) override;
ndk::ScopedAStatus setSetId(SetIDType type, const std::string& setid) override;
ndk::ScopedAStatus updateNetworkState(const NetworkAttributes& attributes) override;
private:
// Synchronization lock for sCallback
mutable std::mutex mMutex;
// Guarded by mMutex
static std::shared_ptr<IAGnssRilCallback> sCallback;
};
} // namespace aidl::android::hardware::gnss

View File

@@ -56,6 +56,7 @@ cc_binary {
"android.hardware.gnss-V2-ndk",
],
srcs: [
"AGnssRil.cpp",
"AGnss.cpp",
"Gnss.cpp",
"GnssBatching.cpp",

View File

@@ -20,6 +20,7 @@
#include <inttypes.h>
#include <log/log.h>
#include "AGnss.h"
#include "AGnssRil.h"
#include "GnssBatching.h"
#include "GnssConfiguration.h"
#include "GnssDebug.h"
@@ -154,7 +155,7 @@ ScopedAStatus Gnss::close() {
return ScopedAStatus::ok();
}
ndk::ScopedAStatus Gnss::getExtensionAGnss(std::shared_ptr<IAGnss>* iAGnss) {
ScopedAStatus Gnss::getExtensionAGnss(std::shared_ptr<IAGnss>* iAGnss) {
ALOGD("Gnss::getExtensionAGnss");
*iAGnss = SharedRefBase::make<AGnss>();
return ndk::ScopedAStatus::ok();
@@ -166,6 +167,12 @@ ScopedAStatus Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int unce
return ScopedAStatus::ok();
}
ScopedAStatus Gnss::getExtensionAGnssRil(std::shared_ptr<IAGnssRil>* iAGnssRil) {
ALOGD("Gnss::getExtensionAGnssRil");
*iAGnssRil = SharedRefBase::make<AGnssRil>();
return ndk::ScopedAStatus::ok();
}
ScopedAStatus Gnss::injectLocation(const GnssLocation& location) {
ALOGD("injectLocation. lat:%lf, lng:%lf, acc:%f", location.latitudeDegrees,
location.longitudeDegrees, location.horizontalAccuracyMeters);

View File

@@ -17,6 +17,7 @@
#pragma once
#include <aidl/android/hardware/gnss/BnAGnss.h>
#include <aidl/android/hardware/gnss/BnAGnssRil.h>
#include <aidl/android/hardware/gnss/BnGnss.h>
#include <aidl/android/hardware/gnss/BnGnssBatching.h>
#include <aidl/android/hardware/gnss/BnGnssConfiguration.h>
@@ -65,6 +66,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 getExtensionAGnssRil(std::shared_ptr<IAGnssRil>* iAGnssRil) override;
ndk::ScopedAStatus getExtensionGnssDebug(std::shared_ptr<IGnssDebug>* iGnssDebug) override;
ndk::ScopedAStatus getExtensionGnssVisibilityControl(
std::shared_ptr<android::hardware::gnss::visibility_control::IGnssVisibilityControl>*

View File

@@ -0,0 +1,28 @@
/*
* Copyright (C) 2022 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.
*/
#include "AGnssRilCallbackAidl.h"
#include <log/log.h>
android::binder::Status AGnssRilCallbackAidl::requestSetIdCb(int setIdflag) {
ALOGI("requestSetIdCb setIdflag %d", setIdflag);
return android::binder::Status::ok();
}
android::binder::Status AGnssRilCallbackAidl::requestRefLocCb() {
ALOGI("requestRefLocCb");
return android::binder::Status::ok();
}

View File

@@ -0,0 +1,28 @@
/*
* Copyright (C) 2022 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 <android/hardware/gnss/BnAGnssRilCallback.h>
/** Implementation for IAGnssRilCallback. */
class AGnssRilCallbackAidl : public android::hardware::gnss::BnAGnssRilCallback {
public:
AGnssRilCallbackAidl(){};
~AGnssRilCallbackAidl(){};
android::binder::Status requestSetIdCb(int setIdflag) override;
android::binder::Status requestRefLocCb() override;
};

View File

@@ -31,6 +31,7 @@ cc_test {
"gnss_hal_test.cpp",
"gnss_hal_test_cases.cpp",
"AGnssCallbackAidl.cpp",
"AGnssRilCallbackAidl.cpp",
"GnssBatchingCallback.cpp",
"GnssCallbackAidl.cpp",
"GnssGeofenceCallback.cpp",

View File

@@ -27,6 +27,7 @@
#include <android/hardware/gnss/visibility_control/IGnssVisibilityControl.h>
#include <cutils/properties.h>
#include "AGnssCallbackAidl.h"
#include "AGnssRilCallbackAidl.h"
#include "GnssBatchingCallback.h"
#include "GnssGeofenceCallback.h"
#include "GnssMeasurementCallbackAidl.h"
@@ -43,6 +44,7 @@ using android::hardware::gnss::GnssData;
using android::hardware::gnss::GnssMeasurement;
using android::hardware::gnss::GnssPowerStats;
using android::hardware::gnss::IAGnss;
using android::hardware::gnss::IAGnssRil;
using android::hardware::gnss::IGnss;
using android::hardware::gnss::IGnssBatching;
using android::hardware::gnss::IGnssBatchingCallback;
@@ -857,6 +859,42 @@ TEST_P(GnssHalTest, TestAGnssExtension) {
ASSERT_TRUE(status.isOk());
}
/*
* TestAGnssRilExtension:
* 1. Gets the IAGnssRil extension.
* 2. Sets AGnssRilCallback.
* 3. Sets reference location.
*/
TEST_P(GnssHalTest, TestAGnssRilExtension) {
if (aidl_gnss_hal_->getInterfaceVersion() == 1) {
return;
}
sp<IAGnssRil> iAGnssRil;
auto status = aidl_gnss_hal_->getExtensionAGnssRil(&iAGnssRil);
ASSERT_TRUE(status.isOk());
ASSERT_TRUE(iAGnssRil != nullptr);
auto agnssRilCallback = sp<AGnssRilCallbackAidl>::make();
status = iAGnssRil->setCallback(agnssRilCallback);
ASSERT_TRUE(status.isOk());
// Set RefLocation
IAGnssRil::AGnssRefLocationCellID agnssReflocationCellId;
agnssReflocationCellId.type = IAGnssRil::AGnssRefLocationType::LTE_CELLID;
agnssReflocationCellId.mcc = 466;
agnssReflocationCellId.mnc = 97;
agnssReflocationCellId.lac = 46697;
agnssReflocationCellId.cid = 59168142;
agnssReflocationCellId.pcid = 420;
agnssReflocationCellId.tac = 11460;
IAGnssRil::AGnssRefLocation agnssReflocation;
agnssReflocation.type = IAGnssRil::AGnssRefLocationType::LTE_CELLID;
agnssReflocation.cellID = agnssReflocationCellId;
status = iAGnssRil->setRefLocation(agnssReflocation);
ASSERT_TRUE(status.isOk());
}
/*
* GnssDebugValuesSanityTest:
* Ensures that GnssDebug values make sense.