MeasurementAPIClient.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /* Copyright (c) 2017-2018, 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. #define LOG_NDEBUG 0
  30. #define LOG_TAG "LocSvc_MeasurementAPIClient"
  31. #include <log_util.h>
  32. #include <loc_cfg.h>
  33. #include "LocationUtil.h"
  34. #include "MeasurementAPIClient.h"
  35. namespace android {
  36. namespace hardware {
  37. namespace gnss {
  38. namespace V1_0 {
  39. namespace implementation {
  40. using ::android::hardware::gnss::V1_0::IGnssMeasurement;
  41. using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback;
  42. static void convertGnssData(GnssMeasurementsNotification& in,
  43. V1_0::IGnssMeasurementCallback::GnssData& out);
  44. static void convertGnssMeasurement(GnssMeasurementsData& in,
  45. V1_0::IGnssMeasurementCallback::GnssMeasurement& out);
  46. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out);
  47. MeasurementAPIClient::MeasurementAPIClient() :
  48. mGnssMeasurementCbIface(nullptr),
  49. mTracking(false)
  50. {
  51. LOC_LOGD("%s]: ()", __FUNCTION__);
  52. }
  53. MeasurementAPIClient::~MeasurementAPIClient()
  54. {
  55. LOC_LOGD("%s]: ()", __FUNCTION__);
  56. }
  57. // for GpsInterface
  58. Return<IGnssMeasurement::GnssMeasurementStatus>
  59. MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
  60. {
  61. LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
  62. mMutex.lock();
  63. mGnssMeasurementCbIface = callback;
  64. mMutex.unlock();
  65. return startTracking();
  66. }
  67. Return<IGnssMeasurement::GnssMeasurementStatus>
  68. MeasurementAPIClient::startTracking()
  69. {
  70. LocationCallbacks locationCallbacks;
  71. memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
  72. locationCallbacks.size = sizeof(LocationCallbacks);
  73. locationCallbacks.trackingCb = nullptr;
  74. locationCallbacks.batchingCb = nullptr;
  75. locationCallbacks.geofenceBreachCb = nullptr;
  76. locationCallbacks.geofenceStatusCb = nullptr;
  77. locationCallbacks.gnssLocationInfoCb = nullptr;
  78. locationCallbacks.gnssNiCb = nullptr;
  79. locationCallbacks.gnssSvCb = nullptr;
  80. locationCallbacks.gnssNmeaCb = nullptr;
  81. locationCallbacks.gnssMeasurementsCb = nullptr;
  82. if (mGnssMeasurementCbIface != nullptr) {
  83. locationCallbacks.gnssMeasurementsCb =
  84. [this](GnssMeasurementsNotification gnssMeasurementsNotification) {
  85. onGnssMeasurementsCb(gnssMeasurementsNotification);
  86. };
  87. }
  88. locAPISetCallbacks(locationCallbacks);
  89. TrackingOptions options = {};
  90. memset(&options, 0, sizeof(TrackingOptions));
  91. options.size = sizeof(TrackingOptions);
  92. options.minInterval = 1000;
  93. options.mode = GNSS_SUPL_MODE_STANDALONE;
  94. mTracking = true;
  95. LOC_LOGD("%s]: start tracking session", __FUNCTION__);
  96. locAPIStartTracking(options);
  97. return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
  98. }
  99. // for GpsMeasurementInterface
  100. void MeasurementAPIClient::measurementClose() {
  101. LOC_LOGD("%s]: ()", __FUNCTION__);
  102. mTracking = false;
  103. locAPIStopTracking();
  104. }
  105. // callbacks
  106. void MeasurementAPIClient::onGnssMeasurementsCb(
  107. GnssMeasurementsNotification gnssMeasurementsNotification)
  108. {
  109. LOC_LOGD("%s]: (count: %zu active: %d)",
  110. __FUNCTION__, gnssMeasurementsNotification.count, mTracking);
  111. if (mTracking) {
  112. mMutex.lock();
  113. sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr;
  114. if (mGnssMeasurementCbIface != nullptr) {
  115. gnssMeasurementCbIface = mGnssMeasurementCbIface;
  116. }
  117. mMutex.unlock();
  118. if (gnssMeasurementCbIface != nullptr) {
  119. V1_0::IGnssMeasurementCallback::GnssData gnssData;
  120. convertGnssData(gnssMeasurementsNotification, gnssData);
  121. auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData);
  122. if (!r.isOk()) {
  123. LOC_LOGE("%s] Error from GnssMeasurementCb description=%s",
  124. __func__, r.description().c_str());
  125. }
  126. }
  127. }
  128. }
  129. static void convertGnssMeasurement(GnssMeasurementsData& in,
  130. V1_0::IGnssMeasurementCallback::GnssMeasurement& out)
  131. {
  132. memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement));
  133. if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT)
  134. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SNR;
  135. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT)
  136. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_FREQUENCY;
  137. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT)
  138. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_CYCLES;
  139. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT)
  140. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE;
  141. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT)
  142. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY;
  143. if (in.flags & GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT)
  144. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL;
  145. convertGnssSvid(in, out.svid);
  146. convertGnssConstellationType(in.svType, out.constellation);
  147. out.timeOffsetNs = in.timeOffsetNs;
  148. if (in.stateMask & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT)
  149. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK;
  150. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT)
  151. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC;
  152. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT)
  153. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC;
  154. if (in.stateMask & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT)
  155. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED;
  156. if (in.stateMask & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT)
  157. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS;
  158. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT)
  159. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC;
  160. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT)
  161. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC;
  162. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT)
  163. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED;
  164. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT)
  165. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC;
  166. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT)
  167. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC;
  168. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT)
  169. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK;
  170. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT)
  171. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK;
  172. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT)
  173. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC;
  174. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT)
  175. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC;
  176. out.receivedSvTimeInNs = in.receivedSvTimeNs;
  177. out.receivedSvTimeUncertaintyInNs = in.receivedSvTimeUncertaintyNs;
  178. out.cN0DbHz = in.carrierToNoiseDbHz;
  179. out.pseudorangeRateMps = in.pseudorangeRateMps;
  180. out.pseudorangeRateUncertaintyMps = in.pseudorangeRateUncertaintyMps;
  181. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  182. out.accumulatedDeltaRangeState |=
  183. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  184. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  185. out.accumulatedDeltaRangeState |=
  186. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  187. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  188. out.accumulatedDeltaRangeState |=
  189. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  190. out.accumulatedDeltaRangeM = in.adrMeters;
  191. out.accumulatedDeltaRangeUncertaintyM = in.adrUncertaintyMeters;
  192. out.carrierFrequencyHz = in.carrierFrequencyHz;
  193. out.carrierCycles = in.carrierCycles;
  194. out.carrierPhase = in.carrierPhase;
  195. out.carrierPhaseUncertainty = in.carrierPhaseUncertainty;
  196. uint8_t indicator =
  197. static_cast<uint8_t>(IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN);
  198. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_PRESENT)
  199. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_PRESENT;
  200. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_NOT_PRESENT)
  201. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATIOR_NOT_PRESENT;
  202. out.multipathIndicator =
  203. static_cast<IGnssMeasurementCallback::GnssMultipathIndicator>(indicator);
  204. out.snrDb = in.signalToNoiseRatioDb;
  205. out.agcLevelDb = in.agcLevelDb;
  206. }
  207. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out)
  208. {
  209. memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssClock));
  210. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT)
  211. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_LEAP_SECOND;
  212. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_UNCERTAINTY_BIT)
  213. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_TIME_UNCERTAINTY;
  214. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT)
  215. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_FULL_BIAS;
  216. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT)
  217. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS;
  218. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT)
  219. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS_UNCERTAINTY;
  220. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_BIT)
  221. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT;
  222. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_UNCERTAINTY_BIT)
  223. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT_UNCERTAINTY;
  224. out.leapSecond = in.leapSecond;
  225. out.timeNs = in.timeNs;
  226. out.timeUncertaintyNs = in.timeUncertaintyNs;
  227. out.fullBiasNs = in.fullBiasNs;
  228. out.biasNs = in.biasNs;
  229. out.biasUncertaintyNs = in.biasUncertaintyNs;
  230. out.driftNsps = in.driftNsps;
  231. out.driftUncertaintyNsps = in.driftUncertaintyNsps;
  232. out.hwClockDiscontinuityCount = in.hwClockDiscontinuityCount;
  233. }
  234. static void convertGnssData(GnssMeasurementsNotification& in,
  235. V1_0::IGnssMeasurementCallback::GnssData& out)
  236. {
  237. out.measurementCount = in.count;
  238. if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
  239. LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.",
  240. __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT);
  241. out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
  242. }
  243. for (size_t i = 0; i < out.measurementCount; i++) {
  244. convertGnssMeasurement(in.measurements[i], out.measurements[i]);
  245. }
  246. convertGnssClock(in.clock, out.clock);
  247. }
  248. } // namespace implementation
  249. } // namespace V1_0
  250. } // namespace gnss
  251. } // namespace hardware
  252. } // namespace android