| /* Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of Code Aurora Forum, Inc. nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| */ |
| |
| #define LOG_NDDEBUG 0 |
| #define LOG_TAG "LocSvc_afw" |
| |
| #include <hardware/gps.h> |
| #include <dlfcn.h> |
| #include <loc_eng.h> |
| #include <loc_log.h> |
| #include <fcntl.h> |
| #include <errno.h> |
| |
| static gps_location_callback gps_loc_cb = NULL; |
| static gps_sv_status_callback gps_sv_cb = NULL; |
| |
| static void loc_cb(GpsLocation* location, void* locExt); |
| static void sv_cb(GpsSvStatus* sv_status, void* svExt); |
| |
| static const GpsGeofencingInterface* get_geofence_interface(void); |
| |
| // Function declarations for sLocEngInterface |
| static int loc_init(GpsCallbacks* callbacks); |
| static int loc_start(); |
| static int loc_stop(); |
| static void loc_cleanup(); |
| static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty); |
| static int loc_inject_location(double latitude, double longitude, float accuracy); |
| static void loc_delete_aiding_data(GpsAidingData f); |
| static int loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence, |
| uint32_t min_interval, uint32_t preferred_accuracy, |
| uint32_t preferred_time); |
| static const void* loc_get_extension(const char* name); |
| #ifdef QCOM_FEATURE_ULP |
| static int loc_update_criteria(UlpLocationCriteria criteria); |
| #endif |
| |
| // Defines the GpsInterface in gps.h |
| static const GpsInterface sLocEngInterface = |
| { |
| sizeof(GpsInterface), |
| loc_init, |
| loc_start, |
| loc_stop, |
| loc_cleanup, |
| loc_inject_time, |
| loc_inject_location, |
| loc_delete_aiding_data, |
| loc_set_position_mode, |
| loc_get_extension |
| #ifdef QCOM_FEATURE_ULP |
| ,loc_update_criteria |
| #endif |
| }; |
| |
| // Function declarations for sLocEngAGpsInterface |
| static void loc_agps_init(AGpsCallbacks* callbacks); |
| #ifdef QCOM_FEATURE_IPV6 |
| static int loc_agps_open(AGpsType agpsType, |
| const char* apn, AGpsBearerType bearerType); |
| static int loc_agps_closed(AGpsType agpsType); |
| static int loc_agps_open_failed(AGpsType agpsType); |
| #else |
| static int loc_agps_open(const char* apn); |
| static int loc_agps_closed(); |
| static int loc_agps_open_failed(); |
| #endif |
| static int loc_agps_set_server(AGpsType type, const char *hostname, int port); |
| |
| static const AGpsInterface sLocEngAGpsInterface = |
| { |
| sizeof(AGpsInterface), |
| loc_agps_init, |
| loc_agps_open, |
| loc_agps_closed, |
| loc_agps_open_failed, |
| loc_agps_set_server |
| }; |
| |
| static int loc_xtra_init(GpsXtraCallbacks* callbacks); |
| static int loc_xtra_inject_data(char* data, int length); |
| |
| static const GpsXtraInterface sLocEngXTRAInterface = |
| { |
| sizeof(GpsXtraInterface), |
| loc_xtra_init, |
| loc_xtra_inject_data |
| }; |
| |
| static void loc_ni_init(GpsNiCallbacks *callbacks); |
| static void loc_ni_respond(int notif_id, GpsUserResponseType user_response); |
| |
| const GpsNiInterface sLocEngNiInterface = |
| { |
| sizeof(GpsNiInterface), |
| loc_ni_init, |
| loc_ni_respond, |
| }; |
| |
| 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); |
| static void loc_agps_ril_ni_message(uint8_t *msg, size_t len); |
| static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info); |
| static void loc_agps_ril_update_network_availability(int avaiable, const char* apn); |
| |
| static const AGpsRilInterface sLocEngAGpsRilInterface = |
| { |
| sizeof(AGpsRilInterface), |
| loc_agps_ril_init, |
| loc_agps_ril_set_ref_location, |
| loc_agps_ril_set_set_id, |
| loc_agps_ril_ni_message, |
| loc_agps_ril_update_network_state, |
| loc_agps_ril_update_network_availability |
| }; |
| |
| #ifdef QCOM_FEATURE_ULP |
| static bool loc_inject_raw_command(char* command, int length); |
| |
| static const InjectRawCmdInterface sLocEngInjectRawCmdInterface = |
| { |
| sizeof(InjectRawCmdInterface), |
| loc_inject_raw_command |
| }; |
| #endif |
| |
| static loc_eng_data_s_type loc_afw_data; |
| static int gss_fd = 0; |
| |
| /*=========================================================================== |
| FUNCTION gps_get_hardware_interface |
| |
| DESCRIPTION |
| Returns the GPS hardware interaface based on LOC API |
| if GPS is enabled. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| const GpsInterface* gps_get_hardware_interface () |
| { |
| ENTRY_LOG_CALLFLOW(); |
| const GpsInterface* ret_val; |
| |
| char propBuf[PROPERTY_VALUE_MAX]; |
| |
| // check to see if GPS should be disabled |
| property_get("gps.disable", propBuf, ""); |
| if (propBuf[0] == '1') |
| { |
| LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n"); |
| ret_val = NULL; |
| } else { |
| ret_val = &sLocEngInterface; |
| } |
| |
| EXIT_LOG(%p, ret_val); |
| return ret_val; |
| } |
| |
| // for gps.c |
| extern "C" const GpsInterface* get_gps_interface() |
| { |
| char baseband[PROPERTY_VALUE_MAX]; |
| property_get("ro.baseband", baseband, "msm"); |
| if (strcmp(baseband,"apq") == 0) |
| { |
| gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB); |
| gss_fd = open("/dev/gss", O_RDONLY); |
| if (gss_fd < 0) { |
| LOC_LOGE("GSS open failed: %s\n", strerror(errno)); |
| } |
| LOC_LOGD("GSS open success! CAPABILITIES %0x\n", gps_conf.CAPABILITIES); |
| } |
| |
| return &sLocEngInterface; |
| } |
| /*=========================================================================== |
| FUNCTION loc_init |
| |
| DESCRIPTION |
| Initialize the location engine, this include setting up global datas |
| and registers location engien with loc api service. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/Ax |
| |
| ===========================================================================*/ |
| static int loc_init(GpsCallbacks* callbacks) |
| { |
| ENTRY_LOG(); |
| LOC_API_ADAPTER_EVENT_MASK_T event = |
| LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | |
| LOC_API_ADAPTER_BIT_SATELLITE_REPORT | |
| LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | |
| LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | |
| LOC_API_ADAPTER_BIT_IOCTL_REPORT | |
| LOC_API_ADAPTER_BIT_STATUS_REPORT | |
| LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | |
| LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; |
| LocCallbacks clientCallbacks = {loc_cb, /* location_cb */ |
| callbacks->status_cb, /* status_cb */ |
| sv_cb, /* sv_status_cb */ |
| callbacks->nmea_cb, /* nmea_cb */ |
| callbacks->set_capabilities_cb, /* set_capabilities_cb */ |
| callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */ |
| callbacks->release_wakelock_cb, /* release_wakelock_cb */ |
| callbacks->create_thread_cb, /* create_thread_cb */ |
| NULL, /* location_ext_parser */ |
| NULL /* sv_ext_parser */}; |
| gps_loc_cb = callbacks->location_cb; |
| gps_sv_cb = callbacks->sv_status_cb; |
| |
| int ret_val = loc_eng_init(loc_afw_data, &clientCallbacks, event); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_cleanup |
| |
| DESCRIPTION |
| Cleans location engine. The location client handle will be released. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static void loc_cleanup() |
| { |
| ENTRY_LOG(); |
| loc_eng_cleanup(loc_afw_data); |
| gps_loc_cb = NULL; |
| gps_sv_cb = NULL; |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_start |
| |
| DESCRIPTION |
| Starts the tracking session |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_start() |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_start(loc_afw_data); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_stop |
| |
| DESCRIPTION |
| Stops the tracking session |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_stop() |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_stop(loc_afw_data); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_set_position_mode |
| |
| DESCRIPTION |
| Sets the mode and fix frequency for the tracking session. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_set_position_mode(GpsPositionMode mode, |
| GpsPositionRecurrence recurrence, |
| uint32_t min_interval, |
| uint32_t preferred_accuracy, |
| uint32_t preferred_time) |
| { |
| ENTRY_LOG(); |
| LocPositionMode locMode; |
| switch (mode) { |
| case GPS_POSITION_MODE_MS_BASED: |
| locMode = LOC_POSITION_MODE_MS_BASED; |
| break; |
| case GPS_POSITION_MODE_MS_ASSISTED: |
| locMode = LOC_POSITION_MODE_MS_ASSISTED; |
| break; |
| default: |
| locMode = LOC_POSITION_MODE_STANDALONE; |
| break; |
| } |
| int ret_val = loc_eng_set_position_mode(loc_afw_data, locMode, |
| recurrence, min_interval, |
| preferred_accuracy, preferred_time); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_inject_time |
| |
| DESCRIPTION |
| This is used by Java native function to do time injection. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_inject_time(loc_afw_data, time, timeReference, uncertainty); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| |
| /*=========================================================================== |
| FUNCTION loc_inject_location |
| |
| DESCRIPTION |
| This is used by Java native function to do location injection. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0 : Successful |
| error code : Failure |
| |
| SIDE EFFECTS |
| N/A |
| ===========================================================================*/ |
| static int loc_inject_location(double latitude, double longitude, float accuracy) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| |
| /*=========================================================================== |
| FUNCTION loc_delete_aiding_data |
| |
| DESCRIPTION |
| This is used by Java native function to delete the aiding data. The function |
| updates the global variable for the aiding data to be deleted. If the GPS |
| engine is off, the aiding data will be deleted. Otherwise, the actual action |
| will happen when gps engine is turned off. |
| |
| DEPENDENCIES |
| Assumes the aiding data type specified in GpsAidingData matches with |
| LOC API specification. |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static void loc_delete_aiding_data(GpsAidingData f) |
| { |
| ENTRY_LOG(); |
| loc_eng_delete_aiding_data(loc_afw_data, f); |
| |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| #ifdef QCOM_FEATURE_ULP |
| /*=========================================================================== |
| FUNCTION loc_update_criteria |
| |
| DESCRIPTION |
| This is used to inform the ULP module of new unique criteria that are passed |
| in by the applications |
| DEPENDENCIES |
| N/A |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_update_criteria(UlpLocationCriteria criteria) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_update_criteria(loc_afw_data, criteria); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #endif |
| |
| const GpsGeofencingInterface* get_geofence_interface(void) |
| { |
| ENTRY_LOG(); |
| void *handle; |
| const char *error; |
| typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void); |
| get_gps_geofence_interface_function get_gps_geofence_interface; |
| static const GpsGeofencingInterface* geofence_interface = NULL; |
| |
| dlerror(); /* Clear any existing error */ |
| |
| handle = dlopen ("libgeofence.so", RTLD_NOW); |
| |
| if (!handle) |
| { |
| if ((error = dlerror()) != NULL) { |
| LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error); |
| } |
| goto exit; |
| } |
| dlerror(); /* Clear any existing error */ |
| get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface"); |
| if ((error = dlerror()) != NULL) { |
| LOC_LOGE ("%s, dlsym for ulpInterface failed, error = %s\n", __func__, error); |
| goto exit; |
| } |
| |
| geofence_interface = get_gps_geofence_interface(); |
| |
| exit: |
| EXIT_LOG(%d, geofence_interface == NULL); |
| return geofence_interface; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_get_extension |
| |
| DESCRIPTION |
| Get the gps extension to support XTRA. |
| |
| DEPENDENCIES |
| N/A |
| |
| RETURN VALUE |
| The GPS extension interface. |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static const void* loc_get_extension(const char* name) |
| { |
| ENTRY_LOG(); |
| const void* ret_val = NULL; |
| |
| if (strcmp(name, GPS_XTRA_INTERFACE) == 0) |
| { |
| ret_val = &sLocEngXTRAInterface; |
| } |
| |
| else if (strcmp(name, AGPS_INTERFACE) == 0) |
| { |
| ret_val = &sLocEngAGpsInterface; |
| } |
| |
| else if (strcmp(name, GPS_NI_INTERFACE) == 0) |
| { |
| ret_val = &sLocEngNiInterface; |
| } |
| |
| else if (strcmp(name, AGPS_RIL_INTERFACE) == 0) |
| { |
| ret_val = &sLocEngAGpsRilInterface; |
| } |
| |
| else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0) |
| { |
| ret_val = get_geofence_interface(); |
| } |
| #ifdef QCOM_FEATURE_ULP |
| else if (strcmp(name, ULP_RAW_CMD_INTERFACE) == 0) |
| { |
| ret_val = &sLocEngInjectRawCmdInterface; |
| } |
| #endif |
| else |
| { |
| LOC_LOGE ("get_extension: Invalid interface passed in\n"); |
| } |
| |
| EXIT_LOG(%p, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_init |
| |
| DESCRIPTION |
| Initialize the AGps interface. |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static void loc_agps_init(AGpsCallbacks* callbacks) |
| { |
| ENTRY_LOG(); |
| loc_eng_agps_init(loc_afw_data, callbacks); |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_open |
| |
| DESCRIPTION |
| This function is called when on-demand data connection opening is successful. |
| It should inform ARM 9 about the data open result. |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| #ifdef QCOM_FEATURE_IPV6 |
| static int loc_agps_open(AGpsType agpsType, |
| const char* apn, AGpsBearerType bearerType) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #else |
| static int loc_agps_open(const char* apn) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_open(loc_afw_data, apn); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #endif |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_closed |
| |
| DESCRIPTION |
| This function is called when on-demand data connection closing is done. |
| It should inform ARM 9 about the data close result. |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| #ifdef QCOM_FEATURE_IPV6 |
| static int loc_agps_closed(AGpsType agpsType) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #else |
| static int loc_agps_closed() |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_closed(loc_afw_data); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #endif |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_open_failed |
| |
| DESCRIPTION |
| This function is called when on-demand data connection opening has failed. |
| It should inform ARM 9 about the data open result. |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| #ifdef QCOM_FEATURE_IPV6 |
| int loc_agps_open_failed(AGpsType agpsType) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #else |
| int loc_agps_open_failed() |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_agps_open_failed(loc_afw_data); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| #endif |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_set_server |
| |
| DESCRIPTION |
| If loc_eng_set_server is called before loc_eng_init, it doesn't work. This |
| proxy buffers server settings and calls loc_eng_set_server when the client is |
| open. |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| 0 |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_agps_set_server(AGpsType type, const char* hostname, int port) |
| { |
| ENTRY_LOG(); |
| LocServerType serverType; |
| switch (type) { |
| case AGPS_TYPE_SUPL: |
| serverType = LOC_AGPS_SUPL_SERVER; |
| break; |
| case AGPS_TYPE_C2K: |
| serverType = LOC_AGPS_CDMA_PDE_SERVER; |
| break; |
| } |
| int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_xtra_init |
| |
| DESCRIPTION |
| Initialize XTRA module. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_xtra_init(GpsXtraCallbacks* callbacks) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_xtra_init(loc_afw_data, callbacks); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| |
| /*=========================================================================== |
| FUNCTION loc_xtra_inject_data |
| |
| DESCRIPTION |
| Initialize XTRA module. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static int loc_xtra_inject_data(char* data, int length) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length); |
| |
| EXIT_LOG(%d, ret_val); |
| return ret_val; |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_ni_init |
| |
| DESCRIPTION |
| This function initializes the NI interface |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| void loc_ni_init(GpsNiCallbacks *callbacks) |
| { |
| ENTRY_LOG(); |
| loc_eng_ni_init(loc_afw_data, callbacks); |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| /*=========================================================================== |
| FUNCTION loc_ni_respond |
| |
| DESCRIPTION |
| This function sends an NI respond to the modem processor |
| |
| DEPENDENCIES |
| NONE |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| void loc_ni_respond(int notif_id, GpsUserResponseType user_response) |
| { |
| ENTRY_LOG(); |
| loc_eng_ni_respond(loc_afw_data, notif_id, user_response); |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| // Below stub functions are members of sLocEngAGpsRilInterface |
| 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) {} |
| static void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {} |
| static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {} |
| |
| /*=========================================================================== |
| FUNCTION loc_agps_ril_update_network_availability |
| |
| DESCRIPTION |
| Sets data call allow vs disallow flag to modem |
| This is the only member of sLocEngAGpsRilInterface implemented. |
| |
| DEPENDENCIES |
| None |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static void loc_agps_ril_update_network_availability(int available, const char* apn) |
| { |
| ENTRY_LOG(); |
| loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn); |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| #ifdef QCOM_FEATURE_ULP |
| /*=========================================================================== |
| FUNCTION loc_inject_raw_command |
| |
| DESCRIPTION |
| This is used to send special test modem commands from the applications |
| down into the HAL |
| DEPENDENCIES |
| N/A |
| |
| RETURN VALUE |
| 0: success |
| |
| SIDE EFFECTS |
| N/A |
| |
| ===========================================================================*/ |
| static bool loc_inject_raw_command(char* command, int length) |
| { |
| ENTRY_LOG(); |
| int ret_val = loc_eng_inject_raw_command(loc_afw_data, command, length); |
| EXIT_LOG(%s, loc_logger_boolStr[ret_val!=0]); |
| return ret_val; |
| } |
| #endif |
| |
| |
| static void loc_cb(GpsLocation* location, void* locExt) |
| { |
| ENTRY_LOG(); |
| if (NULL != gps_loc_cb && NULL != location) { |
| #ifdef QCOM_FEATURE_ULP |
| CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source); |
| #else |
| CALLBACK_LOG_CALLFLOW("location_cb - at", %llu, location->timestamp); |
| #endif |
| gps_loc_cb(location); |
| } |
| EXIT_LOG(%s, VOID_RET); |
| } |
| |
| static void sv_cb(GpsSvStatus* sv_status, void* svExt) |
| { |
| ENTRY_LOG(); |
| if (NULL != gps_sv_cb) { |
| CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs); |
| gps_sv_cb(sv_status); |
| } |
| EXIT_LOG(%s, VOID_RET); |
| } |