123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- #define LOG_TAG "LocSvc_GnssInterface"
- #define LOG_NDEBUG 0
- #include "Gnss.h"
- #include <log_util.h>
- #include <android/binder_auto_utils.h>
- namespace android {
- namespace hardware {
- namespace gnss {
- namespace aidl {
- namespace implementation {
- void gnssCallbackDied(void* cookie) {
- LOC_LOGe("IGnssCallback AIDL service died");
- Gnss* iface = static_cast<Gnss*>(cookie);
- if (iface != nullptr) {
- iface->handleClientDeath();
- }
- }
- ndk::ScopedAStatus Gnss::setCallback(const std::shared_ptr<IGnssCallback>& callback) {
- if (callback == nullptr) {
- LOC_LOGe("Null callback ignored");
- return ndk::ScopedAStatus::fromExceptionCode(STATUS_INVALID_OPERATION);
- }
- mGnssCallback = callback;
- GnssAPIClient* api = getApi();
- if (mGnssCallback != nullptr) {
- AIBinder_DeathRecipient* recipient = AIBinder_DeathRecipient_new(&gnssCallbackDied);
- AIBinder_linkToDeath(callback->asBinder().get(), recipient, this);
- }
- if (api != nullptr) {
- api->gnssUpdateCallbacks(callback);
- api->gnssEnable(LOCATION_TECHNOLOGY_TYPE_GNSS);
- api->requestCapabilities();
- }
- return ndk::ScopedAStatus::ok();
- }
- ndk::ScopedAStatus Gnss::close() {
- if (mApi != nullptr) {
- mApi->gnssDisable();
- }
- return ndk::ScopedAStatus::ok();
- }
- Gnss::Gnss(): mGnssCallback(nullptr) {
- memset(&mPendingConfig, 0, sizeof(GnssConfig));
- ENTRY_LOG_CALLFLOW();
- }
- Gnss::~Gnss() {
- ENTRY_LOG_CALLFLOW();
- if (mApi != nullptr) {
- mApi->destroy();
- mApi = nullptr;
- }
- }
- void Gnss::handleClientDeath() {
- close();
- if (mApi != nullptr) {
- mApi->gnssUpdateCallbacks(mGnssCallback);
- }
- mGnssCallback = nullptr;
- }
- ndk::ScopedAStatus Gnss::updateConfiguration(GnssConfig& gnssConfig) {
- ENTRY_LOG_CALLFLOW();
- GnssAPIClient* api = getApi();
- if (api) {
- api->gnssConfigurationUpdate(gnssConfig);
- } else if (gnssConfig.flags != 0) {
-
- mPendingConfig.size = sizeof(GnssConfig);
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT;
- mPendingConfig.gpsLock = gnssConfig.gpsLock;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT;
- mPendingConfig.suplVersion = gnssConfig.suplVersion;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT;
- mPendingConfig.assistanceServer.size = sizeof(GnssConfigSetAssistanceServer);
- mPendingConfig.assistanceServer.type = gnssConfig.assistanceServer.type;
- if (mPendingConfig.assistanceServer.hostName != nullptr) {
- free((void*)mPendingConfig.assistanceServer.hostName);
- mPendingConfig.assistanceServer.hostName =
- strdup(gnssConfig.assistanceServer.hostName);
- }
- mPendingConfig.assistanceServer.port = gnssConfig.assistanceServer.port;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT;
- mPendingConfig.lppProfileMask = gnssConfig.lppProfileMask;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT;
- mPendingConfig.lppeControlPlaneMask = gnssConfig.lppeControlPlaneMask;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT;
- mPendingConfig.lppeUserPlaneMask = gnssConfig.lppeUserPlaneMask;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT;
- mPendingConfig.aGlonassPositionProtocolMask = gnssConfig.aGlonassPositionProtocolMask;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT;
- mPendingConfig.emergencyPdnForEmergencySupl = gnssConfig.emergencyPdnForEmergencySupl;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT;
- mPendingConfig.suplEmergencyServices = gnssConfig.suplEmergencyServices;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_MODE_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_MODE_BIT;
- mPendingConfig.suplModeMask = gnssConfig.suplModeMask;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT;
- mPendingConfig.blacklistedSvIds = gnssConfig.blacklistedSvIds;
- }
- if (gnssConfig.flags & GNSS_CONFIG_FLAGS_EMERGENCY_EXTENSION_SECONDS_BIT) {
- mPendingConfig.flags |= GNSS_CONFIG_FLAGS_EMERGENCY_EXTENSION_SECONDS_BIT;
- mPendingConfig.emergencyExtensionSeconds = gnssConfig.emergencyExtensionSeconds;
- }
- }
- return ndk::ScopedAStatus::ok();
- }
- ::ndk::ScopedAStatus Gnss::getExtensionGnssConfiguration(
- std::shared_ptr<::aidl::android::hardware::gnss::IGnssConfiguration>* _aidl_return) {
- ENTRY_LOG_CALLFLOW();
- if (mGnssConfiguration == nullptr) {
- mGnssConfiguration = SharedRefBase::make<GnssConfiguration>(this);
- }
- *_aidl_return = mGnssConfiguration;
- return ndk::ScopedAStatus::ok();
- }
- ::ndk::ScopedAStatus Gnss::getExtensionGnssPowerIndication(
- std::shared_ptr<::aidl::android::hardware::gnss::IGnssPowerIndication>* _aidl_return) {
- ENTRY_LOG_CALLFLOW();
- if (mGnssPowerIndication == nullptr) {
- mGnssPowerIndication = SharedRefBase::make<GnssPowerIndication>();
- }
- *_aidl_return = mGnssPowerIndication;
- return ndk::ScopedAStatus::ok();
- }
- ::ndk::ScopedAStatus Gnss::getExtensionGnssMeasurement(
- std::shared_ptr<::aidl::android::hardware::gnss::IGnssMeasurementInterface>* _aidl_return) {
- ENTRY_LOG_CALLFLOW();
- if (mGnssMeasurementInterface == nullptr) {
- mGnssMeasurementInterface = SharedRefBase::make<GnssMeasurementInterface>();
- }
- *_aidl_return = mGnssMeasurementInterface;
- return ndk::ScopedAStatus::ok();
- }
- GnssAPIClient* Gnss::getApi() {
- if (mApi != nullptr) {
- return mApi;
- }
- if (mGnssCallback != nullptr) {
- mApi = new GnssAPIClient(mGnssCallback);
- } else {
- LOC_LOGW("%s] GnssAPIClient is not ready", __FUNCTION__);
- return mApi;
- }
- if (mPendingConfig.size == sizeof(GnssConfig)) {
-
- mApi->gnssConfigurationUpdate(mPendingConfig);
-
- mPendingConfig.size = 0;
- if (mPendingConfig.assistanceServer.hostName != nullptr) {
- free((void*)mPendingConfig.assistanceServer.hostName);
- }
- }
- return mApi;
- }
- }
- }
- }
- }
- }
|