GnssAntennaInfo.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above
  10. * copyright notice, this list of conditions and the following
  11. * disclaimer in the documentation and/or other materials provided
  12. * with the distribution.
  13. * * Neither the name of The Linux Foundation nor the names of its
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  18. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  21. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  24. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  26. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  27. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #define LOG_TAG "LocSvc_GnssAntennaInfoInterface"
  30. #include <log_util.h>
  31. #include "Gnss.h"
  32. #include "GnssAntennaInfo.h"
  33. #include <android/hardware/gnss/1.0/types.h>
  34. namespace android {
  35. namespace hardware {
  36. namespace gnss {
  37. namespace V2_1 {
  38. namespace implementation {
  39. static GnssAntennaInfo* spGnssAntennaInfo = nullptr;
  40. static void convertGnssAntennaInfo(std::vector<GnssAntennaInformation>& in,
  41. hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& antennaInfos);
  42. void GnssAntennaInfo::GnssAntennaInfoDeathRecipient::serviceDied(uint64_t cookie,
  43. const wp<IBase>& who) {
  44. LOC_LOGE("%s] service died. cookie: %llu, who: %p",
  45. __FUNCTION__, static_cast<unsigned long long>(cookie), &who);
  46. // we do nothing here
  47. // Gnss::GnssDeathRecipient will stop the session
  48. // However, we need to inform the adapter that the service has died
  49. if (nullptr == spGnssAntennaInfo) {
  50. LOC_LOGE("%s]: spGnssAntennaInfo is nullptr", __FUNCTION__);
  51. return;
  52. }
  53. if (nullptr == spGnssAntennaInfo->mGnss) {
  54. LOC_LOGE("%s]: spGnssAntennaInfo->mGnss is nullptr", __FUNCTION__);
  55. return;
  56. }
  57. spGnssAntennaInfo->mGnss->getGnssInterface()->antennaInfoClose();
  58. }
  59. static void convertGnssAntennaInfo(std::vector<GnssAntennaInformation>& in,
  60. hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& out) {
  61. uint32_t vecSize, numberOfRows, numberOfColumns;
  62. vecSize = in.size();
  63. out.resize(vecSize);
  64. for (uint32_t i = 0; i < vecSize; i++) {
  65. out[i].carrierFrequencyMHz = in[i].carrierFrequencyMHz;
  66. out[i].phaseCenterOffsetCoordinateMillimeters.x =
  67. in[i].phaseCenterOffsetCoordinateMillimeters.x;
  68. out[i].phaseCenterOffsetCoordinateMillimeters.xUncertainty =
  69. in[i].phaseCenterOffsetCoordinateMillimeters.xUncertainty;
  70. out[i].phaseCenterOffsetCoordinateMillimeters.y =
  71. in[i].phaseCenterOffsetCoordinateMillimeters.y;
  72. out[i].phaseCenterOffsetCoordinateMillimeters.yUncertainty =
  73. in[i].phaseCenterOffsetCoordinateMillimeters.yUncertainty;
  74. out[i].phaseCenterOffsetCoordinateMillimeters.z =
  75. in[i].phaseCenterOffsetCoordinateMillimeters.z;
  76. out[i].phaseCenterOffsetCoordinateMillimeters.zUncertainty =
  77. in[i].phaseCenterOffsetCoordinateMillimeters.zUncertainty;
  78. numberOfRows = in[i].phaseCenterVariationCorrectionMillimeters.size();
  79. out[i].phaseCenterVariationCorrectionMillimeters.resize(numberOfRows);
  80. for (uint32_t j = 0; j < numberOfRows; j++) {
  81. numberOfColumns = in[i].phaseCenterVariationCorrectionMillimeters[j].size();
  82. out[i].phaseCenterVariationCorrectionMillimeters[j].row.resize(numberOfColumns);
  83. for (uint32_t k = 0; k < numberOfColumns; k++) {
  84. out[i].phaseCenterVariationCorrectionMillimeters[j].row[k] =
  85. in[i].phaseCenterVariationCorrectionMillimeters[j][k];
  86. }
  87. }
  88. numberOfRows = in[i].phaseCenterVariationCorrectionUncertaintyMillimeters.size();
  89. out[i].phaseCenterVariationCorrectionUncertaintyMillimeters.resize(numberOfRows);
  90. for (uint32_t j = 0; j < numberOfRows; j++) {
  91. numberOfColumns = in[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].size();
  92. out[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].
  93. row.resize(numberOfColumns);
  94. for (uint32_t k = 0; k < numberOfColumns; k++) {
  95. out[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j].row[k] =
  96. in[i].phaseCenterVariationCorrectionUncertaintyMillimeters[j][k];
  97. }
  98. }
  99. numberOfRows = in[i].signalGainCorrectionDbi.size();
  100. out[i].signalGainCorrectionDbi.resize(numberOfRows);
  101. for (uint32_t j = 0; j < numberOfRows; j++) {
  102. numberOfColumns = in[i].signalGainCorrectionDbi[j].size();
  103. out[i].signalGainCorrectionDbi[j].row.resize(numberOfColumns);
  104. for (uint32_t k = 0; k < numberOfColumns; k++) {
  105. out[i].signalGainCorrectionDbi[j].row[k] = in[i].signalGainCorrectionDbi[j][k];
  106. }
  107. }
  108. numberOfRows = in[i].signalGainCorrectionUncertaintyDbi.size();
  109. out[i].signalGainCorrectionUncertaintyDbi.resize(numberOfRows);
  110. for (uint32_t j = 0; j < numberOfRows; j++) {
  111. numberOfColumns = in[i].signalGainCorrectionUncertaintyDbi[j].size();
  112. out[i].signalGainCorrectionUncertaintyDbi[j].row.resize(numberOfColumns);
  113. for (uint32_t k = 0; k < numberOfColumns; k++) {
  114. out[i].signalGainCorrectionUncertaintyDbi[j].row[k] =
  115. in[i].signalGainCorrectionUncertaintyDbi[j][k];
  116. }
  117. }
  118. }
  119. }
  120. GnssAntennaInfo::GnssAntennaInfo(Gnss* gnss) : mGnss(gnss) {
  121. mGnssAntennaInfoDeathRecipient = new GnssAntennaInfoDeathRecipient();
  122. spGnssAntennaInfo = this;
  123. }
  124. GnssAntennaInfo::~GnssAntennaInfo() {
  125. spGnssAntennaInfo = nullptr;
  126. }
  127. // Methods from ::android::hardware::gnss::V2_1::IGnssAntennaInfo follow.
  128. Return<GnssAntennaInfo::GnssAntennaInfoStatus>
  129. GnssAntennaInfo::setCallback(const sp<IGnssAntennaInfoCallback>& callback) {
  130. uint32_t retValue;
  131. if (mGnss == nullptr) {
  132. LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
  133. return GnssAntennaInfoStatus::ERROR_GENERIC;
  134. }
  135. mGnssAntennaInfoCbIface = callback;
  136. retValue = mGnss->getGnssInterface()->antennaInfoInit(aiGnssAntennaInfoCb);
  137. switch (retValue) {
  138. case ANTENNA_INFO_SUCCESS: return GnssAntennaInfoStatus::SUCCESS;
  139. case ANTENNA_INFO_ERROR_ALREADY_INIT: return GnssAntennaInfoStatus::ERROR_ALREADY_INIT;
  140. case ANTENNA_INFO_ERROR_GENERIC:
  141. default: return GnssAntennaInfoStatus::ERROR_GENERIC;
  142. }
  143. }
  144. Return<void> GnssAntennaInfo::close(void) {
  145. if (mGnss == nullptr) {
  146. LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__);
  147. return Void();
  148. }
  149. mGnss->getGnssInterface()->antennaInfoClose();
  150. return Void();
  151. }
  152. void GnssAntennaInfo::aiGnssAntennaInfoCb
  153. (std::vector<GnssAntennaInformation> gnssAntennaInformations) {
  154. if (nullptr != spGnssAntennaInfo) {
  155. spGnssAntennaInfo->gnssAntennaInfoCb(gnssAntennaInformations);
  156. }
  157. }
  158. void GnssAntennaInfo::gnssAntennaInfoCb
  159. (std::vector<GnssAntennaInformation> gnssAntennaInformations) {
  160. if (mGnssAntennaInfoCbIface != nullptr) {
  161. hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo> antennaInfos;
  162. // Convert from one structure to another
  163. convertGnssAntennaInfo(gnssAntennaInformations, antennaInfos);
  164. auto r = mGnssAntennaInfoCbIface->gnssAntennaInfoCb(antennaInfos);
  165. if (!r.isOk()) {
  166. LOC_LOGw("Error antenna info cb %s", r.description().c_str());
  167. }
  168. } else {
  169. LOC_LOGw("setCallback has not been called yet");
  170. }
  171. }
  172. } // namespace implementation
  173. } // namespace V2_1
  174. } // namespace gnss
  175. } // namespace hardware
  176. } // namespace android