Merge "Add IGnss AIDL HAL (frameworks/base)"
This commit is contained in:
committed by
Android (Google) Code Review
commit
21f5ee7460
@@ -623,8 +623,38 @@ public class GnssNative {
|
||||
public void injectLocation(Location location) {
|
||||
Preconditions.checkState(mRegistered);
|
||||
if (location.hasAccuracy()) {
|
||||
mGnssHal.injectLocation(location.getLatitude(), location.getLongitude(),
|
||||
location.getAccuracy());
|
||||
|
||||
int gnssLocationFlags = GNSS_LOCATION_HAS_LAT_LONG
|
||||
| (location.hasAltitude() ? GNSS_LOCATION_HAS_ALTITUDE : 0)
|
||||
| (location.hasSpeed() ? GNSS_LOCATION_HAS_SPEED : 0)
|
||||
| (location.hasBearing() ? GNSS_LOCATION_HAS_BEARING : 0)
|
||||
| (location.hasAccuracy() ? GNSS_LOCATION_HAS_HORIZONTAL_ACCURACY : 0)
|
||||
| (location.hasVerticalAccuracy() ? GNSS_LOCATION_HAS_VERTICAL_ACCURACY : 0)
|
||||
| (location.hasSpeedAccuracy() ? GNSS_LOCATION_HAS_SPEED_ACCURACY : 0)
|
||||
| (location.hasBearingAccuracy() ? GNSS_LOCATION_HAS_BEARING_ACCURACY : 0);
|
||||
|
||||
double latitudeDegrees = location.getLatitude();
|
||||
double longitudeDegrees = location.getLongitude();
|
||||
double altitudeMeters = location.getAltitude();
|
||||
float speedMetersPerSec = location.getSpeed();
|
||||
float bearingDegrees = location.getBearing();
|
||||
float horizontalAccuracyMeters = location.getAccuracy();
|
||||
float verticalAccuracyMeters = location.getVerticalAccuracyMeters();
|
||||
float speedAccuracyMetersPerSecond = location.getSpeedAccuracyMetersPerSecond();
|
||||
float bearingAccuracyDegrees = location.getBearingAccuracyDegrees();
|
||||
long timestamp = location.getTime();
|
||||
|
||||
int elapsedRealtimeFlags = GNSS_REALTIME_HAS_TIMESTAMP_NS
|
||||
| (location.hasElapsedRealtimeUncertaintyNanos()
|
||||
? GNSS_REALTIME_HAS_TIME_UNCERTAINTY_NS : 0);
|
||||
long elapsedRealtimeNanos = location.getElapsedRealtimeNanos();
|
||||
double elapsedRealtimeUncertaintyNanos = location.getElapsedRealtimeUncertaintyNanos();
|
||||
|
||||
mGnssHal.injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
|
||||
altitudeMeters, speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
|
||||
verticalAccuracyMeters, speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
|
||||
timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos,
|
||||
elapsedRealtimeUncertaintyNanos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1263,8 +1293,15 @@ public class GnssNative {
|
||||
return native_read_nmea(buffer, bufferSize);
|
||||
}
|
||||
|
||||
protected void injectLocation(double latitude, double longitude, float accuracy) {
|
||||
native_inject_location(latitude, longitude, accuracy);
|
||||
protected void injectLocation(@GnssLocationFlags int gnssLocationFlags, double latitude,
|
||||
double longitude, double altitude, float speed, float bearing,
|
||||
float horizontalAccuracy, float verticalAccuracy, float speedAccuracy,
|
||||
float bearingAccuracy, long timestamp, @GnssRealtimeFlags int elapsedRealtimeFlags,
|
||||
long elapsedRealtimeNanos, double elapsedRealtimeUncertaintyNanos) {
|
||||
native_inject_location(gnssLocationFlags, latitude, longitude, altitude, speed,
|
||||
bearing, horizontalAccuracy, verticalAccuracy, speedAccuracy, bearingAccuracy,
|
||||
timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos,
|
||||
elapsedRealtimeUncertaintyNanos);
|
||||
}
|
||||
|
||||
protected void injectBestLocation(@GnssLocationFlags int gnssLocationFlags, double latitude,
|
||||
@@ -1438,8 +1475,13 @@ public class GnssNative {
|
||||
|
||||
// location injection APIs
|
||||
|
||||
private static native void native_inject_location(double latitude, double longitude,
|
||||
float accuracy);
|
||||
private static native void native_inject_location(
|
||||
int gnssLocationFlags, double latitudeDegrees, double longitudeDegrees,
|
||||
double altitudeMeters, float speedMetersPerSec, float bearingDegrees,
|
||||
float horizontalAccuracyMeters, float verticalAccuracyMeters,
|
||||
float speedAccuracyMetersPerSecond, float bearingAccuracyDegrees,
|
||||
long timestamp, int elapsedRealtimeFlags, long elapsedRealtimeNanos,
|
||||
double elapsedRealtimeUncertaintyNanos);
|
||||
|
||||
|
||||
private static native void native_inject_best_location(
|
||||
|
||||
@@ -231,6 +231,11 @@ namespace android {
|
||||
|
||||
namespace {
|
||||
|
||||
// Returns true if location has lat/long information.
|
||||
bool hasLatLong(const GnssLocationAidl& location) {
|
||||
return (location.gnssLocationFlags & GnssLocationAidl::HAS_LAT_LONG) != 0;
|
||||
}
|
||||
|
||||
// Returns true if location has lat/long information.
|
||||
bool hasLatLong(const GnssLocation_V1_0& location) {
|
||||
return (static_cast<uint32_t>(location.gnssLocationFlags) &
|
||||
@@ -248,6 +253,36 @@ static inline jboolean boolToJbool(bool value) {
|
||||
return value ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
static GnssLocationAidl createGnssLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
|
||||
jdouble longitudeDegrees, jdouble altitudeMeters,
|
||||
jfloat speedMetersPerSec, jfloat bearingDegrees,
|
||||
jfloat horizontalAccuracyMeters,
|
||||
jfloat verticalAccuracyMeters,
|
||||
jfloat speedAccuracyMetersPerSecond,
|
||||
jfloat bearingAccuracyDegrees, jlong timestamp,
|
||||
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
|
||||
jdouble elapsedRealtimeUncertaintyNanos) {
|
||||
GnssLocationAidl location;
|
||||
location.gnssLocationFlags = static_cast<int>(gnssLocationFlags);
|
||||
location.latitudeDegrees = static_cast<double>(latitudeDegrees);
|
||||
location.longitudeDegrees = static_cast<double>(longitudeDegrees);
|
||||
location.altitudeMeters = static_cast<double>(altitudeMeters);
|
||||
location.speedMetersPerSec = static_cast<double>(speedMetersPerSec);
|
||||
location.bearingDegrees = static_cast<double>(bearingDegrees);
|
||||
location.horizontalAccuracyMeters = static_cast<double>(horizontalAccuracyMeters);
|
||||
location.verticalAccuracyMeters = static_cast<double>(verticalAccuracyMeters);
|
||||
location.speedAccuracyMetersPerSecond = static_cast<double>(speedAccuracyMetersPerSecond);
|
||||
location.bearingAccuracyDegrees = static_cast<double>(bearingAccuracyDegrees);
|
||||
location.timestampMillis = static_cast<uint64_t>(timestamp);
|
||||
|
||||
location.elapsedRealtime.flags = static_cast<int>(elapsedRealtimeFlags);
|
||||
location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
|
||||
location.elapsedRealtime.timeUncertaintyNs =
|
||||
static_cast<double>(elapsedRealtimeUncertaintyNanos);
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
static GnssLocation_V1_0 createGnssLocation_V1_0(
|
||||
jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees,
|
||||
jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees,
|
||||
@@ -298,7 +333,8 @@ struct GnssCallback : public IGnssCallback_V2_1 {
|
||||
Return<void> gnssLocationCb(const GnssLocation_V1_0& location) override;
|
||||
Return<void> gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override;
|
||||
Return<void> gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override {
|
||||
return gnssSvStatusCbImpl(svStatus);
|
||||
return gnssSvStatusCbImpl<IGnssCallback_V1_0::GnssSvStatus, IGnssCallback_V1_0::GnssSvInfo>(
|
||||
svStatus);
|
||||
}
|
||||
Return<void> gnssNmeaCb(int64_t timestamp, const android::hardware::hidl_string& nmea) override;
|
||||
Return<void> gnssSetCapabilitesCb(uint32_t capabilities) override;
|
||||
@@ -318,73 +354,67 @@ struct GnssCallback : public IGnssCallback_V2_1 {
|
||||
Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override;
|
||||
Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override;
|
||||
Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) override {
|
||||
return gnssSvStatusCbImpl(svInfoList);
|
||||
return gnssSvStatusCbImpl<hidl_vec<IGnssCallback_V2_0::GnssSvInfo>,
|
||||
IGnssCallback_V1_0::GnssSvInfo>(svInfoList);
|
||||
}
|
||||
|
||||
// New in 2.1
|
||||
Return<void> gnssSvStatusCb_2_1(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) override {
|
||||
return gnssSvStatusCbImpl(svInfoList);
|
||||
return gnssSvStatusCbImpl<hidl_vec<IGnssCallback_V2_1::GnssSvInfo>,
|
||||
IGnssCallback_V1_0::GnssSvInfo>(svInfoList);
|
||||
}
|
||||
Return<void> gnssSetCapabilitiesCb_2_1(uint32_t capabilities) override;
|
||||
|
||||
// TODO: Reconsider allocation cost vs threadsafety on these statics
|
||||
static const char* sNmeaString;
|
||||
static size_t sNmeaStringLength;
|
||||
|
||||
template <class T>
|
||||
static Return<void> gnssLocationCbImpl(const T& location);
|
||||
|
||||
template <class T_list, class T_sv_info>
|
||||
static Return<void> gnssSvStatusCbImpl(const T_list& svStatus);
|
||||
|
||||
private:
|
||||
template<class T>
|
||||
Return<void> gnssLocationCbImpl(const T& location);
|
||||
|
||||
template<class T>
|
||||
Return<void> gnssSvStatusCbImpl(const T& svStatus);
|
||||
|
||||
template<class T>
|
||||
uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) {
|
||||
template <class T>
|
||||
static uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
double getBasebandCn0DbHz(const T& svStatus, size_t i) {
|
||||
template <class T>
|
||||
static double getBasebandCn0DbHz(const T& svStatus, size_t i) {
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
uint32_t getGnssSvInfoListSize(const IGnssCallback_V1_0::GnssSvStatus& svStatus) {
|
||||
return svStatus.numSvs;
|
||||
}
|
||||
|
||||
uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) {
|
||||
template <class T>
|
||||
static uint32_t getGnssSvInfoListSize(const T& svInfoList) {
|
||||
return svInfoList.size();
|
||||
}
|
||||
|
||||
uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) {
|
||||
return svInfoList.size();
|
||||
static const IGnssCallbackAidl::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
const std::vector<IGnssCallbackAidl::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return svInfoList[i];
|
||||
}
|
||||
|
||||
const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) {
|
||||
return svStatus.gnssSvList.data()[i];
|
||||
}
|
||||
|
||||
const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return svInfoList[i].v1_0;
|
||||
}
|
||||
|
||||
const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
|
||||
const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return svInfoList[i].v2_0.v1_0;
|
||||
}
|
||||
|
||||
uint32_t getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) {
|
||||
return static_cast<uint32_t>(svStatus.gnssSvList.data()[i].constellation);
|
||||
}
|
||||
|
||||
uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) {
|
||||
template <class T>
|
||||
static uint32_t getConstellationType(const T& svInfoList, size_t i) {
|
||||
return static_cast<uint32_t>(svInfoList[i].constellation);
|
||||
}
|
||||
|
||||
uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return static_cast<uint32_t>(svInfoList[i].v2_0.constellation);
|
||||
}
|
||||
};
|
||||
|
||||
Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) {
|
||||
@@ -441,14 +471,43 @@ uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(const hidl_vec<IGnssCallback_V2
|
||||
return SVID_FLAGS_HAS_BASEBAND_CN0;
|
||||
}
|
||||
|
||||
template <>
|
||||
uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(
|
||||
const std::vector<IGnssCallbackAidl::GnssSvInfo>& svStatus) {
|
||||
return SVID_FLAGS_HAS_BASEBAND_CN0;
|
||||
}
|
||||
|
||||
template <>
|
||||
double GnssCallback::getBasebandCn0DbHz(
|
||||
const std::vector<IGnssCallbackAidl::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return svInfoList[i].basebandCN0DbHz;
|
||||
}
|
||||
|
||||
template<>
|
||||
double GnssCallback::getBasebandCn0DbHz(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList,
|
||||
size_t i) {
|
||||
return svInfoList[i].basebandCN0DbHz;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
|
||||
template <>
|
||||
uint32_t GnssCallback::getGnssSvInfoListSize(const IGnssCallback_V1_0::GnssSvStatus& svStatus) {
|
||||
return svStatus.numSvs;
|
||||
}
|
||||
|
||||
template <>
|
||||
uint32_t GnssCallback::getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus,
|
||||
size_t i) {
|
||||
return static_cast<uint32_t>(svStatus.gnssSvList.data()[i].constellation);
|
||||
}
|
||||
|
||||
template <>
|
||||
uint32_t GnssCallback::getConstellationType(
|
||||
const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
|
||||
return static_cast<uint32_t>(svInfoList[i].v2_0.constellation);
|
||||
}
|
||||
|
||||
template <class T_list, class T_sv_info>
|
||||
Return<void> GnssCallback::gnssSvStatusCbImpl(const T_list& svStatus) {
|
||||
JNIEnv* env = getJniEnv();
|
||||
|
||||
uint32_t listSize = getGnssSvInfoListSize(svStatus);
|
||||
@@ -476,7 +535,7 @@ Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
|
||||
CONSTELLATION_TYPE_SHIFT_WIDTH = 8
|
||||
};
|
||||
|
||||
const IGnssCallback_V1_0::GnssSvInfo& info = getGnssSvInfoOfIndex(svStatus, i);
|
||||
const T_sv_info& info = getGnssSvInfoOfIndex(svStatus, i);
|
||||
svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) |
|
||||
(getConstellationType(svStatus, i) << CONSTELLATION_TYPE_SHIFT_WIDTH) |
|
||||
static_cast<uint32_t>(info.svFlag);
|
||||
@@ -586,6 +645,16 @@ Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSys
|
||||
class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback {
|
||||
public:
|
||||
Status gnssSetCapabilitiesCb(const int capabilities) override;
|
||||
Status gnssStatusCb(const GnssStatusValue status) override;
|
||||
Status gnssSvStatusCb(const std::vector<GnssSvInfo>& svInfoList) override;
|
||||
Status gnssLocationCb(const GnssLocationAidl& location) override;
|
||||
Status gnssNmeaCb(const int64_t timestamp, const std::string& nmea) override;
|
||||
Status gnssAcquireWakelockCb() override;
|
||||
Status gnssReleaseWakelockCb() override;
|
||||
Status gnssSetSystemInfoCb(const GnssSystemInfo& info) override;
|
||||
Status gnssRequestTimeCb() override;
|
||||
Status gnssRequestLocationCb(const bool independentFromGnss,
|
||||
const bool isUserEmergency) override;
|
||||
};
|
||||
|
||||
Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) {
|
||||
@@ -596,6 +665,76 @@ Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) {
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssStatusCb(const GnssStatusValue status) {
|
||||
JNIEnv* env = getJniEnv();
|
||||
env->CallVoidMethod(mCallbacksObj, method_reportStatus, status);
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssSvStatusCb(const std::vector<GnssSvInfo>& svInfoList) {
|
||||
GnssCallback::gnssSvStatusCbImpl<std::vector<GnssSvInfo>, GnssSvInfo>(svInfoList);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssLocationCb(const GnssLocationAidl& location) {
|
||||
GnssCallback::gnssLocationCbImpl<GnssLocationAidl>(location);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssNmeaCb(const int64_t timestamp, const std::string& nmea) {
|
||||
JNIEnv* env = getJniEnv();
|
||||
/*
|
||||
* The Java code will call back to read these values.
|
||||
* We do this to avoid creating unnecessary String objects.
|
||||
*/
|
||||
GnssCallback::sNmeaString = nmea.c_str();
|
||||
GnssCallback::sNmeaStringLength = nmea.size();
|
||||
|
||||
env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp);
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssAcquireWakelockCb() {
|
||||
acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssReleaseWakelockCb() {
|
||||
release_wake_lock(WAKE_LOCK_NAME);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssSetSystemInfoCb(const GnssSystemInfo& info) {
|
||||
ALOGD("%s: yearOfHw=%d, name=%s\n", __func__, info.yearOfHw, info.name.c_str());
|
||||
JNIEnv* env = getJniEnv();
|
||||
env->CallVoidMethod(mCallbacksObj, method_setGnssYearOfHardware, info.yearOfHw);
|
||||
jstring jstringName = env->NewStringUTF(info.name.c_str());
|
||||
env->CallVoidMethod(mCallbacksObj, method_setGnssHardwareModelName, jstringName);
|
||||
if (jstringName) {
|
||||
env->DeleteLocalRef(jstringName);
|
||||
}
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssRequestTimeCb() {
|
||||
JNIEnv* env = getJniEnv();
|
||||
env->CallVoidMethod(mCallbacksObj, method_requestUtcTime);
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
Status GnssCallbackAidl::gnssRequestLocationCb(const bool independentFromGnss,
|
||||
const bool isUserEmergency) {
|
||||
JNIEnv* env = getJniEnv();
|
||||
env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss),
|
||||
boolToJbool(isUserEmergency));
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
/*
|
||||
* GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication
|
||||
* interface.
|
||||
@@ -797,7 +936,10 @@ Return<void> AGnssRilCallback::requestRefLocCb() {
|
||||
static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
|
||||
gnssHalAidl = waitForVintfService<IGnssAidl>();
|
||||
if (gnssHalAidl != nullptr) {
|
||||
ALOGD("Successfully got GNSS AIDL handle.");
|
||||
ALOGD("Successfully got GNSS AIDL handle. Version=%d.", gnssHalAidl->getInterfaceVersion());
|
||||
if (gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ALOGD("Trying IGnss_V2_1::getService()");
|
||||
@@ -952,15 +1094,17 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
|
||||
|
||||
// TODO: linkToDeath for AIDL HAL
|
||||
|
||||
gnssHalDeathRecipient = new GnssDeathRecipient();
|
||||
hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
|
||||
if (!linked.isOk()) {
|
||||
ALOGE("Transaction error in linking to GnssHAL death: %s",
|
||||
linked.description().c_str());
|
||||
} else if (!linked) {
|
||||
ALOGW("Unable to link to GnssHal death notifications");
|
||||
} else {
|
||||
ALOGD("Link to death notification successful");
|
||||
if (gnssHal != nullptr) {
|
||||
gnssHalDeathRecipient = new GnssDeathRecipient();
|
||||
hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
|
||||
if (!linked.isOk()) {
|
||||
ALOGE("Transaction error in linking to GnssHAL death: %s",
|
||||
linked.description().c_str());
|
||||
} else if (!linked) {
|
||||
ALOGW("Unable to link to GnssHal death notifications");
|
||||
} else {
|
||||
ALOGD("Link to death notification successful");
|
||||
}
|
||||
}
|
||||
|
||||
if (gnssHalAidl != nullptr) {
|
||||
@@ -1163,7 +1307,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
|
||||
gnssConfigurationIface =
|
||||
std::make_unique<gnss::GnssConfiguration_V1_1>(gnssConfiguration);
|
||||
}
|
||||
} else {
|
||||
} else if (gnssHal != nullptr) {
|
||||
auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
|
||||
if (checkHidlReturn(gnssConfiguration,
|
||||
"Unable to get a handle to GnssConfiguration_V1_0")) {
|
||||
@@ -1229,7 +1373,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
|
||||
}
|
||||
|
||||
static jboolean android_location_gnss_hal_GnssNative_is_supported(JNIEnv* /* env */, jclass) {
|
||||
return (gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
|
||||
return (gnssHalAidl != nullptr || gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
static jboolean android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported(
|
||||
@@ -1263,26 +1407,26 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
Return<bool> result = false;
|
||||
|
||||
// Set top level IGnss.hal callback.
|
||||
sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallback();
|
||||
if (gnssHal_V2_1 != nullptr) {
|
||||
result = gnssHal_V2_1->setCallback_2_1(gnssCbIface);
|
||||
} else if (gnssHal_V2_0 != nullptr) {
|
||||
result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
|
||||
} else if (gnssHal_V1_1 != nullptr) {
|
||||
result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
|
||||
} else if (gnssHal != nullptr) {
|
||||
result = gnssHal->setCallback(gnssCbIface);
|
||||
if (gnssHal != nullptr) {
|
||||
Return<bool> result = false;
|
||||
sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallback();
|
||||
if (gnssHal_V2_1 != nullptr) {
|
||||
result = gnssHal_V2_1->setCallback_2_1(gnssCbIface);
|
||||
} else if (gnssHal_V2_0 != nullptr) {
|
||||
result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
|
||||
} else if (gnssHal_V1_1 != nullptr) {
|
||||
result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
|
||||
} else {
|
||||
result = gnssHal->setCallback(gnssCbIface);
|
||||
}
|
||||
if (!checkHidlReturn(result, "IGnss setCallback() failed.")) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!checkHidlReturn(result, "IGnss setCallback() failed.")) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
|
||||
if (gnssHalAidl != nullptr) {
|
||||
sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
|
||||
auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl);
|
||||
if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) {
|
||||
return JNI_FALSE;
|
||||
@@ -1298,7 +1442,7 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
|
||||
}
|
||||
} else if (gnssXtraIface != nullptr) {
|
||||
sp<IGnssXtraCallback> gnssXtraCbIface = new GnssXtraCallback();
|
||||
result = gnssXtraIface->setCallback(gnssXtraCbIface);
|
||||
auto result = gnssXtraIface->setCallback(gnssXtraCbIface);
|
||||
if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) {
|
||||
gnssXtraIface = nullptr;
|
||||
} else {
|
||||
@@ -1341,20 +1485,20 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
|
||||
if (gnssVisibilityControlIface != nullptr) {
|
||||
sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface =
|
||||
new GnssVisibilityControlCallback();
|
||||
result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
|
||||
auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
|
||||
checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed.");
|
||||
}
|
||||
|
||||
// Set IMeasurementCorrections.hal callback.
|
||||
if (gnssCorrectionsIface_V1_1 != nullptr) {
|
||||
sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
|
||||
new MeasurementCorrectionsCallback();
|
||||
result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
|
||||
checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
|
||||
sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
|
||||
new MeasurementCorrectionsCallback();
|
||||
auto result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
|
||||
checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
|
||||
} else if (gnssCorrectionsIface_V1_0 != nullptr) {
|
||||
sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
|
||||
new MeasurementCorrectionsCallback();
|
||||
result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface);
|
||||
auto result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface);
|
||||
checkHidlReturn(result, "IMeasurementCorrections 1.0 setCallback() failed.");
|
||||
} else {
|
||||
ALOGI("Unable to find IMeasurementCorrections.");
|
||||
@@ -1388,6 +1532,15 @@ static void android_location_gnss_hal_GnssNative_cleanup(JNIEnv* /* env */, jcla
|
||||
static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
|
||||
JNIEnv* /* env */, jclass, jint mode, jint recurrence, jint min_interval,
|
||||
jint preferred_accuracy, jint preferred_time, jboolean low_power_mode) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
auto status = gnssHalAidl->setPositionMode(static_cast<IGnssAidl::GnssPositionMode>(mode),
|
||||
static_cast<IGnssAidl::GnssPositionRecurrence>(
|
||||
recurrence),
|
||||
min_interval, preferred_accuracy, preferred_time,
|
||||
low_power_mode);
|
||||
return checkAidlStatus(status, "IGnssAidl setPositionMode() failed.");
|
||||
}
|
||||
|
||||
Return<bool> result = false;
|
||||
if (gnssHal_V1_1 != nullptr) {
|
||||
result = gnssHal_V1_1->setPositionMode_1_1(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
|
||||
@@ -1408,6 +1561,11 @@ static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
|
||||
}
|
||||
|
||||
static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
auto status = gnssHalAidl->start();
|
||||
return checkAidlStatus(status, "IGnssAidl start() failed.");
|
||||
}
|
||||
|
||||
if (gnssHal == nullptr) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
@@ -1417,6 +1575,11 @@ static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jc
|
||||
}
|
||||
|
||||
static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jclass) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
auto status = gnssHalAidl->stop();
|
||||
return checkAidlStatus(status, "IGnssAidl stop() failed.");
|
||||
}
|
||||
|
||||
if (gnssHal == nullptr) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
@@ -1427,6 +1590,12 @@ static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jcl
|
||||
|
||||
static void android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv* /* env */, jclass,
|
||||
jint flags) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
auto status = gnssHalAidl->deleteAidingData(static_cast<IGnssAidl::GnssAidingData>(flags));
|
||||
checkAidlStatus(status, "IGnssAidl deleteAidingData() failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (gnssHal == nullptr) {
|
||||
return;
|
||||
}
|
||||
@@ -1490,10 +1659,15 @@ static jint android_location_gnss_hal_GnssNative_read_nmea(JNIEnv* env, jclass,
|
||||
static void android_location_gnss_hal_GnssNative_inject_time(JNIEnv* /* env */, jclass, jlong time,
|
||||
jlong timeReference,
|
||||
jint uncertainty) {
|
||||
if (gnssHal == nullptr) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
auto status = gnssHalAidl->injectTime(time, timeReference, uncertainty);
|
||||
checkAidlStatus(status, "IGnssAidl injectTime() failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (gnssHal == nullptr) {
|
||||
return;
|
||||
}
|
||||
auto result = gnssHal->injectTime(time, timeReference, uncertainty);
|
||||
checkHidlReturn(result, "IGnss injectTime() failed.");
|
||||
}
|
||||
@@ -1505,6 +1679,19 @@ static void android_location_gnss_hal_GnssNative_inject_best_location(
|
||||
jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
|
||||
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
|
||||
jdouble elapsedRealtimeUncertaintyNanos) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
GnssLocationAidl location =
|
||||
createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
|
||||
altitudeMeters, speedMetersPerSec, bearingDegrees,
|
||||
horizontalAccuracyMeters, verticalAccuracyMeters,
|
||||
speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
|
||||
elapsedRealtimeFlags, elapsedRealtimeNanos,
|
||||
elapsedRealtimeUncertaintyNanos);
|
||||
auto status = gnssHalAidl->injectBestLocation(location);
|
||||
checkAidlStatus(status, "IGnssAidl injectBestLocation() failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (gnssHal_V2_0 != nullptr) {
|
||||
GnssLocation_V2_0 location = createGnssLocation_V2_0(
|
||||
gnssLocationFlags,
|
||||
@@ -1546,15 +1733,31 @@ static void android_location_gnss_hal_GnssNative_inject_best_location(
|
||||
ALOGE("IGnss injectBestLocation() is called but gnssHal_V1_1 is not available.");
|
||||
}
|
||||
|
||||
static void android_location_gnss_hal_GnssNative_inject_location(JNIEnv* /* env */, jclass,
|
||||
jdouble latitude,
|
||||
jdouble longitude,
|
||||
jfloat accuracy) {
|
||||
if (gnssHal == nullptr) {
|
||||
static void android_location_gnss_hal_GnssNative_inject_location(
|
||||
JNIEnv* /* env */, jclass, jint gnssLocationFlags, jdouble latitudeDegrees,
|
||||
jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec,
|
||||
jfloat bearingDegrees, jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
|
||||
jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
|
||||
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
|
||||
jdouble elapsedRealtimeUncertaintyNanos) {
|
||||
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
|
||||
GnssLocationAidl location =
|
||||
createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
|
||||
altitudeMeters, speedMetersPerSec, bearingDegrees,
|
||||
horizontalAccuracyMeters, verticalAccuracyMeters,
|
||||
speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
|
||||
elapsedRealtimeFlags, elapsedRealtimeNanos,
|
||||
elapsedRealtimeUncertaintyNanos);
|
||||
auto status = gnssHalAidl->injectLocation(location);
|
||||
checkAidlStatus(status, "IGnssAidl injectLocation() failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto result = gnssHal->injectLocation(latitude, longitude, accuracy);
|
||||
if (gnssHal == nullptr) {
|
||||
return;
|
||||
}
|
||||
auto result =
|
||||
gnssHal->injectLocation(latitudeDegrees, longitudeDegrees, horizontalAccuracyMeters);
|
||||
checkHidlReturn(result, "IGnss injectLocation() failed.");
|
||||
}
|
||||
|
||||
@@ -2207,7 +2410,7 @@ static const JNINativeMethod sLocationProviderMethods[] = {
|
||||
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_time)},
|
||||
{"native_inject_best_location", "(IDDDFFFFFFJIJD)V",
|
||||
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_best_location)},
|
||||
{"native_inject_location", "(DDF)V",
|
||||
{"native_inject_location", "(IDDDFFFFFFJIJD)V",
|
||||
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_location)},
|
||||
{"native_supports_psds", "()Z",
|
||||
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_supports_psds)},
|
||||
|
||||
@@ -43,7 +43,7 @@ jboolean AGnss::setCallback(const std::unique_ptr<AGnssCallback>& callback) {
|
||||
|
||||
jboolean AGnss::dataConnOpen(JNIEnv* env, jlong networkHandle, jstring apn, jint apnIpType) {
|
||||
ScopedJniString jniApn{env, apn};
|
||||
auto status = mIAGnss->dataConnOpen(networkHandle, String16(jniApn.c_str()),
|
||||
auto status = mIAGnss->dataConnOpen(networkHandle, std::string(jniApn.c_str()),
|
||||
static_cast<IAGnss::ApnIpType>(apnIpType));
|
||||
return checkAidlStatus(status,
|
||||
"IAGnssAidl dataConnOpen() failed. APN and its IP type not set.");
|
||||
@@ -61,8 +61,8 @@ jboolean AGnss::dataConnFailed() {
|
||||
|
||||
jboolean AGnss::setServer(JNIEnv* env, jint type, jstring hostname, jint port) {
|
||||
ScopedJniString jniHostName{env, hostname};
|
||||
auto status =
|
||||
mIAGnss->setServer(static_cast<AGnssType>(type), String16(jniHostName.c_str()), port);
|
||||
auto status = mIAGnss->setServer(static_cast<AGnssType>(type), std::string(jniHostName.c_str()),
|
||||
port);
|
||||
return checkAidlStatus(status, "IAGnssAidl setServer() failed. Host name and port not set.");
|
||||
}
|
||||
|
||||
|
||||
@@ -429,11 +429,15 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void injectLocation(double latitude, double longitude, float accuracy) {
|
||||
protected void injectLocation(@GnssLocationFlags int gnssLocationFlags, double latitude,
|
||||
double longitude, double altitude, float speed, float bearing, float horizontalAccuracy,
|
||||
float verticalAccuracy, float speedAccuracy, float bearingAccuracy, long timestamp,
|
||||
@GnssRealtimeFlags int elapsedRealtimeFlags, long elapsedRealtimeNanos,
|
||||
double elapsedRealtimeUncertaintyNanos) {
|
||||
mState.mInjectedLocation = new Location("injected");
|
||||
mState.mInjectedLocation.setLatitude(latitude);
|
||||
mState.mInjectedLocation.setLongitude(longitude);
|
||||
mState.mInjectedLocation.setAccuracy(accuracy);
|
||||
mState.mInjectedLocation.setAccuracy(horizontalAccuracy);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user