123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- /*
- * Copyright (c) 2020, 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_TAG "LocSvc_GnssAntennaInfoInterface"
- #include <log_util.h>
- #include "Gnss.h"
- #include "GnssAntennaInfo.h"
- #include <android/hardware/gnss/1.0/types.h>
- namespace android {
- namespace hardware {
- namespace gnss {
- namespace V2_1 {
- namespace implementation {
- static GnssAntennaInfo* spGnssAntennaInfo = nullptr;
- static void convertGnssAntennaInfo(std::vector<GnssAntennaInformation>& in,
- hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& antennaInfos);
- void GnssAntennaInfo::GnssAntennaInfoDeathRecipient::serviceDied(uint64_t cookie,
- const wp<IBase>& who) {
- LOC_LOGE("%s] service died. cookie: %llu, who: %p",
- __FUNCTION__, static_cast<unsigned long long>(cookie), &who);
- // we do nothing here
- // Gnss::GnssDeathRecipient will stop the session
- // However, we need to inform the adapter that the service has died
- if (nullptr == spGnssAntennaInfo) {
- LOC_LOGE("%s]: spGnssAntennaInfo is nullptr", __FUNCTION__);
- return;
- }
- if (nullptr == spGnssAntennaInfo->mGnss) {
- LOC_LOGE("%s]: spGnssAntennaInfo->mGnss is nullptr", __FUNCTION__);
- return;
- }
- spGnssAntennaInfo->mGnss->getGnssInterface()->antennaInfoClose();
- }
- static void convertGnssAntennaInfo(std::vector<GnssAntennaInformation>& in,
- hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& out) {
- uint32_t vecSize, numberOfRows, numberOfColumns;
- vecSize = in.size();
- out.resize(vecSize);
- for (uint32_t i = 0; i < vecSize; i++) {
- out[i].carrierFrequencyMHz = in[i].carrierFrequencyMHz;
- out[i].phaseCenterOffsetCoordinateMillimeters.x =
- in[i].phaseCenterOffsetCoordinateMillimeters.x;
- out[i].phaseCenterOffsetCoordinateMillimeters.xUncertainty =
- in[i].phaseCenterOffsetCoordinateMillimeters.xUncertainty;
- out[i].phaseCenterOffsetCoordinateMillimeters.y =
- in[i].phaseCenterOffsetCoordinateMillimeters.y;
- out[i].phaseCenterOffsetCoordinateMillimeters.yUncertainty =
- in[i].phaseCenterOffsetCoordinateMillimeters.yUncertainty;
- out[i].phaseCenterOffsetCoordinateMillimeters.z =
- in[i].phaseCenterOffsetCoordinateMillimeters.z;
- out[i].phaseCenterOffsetCoordinateMillimeters.zUncertainty =
- in[i].phaseCenterOffsetCoordinateMillimeters.zUncertainty;
- numberOfRows = in[i].phaseCenterVariationCorrectionMillimeters.size();
- out[i].phaseCenterVariationCorrectionMillimeters.resize(numberOfRows);
- for (uint32_t j = 0; j < numberOfRows; j++) {
- numberOfColumns = in[i].phaseCenterVariationCorrectionMillimeters[j].size();
- out[i].phaseCenterVariationCorrectionMillimeters[j].row.resize(numberOfColumns);
- for (uint32_t k = 0; k < numberOfColumns; k++) {
- out[i].phaseCenterVariationCorrectionMillimeters[j].row[k] =
- in[i].phaseCenterVariationCorrectionMillimeters[j][k];
- }
- }
- numberOfRows = in[i].phaseCenterVariationCorrectionUncertaintyMillimeters.size();
- out[i].phaseCenterVariationCorrectionUncertaintyMillimeters.resize(numberOfRows);
- for (uint32_t j = 0; j < numberOfRows; j++) {
- numberOfColumns = in[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].size();
- out[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].
- row.resize(numberOfColumns);
- for (uint32_t k = 0; k < numberOfColumns; k++) {
- out[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].row[k] =
- in[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j][k];
- }
- }
- numberOfRows = in[i].signalGainCorrectionDbi.size();
- out[i].signalGainCorrectionDbi.resize(numberOfRows);
- for (uint32_t j = 0; j < numberOfRows; j++) {
- numberOfColumns = in[i].signalGainCorrectionDbi[j].size();
- out[i].signalGainCorrectionDbi[j].row.resize(numberOfColumns);
- for (uint32_t k = 0; k < numberOfColumns; k++) {
- out[i].signalGainCorrectionDbi[j].row[k] = in[i].signalGainCorrectionDbi[j][k];
- }
- }
- numberOfRows = in[i].signalGainCorrectionUncertaintyDbi.size();
- out[i].signalGainCorrectionUncertaintyDbi.resize(numberOfRows);
- for (uint32_t j = 0; j < numberOfRows; j++) {
- numberOfColumns = in[i].signalGainCorrectionUncertaintyDbi[j].size();
- out[i].signalGainCorrectionUncertaintyDbi[j].row.resize(numberOfColumns);
- for (uint32_t k = 0; k < numberOfColumns; k++) {
- out[i].signalGainCorrectionUncertaintyDbi[j].row[k] =
- in[i].signalGainCorrectionUncertaintyDbi[j][k];
- }
- }
- }
- }
- GnssAntennaInfo::GnssAntennaInfo(Gnss* gnss) : mGnss(gnss) {
- mGnssAntennaInfoDeathRecipient = new GnssAntennaInfoDeathRecipient();
- spGnssAntennaInfo = this;
- }
- GnssAntennaInfo::~GnssAntennaInfo() {
- spGnssAntennaInfo = nullptr;
- }
- // Methods from ::android::hardware::gnss::V2_1::IGnssAntennaInfo follow.
- Return<GnssAntennaInfo::GnssAntennaInfoStatus>
- GnssAntennaInfo::setCallback(const sp<IGnssAntennaInfoCallback>& callback) {
- uint32_t retValue;
- if (mGnss == nullptr) {
- LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
- return GnssAntennaInfoStatus::ERROR_GENERIC;
- }
- mGnssAntennaInfoCbIface = callback;
- retValue = mGnss->getGnssInterface()->antennaInfoInit(aiGnssAntennaInfoCb);
- switch (retValue) {
- case ANTENNA_INFO_SUCCESS: return GnssAntennaInfoStatus::SUCCESS;
- case ANTENNA_INFO_ERROR_ALREADY_INIT: return GnssAntennaInfoStatus::ERROR_ALREADY_INIT;
- case ANTENNA_INFO_ERROR_GENERIC:
- default: return GnssAntennaInfoStatus::ERROR_GENERIC;
- }
- }
- Return<void> GnssAntennaInfo::close(void) {
- if (mGnss == nullptr) {
- LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
- return Void();
- }
- mGnss->getGnssInterface()->antennaInfoClose();
- return Void();
- }
- void GnssAntennaInfo::aiGnssAntennaInfoCb
- (std::vector<GnssAntennaInformation> gnssAntennaInformations) {
- if (nullptr != spGnssAntennaInfo) {
- spGnssAntennaInfo->gnssAntennaInfoCb(gnssAntennaInformations);
- }
- }
- void GnssAntennaInfo::gnssAntennaInfoCb
- (std::vector<GnssAntennaInformation> gnssAntennaInformations) {
- if (mGnssAntennaInfoCbIface != nullptr) {
- hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo> antennaInfos;
- // Convert from one structure to another
- convertGnssAntennaInfo(gnssAntennaInformations, antennaInfos);
- auto r = mGnssAntennaInfoCbIface->gnssAntennaInfoCb(antennaInfos);
- if (!r.isOk()) {
- LOC_LOGw("Error antenna info cb %s", r.description().c_str());
- }
- } else {
- LOC_LOGw("setCallback has not been called yet");
- }
- }
- } // namespace implementation
- } // namespace V2_1
- } // namespace gnss
- } // namespace hardware
- } // namespace android
|