diff --git a/loc_api/libloc_api_50001/Android.mk b/loc_api/libloc_api_50001/Android.mk index 50019b89..484bcd65 100644 --- a/loc_api/libloc_api_50001/Android.mk +++ b/loc_api/libloc_api_50001/Android.mk @@ -75,7 +75,8 @@ LOCAL_SHARED_LIBRARIES := \ libloc_core \ libgps.utils \ libdl \ - libmdmdetect + libmdmdetect \ + libperipheral_client LOCAL_SRC_FILES += \ loc.cpp \ @@ -93,7 +94,8 @@ endif LOCAL_C_INCLUDES:= \ $(TARGET_OUT_HEADERS)/gps.utils \ $(TARGET_OUT_HEADERS)/libloc_core \ - $(TARGET_OUT_HEADERS)/libmdmdetect/inc + $(TARGET_OUT_HEADERS)/libmdmdetect/inc \ + $(TARGET_OUT_HEADERS)/libperipheralclient/inc LOCAL_PRELINK_MODULE := false LOCAL_MODULE_RELATIVE_PATH := hw diff --git a/loc_api/libloc_api_50001/loc.cpp b/loc_api/libloc_api_50001/loc.cpp index 0b3c943d..b3c267e6 100644 --- a/loc_api/libloc_api_50001/loc.cpp +++ b/loc_api/libloc_api_50001/loc.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -53,6 +54,8 @@ extern "C" { #endif /* __cplusplus */ using namespace loc_core; +#define LOC_PM_CLIENT_NAME "GPS" + //Globals defns static gps_location_callback gps_loc_cb = NULL; static gps_sv_status_callback gps_sv_cb = NULL; @@ -127,9 +130,21 @@ const GpsNiInterface sLocEngNiInterface = loc_ni_respond, }; -// For shutting down MDM in fusion devices -static int mdm_fd = -1; +typedef struct { + //MAX_NAME_LEN defined in mdm_detect.h + char modem_name[MAX_NAME_LEN]; + //MAX_PATH_LEN defined in mdm_detect.h + char powerup_node[MAX_PATH_LEN]; + //this handle is used by peripheral mgr + void *handle; + int mdm_fd; + MdmType mdm_type; + bool peripheral_mgr_supported; + bool peripheral_mgr_registered; +}s_loc_mdm_info; +static s_loc_mdm_info loc_mdm_info; +static void loc_pm_event_notifier(void *client_data, enum pm_event event); static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ); static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct); static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid); @@ -262,7 +277,10 @@ SIDE EFFECTS static int loc_init(GpsCallbacks* callbacks) { int retVal = -1; - int i = 0; + enum pm_event mdm_state; + static int mdm_index = -1; + int peripheral_mgr_ret = PM_RET_FAILED; + ENTRY_LOG(); LOC_API_ADAPTER_EVENT_MASK_T event; @@ -311,7 +329,11 @@ static int loc_init(GpsCallbacks* callbacks) loc_afw_data.adapter->setPowerVote(true); LOC_LOGD("loc_eng_init() success!"); - if (mdm_fd < 0) { + + //if index is 0 or more, then we've looked for mdm already + LOC_LOGD("%s:%d]: mdm_index: %d", __func__, __LINE__, + mdm_index); + if (mdm_index < 0) { struct dev_info modem_info; memset(&modem_info, 0, sizeof(struct dev_info)); if(get_system_info(&modem_info) != RET_SUCCESS) { @@ -319,26 +341,76 @@ static int loc_init(GpsCallbacks* callbacks) __func__, __LINE__); goto err; } - for(i=0; i= 0) { + if(loc_mdm_info.peripheral_mgr_supported == true) { + LOC_LOGD("%s:%d]: Voting for modem power down", __func__, __LINE__); + pm_client_disconnect(loc_mdm_info.handle); + } + else if (loc_mdm_info.mdm_fd >= 0) { LOC_LOGD("closing the powerup node"); - close(mdm_fd); - mdm_fd = -1; + close(loc_mdm_info.mdm_fd); + loc_mdm_info.mdm_fd = -1; LOC_LOGD("finished closing the powerup node"); - } else { + } + else { LOC_LOGD("powerup node has not been opened yet."); } @@ -994,3 +1071,11 @@ static void local_sv_cb(GpsSvStatus* sv_status, void* svExt) } EXIT_LOG(%s, VOID_RET); } + +static void loc_pm_event_notifier(void *client_data, enum pm_event event) +{ + ENTRY_LOG(); + LOC_LOGD("%s:%d]: event: %d", __func__, __LINE__, (int)event); + pm_client_event_acknowledge(loc_mdm_info.handle, event); + EXIT_LOG(%s, VOID_RET); +}