1f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani/* Copyright (c) 2009,2011 Code Aurora Forum. All rights reserved. 2f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 3f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * Redistribution and use in source and binary forms, with or without 4f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * modification, are permitted provided that the following conditions are 5f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * met: 6f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * * Redistributions of source code must retain the above copyright 7f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * notice, this list of conditions and the following disclaimer. 8f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * * Redistributions in binary form must reproduce the above 9f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * copyright notice, this list of conditions and the following 10f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * disclaimer in the documentation and/or other materials provided 11f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * with the distribution. 12f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * * Neither the name of Code Aurora Forum, Inc. nor the names of its 13f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * contributors may be used to endorse or promote products derived 14f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * from this software without specific prior written permission. 15f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 16f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani * 28f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani */ 29b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 30b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#define LOG_NDDEBUG 0 31b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 32b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <stdio.h> 33b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <stdlib.h> 34b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <unistd.h> 35b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <ctype.h> 36b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <math.h> 37b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <pthread.h> 38b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <arpa/inet.h> 39b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <netdb.h> 40b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 41b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <rpc/rpc.h> 42b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include "loc_api_rpc_glue.h" 43b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include "loc_apicb_appinit.h" 44b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 45b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <cutils/properties.h> 46b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <cutils/sched_policy.h> 47b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <utils/SystemClock.h> 48b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 49b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <loc_eng.h> 50b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <loc_eng_ni.h> 51b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 52b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#define LOG_TAG "lib_locapi" 53b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#include <utils/Log.h> 54b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 55b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood// comment this out to enable logging 56f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani// #undef LOGD 57f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani// #define LOGD(...) {} 58b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 59b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#define DEBUG_MOCK_NI 0 60b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 61b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood// Function declarations for sLocEngInterface 62b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_init(GpsCallbacks* callbacks); 63b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_start(); 64b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_stop(); 653c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwoodstatic int loc_eng_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence, 663c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); 67b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_cleanup(); 68b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty); 69b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_inject_location(double latitude, double longitude, float accuracy); 70b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_delete_aiding_data (GpsAidingData f); 71b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic const void* loc_eng_get_extension(const char* name); 72b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 73b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood// Function declarations for sLocEngAGpsInterface 74b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_agps_init(AGpsCallbacks* callbacks); 75b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_open(const char* apn); 76b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_closed(); 77b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_failed(); 78b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_set_server(AGpsType type, const char* hostname, int port); 79b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 80b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 81b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int32 loc_event_cb (rpc_loc_client_handle_type client_handle, 82b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_event_mask_type loc_event, 83b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood const rpc_loc_event_payload_u_type* loc_event_payload); 84b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_position (const rpc_loc_parsed_position_s_type *location_report_ptr); 85b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_sv (const rpc_loc_gnss_info_s_type *gnss_report_ptr); 86b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_status (const rpc_loc_status_event_s_type *status_report_ptr); 87b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_nmea (const rpc_loc_nmea_report_s_type *nmea_report_ptr); 88b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_process_conn_request (const rpc_loc_server_request_s_type *server_request_ptr); 89b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 905153d56321e20974d29c0649839d96e8351775b6Mike Lockwoodstatic void loc_eng_process_deferred_action (void* arg); 912c115de4096177477cf9495de9dd533267d0607eMike Lockwoodstatic void loc_eng_process_atl_deferred_action (int flags); 92b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_delete_aiding_data_deferred_action (void); 93b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 94b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int set_agps_server(); 95b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 96b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood// Defines the GpsInterface in gps.h 97b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic const GpsInterface sLocEngInterface = 98b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 99300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood sizeof(GpsInterface), 100b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_init, 101b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_start, 102b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_stop, 103b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_cleanup, 104b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_inject_time, 105b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_inject_location, 106b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_delete_aiding_data, 107b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_set_position_mode, 108b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_get_extension, 109b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood}; 110b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 111b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic const AGpsInterface sLocEngAGpsInterface = 112b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 113300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood sizeof(AGpsInterface), 114b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_agps_init, 115b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_agps_data_conn_open, 116b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_agps_data_conn_closed, 117b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_agps_data_conn_failed, 118b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_agps_set_server, 119b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood}; 120b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 121b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood// Global data structure for location engine 122b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodloc_eng_data_s_type loc_eng_data; 123b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 124b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 125b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION gps_get_hardware_interface 126b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 127b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 128b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Returns the GPS hardware interaface based on LOC API 129b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if GPS is enabled. 130b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 131b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 132b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 133b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 134b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 135b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0: success 136b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 137b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 138b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 139b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 140b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 141b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodconst GpsInterface* gps_get_hardware_interface () 142b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 143b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood char propBuf[PROPERTY_VALUE_MAX]; 144b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 145b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // check to see if GPS should be disabled 146b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood property_get("gps.disable", propBuf, ""); 147b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (propBuf[0] == '1') 148b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 149f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("gps_get_interface returning NULL because gps.disable=1\n"); 150b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return NULL; 151b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 152b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 153b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return &sLocEngInterface; 154b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 155b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 156b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 157b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_init 158b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 159b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 160b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Initialize the location engine, this include setting up global datas 161b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood and registers location engien with loc api service. 162b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 163b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 164b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 165b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 166b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 167b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0: success 168b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 169b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 170b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 171b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 172b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 1739391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood 1749391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood// fully shutting down the GPS is temporarily disabled to avoid intermittent BP crash 1759391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#define DISABLE_CLEANUP 1 1769391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood 177b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_init(GpsCallbacks* callbacks) 178b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1799391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#if DISABLE_CLEANUP 1809391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood if (loc_eng_data.deferred_action_thread) { 1819391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood // already initialized 1829391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood return 0; 1839391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood } 1849391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#endif 185b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Start the LOC api RPC service 186b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_api_glue_init (); 187b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1883c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood callbacks->set_capabilities_cb(GPS_CAPABILITY_SCHEDULING | GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB); 1893c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood 190b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (&loc_eng_data, 0, sizeof (loc_eng_data_s_type)); 191b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 192b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // LOC ENG module data initialization 1932c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.location_cb = callbacks->location_cb; 1942c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.sv_status_cb = callbacks->sv_status_cb; 1952c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.status_cb = callbacks->status_cb; 1962c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.nmea_cb = callbacks->nmea_cb; 1972c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb; 1982c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb; 199b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 200b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_event_mask_type event = RPC_LOC_EVENT_PARSED_POSITION_REPORT | 201b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_SATELLITE_REPORT | 202b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_LOCATION_SERVER_REQUEST | 203b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST | 204b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_IOCTL_REPORT | 205b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_STATUS_REPORT | 206b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_NMEA_POSITION_REPORT | 207b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST; 208b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 209b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.client_handle = loc_open (event, loc_event_cb); 210b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 211b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_init (&(loc_eng_data.deferred_action_mutex), NULL); 212b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_init (&(loc_eng_data.deferred_action_cond) , NULL); 213bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_init (&(loc_eng_data.deferred_stop_mutex), NULL); 214bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood 21524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_data.loc_event = 0; 2162c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags = 0; 217b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (loc_eng_data.apn_name, 0, sizeof (loc_eng_data.apn_name)); 218b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 219b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.aiding_data_for_deletion = 0; 220b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.engine_status = GPS_STATUS_NONE; 221b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 222b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // XTRA module data initialization 223b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.xtra_module_data.download_request_cb = NULL; 224b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 225b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // IOCTL module data initialization 226b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.ioctl_data.cb_is_selected = FALSE; 227b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.ioctl_data.cb_is_waiting = FALSE; 228b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.ioctl_data.client_handle = RPC_LOC_CLIENT_HANDLE_INVALID; 229b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (&(loc_eng_data.ioctl_data.cb_payload), 230b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0, 231b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood sizeof (rpc_loc_ioctl_callback_s_type)); 232b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 233b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_init (&(loc_eng_data.ioctl_data.cb_data_mutex), NULL); 234b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_init(&loc_eng_data.ioctl_data.cb_arrived_cond, NULL); 235b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 2365153d56321e20974d29c0649839d96e8351775b6Mike Lockwood loc_eng_data.deferred_action_thread = callbacks->create_thread_cb("loc_api", 2375153d56321e20974d29c0649839d96e8351775b6Mike Lockwood loc_eng_process_deferred_action, NULL); 238b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 239f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_init called, client id = %d\n", (int32) loc_eng_data.client_handle); 240b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 241b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 242b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 243b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 244b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_cleanup 245b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 246b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 247b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Cleans location engine. The location client handle will be released. 248b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 249b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 250b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 251b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 252b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 253b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 254b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 255b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 256b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 257b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 258b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 259b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_cleanup() 260b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 2619391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#if DISABLE_CLEANUP 2629391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood return; 2639391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#else 264b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.deferred_action_thread) 265b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 266b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood /* Terminate deferred action working thread */ 2672c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_lock(&loc_eng_data.deferred_action_mutex); 2682c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 2692c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 2702c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_QUIT; 2712c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_cond_signal(&loc_eng_data.deferred_action_cond); 2722c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_unlock(&loc_eng_data.deferred_action_mutex); 273b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 274b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood void* ignoredValue; 275b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_join(loc_eng_data.deferred_action_thread, &ignoredValue); 276b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.deferred_action_thread = NULL; 277b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 278b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 279b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // clean up 280b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (void) loc_close (loc_eng_data.client_handle); 281b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 282b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_destroy (&loc_eng_data.deferred_action_mutex); 283b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_destroy (&loc_eng_data.deferred_action_cond); 284b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 285b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_destroy (&loc_eng_data.ioctl_data.cb_data_mutex); 286b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_destroy (&loc_eng_data.ioctl_data.cb_arrived_cond); 287b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 288ae1989429bcdce118229b4b728daaed99b039e8fMike Lockwood// Do not call this as it can result in the ARM9 crashing if it sends events while we are disabled 289ae1989429bcdce118229b4b728daaed99b039e8fMike Lockwood// loc_apicb_app_deinit(); 2909391343952a0ab27a738f5b3de5c5525ecbc096dMike Lockwood#endif 291b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 292b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 293b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 294b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 295b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_start 296b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 297b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 298b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Starts the tracking session 299b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 300b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 301b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 302b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 303b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 304b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0: success 305b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 306b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 307b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 308b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 309b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 310b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_start() 311b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 312b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int ret_val; 313f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_start\n"); 314b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 315b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.position_mode != GPS_POSITION_MODE_STANDALONE && 316b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_server_host[0] != 0 && 317b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_server_port != 0) { 318b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int result = set_agps_server(); 319f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("set_agps_server returned = %d\n", result); 320b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 321b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 322b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_start_fix (loc_eng_data.client_handle); 323b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 324b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != RPC_LOC_API_SUCCESS) 325b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 326f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_start returned error = %d\n", ret_val); 327b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 328b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 329b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 330b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 331b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 332b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 333b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 334b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_stop 335b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 336b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 337b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Stops the tracking session 338b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 339b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 340b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 341b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 342b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 343b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0: success 344b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 345b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 346b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 347b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 348b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 349b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_stop() 350b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 351b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int ret_val; 352b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 353f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_stop\n"); 354b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 355bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_stop_mutex)); 356bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood // work around problem with loc_eng_stop when AGPS requests are pending 357bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood // we defer stopping the engine until the AGPS request is done 358bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood if (loc_eng_data.agps_request_pending) 359bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood { 360bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood loc_eng_data.stop_request_pending = true; 361f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("deferring stop until AGPS data call is finished\n"); 362bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_stop_mutex)); 363bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood return 0; 364bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood } 365bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_stop_mutex)); 366bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood 367b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_stop_fix (loc_eng_data.client_handle); 368b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != RPC_LOC_API_SUCCESS) 369b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 370f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_stop returned error = %d\n", ret_val); 371b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 372b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 373b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 374b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 375b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 376b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_set_gps_lock(rpc_loc_lock_e_type lock_type) 377b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 378b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 379b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 380b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 381f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_gps_lock mode, client = %d, lock_type = %d\n", 382b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (int32) loc_eng_data.client_handle, lock_type); 383b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 384b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.rpc_loc_ioctl_data_u_type_u.engine_lock = lock_type; 385b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_SET_ENGINE_LOCK; 386b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 387b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 388b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_IOCTL_SET_ENGINE_LOCK, 389b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 390b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 391b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL /* No output information is expected*/); 392b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 393b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != TRUE) 394b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 395f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_gps_lock mode failed\n"); 396b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 397b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 398b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 399b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 400b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 401b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 402b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_set_position_mode 403b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 404b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 4053c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood Sets the mode and fix frequency for the tracking session. 406b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 407b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 408b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 409b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 410b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 411b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0: success 412b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 413b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 414b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 415b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 416b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 4173c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwoodstatic int loc_eng_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence, 4183c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time) 419b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 420b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 421b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_fix_criteria_s_type *fix_criteria_ptr; 422b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 423b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 424f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n", 4253c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood (int32) loc_eng_data.client_handle, min_interval, mode); 426b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 427b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.position_mode = mode; 428b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_SET_FIX_CRITERIA; 429b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 430b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood fix_criteria_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria); 4313c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE | 432b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE; 433b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 4343c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood switch (mode) { 4353c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood case GPS_POSITION_MODE_MS_BASED: 4363c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSB; 4373c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood break; 4383c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood case GPS_POSITION_MODE_MS_ASSISTED: 4393c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSA; 4403c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood break; 4413c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood case GPS_POSITION_MODE_STANDALONE: 4423c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood default: 4433c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_STANDALONE; 4443c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood break; 445b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 4463c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood if (min_interval > 0) { 4473c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->min_interval = min_interval; 4483c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL; 449b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 4503c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood if (preferred_accuracy > 0) { 4513c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->preferred_accuracy = preferred_accuracy; 4523c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY; 4533c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood } 4543c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood if (preferred_time > 0) { 4553c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->preferred_response_time = preferred_time; 4563c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME; 4573c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood } 4583c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood 4593c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood switch (recurrence) { 4603c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood case GPS_POSITION_RECURRENCE_SINGLE: 4613c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX; 4623c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood break; 4633c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood case GPS_POSITION_RECURRENCE_PERIODIC: 4643c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood default: 4653c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX; 4663c865ec2f9efbe5e21b55c1b43a2fbe9ffe1000aMike Lockwood break; 467b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 468b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 469b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl(loc_eng_data.client_handle, 470b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_IOCTL_SET_FIX_CRITERIA, 471b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 472b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 473b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL /* No output information is expected*/); 474b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 475b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != TRUE) 476b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 477f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_position mode failed\n"); 478b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 479b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 480b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 481b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 482b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 483b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 484b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_inject_time 485b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 486b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 487b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood This is used by Java native function to do time injection. 488b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 489b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 490b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 491b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 492b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 493b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_API_SUCCESS 494b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 495b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 496b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 497b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 498b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 499b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_inject_time (GpsUtcTime time, int64_t timeReference, int uncertainty) 500b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 501b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 502b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_assist_data_time_s_type *time_info_ptr; 503b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 504b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 505f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_inject_time, uncertainty = %d\n", uncertainty); 506b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 507b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_INJECT_UTC_TIME; 508b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 509b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood time_info_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.assistance_data_time); 510b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood time_info_ptr->time_utc = time; 511b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood time_info_ptr->time_utc += (int64_t)(android::elapsedRealtime() - timeReference); 512b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood time_info_ptr->uncertainty = uncertainty; // Uncertainty in ms 513b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 514b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 515b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_IOCTL_INJECT_UTC_TIME, 516b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 517b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 518b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL /* No output information is expected*/); 519b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 520b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != TRUE) 521b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 522f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_inject_time failed\n"); 523b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 524b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 525b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 526b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 527b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 528b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_inject_location (double latitude, double longitude, float accuracy) 529b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 530b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood /* not yet implemented */ 531b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 532b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 533b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 534b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 535b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_delete_aiding_data 536b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 537b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 538b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood This is used by Java native function to delete the aiding data. The function 539b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood updates the global variable for the aiding data to be deleted. If the GPS 540b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood engine is off, the aiding data will be deleted. Otherwise, the actual action 541b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood will happen when gps engine is turned off. 542b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 543b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 544b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Assumes the aiding data type specified in GpsAidingData matches with 545b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC API specification. 546b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 547b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 548b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_API_SUCCESS 549b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 550b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 551b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 552b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 553b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 554b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_delete_aiding_data (GpsAidingData f) 555b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 556b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_action_mutex)); 557b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 558a4977cd631b6f4bc1ee74d0ed60977cb06d12e6fMike Lockwood // Currently, LOC API only support deletion of all aiding data, 559a4977cd631b6f4bc1ee74d0ed60977cb06d12e6fMike Lockwood if (f) 560b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.aiding_data_for_deletion = GPS_DELETE_ALL; 561b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 5626774225c7860662a75ff580ded6f23b50dd8f324Mike Lockwood if ((loc_eng_data.engine_status != GPS_STATUS_SESSION_BEGIN) && 563b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (loc_eng_data.aiding_data_for_deletion != 0)) 564b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 5652c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 5662c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 5672c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_DELETE_AIDING; 568b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_signal(&(loc_eng_data.deferred_action_cond)); 569b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 570b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // In case gps engine is ON, the assistance data will be deleted when the engine is OFF 571b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 572b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 573b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_action_mutex)); 574b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 575b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 576b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 577b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_get_extension 578b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 579b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 580b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Get the gps extension to support XTRA. 581b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 582b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 583b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 584b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 585b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 586b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood The GPS extension interface. 587b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 588b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 589b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 590b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 591b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 592b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic const void* loc_eng_get_extension(const char* name) 593b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 594b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (strcmp(name, GPS_XTRA_INTERFACE) == 0) 595b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 596b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return &sLocEngXTRAInterface; 597b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 598b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else if (strcmp(name, AGPS_INTERFACE) == 0) 599b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 600b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return &sLocEngAGpsInterface; 601b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 602b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else if (strcmp(name, GPS_NI_INTERFACE) == 0) 603b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 604b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return &sLocEngNiInterface; 605b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 606b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 607b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return NULL; 608b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 609b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 610b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#if DEBUG_MOCK_NI == 1 611b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 612b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION mock_ni 613b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 614b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 615b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood DEBUG tool: simulate an NI request 616b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 617b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 618b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 619b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 620b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 621b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 622b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 623b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 624b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 625b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 626b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 627b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void* mock_ni(void* arg) 628b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 629b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood static int busy = 0; 630b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 631b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (busy) return NULL; 632b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 633b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood busy = 1; 634b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 635b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood sleep(5); 636b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 637b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_client_handle_type client_handle; 638b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_event_mask_type loc_event; 639b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_event_payload_u_type payload; 640b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ni_event_s_type *ni_req; 641b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ni_supl_notify_verify_req_s_type *supl_req; 642b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 643b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood client_handle = (rpc_loc_client_handle_type) arg; 644b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 645b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_event = RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST; 646b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood payload.disc = loc_event; 647b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 648b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ni_req = &payload.rpc_loc_event_payload_u_type_u.ni_request; 649b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ni_req->event = RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ; 650b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req = &ni_req->payload.rpc_loc_ni_event_payload_u_type_u.supl_req; 651b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 652b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Encodings for Spirent Communications 653b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood char client_name[80] = {0x53,0x78,0x5A,0x5E,0x76,0xD3,0x41,0xC3,0x77, 654b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0xBB,0x5D,0x77,0xA7,0xC7,0x61,0x7A,0xFA,0xED,0x9E,0x03}; 655b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood char requestor_id[80] = {0x53,0x78,0x5A,0x5E,0x76,0xD3,0x41,0xC3,0x77, 656b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0xBB,0x5D,0x77,0xA7,0xC7,0x61,0x7A,0xFA,0xED,0x9E,0x03}; 657b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 658b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->flags = RPC_LOC_NI_CLIENT_NAME_PRESENT | 659b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_NI_REQUESTOR_ID_PRESENT | 660b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_NI_ENCODING_TYPE_PRESENT; 661b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 662b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->datacoding_scheme = RPC_LOC_NI_SUPL_GSM_DEFAULT; 663b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 664b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->client_name.data_coding_scheme = RPC_LOC_NI_SUPL_GSM_DEFAULT; // no coding 665b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->client_name.client_name_string.client_name_string_len = strlen(client_name); 666b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->client_name.client_name_string.client_name_string_val = client_name; 667b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->client_name.string_len = strlen(client_name); 668b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 669b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->requestor_id.data_coding_scheme = RPC_LOC_NI_SUPL_GSM_DEFAULT; 670b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->requestor_id.requestor_id_string.requestor_id_string_len = strlen(requestor_id); 671b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->requestor_id.requestor_id_string.requestor_id_string_val = requestor_id; 672b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->requestor_id.string_len = strlen(requestor_id); 673b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 674b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->notification_priv_type = RPC_LOC_NI_USER_NOTIFY_VERIFY_ALLOW_NO_RESP; 675b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood supl_req->user_response_timer = 10; 676b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 677b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_event_cb(client_handle, loc_event, &payload); 678b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 679b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood busy = 0; 680b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 681b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return NULL; 682b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 683b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood#endif // DEBUG_MOCK_NI 684b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 685b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 686b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_event_cb 687b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 688b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 689b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood This is the callback function registered by loc_open. 690b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 691b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 692b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 693b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 694b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 695b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_API_SUCCESS 696b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 697b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 698b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 699b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 700b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 701b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int32 loc_event_cb( 702b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_client_handle_type client_handle, 703b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_event_mask_type loc_event, 704b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood const rpc_loc_event_payload_u_type* loc_event_payload 705b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ) 706b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 707f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_event_cb, client = %d, loc_event = 0x%x", (int32) client_handle, (uint32) loc_event); 708b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (client_handle == loc_eng_data.client_handle) 709b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 71024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood pthread_mutex_lock(&loc_eng_data.deferred_action_mutex); 71124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_data.loc_event = loc_event; 71224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood memcpy(&loc_eng_data.loc_event_payload, loc_event_payload, sizeof(*loc_event_payload)); 713b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 7142c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 7152c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 7162c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_EVENT; 7172c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_cond_signal(&loc_eng_data.deferred_action_cond); 7182c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_unlock(&loc_eng_data.deferred_action_mutex); 719b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 720b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 721b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 722f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc client mismatch: received = %d, expected = %d \n", (int32) client_handle, (int32) loc_eng_data.client_handle); 723b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 724b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 725b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return RPC_LOC_API_SUCCESS; 726b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 727b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 728b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 729b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_report_position 730b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 731b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 732b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Reports position information to the Java layer. 733b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 734b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 735b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 736b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 737b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 738b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 739b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 740b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 741b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 742b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 743b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 744b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_position (const rpc_loc_parsed_position_s_type *location_report_ptr) 745b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 746b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood GpsLocation location; 747b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 748f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_position: location report, valid mask = 0x%x, sess status = %d\n", 749b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (uint32) location_report_ptr->valid_mask, location_report_ptr->session_status); 750b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 751300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood memset (&location, 0, sizeof(location)); 752300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood location.size = sizeof(location); 753b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SESSION_STATUS) 754b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 755b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Not a position report, return 756b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->session_status == RPC_LOC_SESS_STATUS_SUCCESS) 757b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 758b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_TIMESTAMP_UTC) 759b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 760b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.timestamp = location_report_ptr->timestamp_utc; 761b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 762b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 763b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LATITUDE) && 764b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_LONGITUDE)) 765b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 766b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.flags |= GPS_LOCATION_HAS_LAT_LONG; 767b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.latitude = location_report_ptr->latitude; 768b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.longitude = location_report_ptr->longitude; 769b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 770b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 771b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID ) 772b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 773b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.flags |= GPS_LOCATION_HAS_ALTITUDE; 774b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.altitude = location_report_ptr->altitude_wrt_ellipsoid; 775b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 776b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 777b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_HORIZONTAL) && 778b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_SPEED_VERTICAL)) 779b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 780b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.flags |= GPS_LOCATION_HAS_SPEED; 781b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.speed = sqrt(location_report_ptr->speed_horizontal * location_report_ptr->speed_horizontal + 782b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location_report_ptr->speed_vertical * location_report_ptr->speed_vertical); 783b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 784b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 785b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HEADING) 786b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 787b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.flags |= GPS_LOCATION_HAS_BEARING; 788b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.bearing = location_report_ptr->heading; 789b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 790b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 791b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (location_report_ptr->valid_mask & RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR) 792b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 793b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.flags |= GPS_LOCATION_HAS_ACCURACY; 794b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood location.accuracy = location_report_ptr->hor_unc_circular; 795b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 796b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 797b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.location_cb != NULL) 798b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 799f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_position: fire callback\n"); 800b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.location_cb (&location); 801b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 802b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 803b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 804b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 805f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_position: ignore position report when session status = %d\n", location_report_ptr->session_status); 806b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 807b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 808b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 809b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 810f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_position: ignore position report when session status is not set\n"); 811b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 812b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 813b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 814b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 815b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_report_sv 816b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 817b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 818b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Reports GPS satellite information to the Java layer. 819b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 820b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 821b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 822b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 823b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 824b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 825b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 826b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 827b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 828b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 829b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 830b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_sv (const rpc_loc_gnss_info_s_type *gnss_report_ptr) 831b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 832b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood GpsSvStatus SvStatus; 833b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int num_svs_max, i; 834b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood const rpc_loc_sv_info_s_type *sv_info_ptr; 835b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 836f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_sv: valid_mask = 0x%x, num of sv = %d\n", 837b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (uint32) gnss_report_ptr->valid_mask, 838b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood gnss_report_ptr->sv_count); 839b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 840b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood num_svs_max = 0; 841b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (&SvStatus, 0, sizeof (GpsSvStatus)); 842b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT) 843b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 844b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood num_svs_max = gnss_report_ptr->sv_count; 845b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (num_svs_max > GPS_MAX_SVS) 846b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 847b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood num_svs_max = GPS_MAX_SVS; 848b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 849b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 850b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 851b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (gnss_report_ptr->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST) 852b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 853b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.num_svs = 0; 854b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 855b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood for (i = 0; i < num_svs_max; i++) 856b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 857b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood sv_info_ptr = &(gnss_report_ptr->sv_list.sv_list_val[i]); 858b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SYSTEM) 859b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 860b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GPS) 861b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 862300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood SvStatus.sv_list[SvStatus.num_svs].size = sizeof(GpsSvStatus); 863b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn; 864b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 865b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // We only have the data field to report gps eph and alm mask 866b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_EPH) && 867b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (sv_info_ptr->has_eph == 1)) 868b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 869b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.ephemeris_mask |= (1 << (sv_info_ptr->prn-1)); 870b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 871b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 872b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_HAS_ALM) && 873b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (sv_info_ptr->has_alm == 1)) 874b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 875b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.almanac_mask |= (1 << (sv_info_ptr->prn-1)); 876b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 877b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 878b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_PROCESS_STATUS) && 879b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (sv_info_ptr->process_status == RPC_LOC_SV_STATUS_TRACK)) 880b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 881b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.used_in_fix_mask |= (1 << (sv_info_ptr->prn-1)); 882b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 883b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 884b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // SBAS: GPS RPN: 120-151, 885b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // In exteneded measurement report, we follow nmea standard, which is from 33-64. 886b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_SBAS) 887b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 888b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + 33 - 120; 889b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 890b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Gloness: Slot id: 1-32 891b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // In extended measurement report, we follow nmea standard, which is 65-96 892b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else if (sv_info_ptr->system == RPC_LOC_SV_SYSTEM_GLONASS) 893b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 894b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].prn = sv_info_ptr->prn + (65-1); 895b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 896b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Unsupported SV system 897b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 898b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 899b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood continue; 900b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 901b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 902b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 903b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_SNR) 904b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 905b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].snr = sv_info_ptr->snr; 906b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 907b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 908b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_ELEVATION) 909b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 910b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].elevation = sv_info_ptr->elevation; 911b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 912b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 913b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (sv_info_ptr->valid_mask & RPC_LOC_SV_INFO_VALID_AZIMUTH) 914b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 915b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.sv_list[SvStatus.num_svs].azimuth = sv_info_ptr->azimuth; 916b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 917b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 918b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood SvStatus.num_svs++; 919b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 920b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 921b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 922f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("num_svs = %d, eph mask = %d, alm mask = %d\n", SvStatus.num_svs, SvStatus.ephemeris_mask, SvStatus.almanac_mask ); 923b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if ((SvStatus.num_svs != 0) && (loc_eng_data.sv_status_cb != NULL)) 924b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 925b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.sv_status_cb(&SvStatus); 926b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 927b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 928b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 929b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 930b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_report_status 931b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 932b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 933b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Reports GPS engine state to Java layer. 934b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 935b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 936b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 937b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 938b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 939b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 940b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 941b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 942b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 943b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 944b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 945b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_status (const rpc_loc_status_event_s_type *status_report_ptr) 946b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 947b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood GpsStatus status; 948b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 949f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("loc_eng_report_status: event = %d\n", status_report_ptr->event); 950b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 951300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood memset (&status, 0, sizeof(status)); 952300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood status.size = sizeof(status); 953b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood status.status = GPS_STATUS_NONE; 954b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) 955b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 956b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON) 957b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 95824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // GPS_STATUS_SESSION_BEGIN implies GPS_STATUS_ENGINE_ON 959b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood status.status = GPS_STATUS_SESSION_BEGIN; 9605153d56321e20974d29c0649839d96e8351775b6Mike Lockwood loc_eng_data.status_cb(&status); 961b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 962b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF) 963b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 96424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // GPS_STATUS_SESSION_END implies GPS_STATUS_ENGINE_OFF 9656774225c7860662a75ff580ded6f23b50dd8f324Mike Lockwood status.status = GPS_STATUS_ENGINE_OFF; 9665153d56321e20974d29c0649839d96e8351775b6Mike Lockwood loc_eng_data.status_cb(&status); 967b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 968b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 969b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 9702c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_lock(&loc_eng_data.deferred_action_mutex); 971b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.engine_status = status.status; 972b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 973b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Wake up the thread for aiding data deletion. 9746774225c7860662a75ff580ded6f23b50dd8f324Mike Lockwood if ((loc_eng_data.engine_status != GPS_STATUS_SESSION_BEGIN) && 975b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (loc_eng_data.aiding_data_for_deletion != 0)) 976b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 9772c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 9782c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 9792c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_DELETE_AIDING; 980b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_signal(&(loc_eng_data.deferred_action_cond)); 981b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // In case gps engine is ON, the assistance data will be deleted when the engine is OFF 982b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 983b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 9842c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_unlock(&loc_eng_data.deferred_action_mutex); 985b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 986b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 987b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_report_nmea (const rpc_loc_nmea_report_s_type *nmea_report_ptr) 988b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 989b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.nmea_cb != NULL) 990b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 991b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood struct timeval tv; 992b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 993b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood gettimeofday(&tv, (struct timezone *) NULL); 994b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood long long now = tv.tv_sec * 1000LL + tv.tv_usec / 1000; 995b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 996c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#if (AMSS_VERSION==3200) 997b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.nmea_cb(now, nmea_report_ptr->nmea_sentences.nmea_sentences_val, 998b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood nmea_report_ptr->nmea_sentences.nmea_sentences_len); 999c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#else 1000c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood loc_eng_data.nmea_cb(now, nmea_report_ptr->nmea_sentences, nmea_report_ptr->length); 1001c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#endif 1002b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1003b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1004b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1005b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 1006b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_process_conn_request 1007b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1008b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 1009b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Requests data connection to be brought up/tore down with the location server. 1010b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1011b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 1012b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1013b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1014b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 1015b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1016b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1017b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 1018b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1019b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1020b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 1021b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_process_conn_request (const rpc_loc_server_request_s_type *server_request_ptr) 1022b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1023f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_event_cb: get loc event location server request, event = %d\n", server_request_ptr->event); 1024b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1025b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Signal DeferredActionThread to send the APN name 1026b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&loc_eng_data.deferred_action_mutex); 1027b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1028b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // This implemenation is based on the fact that modem now at any time has only one data connection for AGPS at any given time 1029b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (server_request_ptr->event == RPC_LOC_SERVER_REQUEST_OPEN) 1030b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1031b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.conn_handle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.open_req.conn_handle; 1032b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_status = GPS_REQUEST_AGPS_DATA_CONN; 1033bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood loc_eng_data.agps_request_pending = true; 1034b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1035b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 1036b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1037b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.conn_handle = server_request_ptr->payload.rpc_loc_server_request_u_type_u.close_req.conn_handle; 1038b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_status = GPS_RELEASE_AGPS_DATA_CONN; 1039bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood loc_eng_data.agps_request_pending = false; 1040b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1041b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 10422c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 10432c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 10442c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_AGPS_STATUS; 10452c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_cond_signal(&loc_eng_data.deferred_action_cond); 10462c115de4096177477cf9495de9dd533267d0607eMike Lockwood pthread_mutex_unlock(&loc_eng_data.deferred_action_mutex); 1047b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1048b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1049b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 1050b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_agps_init 1051b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1052b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 1053b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1054b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1055b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 1056b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NONE 1057b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1058b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 1059b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 0 1060b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1061b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 1062b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1063b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1064b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 1065b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_agps_init(AGpsCallbacks* callbacks) 1066b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1067f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV("loc_eng_agps_init\n"); 1068b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_status_cb = callbacks->status_cb; 1069b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1070b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1071b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_open(const char* apn) 1072b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1073b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int apn_len; 1074f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_agps_data_conn_open: %s\n", apn); 1075b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1076b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_action_mutex)); 1077b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1078b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (apn != NULL) 1079b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1080b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood apn_len = strlen (apn); 1081b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1082b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (apn_len >= sizeof(loc_eng_data.apn_name)) 1083b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1084f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_apn: error, apn name exceeds maximum lenght of 100 chars\n"); 1085b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood apn_len = sizeof(loc_eng_data.apn_name) - 1; 1086b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1087b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1088b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memcpy (loc_eng_data.apn_name, apn, apn_len); 1089b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.apn_name[apn_len] = '\0'; 1090b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1091b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 10922c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 10932c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 10942c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_AGPS_DATA_SUCCESS; 1095b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_signal(&(loc_eng_data.deferred_action_cond)); 1096b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_action_mutex)); 1097b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 1098b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1099b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1100b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_closed() 1101b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1102f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_agps_data_conn_closed\n"); 1103b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_action_mutex)); 11042c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 11052c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 11062c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_AGPS_DATA_CLOSED; 1107b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_signal(&(loc_eng_data.deferred_action_cond)); 1108b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_action_mutex)); 1109b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 1110b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1111b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1112b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_data_conn_failed() 1113b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1114f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_agps_data_conn_failed\n"); 1115b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1116b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_action_mutex)); 11172c115de4096177477cf9495de9dd533267d0607eMike Lockwood /* hold a wake lock while events are pending for deferred_action_thread */ 11182c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.acquire_wakelock_cb(); 11192c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags |= DEFERRED_ACTION_AGPS_DATA_FAILED; 1120b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_cond_signal(&(loc_eng_data.deferred_action_cond)); 1121b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_action_mutex)); 1122b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 1123b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1124b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1125b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int set_agps_server() 1126b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1127b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 1128b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_server_info_s_type *server_info_ptr; 1129b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 1130b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood uint16 port_temp; 1131b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood unsigned char *b_ptr; 1132b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1133b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.agps_server_host[0] == 0 || loc_eng_data.agps_server_port == 0) 1134b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return -1; 1135b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1136b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.agps_server_address == 0) { 1137b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood struct hostent* he = gethostbyname(loc_eng_data.agps_server_host); 1138b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (he) 1139b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_server_address = *(uint32_t *)he->h_addr_list[0]; 1140b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1141b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (loc_eng_data.agps_server_address == 0) 1142b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return -1; 1143b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1144b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood b_ptr = (unsigned char*) (&loc_eng_data.agps_server_address); 1145c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood 1146c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood 1147c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood server_info_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.server_addr); 1148c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR; 1149c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood server_info_ptr->addr_type = RPC_LOC_SERVER_ADDR_URL; 1150c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood server_info_ptr->addr_info.disc = RPC_LOC_SERVER_ADDR_URL; 1151c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood 1152c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#if (AMSS_VERSION==3200) 1153c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood char url[24]; 1154b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset(url, 0, sizeof(url)); 1155b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood snprintf(url, sizeof(url) - 1, "%d.%d.%d.%d:%d", 1156b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (*(b_ptr + 0) & 0x000000ff), (*(b_ptr+1) & 0x000000ff), 1157b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (*(b_ptr + 2) & 0x000000ff), (*(b_ptr+3) & 0x000000ff), 1158b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood (loc_eng_data.agps_server_port & (0x0000ffff))); 1159b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1160b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val = url; 1161c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_len = strlen(url); 1162f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("set_agps_server, addr = %s\n", server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr.addr_val); 1163c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#else 1164c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood char* buf = server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr; 1165c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood int buf_len = sizeof(server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.addr); 1166c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood memset(buf, 0, buf_len); 1167c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood snprintf(buf, buf_len - 1, "%d.%d.%d.%d:%d", 1168c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood (*(b_ptr + 0) & 0x000000ff), (*(b_ptr+1) & 0x000000ff), 1169c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood (*(b_ptr + 2) & 0x000000ff), (*(b_ptr+3) & 0x000000ff), 1170c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood (loc_eng_data.agps_server_port & (0x0000ffff))); 1171c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood 1172c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood server_info_ptr->addr_info.rpc_loc_server_addr_u_type_u.url.length = buf_len; 1173f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("set_agps_server, addr = %s\n", buf); 1174c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#endif 1175b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1176b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 1177b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR, 1178b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 1179b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 1180b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL /* No output information is expected*/); 1181b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1182b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (ret_val != TRUE) 1183b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1184f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("set_agps_server failed\n"); 1185b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return -1; 1186b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1187b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 1188b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1189f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV ("set_agps_server successful\n"); 1190b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 1191b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1192b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1193b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1194b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic int loc_eng_agps_set_server(AGpsType type, const char* hostname, int port) 1195b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1196f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_eng_set_default_agps_server, type = %d, hostname = %s, port = %d\n", type, hostname, port); 1197b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1198b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood if (type != AGPS_TYPE_SUPL) 1199b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return -1; 1200b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1201b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood strncpy(loc_eng_data.agps_server_host, hostname, sizeof(loc_eng_data.agps_server_host) - 1); 1202b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_server_port = port; 1203b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood return 0; 1204b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1205b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1206b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 1207b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_delete_aiding_data_deferred_action 1208b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1209b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 1210b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood This is used to remove the aiding data when GPS engine is off. 1211b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1212b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 1213b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Assumes the aiding data type specified in GpsAidingData matches with 1214b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC API specification. 1215b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1216b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 1217b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_API_SUCCESS 1218b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1219b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 1220b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1221b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1222b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 1223b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwoodstatic void loc_eng_delete_aiding_data_deferred_action (void) 1224b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1225b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Currently, we only support deletion of all aiding data, 1226b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // since the Android defined aiding data mask matches with modem, 1227b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // so just pass them down without any translation 1228b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 1229b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_assist_data_delete_s_type *assist_data_ptr; 1230b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 1231b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1232b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_DELETE_ASSIST_DATA; 1233b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood assist_data_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete); 1234a4977cd631b6f4bc1ee74d0ed60977cb06d12e6fMike Lockwood assist_data_ptr->type = loc_eng_data.aiding_data_for_deletion; 1235a4977cd631b6f4bc1ee74d0ed60977cb06d12e6fMike Lockwood loc_eng_data.aiding_data_for_deletion = 0; 1236a4977cd631b6f4bc1ee74d0ed60977cb06d12e6fMike Lockwood 1237b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (&(assist_data_ptr->reserved), 0, sizeof (assist_data_ptr->reserved)); 1238b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1239b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 1240b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_IOCTL_DELETE_ASSIST_DATA , 1241b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 1242b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 1243b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL); 1244b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1245f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_ioctl for aiding data deletion returned %d, 1 for success\n", ret_val); 1246b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1247b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1248b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 1249b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_process_atl_deferred_action 1250b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1251b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 1252b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood This is used to inform the location engine of the processing status for 1253b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood data connection open/close request. 1254b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1255b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 1256b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 1257b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1258b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 1259b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood RPC_LOC_API_SUCCESS 1260b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1261b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 1262b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1263b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1264b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 12652c115de4096177477cf9495de9dd533267d0607eMike Lockwoodstatic void loc_eng_process_atl_deferred_action (int flags) 1266b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 1267b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_server_open_status_s_type *conn_open_status_ptr; 1268b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_server_close_status_s_type *conn_close_status_ptr; 1269b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood rpc_loc_ioctl_data_u_type ioctl_data; 1270b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood boolean ret_val; 1271b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood int agps_status = -1; 1272b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1273f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGV("loc_eng_process_atl_deferred_action, agps_status = %d\n", loc_eng_data.agps_status); 1274b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1275b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood memset (&ioctl_data, 0, sizeof (rpc_loc_ioctl_data_u_type)); 1276b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 12772c115de4096177477cf9495de9dd533267d0607eMike Lockwood if (flags & DEFERRED_ACTION_AGPS_DATA_CLOSED) 1278b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1279b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS; 1280b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_close_status_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_close_status); 1281b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_close_status_ptr->conn_handle = loc_eng_data.conn_handle; 1282b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_close_status_ptr->close_status = RPC_LOC_SERVER_CLOSE_SUCCESS; 1283b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1284b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else 1285b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1286b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS; 1287b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_open_status_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status; 1288b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_open_status_ptr->conn_handle = loc_eng_data.conn_handle; 12892c115de4096177477cf9495de9dd533267d0607eMike Lockwood if (flags & DEFERRED_ACTION_AGPS_DATA_SUCCESS) 1290b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1291b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_open_status_ptr->open_status = RPC_LOC_SERVER_OPEN_SUCCESS; 1292b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Both buffer are of the same maximum size, and the source is null terminated 1293b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // strcpy (&(ioctl_data.rpc_loc_ioctl_data_u_type_u.conn_open_status.apn_name), &(loc_eng_data.apn_name)); 1294c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#if (AMSS_VERSION==3200) 1295b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_open_status_ptr->apn_name = loc_eng_data.apn_name; 1296c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#else 1297c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood memset(conn_open_status_ptr->apn_name, 0, sizeof(conn_open_status_ptr->apn_name)); 1298c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood strncpy(conn_open_status_ptr->apn_name, loc_eng_data.apn_name, 1299c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood sizeof(conn_open_status_ptr->apn_name) - 1); 1300c6419effb6a1da6dbc86432e66d64b5bfcacbad6Mike Lockwood#endif 1301b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Delay this so that PDSM ATL module will behave properly 1302b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood sleep (1); 1303f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_ioctl for ATL with apn_name = %s\n", conn_open_status_ptr->apn_name); 1304b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1305b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood else // data_connection_failed 1306b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1307b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood conn_open_status_ptr->open_status = RPC_LOC_SERVER_OPEN_FAIL; 1308b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1309b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Delay this so that PDSM ATL module will behave properly 1310b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood sleep (1); 1311b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1312b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1313b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ret_val = loc_eng_ioctl (loc_eng_data.client_handle, 1314b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood ioctl_data.disc, 1315b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood &ioctl_data, 1316b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood LOC_IOCTL_DEFAULT_TIMEOUT, 1317b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood NULL); 1318b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1319f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_ioctl for ATL returned %d (1 for success)\n", ret_val); 1320b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1321b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1322b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood/*=========================================================================== 132324d7556a88537061aaef7c58588813c0faf98c21Mike LockwoodFUNCTION loc_eng_process_loc_event 132424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 132524d7556a88537061aaef7c58588813c0faf98c21Mike LockwoodDESCRIPTION 132624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood This is used to process events received from the location engine. 132724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 132824d7556a88537061aaef7c58588813c0faf98c21Mike LockwoodDEPENDENCIES 132924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood None 133024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 133124d7556a88537061aaef7c58588813c0faf98c21Mike LockwoodRETURN VALUE 133224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood N/A 133324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 133424d7556a88537061aaef7c58588813c0faf98c21Mike LockwoodSIDE EFFECTS 133524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood N/A 133624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 133724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood===========================================================================*/ 133824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwoodstatic void loc_eng_process_loc_event (rpc_loc_event_mask_type loc_event, 133924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood rpc_loc_event_payload_u_type* loc_event_payload) 134024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood{ 134124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT) 134224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 134324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_report_position (&(loc_event_payload->rpc_loc_event_payload_u_type_u.parsed_location_report)); 134424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 134524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 134624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_SATELLITE_REPORT) 134724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 134824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_report_sv (&(loc_event_payload->rpc_loc_event_payload_u_type_u.gnss_report)); 134924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 135024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 135124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_STATUS_REPORT) 135224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 135324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_report_status (&(loc_event_payload->rpc_loc_event_payload_u_type_u.status_report)); 135424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 135524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 135624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_NMEA_POSITION_REPORT) 135724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 135824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_report_nmea (&(loc_event_payload->rpc_loc_event_payload_u_type_u.nmea_report)); 135924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 136024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 136124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // Android XTRA interface supports only XTRA download 136224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST) 136324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 136424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event_payload->rpc_loc_event_payload_u_type_u.assist_data_request.event == 136524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ) 136624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 1367f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_event_cb: xtra download requst"); 136824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 136924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // Call Registered callback 137024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_eng_data.xtra_module_data.download_request_cb != NULL) 137124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 137224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_data.xtra_module_data.download_request_cb (); 137324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 137424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 137524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 137624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 137724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_IOCTL_REPORT) 137824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 137924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // Process the received RPC_LOC_EVENT_IOCTL_REPORT 138024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood (void) loc_eng_ioctl_process_cb (loc_eng_data.client_handle, 138124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood &(loc_event_payload->rpc_loc_event_payload_u_type_u.ioctl_report)); 138224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 138324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 138424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event & RPC_LOC_EVENT_LOCATION_SERVER_REQUEST) 138524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 138624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_process_conn_request (&(loc_event_payload->rpc_loc_event_payload_u_type_u.loc_server_request)); 138724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 138824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 138924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_ni_callback(loc_event, loc_event_payload); 139024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 139124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood#if DEBUG_MOCK_NI == 1 139224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // DEBUG only 139324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if ((loc_event & RPC_LOC_EVENT_STATUS_REPORT) && 139424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_event_payload->rpc_loc_event_payload_u_type_u.status_report. 139524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood payload.rpc_loc_status_event_payload_u_type_u.engine_state 139624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood == RPC_LOC_ENGINE_STATE_OFF) 139724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood { 139824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // Mock an NI request 139924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood pthread_t th; 140024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood pthread_create (&th, NULL, mock_ni, (void*) client_handle); 140124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 140224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood#endif /* DEBUG_MOCK_NI == 1 */ 140324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood} 140424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 140524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood/*=========================================================================== 1406b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodFUNCTION loc_eng_process_deferred_action 1407b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1408b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDESCRIPTION 1409b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood Main routine for the thread to execute certain commands 1410b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood that are not safe to be done from within an RPC callback. 1411b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1412b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodDEPENDENCIES 1413b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 1414b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1415b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodRETURN VALUE 1416b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood None 1417b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1418b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike LockwoodSIDE EFFECTS 1419b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood N/A 1420b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1421b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood===========================================================================*/ 14225153d56321e20974d29c0649839d96e8351775b6Mike Lockwoodstatic void loc_eng_process_deferred_action (void* arg) 1423b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood{ 142424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood AGpsStatus status; 1425300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood status.size = sizeof(status); 142624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood status.type = AGPS_TYPE_SUPL; 142724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 1428f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_process_deferred_action started\n"); 1429b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1430237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood // make sure we do not run in background scheduling group 1431237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood set_sched_policy(gettid(), SP_FOREGROUND); 1432b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1433237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood // disable the GPS lock 1434f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("Setting GPS privacy lock to RPC_LOC_LOCK_NONE\n"); 1435b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_set_gps_lock(RPC_LOC_LOCK_NONE); 1436b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 14372c115de4096177477cf9495de9dd533267d0607eMike Lockwood while (1) 1438b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 143924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood GpsAidingData aiding_data_for_deletion; 144024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood GpsStatusValue engine_status; 144124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 144224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood rpc_loc_event_mask_type loc_event; 144324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood rpc_loc_event_payload_u_type loc_event_payload; 144424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 1445b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // Wait until we are signalled to do a deferred action, or exit 1446b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood pthread_mutex_lock(&loc_eng_data.deferred_action_mutex); 14472c115de4096177477cf9495de9dd533267d0607eMike Lockwood 1448a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood // If we have an event we should process it immediately, 1449a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood // otherwise wait until we are signalled 1450a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood if (loc_eng_data.deferred_action_flags == 0) { 1451a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood // do not hold a wake lock while waiting for an event... 14522c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.release_wakelock_cb(); 1453a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood pthread_cond_wait(&loc_eng_data.deferred_action_cond, 1454a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood &loc_eng_data.deferred_action_mutex); 1455a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood // but after we are signalled reacquire the wake lock 1456a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood // until we are done processing the event. 1457a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood loc_eng_data.acquire_wakelock_cb(); 1458a162c4351926285892214b0726aaf07f0631dc72Mike Lockwood } 1459b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 14602c115de4096177477cf9495de9dd533267d0607eMike Lockwood if (loc_eng_data.deferred_action_flags & DEFERRED_ACTION_QUIT) 1461b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 146224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood pthread_mutex_unlock(&loc_eng_data.deferred_action_mutex); 1463b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood break; 1464b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1465b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 146624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // copy anything we need before releasing the mutex 146724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_event = loc_eng_data.loc_event; 146824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event != 0) { 146924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood memcpy(&loc_event_payload, &loc_eng_data.loc_event_payload, sizeof(loc_event_payload)); 147024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_data.loc_event = 0; 147124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 147224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 14732c115de4096177477cf9495de9dd533267d0607eMike Lockwood int flags = loc_eng_data.deferred_action_flags; 14742c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.deferred_action_flags = 0; 147524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood engine_status = loc_eng_data.agps_status; 147624d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood aiding_data_for_deletion = loc_eng_data.aiding_data_for_deletion; 147724d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood status.status = loc_eng_data.agps_status; 147824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_data.agps_status = 0; 147924d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 148024d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood // perform all actions after releasing the mutex to avoid blocking RPCs from the ARM9 148124d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_action_mutex)); 148224d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood 148324d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (loc_event != 0) { 148424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood loc_eng_process_loc_event(loc_event, &loc_event_payload); 148524d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood } 1486b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1487b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood // send_delete_aiding_data must be done when GPS engine is off 148824d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if ((engine_status != GPS_STATUS_SESSION_BEGIN) && (aiding_data_for_deletion != 0)) 1489b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 1490b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_delete_aiding_data_deferred_action (); 1491b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1492b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 14932c115de4096177477cf9495de9dd533267d0607eMike Lockwood if (flags & (DEFERRED_ACTION_AGPS_DATA_SUCCESS | 14942c115de4096177477cf9495de9dd533267d0607eMike Lockwood DEFERRED_ACTION_AGPS_DATA_CLOSED | 14952c115de4096177477cf9495de9dd533267d0607eMike Lockwood DEFERRED_ACTION_AGPS_DATA_FAILED)) 1496b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood { 14972c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_process_atl_deferred_action(flags); 1498bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood 1499bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_lock(&(loc_eng_data.deferred_stop_mutex)); 1500bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood // work around problem with loc_eng_stop when AGPS requests are pending 1501bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood // we defer stopping the engine until the AGPS request is done 1502bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood loc_eng_data.agps_request_pending = false; 1503bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood if (loc_eng_data.stop_request_pending) 1504bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood { 1505f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("handling deferred stop\n"); 15060b602e40b8dc1f134ed94f7a781b1be2b88e760dMike Lockwood if (loc_stop_fix(loc_eng_data.client_handle) != RPC_LOC_API_SUCCESS) 15070b602e40b8dc1f134ed94f7a781b1be2b88e760dMike Lockwood { 1508f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD ("loc_stop_fix failed!\n"); 15090b602e40b8dc1f134ed94f7a781b1be2b88e760dMike Lockwood } 1510bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood } 1511bd3166c592f9f578040bb94bd7c68e4f01a0038dMike Lockwood pthread_mutex_unlock(&(loc_eng_data.deferred_stop_mutex)); 1512b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1513b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 151424d7556a88537061aaef7c58588813c0faf98c21Mike Lockwood if (status.status != 0 && loc_eng_data.agps_status_cb) { 1515b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood loc_eng_data.agps_status_cb(&status); 1516b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1517b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood } 1518b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood 1519237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood // reenable the GPS lock 1520f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("Setting GPS privacy lock to RPC_LOC_LOCK_ALL\n"); 1521237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood loc_eng_set_gps_lock(RPC_LOC_LOCK_ALL); 1522237c22f03d1800ec68b47e7df072efeab6c04199Mike Lockwood 1523f77c85bb51137f5ba854184e5e9194197027438aAjay Dudani LOGD("loc_eng_process_deferred_action thread exiting\n"); 15242c115de4096177477cf9495de9dd533267d0607eMike Lockwood loc_eng_data.release_wakelock_cb(); 15255153d56321e20974d29c0649839d96e8351775b6Mike Lockwood 15265153d56321e20974d29c0649839d96e8351775b6Mike Lockwood loc_eng_data.deferred_action_thread = 0; 1527b4c4f2016ae47fdd00e26b57d1766cf180d6f51aMike Lockwood} 1528300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood 1529300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood// for gps.c 1530300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwoodextern "C" const GpsInterface* get_gps_interface() 1531300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood{ 1532300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood return &sLocEngInterface; 1533300b715b0dc36ae82b442a201432a5f2065e664bMike Lockwood} 1534