1/* Copyright (c) 2009,2011 Code Aurora Forum. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above
9 *       copyright notice, this list of conditions and the following
10 *       disclaimer in the documentation and/or other materials provided
11 *       with the distribution.
12 *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
13 *       contributors may be used to endorse or promote products derived
14 *       from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#ifndef LOC_ENG_H
31#define LOC_ENG_H
32
33#ifdef __cplusplus
34extern "C" {
35#endif /* __cplusplus */
36
37// Uncomment to keep all LOG messages (LOGD, LOGI, LOGV, etc.)
38#define MAX_NUM_ATL_CONNECTIONS  2
39// Define boolean type to be used by libgps on loc api module
40typedef unsigned char boolean;
41
42#ifndef TRUE
43#define TRUE 1
44#endif
45
46#ifndef FALSE
47#define FALSE 0
48#endif
49
50#include <loc.h>
51#include <loc_eng_xtra.h>
52#include <loc_eng_ni.h>
53#include <loc_eng_agps.h>
54#include <loc_cfg.h>
55#include <loc_log.h>
56#include <log_util.h>
57#include <loc_eng_msg.h>
58#include <loc_eng_agps.h>
59#include <LocApiAdapter.h>
60
61// The data connection minimal open time
62#define DATA_OPEN_MIN_TIME        1  /* sec */
63
64// The system sees GPS engine turns off after inactive for this period of time
65#define GPS_AUTO_OFF_TIME         2  /* secs */
66#define SUCCESS              TRUE
67#define FAILURE                 FALSE
68#define INVALID_ATL_CONNECTION_HANDLE -1
69
70#define MAX_APN_LEN 100
71#define MAX_URL_LEN 256
72#define smaller_of(a, b) (((a) > (b)) ? (b) : (a))
73
74enum loc_mute_session_e_type {
75   LOC_MUTE_SESS_NONE = 0,
76   LOC_MUTE_SESS_WAIT,
77   LOC_MUTE_SESS_IN_SESSION
78};
79
80// Module data
81typedef struct
82{
83    LocApiAdapter                 *client_handle;
84    loc_location_cb_ext            location_cb;
85    gps_status_callback            status_cb;
86    loc_sv_status_cb_ext           sv_status_cb;
87    agps_status_callback           agps_status_cb;
88    gps_nmea_callback              nmea_cb;
89    gps_ni_notify_callback         ni_notify_cb;
90    gps_acquire_wakelock           acquire_wakelock_cb;
91    gps_release_wakelock           release_wakelock_cb;
92    boolean                        intermediateFix;
93    AGpsStatusValue                agps_status;
94    // used to defer stopping the GPS engine until AGPS data calls are done
95    boolean                        agps_request_pending;
96    boolean                        stop_request_pending;
97    loc_eng_xtra_data_s_type       xtra_module_data;
98    loc_eng_ni_data_s_type         loc_eng_ni_data;
99
100    boolean                        navigating;
101
102    // AGPS state machines
103    AgpsStateMachine*              agnss_nif;
104    AgpsStateMachine*              internet_nif;
105
106    // GPS engine status
107    GpsStatusValue                 engine_status;
108    GpsStatusValue                 fix_session_status;
109
110    // Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
111    GpsAidingData                  aiding_data_for_deletion;
112
113    void*                          context;
114
115    loc_eng_msg_position_mode      position_mode;
116
117    // For muting session broadcast
118    loc_mute_session_e_type        mute_session_state;
119
120    // Address buffers, for addressing setting before init
121    int    supl_host_set;
122    char   supl_host_buf[101];
123    int    supl_port_buf;
124    int    c2k_host_set;
125    char   c2k_host_buf[101];
126    int    c2k_port_buf;
127    int    mpc_host_set;
128    char   mpc_host_buf[101];
129    int    mpc_port_buf;
130} loc_eng_data_s_type;
131
132
133int  loc_eng_init(loc_eng_data_s_type &loc_eng_data,
134                  LocCallbacks* callbacks,
135                  LOC_API_ADAPTER_EVENT_MASK_T event);
136int  loc_eng_start(loc_eng_data_s_type &loc_eng_data);
137int  loc_eng_stop(loc_eng_data_s_type &loc_eng_data);
138void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data);
139int  loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data,
140                         GpsUtcTime time, int64_t timeReference,
141                         int uncertainty);
142int  loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data,
143                             double latitude, double longitude,
144                             float accuracy);
145void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data,
146                                GpsAidingData f);
147int  loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
148                               LocPositionMode mode, GpsPositionRecurrence recurrence,
149                               uint32_t min_interval, uint32_t preferred_accuracy,
150                               uint32_t preferred_time);
151const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data,
152                                  const char* name);
153#ifdef QCOM_FEATURE_ULP
154int  loc_eng_update_criteria(loc_eng_data_s_type &loc_eng_data,
155                             UlpLocationCriteria criteria);
156#endif
157
158void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data,
159                       AGpsCallbacks* callbacks);
160#ifdef QCOM_FEATURE_IPV6
161int  loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsType agpsType,
162                      const char* apn, AGpsBearerType bearerType);
163int  loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsType agpsType);
164int  loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsType agpsType);
165#else
166int  loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, const char* apn);
167int  loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data);
168int  loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data);
169#endif
170
171int  loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
172                              LocServerType type, const char *hostname, int port);
173
174
175void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
176                                                  int avaiable, const char* apn);
177
178
179bool loc_eng_inject_raw_command(loc_eng_data_s_type &loc_eng_data,
180                                char* command, int length);
181
182
183void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data);
184
185int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
186                       GpsXtraCallbacks* callbacks);
187
188int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
189                             char* data, int length);
190
191extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data,
192                            GpsNiCallbacks *callbacks);
193extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
194                               int notif_id, GpsUserResponseType user_response);
195extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
196                                   const GpsNiNotification *notif,
197                                   const void* passThrough);
198extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
199
200#ifdef __cplusplus
201}
202#endif /* __cplusplus */
203
204#endif // LOC_ENG_H
205