Home | History | Annotate | Download | only in location_api
      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 #define LOG_NDEBUG 0
     31 #define LOG_TAG "LocSvc_BatchingAPIClient"
     32 
     33 #include <log_util.h>
     34 #include <loc_cfg.h>
     35 
     36 #include "LocationUtil.h"
     37 #include "BatchingAPIClient.h"
     38 
     39 #include "limits.h"
     40 
     41 
     42 namespace android {
     43 namespace hardware {
     44 namespace gnss {
     45 namespace V1_0 {
     46 namespace implementation {
     47 
     48 static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
     49         LocationCapabilitiesMask mask);
     50 
     51 BatchingAPIClient::BatchingAPIClient(const sp<IGnssBatchingCallback>& callback) :
     52     LocationAPIClientBase(),
     53     mGnssBatchingCbIface(callback),
     54     mDefaultId(UINT_MAX),
     55     mLocationCapabilitiesMask(0)
     56 {
     57     LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
     58 
     59     LocationCallbacks locationCallbacks;
     60     memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
     61     locationCallbacks.size = sizeof(LocationCallbacks);
     62 
     63     locationCallbacks.trackingCb = nullptr;
     64     locationCallbacks.batchingCb = nullptr;
     65     if (mGnssBatchingCbIface != nullptr) {
     66         locationCallbacks.batchingCb = [this](size_t count, Location* location,
     67             BatchingOptions batchOptions) {
     68             onBatchingCb(count, location, batchOptions);
     69         };
     70     }
     71     locationCallbacks.geofenceBreachCb = nullptr;
     72     locationCallbacks.geofenceStatusCb = nullptr;
     73     locationCallbacks.gnssLocationInfoCb = nullptr;
     74     locationCallbacks.gnssNiCb = nullptr;
     75     locationCallbacks.gnssSvCb = nullptr;
     76     locationCallbacks.gnssNmeaCb = nullptr;
     77     locationCallbacks.gnssMeasurementsCb = nullptr;
     78 
     79     locAPISetCallbacks(locationCallbacks);
     80 }
     81 
     82 BatchingAPIClient::~BatchingAPIClient()
     83 {
     84     LOC_LOGD("%s]: ()", __FUNCTION__);
     85 }
     86 
     87 int BatchingAPIClient::getBatchSize()
     88 {
     89     LOC_LOGD("%s]: ()", __FUNCTION__);
     90     return locAPIGetBatchSize();
     91 }
     92 
     93 int BatchingAPIClient::startSession(const IGnssBatching::Options& opts)
     94 {
     95     LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
     96             static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
     97     int retVal = -1;
     98     LocationOptions options;
     99     convertBatchOption(opts, options, mLocationCapabilitiesMask);
    100     uint32_t mode = 0;
    101     if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) {
    102         mode = SESSION_MODE_ON_FULL;
    103     }
    104     if (locAPIStartSession(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) {
    105         retVal = 1;
    106     }
    107     return retVal;
    108 }
    109 
    110 int BatchingAPIClient::updateSessionOptions(const IGnssBatching::Options& opts)
    111 {
    112     LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
    113             static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
    114     int retVal = -1;
    115     LocationOptions options;
    116     convertBatchOption(opts, options, mLocationCapabilitiesMask);
    117 
    118     uint32_t mode = 0;
    119     if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) {
    120         mode = SESSION_MODE_ON_FULL;
    121     }
    122     if (locAPIUpdateSessionOptions(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) {
    123         retVal = 1;
    124     }
    125     return retVal;
    126 }
    127 
    128 int BatchingAPIClient::stopSession()
    129 {
    130     LOC_LOGD("%s]: ", __FUNCTION__);
    131     int retVal = -1;
    132     if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) {
    133         retVal = 1;
    134     }
    135     return retVal;
    136 }
    137 
    138 void BatchingAPIClient::getBatchedLocation(int last_n_locations)
    139 {
    140     LOC_LOGD("%s]: (%d)", __FUNCTION__, last_n_locations);
    141     locAPIGetBatchedLocations(mDefaultId, last_n_locations);
    142 }
    143 
    144 void BatchingAPIClient::flushBatchedLocations()
    145 {
    146     LOC_LOGD("%s]: ()", __FUNCTION__);
    147     locAPIGetBatchedLocations(mDefaultId, SIZE_MAX);
    148 }
    149 
    150 void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
    151 {
    152     LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask);
    153     mLocationCapabilitiesMask = capabilitiesMask;
    154 }
    155 
    156 void BatchingAPIClient::onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions)
    157 {
    158     LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count);
    159     if (mGnssBatchingCbIface != nullptr && count > 0) {
    160         hidl_vec<GnssLocation> locationVec;
    161         locationVec.resize(count);
    162         for (size_t i = 0; i < count; i++) {
    163             convertGnssLocation(location[i], locationVec[i]);
    164         }
    165         auto r = mGnssBatchingCbIface->gnssLocationBatchCb(locationVec);
    166         if (!r.isOk()) {
    167             LOC_LOGE("%s] Error from gnssLocationBatchCb description=%s",
    168                 __func__, r.description().c_str());
    169         }
    170     }
    171 }
    172 
    173 static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
    174         LocationCapabilitiesMask mask)
    175 {
    176     memset(&out, 0, sizeof(LocationOptions));
    177     out.size = sizeof(LocationOptions);
    178     out.minInterval = (uint32_t)(in.periodNanos / 1000000L);
    179     out.minDistance = 0;
    180     out.mode = GNSS_SUPL_MODE_STANDALONE;
    181     if (mask & LOCATION_CAPABILITIES_GNSS_MSA_BIT)
    182         out.mode = GNSS_SUPL_MODE_MSA;
    183     if (mask & LOCATION_CAPABILITIES_GNSS_MSB_BIT)
    184         out.mode = GNSS_SUPL_MODE_MSB;
    185 }
    186 
    187 }  // namespace implementation
    188 }  // namespace V1_0
    189 }  // namespace gnss
    190 }  // namespace hardware
    191 }  // namespace android
    192