/* Copyright (c) 2009-2014, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation, nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef LOC_ENG_H #define LOC_ENG_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ // Uncomment to keep all LOG messages (LOGD, LOGI, LOGV, etc.) #define MAX_NUM_ATL_CONNECTIONS 2 // Define boolean type to be used by libgps on loc api module typedef unsigned char boolean; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #include <loc.h> #include <loc_eng_xtra.h> #include <loc_eng_ni.h> #include <loc_eng_agps.h> #include <loc_cfg.h> #include <loc_log.h> #include <log_util.h> #include <loc_eng_agps.h> #include <LocEngAdapter.h> // The data connection minimal open time #define DATA_OPEN_MIN_TIME 1 /* sec */ // The system sees GPS engine turns off after inactive for this period of time #define GPS_AUTO_OFF_TIME 2 /* secs */ #define SUCCESS TRUE #define FAILURE FALSE #define INVALID_ATL_CONNECTION_HANDLE -1 #define MAX_XTRA_SERVER_URL_LENGTH 256 enum loc_nmea_provider_e_type { NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA NMEA_PROVIDER_MP // Modem Processor Provider of NMEA }; enum loc_mute_session_e_type { LOC_MUTE_SESS_NONE = 0, LOC_MUTE_SESS_WAIT, LOC_MUTE_SESS_IN_SESSION }; // Module data typedef struct loc_eng_data_s { LocEngAdapter *adapter; loc_location_cb_ext location_cb; gps_status_callback status_cb; loc_sv_status_cb_ext sv_status_cb; agps_status_extended agps_status_cb; gps_nmea_callback nmea_cb; gps_ni_notify_callback ni_notify_cb; gps_set_capabilities set_capabilities_cb; gps_acquire_wakelock acquire_wakelock_cb; gps_release_wakelock release_wakelock_cb; gps_request_utc_time request_utc_time_cb; gps_measurement_callback gps_measurement_cb; boolean intermediateFix; AGpsStatusValue agps_status; loc_eng_xtra_data_s_type xtra_module_data; loc_eng_ni_data_s_type loc_eng_ni_data; // AGPS state machines AgpsStateMachine* agnss_nif; AgpsStateMachine* internet_nif; AgpsStateMachine* wifi_nif; //State machine for Data Services AgpsStateMachine* ds_nif; // GPS engine status GpsStatusValue engine_status; GpsStatusValue fix_session_status; // Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off GpsAidingData aiding_data_for_deletion; // For muting session broadcast loc_mute_session_e_type mute_session_state; // For nmea generation boolean generateNmea; uint32_t sv_used_mask; float hdop; float pdop; float vdop; // Address buffers, for addressing setting before init int supl_host_set; char supl_host_buf[101]; int supl_port_buf; int c2k_host_set; char c2k_host_buf[101]; int c2k_port_buf; int mpc_host_set; char mpc_host_buf[101]; int mpc_port_buf; loc_ext_parser location_ext_parser; loc_ext_parser sv_ext_parser; } loc_eng_data_s_type; /* GPS.conf support */ /* NOTE: the implementaiton of the parser casts number fields to 32 bit. To ensure all 'n' fields working, they must all be 32 bit fields. */ typedef struct loc_gps_cfg_s { uint32_t INTERMEDIATE_POS; uint32_t ACCURACY_THRES; uint32_t SUPL_VER; uint32_t SUPL_MODE; uint32_t CAPABILITIES; uint32_t LPP_PROFILE; uint32_t XTRA_VERSION_CHECK; char XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH]; char XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH]; char XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH]; uint32_t USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL; uint32_t NMEA_PROVIDER; uint32_t GPS_LOCK; uint32_t A_GLONASS_POS_PROTOCOL_SELECT; uint32_t AGPS_CERT_WRITABLE_MASK; } loc_gps_cfg_s_type; /* NOTE: the implementaiton of the parser casts number fields to 32 bit. To ensure all 'n' fields working, they must all be 32 bit fields. */ /* Meanwhile, *_valid fields are 8 bit fields, and 'f' fields are double. Rigid as they are, it is the the status quo, until the parsing mechanism is change, that is. */ typedef struct { uint8_t GYRO_BIAS_RANDOM_WALK_VALID; double GYRO_BIAS_RANDOM_WALK; uint32_t SENSOR_ACCEL_BATCHES_PER_SEC; uint32_t SENSOR_ACCEL_SAMPLES_PER_BATCH; uint32_t SENSOR_GYRO_BATCHES_PER_SEC; uint32_t SENSOR_GYRO_SAMPLES_PER_BATCH; uint32_t SENSOR_ACCEL_BATCHES_PER_SEC_HIGH; uint32_t SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH; uint32_t SENSOR_GYRO_BATCHES_PER_SEC_HIGH; uint32_t SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH; uint32_t SENSOR_CONTROL_MODE; uint32_t SENSOR_USAGE; uint32_t SENSOR_ALGORITHM_CONFIG_MASK; uint8_t ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID; double ACCEL_RANDOM_WALK_SPECTRAL_DENSITY; uint8_t ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID; double ANGLE_RANDOM_WALK_SPECTRAL_DENSITY; uint8_t RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID; double RATE_RANDOM_WALK_SPECTRAL_DENSITY; uint8_t VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID; double VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY; uint32_t SENSOR_PROVIDER; } loc_sap_cfg_s_type; extern loc_gps_cfg_s_type gps_conf; extern loc_sap_cfg_s_type sap_conf; uint32_t getCarrierCapabilities(); //loc_eng functions int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks, LOC_API_ADAPTER_EVENT_MASK_T event, ContextBase* context); int loc_eng_start(loc_eng_data_s_type &loc_eng_data); int loc_eng_stop(loc_eng_data_s_type &loc_eng_data); void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data); int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data, GpsUtcTime time, int64_t timeReference, int uncertainty); int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data, double latitude, double longitude, float accuracy); void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data, GpsAidingData f); int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data, LocPosMode ¶ms); const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data, const char* name); int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data, LocServerType type, const char *hostname, int port); void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data); int loc_eng_read_config(void); //loc_eng_agps functions void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data, AGpsExtCallbacks* callbacks); int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType, const char* apn, AGpsBearerType bearerType); int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType); int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType); void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data, int avaiable, const char* apn); int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data, const DerEncodedCertificate* certificates, size_t length); //loc_eng_xtra functions int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data, GpsXtraExtCallbacks* callbacks); int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data, char* data, int length); int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data); void loc_eng_xtra_version_check(loc_eng_data_s_type &loc_eng_data, int check); //loc_eng_ni functions extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data, GpsNiExtCallbacks *callbacks); extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data, int notif_id, GpsUserResponseType user_response); extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data, const GpsNiNotification *notif, const void* passThrough); extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data); void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data, const char* config_data, int32_t length); int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data, GpsMeasurementCallbacks* callbacks); void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data); #ifdef __cplusplus } #endif /* __cplusplus */ #endif // LOC_ENG_H