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 30 #include "GnssAdapter.h" 31 #include "location_interface.h" 32 33 static GnssAdapter* gGnssAdapter = NULL; 34 35 static void initialize(); 36 static void deinitialize(); 37 38 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks); 39 static void removeClient(LocationAPI* client); 40 static void requestCapabilities(LocationAPI* client); 41 42 static uint32_t startTracking(LocationAPI* client, LocationOptions& options); 43 static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options); 44 static void stopTracking(LocationAPI* client, uint32_t id); 45 46 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response); 47 static uint32_t gnssDeleteAidingData(GnssAidingData& data); 48 49 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks); 50 static uint32_t enable(LocationTechnologyType techType); 51 static void disable(uint32_t id); 52 static uint32_t* gnssUpdateConfig(GnssConfig config); 53 54 static void injectLocation(double latitude, double longitude, float accuracy); 55 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty); 56 57 static void agpsInit(void* statusV4Cb); 58 static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnLen, int ipType); 59 static void agpsDataConnClosed(AGpsExtType agpsType); 60 static void agpsDataConnFailed(AGpsExtType agpsType); 61 62 static const GnssInterface gGnssInterface = { 63 sizeof(GnssInterface), 64 initialize, 65 deinitialize, 66 addClient, 67 removeClient, 68 requestCapabilities, 69 startTracking, 70 updateTrackingOptions, 71 stopTracking, 72 gnssNiResponse, 73 setControlCallbacks, 74 enable, 75 disable, 76 gnssUpdateConfig, 77 gnssDeleteAidingData, 78 injectLocation, 79 injectTime, 80 agpsInit, 81 agpsDataConnOpen, 82 agpsDataConnClosed, 83 agpsDataConnFailed 84 }; 85 86 #ifndef DEBUG_X86 87 extern "C" const GnssInterface* getGnssInterface() 88 #else 89 const GnssInterface* getGnssInterface() 90 #endif // DEBUG_X86 91 { 92 return &gGnssInterface; 93 } 94 95 static void initialize() 96 { 97 if (NULL == gGnssAdapter) { 98 gGnssAdapter = new GnssAdapter(); 99 } 100 } 101 102 static void deinitialize() 103 { 104 if (NULL != gGnssAdapter) { 105 delete gGnssAdapter; 106 gGnssAdapter = NULL; 107 } 108 } 109 110 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks) 111 { 112 if (NULL != gGnssAdapter) { 113 gGnssAdapter->addClientCommand(client, callbacks); 114 } 115 } 116 117 static void removeClient(LocationAPI* client) 118 { 119 if (NULL != gGnssAdapter) { 120 gGnssAdapter->removeClientCommand(client); 121 } 122 } 123 124 static void requestCapabilities(LocationAPI* client) 125 { 126 if (NULL != gGnssAdapter) { 127 gGnssAdapter->requestCapabilitiesCommand(client); 128 } 129 } 130 131 static uint32_t startTracking(LocationAPI* client, LocationOptions& options) 132 { 133 if (NULL != gGnssAdapter) { 134 return gGnssAdapter->startTrackingCommand(client, options); 135 } else { 136 return 0; 137 } 138 } 139 140 static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options) 141 { 142 if (NULL != gGnssAdapter) { 143 gGnssAdapter->updateTrackingOptionsCommand(client, id, options); 144 } 145 } 146 147 static void stopTracking(LocationAPI* client, uint32_t id) 148 { 149 if (NULL != gGnssAdapter) { 150 gGnssAdapter->stopTrackingCommand(client, id); 151 } 152 } 153 154 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response) 155 { 156 if (NULL != gGnssAdapter) { 157 gGnssAdapter->gnssNiResponseCommand(client, id, response); 158 } 159 } 160 161 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks) 162 { 163 if (NULL != gGnssAdapter) { 164 return gGnssAdapter->setControlCallbacksCommand(controlCallbacks); 165 } 166 } 167 168 static uint32_t enable(LocationTechnologyType techType) 169 { 170 if (NULL != gGnssAdapter) { 171 return gGnssAdapter->enableCommand(techType); 172 } else { 173 return 0; 174 } 175 } 176 177 static void disable(uint32_t id) 178 { 179 if (NULL != gGnssAdapter) { 180 return gGnssAdapter->disableCommand(id); 181 } 182 } 183 184 static uint32_t* gnssUpdateConfig(GnssConfig config) 185 { 186 if (NULL != gGnssAdapter) { 187 return gGnssAdapter->gnssUpdateConfigCommand(config); 188 } else { 189 return NULL; 190 } 191 } 192 193 static uint32_t gnssDeleteAidingData(GnssAidingData& data) 194 { 195 if (NULL != gGnssAdapter) { 196 return gGnssAdapter->gnssDeleteAidingDataCommand(data); 197 } else { 198 return NULL; 199 } 200 } 201 202 static void injectLocation(double latitude, double longitude, float accuracy) 203 { 204 if (NULL != gGnssAdapter) { 205 gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy); 206 } 207 } 208 209 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty) 210 { 211 if (NULL != gGnssAdapter) { 212 gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty); 213 } 214 } 215 216 static void agpsInit(void* statusV4Cb) { 217 218 if (NULL != gGnssAdapter) { 219 gGnssAdapter->initAgpsCommand(statusV4Cb); 220 } 221 } 222 static void agpsDataConnOpen( 223 AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) { 224 225 if (NULL != gGnssAdapter) { 226 gGnssAdapter->dataConnOpenCommand( 227 agpsType, apnName, apnLen, ipType); 228 } 229 } 230 static void agpsDataConnClosed(AGpsExtType agpsType) { 231 232 if (NULL != gGnssAdapter) { 233 gGnssAdapter->dataConnClosedCommand(agpsType); 234 } 235 } 236 static void agpsDataConnFailed(AGpsExtType agpsType) { 237 238 if (NULL != gGnssAdapter) { 239 gGnssAdapter->dataConnFailedCommand(agpsType); 240 } 241 } 242