1 /* Copyright (c) 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 GNSS_ADAPTER_H 30 #define GNSS_ADAPTER_H 31 32 #include <LocAdapterBase.h> 33 #include <LocDualContext.h> 34 #include <UlpProxyBase.h> 35 #include <LocationAPI.h> 36 #include <Agps.h> 37 #include <SystemStatus.h> 38 39 #define MAX_URL_LEN 256 40 #define NMEA_SENTENCE_MAX_LENGTH 200 41 #define GLONASS_SV_ID_OFFSET 64 42 #define MAX_SATELLITES_IN_USE 12 43 #define LOC_NI_NO_RESPONSE_TIME 20 44 #define LOC_GPS_NI_RESPONSE_IGNORE 4 45 46 class GnssAdapter; 47 48 typedef struct { 49 pthread_t thread; /* NI thread */ 50 uint32_t respTimeLeft; /* examine time for NI response */ 51 bool respRecvd; /* NI User reponse received or not from Java layer*/ 52 void* rawRequest; 53 uint32_t reqID; /* ID to check against response */ 54 GnssNiResponse resp; 55 pthread_cond_t tCond; 56 pthread_mutex_t tLock; 57 GnssAdapter* adapter; 58 } NiSession; 59 typedef struct { 60 NiSession session; /* SUPL NI Session */ 61 NiSession sessionEs; /* Emergency SUPL NI Session */ 62 uint32_t reqIDCounter; 63 } NiData; 64 65 typedef enum { 66 NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA 67 NMEA_PROVIDER_MP // Modem Processor Provider of NMEA 68 } NmeaProviderType; 69 typedef struct { 70 GnssSvType svType; 71 const char* talker; 72 uint64_t mask; 73 uint32_t svIdOffset; 74 } NmeaSvMeta; 75 76 using namespace loc_core; 77 78 class GnssAdapter : public LocAdapterBase { 79 /* ==== ULP ============================================================================ */ 80 UlpProxyBase* mUlpProxy; 81 82 /* ==== CLIENT ========================================================================= */ 83 typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap; 84 ClientDataMap mClientData; 85 86 /* ==== TRACKING ======================================================================= */ 87 LocationSessionMap mTrackingSessions; 88 LocPosMode mUlpPositionMode; 89 GnssSvUsedInPosition mGnssSvIdUsedInPosition; 90 bool mGnssSvIdUsedInPosAvail; 91 92 /* ==== CONTROL ======================================================================== */ 93 LocationControlCallbacks mControlCallbacks; 94 uint32_t mPowerVoteId; 95 96 /* ==== NI ============================================================================= */ 97 NiData mNiData; 98 99 /* ==== AGPS ========================================================*/ 100 // This must be initialized via initAgps() 101 AgpsManager mAgpsManager; 102 103 /*==== CONVERSION ===================================================================*/ 104 static void convertOptions(LocPosMode& out, const LocationOptions& options); 105 static void convertLocation(Location& out, const LocGpsLocation& locGpsLocation, 106 const GpsLocationExtended& locationExtended, 107 const LocPosTechMask techMask); 108 static void convertLocationInfo(GnssLocationInfoNotification& out, 109 const GpsLocationExtended& locationExtended); 110 111 public: 112 113 GnssAdapter(); 114 virtual ~GnssAdapter(); 115 116 /* ==== SSR ============================================================================ */ 117 /* ======== EVENTS ====(Called from QMI Thread)========================================= */ 118 virtual void handleEngineUpEvent(); 119 /* ======== UTILITIES ================================================================== */ 120 void restartSessions(); 121 122 /* ==== ULP ============================================================================ */ 123 /* ======== COMMANDS ====(Called from ULP Thread)==================================== */ 124 virtual void setUlpProxyCommand(UlpProxyBase* ulp); 125 /* ======== UTILITIES ================================================================== */ 126 void setUlpProxy(UlpProxyBase* ulp); getUlpProxy()127 inline UlpProxyBase* getUlpProxy() { return mUlpProxy; } 128 129 /* ==== CLIENT ========================================================================= */ 130 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 131 void addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks); 132 void removeClientCommand(LocationAPI* client); 133 void requestCapabilitiesCommand(LocationAPI* client); 134 /* ======== UTILITIES ================================================================== */ 135 void saveClient(LocationAPI* client, const LocationCallbacks& callbacks); 136 void eraseClient(LocationAPI* client); 137 void updateClientsEventMask(); 138 void stopClientSessions(LocationAPI* client); 139 LocationCallbacks getClientCallbacks(LocationAPI* client); 140 141 /* ==== TRACKING ======================================================================= */ 142 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 143 uint32_t startTrackingCommand(LocationAPI* client, LocationOptions& options); 144 void updateTrackingOptionsCommand(LocationAPI* client, uint32_t id, LocationOptions& options); 145 void stopTrackingCommand(LocationAPI* client, uint32_t id); 146 /* ======================(Called from ULP Thread)======================================= */ 147 virtual void setPositionModeCommand(LocPosMode& locPosMode); 148 virtual void startTrackingCommand(); 149 virtual void stopTrackingCommand(); 150 virtual void getZppCommand(); 151 /* ======== RESPONSES ================================================================== */ 152 void reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId); 153 /* ======== UTILITIES ================================================================== */ 154 bool hasTrackingCallback(LocationAPI* client); 155 bool hasMeasurementsCallback(LocationAPI* client); 156 bool isTrackingSession(LocationAPI* client, uint32_t sessionId); 157 void saveTrackingSession(LocationAPI* client, uint32_t sessionId, 158 const LocationOptions& options); 159 void eraseTrackingSession(LocationAPI* client, uint32_t sessionId); setUlpPositionMode(const LocPosMode & mode)160 void setUlpPositionMode(const LocPosMode& mode) { mUlpPositionMode = mode; } getUlpPositionMode()161 LocPosMode& getUlpPositionMode() { return mUlpPositionMode; } 162 LocationError startTrackingMultiplex(const LocationOptions& options); 163 LocationError startTracking(const LocationOptions& options); 164 LocationError stopTrackingMultiplex(LocationAPI* client, uint32_t id); 165 LocationError stopTracking(); 166 LocationError updateTrackingMultiplex(LocationAPI* client, uint32_t id, 167 const LocationOptions& options); 168 169 /* ==== NI ============================================================================= */ 170 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 171 void gnssNiResponseCommand(LocationAPI* client, uint32_t id, GnssNiResponse response); 172 /* ======================(Called from NI Thread)======================================== */ 173 void gnssNiResponseCommand(GnssNiResponse response, void* rawRequest); 174 /* ======== UTILITIES ================================================================== */ 175 bool hasNiNotifyCallback(LocationAPI* client); getNiData()176 NiData& getNiData() { return mNiData; } 177 178 /* ==== CONTROL ======================================================================== */ 179 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 180 uint32_t enableCommand(LocationTechnologyType techType); 181 void disableCommand(uint32_t id); 182 void setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks); 183 void readConfigCommand(); 184 void setConfigCommand(); 185 uint32_t* gnssUpdateConfigCommand(GnssConfig config); 186 uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data); 187 188 void initAgpsCommand(void* statusV4Cb); 189 void dataConnOpenCommand( 190 AGpsExtType agpsType, 191 const char* apnName, int apnLen, LocApnIpType ipType); 192 void dataConnClosedCommand(AGpsExtType agpsType); 193 void dataConnFailedCommand(AGpsExtType agpsType); 194 195 /* ======== RESPONSES ================================================================== */ 196 void reportResponse(LocationError err, uint32_t sessionId); 197 void reportResponse(size_t count, LocationError* errs, uint32_t* ids); 198 /* ======== UTILITIES ================================================================== */ getControlCallbacks()199 LocationControlCallbacks& getControlCallbacks() { return mControlCallbacks; } setControlCallbacks(const LocationControlCallbacks & controlCallbacks)200 void setControlCallbacks(const LocationControlCallbacks& controlCallbacks) 201 { mControlCallbacks = controlCallbacks; } setPowerVoteId(uint32_t id)202 void setPowerVoteId(uint32_t id) { mPowerVoteId = id; } getPowerVoteId()203 uint32_t getPowerVoteId() { return mPowerVoteId; } 204 bool resolveInAddress(const char* hostAddress, struct in_addr* inAddress); 205 206 /* ==== REPORTS ======================================================================== */ 207 /* ======== EVENTS ====(Called from QMI/ULP Thread)===================================== */ 208 virtual void reportPositionEvent(const UlpLocation& ulpLocation, 209 const GpsLocationExtended& locationExtended, 210 enum loc_sess_status status, 211 LocPosTechMask techMask, 212 bool fromUlp=false); 213 virtual void reportSvEvent(const GnssSvNotification& svNotify, bool fromUlp=false); 214 virtual void reportNmeaEvent(const char* nmea, size_t length, bool fromUlp=false); 215 virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data); 216 virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurementsNotify); 217 virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet); 218 virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); 219 220 virtual bool requestATL(int connHandle, LocAGpsType agps_type); 221 virtual bool releaseATL(int connHandle); 222 virtual bool requestSuplES(int connHandle); 223 virtual bool reportDataCallOpened(); 224 virtual bool reportDataCallClosed(); 225 226 /* ======== UTILITIES ================================================================= */ 227 void reportPosition(const UlpLocation &ulpLocation, 228 const GpsLocationExtended &locationExtended, 229 enum loc_sess_status status, 230 LocPosTechMask techMask); 231 void reportSv(GnssSvNotification& svNotify); 232 void reportNmea(const char* nmea, size_t length); 233 bool requestNiNotify(const GnssNiNotification& notify, const void* data); 234 void reportGnssMeasurementData(const GnssMeasurementsNotification& measurementsNotify); 235 236 /*======== GNSSDEBUG ================================================================*/ 237 bool getDebugReport(GnssDebugReport& report); 238 239 /*==== CONVERSION ===================================================================*/ 240 static uint32_t convertGpsLock(const GnssConfigGpsLock gpsLock); 241 static GnssConfigGpsLock convertGpsLock(const uint32_t gpsLock); 242 static uint32_t convertSuplVersion(const GnssConfigSuplVersion suplVersion); 243 static GnssConfigSuplVersion convertSuplVersion(const uint32_t suplVersion); 244 static uint32_t convertLppProfile(const GnssConfigLppProfile lppProfile); 245 static GnssConfigLppProfile convertLppProfile(const uint32_t lppProfile); 246 static uint32_t convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl); 247 static uint32_t convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices); 248 static uint32_t convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask); 249 static GnssConfigLppeControlPlaneMask convertLppeCp(const uint32_t lppeControlPlaneMask); 250 static uint32_t convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask); 251 static GnssConfigLppeUserPlaneMask convertLppeUp(const uint32_t lppeUserPlaneMask); 252 static uint32_t convertAGloProt(const GnssConfigAGlonassPositionProtocolMask); 253 static uint32_t convertSuplMode(const GnssConfigSuplModeMask suplModeMask); 254 static void convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out, 255 const GnssSvType& in_constellation, 256 const SystemStatusReports& in); 257 void injectLocationCommand(double latitude, double longitude, float accuracy); 258 void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty); 259 260 }; 261 262 #endif //GNSS_ADAPTER_H 263