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