/* * 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 #include "Gnss.h" #include "GnssAntennaInfo.h" #include namespace android { namespace hardware { namespace gnss { namespace V2_1 { namespace implementation { static GnssAntennaInfo* spGnssAntennaInfo = nullptr; static void convertGnssAntennaInfo(std::vector& in, hidl_vec& antennaInfos); void GnssAntennaInfo::GnssAntennaInfoDeathRecipient::serviceDied(uint64_t cookie, const wp& who) { LOC_LOGE("%s] service died. cookie: %llu, who: %p", __FUNCTION__, static_cast(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& in, hidl_vec& 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(this); spGnssAntennaInfo = this; } GnssAntennaInfo::~GnssAntennaInfo() { spGnssAntennaInfo = nullptr; } // Methods from ::android::hardware::gnss::V2_1::IGnssAntennaInfo follow. Return GnssAntennaInfo::setCallback(const sp& 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 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 gnssAntennaInformations) { if (nullptr != spGnssAntennaInfo) { spGnssAntennaInfo->gnssAntennaInfoCb(gnssAntennaInformations); } } void GnssAntennaInfo::gnssAntennaInfoCb (std::vector gnssAntennaInformations) { if (mGnssAntennaInfoCbIface != nullptr) { hidl_vec 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