1 /* Copyright (c) 2011-2014, 2016-2017 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 #ifndef LOC_API_BASE_H 30 #define LOC_API_BASE_H 31 32 #include <stddef.h> 33 #include <ctype.h> 34 #include <gps_extended.h> 35 #include <LocationAPI.h> 36 #include <MsgTask.h> 37 #include <platform_lib_log_util.h> 38 39 namespace loc_core { 40 class ContextBase; 41 42 int hexcode(char *hexstring, int string_size, 43 const char *data, int data_size); 44 int decodeAddress(char *addr_string, int string_size, 45 const char *data, int data_size); 46 47 #define MAX_ADAPTERS 10 48 #define MAX_FEATURE_LENGTH 100 49 50 #define TO_ALL_ADAPTERS(adapters, call) \ 51 for (int i = 0; i < MAX_ADAPTERS && NULL != (adapters)[i]; i++) { \ 52 call; \ 53 } 54 55 #define TO_1ST_HANDLING_ADAPTER(adapters, call) \ 56 for (int i = 0; i <MAX_ADAPTERS && NULL != (adapters)[i] && !(call); i++); 57 58 enum xtra_version_check { 59 DISABLED, 60 AUTO, 61 XTRA2, 62 XTRA3 63 }; 64 65 class LocAdapterBase; 66 struct LocSsrMsg; 67 struct LocOpenMsg; 68 69 class LocApiProxyBase { 70 public: LocApiProxyBase()71 inline LocApiProxyBase() {} ~LocApiProxyBase()72 inline virtual ~LocApiProxyBase() {} getSibling2()73 inline virtual void* getSibling2() { return NULL; } 74 }; 75 76 class LocApiBase { 77 friend struct LocSsrMsg; 78 //LocOpenMsg calls open() which makes it necessary to declare 79 //it as a friend 80 friend struct LocOpenMsg; 81 friend class ContextBase; 82 const MsgTask* mMsgTask; 83 ContextBase *mContext; 84 LocAdapterBase* mLocAdapters[MAX_ADAPTERS]; 85 uint64_t mSupportedMsg; 86 uint8_t mFeaturesSupported[MAX_FEATURE_LENGTH]; 87 88 protected: 89 virtual enum loc_api_adapter_err 90 open(LOC_API_ADAPTER_EVENT_MASK_T mask); 91 virtual enum loc_api_adapter_err 92 close(); 93 LOC_API_ADAPTER_EVENT_MASK_T getEvtMask(); 94 LOC_API_ADAPTER_EVENT_MASK_T mMask; 95 LocApiBase(const MsgTask* msgTask, 96 LOC_API_ADAPTER_EVENT_MASK_T excludedMask, 97 ContextBase* context = NULL); ~LocApiBase()98 inline virtual ~LocApiBase() { close(); } 99 bool isInSession(); 100 const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask; 101 102 public: sendMsg(const LocMsg * msg)103 inline void sendMsg(const LocMsg* msg) const { 104 mMsgTask->sendMsg(msg); 105 } 106 void addAdapter(LocAdapterBase* adapter); 107 void removeAdapter(LocAdapterBase* adapter); 108 109 // upward calls 110 void handleEngineUpEvent(); 111 void handleEngineDownEvent(); 112 void reportPosition(UlpLocation& location, 113 GpsLocationExtended& locationExtended, 114 enum loc_sess_status status, 115 LocPosTechMask loc_technology_mask = 116 LOC_POS_TECH_MASK_DEFAULT); 117 void reportSv(GnssSvNotification& svNotify); 118 void reportSvMeasurement(GnssSvMeasurementSet &svMeasurementSet); 119 void reportSvPolynomial(GnssSvPolynomial &svPolynomial); 120 void reportStatus(LocGpsStatusValue status); 121 void reportNmea(const char* nmea, int length); 122 void reportXtraServer(const char* url1, const char* url2, 123 const char* url3, const int maxlength); 124 void requestXtraData(); 125 void requestTime(); 126 void requestLocation(); 127 void requestATL(int connHandle, LocAGpsType agps_type); 128 void releaseATL(int connHandle); 129 void requestSuplES(int connHandle); 130 void reportDataCallOpened(); 131 void reportDataCallClosed(); 132 void requestNiNotify(GnssNiNotification ¬ify, const void* data); 133 void saveSupportedMsgList(uint64_t supportedMsgList); 134 void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek); 135 void saveSupportedFeatureList(uint8_t *featureList); 136 void reportWwanZppFix(LocGpsLocation &zppLoc); 137 138 // downward calls 139 // All below functions are to be defined by adapter specific modules: 140 // RPC, QMI, etc. The default implementation is empty. 141 142 virtual void* getSibling(); 143 virtual LocApiProxyBase* getLocApiProxy(); 144 virtual enum loc_api_adapter_err 145 startFix(const LocPosMode& posMode); 146 virtual enum loc_api_adapter_err 147 stopFix(); 148 virtual LocationError 149 deleteAidingData(const GnssAidingData& data); 150 virtual enum loc_api_adapter_err 151 enableData(int enable); 152 virtual enum loc_api_adapter_err 153 setAPN(char* apn, int len); 154 virtual enum loc_api_adapter_err 155 injectPosition(double latitude, double longitude, float accuracy); 156 virtual enum loc_api_adapter_err 157 setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty); 158 virtual enum loc_api_adapter_err 159 setXtraData(char* data, int length); 160 virtual enum loc_api_adapter_err 161 requestXtraServer(); 162 virtual enum loc_api_adapter_err 163 atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear, LocAGpsType agpsType); 164 virtual enum loc_api_adapter_err 165 atlCloseStatus(int handle, int is_succ); 166 virtual enum loc_api_adapter_err 167 setPositionMode(const LocPosMode& posMode); 168 virtual LocationError 169 setServer(const char* url, int len); 170 virtual LocationError 171 setServer(unsigned int ip, int port, 172 LocServerType type); 173 virtual LocationError 174 informNiResponse(GnssNiResponse userResponse, const void* passThroughData); 175 virtual LocationError setSUPLVersion(GnssConfigSuplVersion version); 176 virtual enum loc_api_adapter_err 177 setNMEATypes (uint32_t typesMask); 178 virtual LocationError setLPPConfig(GnssConfigLppProfile profile); 179 virtual enum loc_api_adapter_err 180 setSensorControlConfig(int sensorUsage, int sensorProvider); 181 virtual enum loc_api_adapter_err 182 setSensorProperties(bool gyroBiasVarianceRandomWalk_valid, 183 float gyroBiasVarianceRandomWalk, 184 bool accelBiasVarianceRandomWalk_valid, 185 float accelBiasVarianceRandomWalk, 186 bool angleBiasVarianceRandomWalk_valid, 187 float angleBiasVarianceRandomWalk, 188 bool rateBiasVarianceRandomWalk_valid, 189 float rateBiasVarianceRandomWalk, 190 bool velocityBiasVarianceRandomWalk_valid, 191 float velocityBiasVarianceRandomWalk); 192 virtual enum loc_api_adapter_err 193 setSensorPerfControlConfig(int controlMode, 194 int accelSamplesPerBatch, 195 int accelBatchesPerSec, 196 int gyroSamplesPerBatch, 197 int gyroBatchesPerSec, 198 int accelSamplesPerBatchHigh, 199 int accelBatchesPerSecHigh, 200 int gyroSamplesPerBatchHigh, 201 int gyroBatchesPerSecHigh, 202 int algorithmConfig); 203 virtual LocationError 204 setAGLONASSProtocol(GnssConfigAGlonassPositionProtocolMask aGlonassProtocol); 205 virtual LocationError setLPPeProtocolCp(GnssConfigLppeControlPlaneMask lppeCP); 206 virtual LocationError setLPPeProtocolUp(GnssConfigLppeUserPlaneMask lppeUP); 207 virtual enum loc_api_adapter_err 208 getWwanZppFix(); 209 virtual enum loc_api_adapter_err 210 getBestAvailableZppFix(LocGpsLocation & zppLoc); 211 virtual enum loc_api_adapter_err 212 getBestAvailableZppFix(LocGpsLocation & zppLoc, GpsLocationExtended & locationExtended, 213 LocPosTechMask & tech_mask); 214 virtual int initDataServiceClient(bool isDueToSsr); 215 virtual int openAndStartDataCall(); 216 virtual void stopDataCall(); 217 virtual void closeDataCall(); 218 virtual void releaseDataServiceClient(); 219 virtual void installAGpsCert(const LocDerEncodedCertificate* pData, 220 size_t length, 221 uint32_t slotBitMask); setInSession(bool inSession)222 inline virtual void setInSession(bool inSession) { 223 224 (void)inSession; 225 } isMessageSupported(LocCheckingMessagesID msgID)226 inline bool isMessageSupported (LocCheckingMessagesID msgID) const { 227 228 // confirm if msgID is not larger than the number of bits in 229 // mSupportedMsg 230 if ((uint64_t)msgID > (sizeof(mSupportedMsg) << 3)) { 231 return false; 232 } else { 233 uint32_t messageChecker = 1 << msgID; 234 return (messageChecker & mSupportedMsg) == messageChecker; 235 } 236 } 237 238 void updateEvtMask(); 239 240 virtual LocationError setGpsLock(GnssConfigGpsLock lock); 241 /* 242 Returns 243 Current value of GPS Lock on success 244 -1 on failure 245 */ 246 virtual int getGpsLock(void); 247 248 virtual LocationError setXtraVersionCheck(uint32_t check); 249 /* 250 Check if the modem support the service 251 */ 252 virtual bool gnssConstellationConfig(); 253 254 /* 255 Check if a feature is supported 256 */ 257 bool isFeatureSupported(uint8_t featureVal); 258 }; 259 260 typedef LocApiBase* (getLocApi_t)(const MsgTask* msgTask, 261 LOC_API_ADAPTER_EVENT_MASK_T exMask, 262 ContextBase *context); 263 264 } // namespace loc_core 265 266 #endif //LOC_API_BASE_H 267