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