Home | History | Annotate | Download | only in libloc_api_50001
      1 /* Copyright (c) 2009-2014, 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
     34 extern "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
     41 typedef 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 
     72 enum 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 
     77 enum 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
     84 typedef 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_set_capabilities           set_capabilities_cb;
     94     gps_acquire_wakelock           acquire_wakelock_cb;
     95     gps_release_wakelock           release_wakelock_cb;
     96     gps_request_utc_time           request_utc_time_cb;
     97     gps_measurement_callback       gps_measurement_cb;
     98     boolean                        intermediateFix;
     99     AGpsStatusValue                agps_status;
    100     loc_eng_xtra_data_s_type       xtra_module_data;
    101     loc_eng_ni_data_s_type         loc_eng_ni_data;
    102 
    103     // AGPS state machines
    104     AgpsStateMachine*              agnss_nif;
    105     AgpsStateMachine*              internet_nif;
    106     AgpsStateMachine*              wifi_nif;
    107     //State machine for Data Services
    108     AgpsStateMachine*              ds_nif;
    109 
    110     // GPS engine status
    111     GpsStatusValue                 engine_status;
    112     GpsStatusValue                 fix_session_status;
    113 
    114     // Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
    115     GpsAidingData                  aiding_data_for_deletion;
    116 
    117     // For muting session broadcast
    118     loc_mute_session_e_type        mute_session_state;
    119 
    120     // For nmea generation
    121     boolean generateNmea;
    122     uint32_t sv_used_mask;
    123     float hdop;
    124     float pdop;
    125     float vdop;
    126 
    127     // Address buffers, for addressing setting before init
    128     int    supl_host_set;
    129     char   supl_host_buf[101];
    130     int    supl_port_buf;
    131     int    c2k_host_set;
    132     char   c2k_host_buf[101];
    133     int    c2k_port_buf;
    134     int    mpc_host_set;
    135     char   mpc_host_buf[101];
    136     int    mpc_port_buf;
    137 
    138     loc_ext_parser location_ext_parser;
    139     loc_ext_parser sv_ext_parser;
    140 } loc_eng_data_s_type;
    141 
    142 /* GPS.conf support */
    143 /* NOTE: the implementaiton of the parser casts number
    144    fields to 32 bit. To ensure all 'n' fields working,
    145    they must all be 32 bit fields. */
    146 typedef struct loc_gps_cfg_s
    147 {
    148     uint32_t       INTERMEDIATE_POS;
    149     uint32_t       ACCURACY_THRES;
    150     uint32_t       SUPL_VER;
    151     uint32_t       SUPL_MODE;
    152     uint32_t       CAPABILITIES;
    153     uint32_t       LPP_PROFILE;
    154     uint32_t       XTRA_VERSION_CHECK;
    155     char        XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH];
    156     char        XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH];
    157     char        XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH];
    158     uint32_t       USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL;
    159     uint32_t       NMEA_PROVIDER;
    160     uint32_t       GPS_LOCK;
    161     uint32_t       A_GLONASS_POS_PROTOCOL_SELECT;
    162     uint32_t       AGPS_CERT_WRITABLE_MASK;
    163 } loc_gps_cfg_s_type;
    164 
    165 /* NOTE: the implementaiton of the parser casts number
    166    fields to 32 bit. To ensure all 'n' fields working,
    167    they must all be 32 bit fields. */
    168 /* Meanwhile, *_valid fields are 8 bit fields, and 'f'
    169    fields are double. Rigid as they are, it is the
    170    the status quo, until the parsing mechanism is
    171    change, that is. */
    172 typedef struct
    173 {
    174     uint8_t        GYRO_BIAS_RANDOM_WALK_VALID;
    175     double         GYRO_BIAS_RANDOM_WALK;
    176     uint32_t       SENSOR_ACCEL_BATCHES_PER_SEC;
    177     uint32_t       SENSOR_ACCEL_SAMPLES_PER_BATCH;
    178     uint32_t       SENSOR_GYRO_BATCHES_PER_SEC;
    179     uint32_t       SENSOR_GYRO_SAMPLES_PER_BATCH;
    180     uint32_t       SENSOR_ACCEL_BATCHES_PER_SEC_HIGH;
    181     uint32_t       SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH;
    182     uint32_t       SENSOR_GYRO_BATCHES_PER_SEC_HIGH;
    183     uint32_t       SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH;
    184     uint32_t       SENSOR_CONTROL_MODE;
    185     uint32_t       SENSOR_USAGE;
    186     uint32_t       SENSOR_ALGORITHM_CONFIG_MASK;
    187     uint8_t        ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
    188     double         ACCEL_RANDOM_WALK_SPECTRAL_DENSITY;
    189     uint8_t        ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
    190     double         ANGLE_RANDOM_WALK_SPECTRAL_DENSITY;
    191     uint8_t        RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
    192     double         RATE_RANDOM_WALK_SPECTRAL_DENSITY;
    193     uint8_t        VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
    194     double         VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY;
    195     uint32_t       SENSOR_PROVIDER;
    196 } loc_sap_cfg_s_type;
    197 
    198 extern loc_gps_cfg_s_type gps_conf;
    199 extern loc_sap_cfg_s_type sap_conf;
    200 
    201 
    202 uint32_t getCarrierCapabilities();
    203 
    204 //loc_eng functions
    205 int  loc_eng_init(loc_eng_data_s_type &loc_eng_data,
    206                   LocCallbacks* callbacks,
    207                   LOC_API_ADAPTER_EVENT_MASK_T event,
    208                   ContextBase* context);
    209 int  loc_eng_start(loc_eng_data_s_type &loc_eng_data);
    210 int  loc_eng_stop(loc_eng_data_s_type &loc_eng_data);
    211 void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data);
    212 int  loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data,
    213                          GpsUtcTime time, int64_t timeReference,
    214                          int uncertainty);
    215 int  loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data,
    216                              double latitude, double longitude,
    217                              float accuracy);
    218 void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data,
    219                                 GpsAidingData f);
    220 int  loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
    221                                LocPosMode &params);
    222 const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data,
    223                                   const char* name);
    224 int  loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
    225                               LocServerType type, const char *hostname, int port);
    226 void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data);
    227 int loc_eng_read_config(void);
    228 
    229 //loc_eng_agps functions
    230 void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data,
    231                        AGpsExtCallbacks* callbacks);
    232 int  loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
    233                       const char* apn, AGpsBearerType bearerType);
    234 int  loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
    235 int  loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
    236 void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
    237                                                   int avaiable, const char* apn);
    238 int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data,
    239                                       const DerEncodedCertificate* certificates,
    240                                       size_t length);
    241 
    242 //loc_eng_xtra functions
    243 int  loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
    244                        GpsXtraExtCallbacks* callbacks);
    245 int  loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
    246                              char* data, int length);
    247 int  loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data);
    248 void loc_eng_xtra_version_check(loc_eng_data_s_type &loc_eng_data, int check);
    249 
    250 //loc_eng_ni functions
    251 extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data,
    252                             GpsNiExtCallbacks *callbacks);
    253 extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
    254                                int notif_id, GpsUserResponseType user_response);
    255 extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
    256                                    const GpsNiNotification *notif,
    257                                    const void* passThrough);
    258 extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
    259 
    260 void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data,
    261                                    const char* config_data, int32_t length);
    262 int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data,
    263                                  GpsMeasurementCallbacks* callbacks);
    264 void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data);
    265 
    266 #ifdef __cplusplus
    267 }
    268 #endif /* __cplusplus */
    269 
    270 #endif // LOC_ENG_H
    271