1 /* Copyright (c) 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 #ifndef LOC_API_ADAPTER_H 30 #define LOC_API_ADAPTER_H 31 32 #include <ctype.h> 33 #include <hardware/gps.h> 34 #include <loc.h> 35 #include <log_util.h> 36 37 #define MIN_POSSIBLE_FIX_INTERVAL 1000 /* msec */ 38 39 enum loc_api_adapter_err { 40 LOC_API_ADAPTER_ERR_SUCCESS = 0, 41 LOC_API_ADAPTER_ERR_GENERAL_FAILURE = 1, 42 LOC_API_ADAPTER_ERR_UNSUPPORTED = 2, 43 LOC_API_ADAPTER_ERR_INVALID_HANDLE = 4, 44 LOC_API_ADAPTER_ERR_INVALID_PARAMETER = 5, 45 LOC_API_ADAPTER_ERR_ENGINE_BUSY = 6, 46 LOC_API_ADAPTER_ERR_PHONE_OFFLINE = 7, 47 LOC_API_ADAPTER_ERR_TIMEOUT = 8, 48 LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9, 49 50 LOC_API_ADAPTER_ERR_ENGINE_DOWN = 100, 51 LOC_API_ADAPTER_ERR_FAILURE, 52 LOC_API_ADAPTER_ERR_UNKNOWN 53 }; 54 55 enum loc_api_adapter_event_index { 56 LOC_API_ADAPTER_REPORT_POSITION = 0, // Position report comes in loc_parsed_position_s_type 57 LOC_API_ADAPTER_REPORT_SATELLITE, // Satellite in view report 58 LOC_API_ADAPTER_REPORT_NMEA_1HZ, // NMEA report at 1HZ rate 59 LOC_API_ADAPTER_REPORT_NMEA_POSITION, // NMEA report at position report rate 60 LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY, // NI notification/verification request 61 LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA, // Assistance data, eg: time, predicted orbits request 62 LOC_API_ADAPTER_REQUEST_LOCATION_SERVER, // Request for location server 63 LOC_API_ADAPTER_REPORT_IOCTL, // Callback report for loc_ioctl 64 LOC_API_ADAPTER_REPORT_STATUS, // Misc status report: eg, engine state 65 66 LOC_API_ADAPTER_EVENT_MAX 67 }; 68 69 #define LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_POSITION) 70 #define LOC_API_ADAPTER_BIT_SATELLITE_REPORT (1<<LOC_API_ADAPTER_REPORT_SATELLITE) 71 #define LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_1HZ) 72 #define LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_POSITION) 73 #define LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST (1<<LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY) 74 #define LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST (1<<LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA) 75 #define LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST (1<<LOC_API_ADAPTER_REQUEST_LOCATION_SERVER) 76 #define LOC_API_ADAPTER_BIT_IOCTL_REPORT (1<<LOC_API_ADAPTER_REPORT_IOCTL) 77 #define LOC_API_ADAPTER_BIT_STATUS_REPORT (1<<LOC_API_ADAPTER_REPORT_STATUS) 78 79 typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T; 80 typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp); 81 82 struct LocEng { 83 void* owner; 84 LOC_API_ADAPTER_EVENT_MASK_T eventMask; 85 const gps_acquire_wakelock acquireWakelock; 86 const gps_release_wakelock releaseWakeLock; 87 const loc_msg_sender sendMsge; 88 const loc_ext_parser extPosInfo; 89 const loc_ext_parser extSvInfo; 90 91 LocEng(void* caller, 92 LOC_API_ADAPTER_EVENT_MASK_T emask, 93 gps_acquire_wakelock acqwl, 94 gps_release_wakelock relwl, 95 loc_msg_sender msgSender, 96 loc_ext_parser posParser, 97 loc_ext_parser svParser); 98 }; 99 100 class LocApiAdapter { 101 protected: 102 const LocEng locEngHandle; 103 104 LocApiAdapter(LocEng &locEng); 105 106 public: 107 //LocApiAdapter(int q, reportCb_t[LOC_API_ADAPTER_EVENT_MAX] callbackTable); 108 virtual ~LocApiAdapter(); 109 110 static LocApiAdapter* getLocApiAdapter(LocEng &locEng); 111 112 static int hexcode(char *hexstring, int string_size, 113 const char *data, int data_size); 114 static int decodeAddress(char *addr_string, int string_size, 115 const char *data, int data_size); 116 117 void reportPosition(GpsLocation &location, 118 void* locationExt, 119 enum loc_sess_status status); 120 void reportSv(GpsSvStatus &svStatus, void* svExt); 121 void reportStatus(GpsStatusValue status); 122 void reportNmea(const char* nmea, int length); 123 void reportAgpsStatus(AGpsStatus &agpsStatus); 124 void requestXtraData(); 125 void requestTime(); 126 void requestLocation(); 127 void requestATL(int connHandle, AGpsType agps_type); 128 void releaseATL(int connHandle); 129 void requestNiNotify(GpsNiNotification ¬ify, const void* data); 130 void handleEngineDownEvent(); 131 void handleEngineUpEvent(); 132 133 // All below functions are to be defined by adapter specific modules: 134 // RPC, QMI, etc. The default implementation is empty. 135 inline virtual enum loc_api_adapter_err reinit()136 reinit() 137 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 138 inline virtual enum loc_api_adapter_err startFix()139 startFix() 140 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 141 inline virtual enum loc_api_adapter_err stopFix()142 stopFix() 143 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 144 inline virtual enum loc_api_adapter_err deleteAidingData(GpsAidingData f)145 deleteAidingData(GpsAidingData f) 146 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 147 inline virtual enum loc_api_adapter_err enableData(int enable)148 enableData(int enable) 149 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 150 inline virtual enum loc_api_adapter_err setAPN(char * apn,int len)151 setAPN(char* apn, int len) 152 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 153 inline virtual enum loc_api_adapter_err injectPosition(double latitude,double longitude,float accuracy)154 injectPosition(double latitude, double longitude, float accuracy) 155 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 156 inline virtual enum loc_api_adapter_err setTime(GpsUtcTime time,int64_t timeReference,int uncertainty)157 setTime(GpsUtcTime time, int64_t timeReference, int uncertainty) 158 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 159 inline virtual enum loc_api_adapter_err setXtraData(char * data,int length)160 setXtraData(char* data, int length) 161 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 162 #ifdef QCOM_FEATURE_IPV6 163 inline virtual enum loc_api_adapter_err atlOpenStatus(int handle,int is_succ,char * apn,AGpsBearerType bear,AGpsType agpsType)164 atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear, AGpsType agpsType) 165 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 166 #else 167 inline virtual enum loc_api_adapter_err atlOpenStatus(int handle,int is_succ,char * apn,AGpsType agpsType)168 atlOpenStatus(int handle, int is_succ, char* apn, AGpsType agpsType) 169 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 170 #endif 171 inline virtual enum loc_api_adapter_err atlCloseStatus(int handle,int is_succ)172 atlCloseStatus(int handle, int is_succ) 173 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 174 inline virtual enum loc_api_adapter_err setPositionMode(LocPositionMode mode,GpsPositionRecurrence recurrence,uint32_t min_interval,uint32_t preferred_accuracy,uint32_t preferred_time)175 setPositionMode(LocPositionMode mode, GpsPositionRecurrence recurrence, 176 uint32_t min_interval, uint32_t preferred_accuracy, 177 uint32_t preferred_time) 178 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 179 inline virtual enum loc_api_adapter_err setServer(const char * url,int len)180 setServer(const char* url, int len) 181 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 182 inline virtual enum loc_api_adapter_err setServer(unsigned int ip,int port,LocServerType type)183 setServer(unsigned int ip, int port, 184 LocServerType type) 185 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 186 inline virtual enum loc_api_adapter_err informNiResponse(GpsUserResponseType userResponse,const void * passThroughData)187 informNiResponse(GpsUserResponseType userResponse, const void* passThroughData) 188 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 189 inline virtual enum loc_api_adapter_err setSUPLVersion(uint32_t version)190 setSUPLVersion(uint32_t version) 191 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 192 inline virtual enum loc_api_adapter_err setSensorControlConfig(int sensorUsage)193 setSensorControlConfig(int sensorUsage) 194 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 195 inline virtual enum loc_api_adapter_err setSensorProperties(float gyroBiasVarianceRandomWalk)196 setSensorProperties(float gyroBiasVarianceRandomWalk) 197 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 198 inline virtual enum loc_api_adapter_err setSensorPerfControlConfig(int controlMode,int accelSamplesPerBatch,int accelBatchesPerSec,int gyroSamplesPerBatch,int gyroBatchesPerSec)199 setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec, 200 int gyroSamplesPerBatch, int gyroBatchesPerSec) 201 {LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;} 202 }; 203 204 extern "C" LocApiAdapter* getLocApiAdapter(LocEng &locEng); 205 206 typedef LocApiAdapter* (getLocApiAdapter_t)(LocEng&); 207 208 #endif //LOC_API_RPC_ADAPTER_H 209