123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation, nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- #define LOG_NDEBUG 0
- #define LOG_TAG "LocSvc_BatchingAPIClient"
- #include <inttypes.h>
- #include <log_util.h>
- #include <loc_cfg.h>
- #include "LocationUtil.h"
- #include "BatchingAPIClient.h"
- #include "limits.h"
- namespace android {
- namespace hardware {
- namespace gnss {
- namespace V1_0 {
- namespace implementation {
- using ::android::hardware::gnss::V1_0::IGnssBatching;
- using ::android::hardware::gnss::V1_0::IGnssBatchingCallback;
- using ::android::hardware::gnss::V1_0::GnssLocation;
- static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
- LocationCapabilitiesMask mask);
- BatchingAPIClient::BatchingAPIClient(const sp<IGnssBatchingCallback>& callback) :
- LocationAPIClientBase(),
- mGnssBatchingCbIface(callback),
- mDefaultId(UINT_MAX),
- mLocationCapabilitiesMask(0)
- {
- LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
- LocationCallbacks locationCallbacks;
- memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
- locationCallbacks.size = sizeof(LocationCallbacks);
- locationCallbacks.trackingCb = nullptr;
- locationCallbacks.batchingCb = nullptr;
- locationCallbacks.batchingCb = [this](size_t count, Location* location,
- BatchingOptions batchOptions) {
- onBatchingCb(count, location, batchOptions);
- };
- locationCallbacks.geofenceBreachCb = nullptr;
- locationCallbacks.geofenceStatusCb = nullptr;
- locationCallbacks.gnssLocationInfoCb = nullptr;
- locationCallbacks.gnssNiCb = nullptr;
- locationCallbacks.gnssSvCb = nullptr;
- locationCallbacks.gnssNmeaCb = nullptr;
- locationCallbacks.gnssMeasurementsCb = nullptr;
- locAPISetCallbacks(locationCallbacks);
- }
- BatchingAPIClient::~BatchingAPIClient()
- {
- LOC_LOGD("%s]: ()", __FUNCTION__);
- }
- void BatchingAPIClient::gnssUpdateCallbacks(const sp<IGnssBatchingCallback>& callback)
- {
- mMutex.lock();
- mGnssBatchingCbIface = callback;
- mMutex.unlock();
- }
- int BatchingAPIClient::getBatchSize()
- {
- LOC_LOGD("%s]: ()", __FUNCTION__);
- return locAPIGetBatchSize();
- }
- int BatchingAPIClient::startSession(const IGnssBatching::Options& opts)
- {
- LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
- static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
- int retVal = -1;
- LocationOptions options;
- convertBatchOption(opts, options, mLocationCapabilitiesMask);
- uint32_t mode = 0;
- if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) {
- mode = SESSION_MODE_ON_FULL;
- }
- if (locAPIStartSession(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) {
- retVal = 1;
- }
- return retVal;
- }
- int BatchingAPIClient::updateSessionOptions(const IGnssBatching::Options& opts)
- {
- LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
- static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
- int retVal = -1;
- LocationOptions options;
- convertBatchOption(opts, options, mLocationCapabilitiesMask);
- uint32_t mode = 0;
- if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) {
- mode = SESSION_MODE_ON_FULL;
- }
- if (locAPIUpdateSessionOptions(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) {
- retVal = 1;
- }
- return retVal;
- }
- int BatchingAPIClient::stopSession()
- {
- LOC_LOGD("%s]: ", __FUNCTION__);
- int retVal = -1;
- if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) {
- retVal = 1;
- }
- return retVal;
- }
- void BatchingAPIClient::getBatchedLocation(int last_n_locations)
- {
- LOC_LOGD("%s]: (%d)", __FUNCTION__, last_n_locations);
- locAPIGetBatchedLocations(mDefaultId, last_n_locations);
- }
- void BatchingAPIClient::flushBatchedLocations()
- {
- LOC_LOGD("%s]: ()", __FUNCTION__);
- locAPIGetBatchedLocations(mDefaultId, SIZE_MAX);
- }
- void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
- {
- LOC_LOGD("%s]: (%" PRIu64 ")", __FUNCTION__, capabilitiesMask);
- mLocationCapabilitiesMask = capabilitiesMask;
- }
- void BatchingAPIClient::onBatchingCb(size_t count, Location* location,
- BatchingOptions /*batchOptions*/)
- {
- LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count);
- mMutex.lock();
- auto cbiface = mGnssBatchingCbIface;
- mMutex.unlock();
- if (cbiface != nullptr && count > 0) {
- hidl_vec<GnssLocation> locationVec;
- locationVec.resize(count);
- for (size_t i = 0; i < count; i++) {
- convertGnssLocation(location[i], locationVec[i]);
- }
- auto r = cbiface->gnssLocationBatchCb(locationVec);
- if (!r.isOk()) {
- LOC_LOGE("%s] Error from gnssLocationBatchCb description=%s",
- __func__, r.description().c_str());
- }
- }
- }
- static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
- LocationCapabilitiesMask mask)
- {
- memset(&out, 0, sizeof(LocationOptions));
- out.size = sizeof(LocationOptions);
- out.minInterval = (uint32_t)(in.periodNanos / 1000000L);
- out.minDistance = 0;
- out.mode = GNSS_SUPL_MODE_STANDALONE;
- if (mask & LOCATION_CAPABILITIES_GNSS_MSA_BIT)
- out.mode = GNSS_SUPL_MODE_MSA;
- if (mask & LOCATION_CAPABILITIES_GNSS_MSB_BIT)
- out.mode = GNSS_SUPL_MODE_MSB;
- }
- } // namespace implementation
- } // namespace V1_0
- } // namespace gnss
- } // namespace hardware
- } // namespace android
|