1/* Copyright (c) 2009-2013, The Linux Foundation. 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 The Linux Foundation, 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
40// Define boolean type to be used by libgps on loc api module
41typedef unsigned char boolean;
42
43#ifndef TRUE
44#define TRUE 1
45#endif
46
47#ifndef FALSE
48#define FALSE 0
49#endif
50
51#include <loc.h>
52#include <loc_eng_xtra.h>
53#include <loc_eng_ni.h>
54#include <loc_eng_agps.h>
55#include <loc_cfg.h>
56#include <loc_log.h>
57#include <log_util.h>
58#include <loc_eng_agps.h>
59#include <LocEngAdapter.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_XTRA_SERVER_URL_LENGTH 256
71
72enum loc_nmea_provider_e_type {
73    NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA
74    NMEA_PROVIDER_MP // Modem Processor Provider of NMEA
75};
76
77enum loc_mute_session_e_type {
78   LOC_MUTE_SESS_NONE = 0,
79   LOC_MUTE_SESS_WAIT,
80   LOC_MUTE_SESS_IN_SESSION
81};
82
83// Module data
84typedef struct loc_eng_data_s
85{
86    LocEngAdapter                  *adapter;
87    loc_location_cb_ext            location_cb;
88    gps_status_callback            status_cb;
89    loc_sv_status_cb_ext           sv_status_cb;
90    agps_status_extended           agps_status_cb;
91    gps_nmea_callback              nmea_cb;
92    gps_ni_notify_callback         ni_notify_cb;
93    gps_acquire_wakelock           acquire_wakelock_cb;
94    gps_release_wakelock           release_wakelock_cb;
95    gps_request_utc_time           request_utc_time_cb;
96    boolean                        intermediateFix;
97    AGpsStatusValue                agps_status;
98    loc_eng_xtra_data_s_type       xtra_module_data;
99    loc_eng_ni_data_s_type         loc_eng_ni_data;
100
101    // AGPS state machines
102    AgpsStateMachine*              agnss_nif;
103    AgpsStateMachine*              internet_nif;
104    AgpsStateMachine*              wifi_nif;
105    //State machine for Data Services
106    AgpsStateMachine*              ds_nif;
107
108    // GPS engine status
109    GpsStatusValue                 engine_status;
110    GpsStatusValue                 fix_session_status;
111
112    // Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
113    GpsAidingData                  aiding_data_for_deletion;
114
115    // For muting session broadcast
116    loc_mute_session_e_type        mute_session_state;
117
118    // For nmea generation
119    boolean generateNmea;
120    uint32_t sv_used_mask;
121    float hdop;
122    float pdop;
123    float vdop;
124
125    // Address buffers, for addressing setting before init
126    int    supl_host_set;
127    char   supl_host_buf[101];
128    int    supl_port_buf;
129    int    c2k_host_set;
130    char   c2k_host_buf[101];
131    int    c2k_port_buf;
132    int    mpc_host_set;
133    char   mpc_host_buf[101];
134    int    mpc_port_buf;
135
136    loc_ext_parser location_ext_parser;
137    loc_ext_parser sv_ext_parser;
138} loc_eng_data_s_type;
139
140/* GPS.conf support */
141typedef struct loc_gps_cfg_s
142{
143    unsigned long  INTERMEDIATE_POS;
144    unsigned long  ACCURACY_THRES;
145    unsigned long  ENABLE_WIPER;
146    unsigned long  SUPL_VER;
147    unsigned long  CAPABILITIES;
148    unsigned long  QUIPC_ENABLED;
149    unsigned long  LPP_PROFILE;
150    uint8_t        NMEA_PROVIDER;
151    unsigned long  A_GLONASS_POS_PROTOCOL_SELECT;
152    char           XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH];
153    char           XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH];
154    char           XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH];
155} loc_gps_cfg_s_type;
156
157typedef struct
158{
159    uint8_t        GYRO_BIAS_RANDOM_WALK_VALID;
160    double         GYRO_BIAS_RANDOM_WALK;
161    unsigned long  SENSOR_ACCEL_BATCHES_PER_SEC;
162    unsigned long  SENSOR_ACCEL_SAMPLES_PER_BATCH;
163    unsigned long  SENSOR_GYRO_BATCHES_PER_SEC;
164    unsigned long  SENSOR_GYRO_SAMPLES_PER_BATCH;
165    unsigned long  SENSOR_ACCEL_BATCHES_PER_SEC_HIGH;
166    unsigned long  SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH;
167    unsigned long  SENSOR_GYRO_BATCHES_PER_SEC_HIGH;
168    unsigned long  SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH;
169    unsigned long  SENSOR_CONTROL_MODE;
170    unsigned long  SENSOR_USAGE;
171    unsigned long  SENSOR_ALGORITHM_CONFIG_MASK;
172    uint8_t        ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
173    double         ACCEL_RANDOM_WALK_SPECTRAL_DENSITY;
174    uint8_t        ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
175    double         ANGLE_RANDOM_WALK_SPECTRAL_DENSITY;
176    uint8_t        RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
177    double         RATE_RANDOM_WALK_SPECTRAL_DENSITY;
178    uint8_t        VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
179    double         VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY;
180} loc_sap_cfg_s_type;
181
182extern loc_gps_cfg_s_type gps_conf;
183extern loc_sap_cfg_s_type sap_conf;
184
185int  loc_eng_init(loc_eng_data_s_type &loc_eng_data,
186                  LocCallbacks* callbacks,
187                  LOC_API_ADAPTER_EVENT_MASK_T event);
188int  loc_eng_start(loc_eng_data_s_type &loc_eng_data);
189int  loc_eng_stop(loc_eng_data_s_type &loc_eng_data);
190void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data);
191int  loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data,
192                         GpsUtcTime time, int64_t timeReference,
193                         int uncertainty);
194int  loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data,
195                             double latitude, double longitude,
196                             float accuracy);
197void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data,
198                                GpsAidingData f);
199int  loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
200                               LocPosMode &params);
201const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data,
202                                  const char* name);
203void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data,
204                       AGpsExtCallbacks* callbacks);
205int  loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
206                      const char* apn, AGpsBearerType bearerType);
207int  loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
208int  loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
209
210int  loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
211                              LocServerType type, const char *hostname, int port);
212
213
214void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
215                                                  int avaiable, const char* apn);
216
217
218bool loc_eng_inject_raw_command(loc_eng_data_s_type &loc_eng_data,
219                                char* command, int length);
220
221
222void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data);
223
224int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
225                       GpsXtraExtCallbacks* callbacks);
226
227int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
228                             char* data, int length);
229
230int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data);
231
232extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data,
233                            GpsNiExtCallbacks *callbacks);
234extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
235                               int notif_id, GpsUserResponseType user_response);
236extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
237                                   const GpsNiNotification *notif,
238                                   const void* passThrough);
239extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
240int loc_eng_read_config(void);
241
242#ifdef __cplusplus
243}
244#endif /* __cplusplus */
245
246#endif // LOC_ENG_H
247