MeasurementAPIClient.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. /* Copyright (c) 2017-2020, 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 <inttypes.h>
  34. #include "LocationUtil.h"
  35. #include "MeasurementAPIClient.h"
  36. #include <loc_misc_utils.h>
  37. namespace android {
  38. namespace hardware {
  39. namespace gnss {
  40. namespace V2_1 {
  41. namespace implementation {
  42. using ::android::hardware::gnss::V1_0::IGnssMeasurement;
  43. using ::android::hardware::gnss::V2_0::IGnssMeasurementCallback;
  44. static void convertGnssData(GnssMeasurementsNotification& in,
  45. V1_0::IGnssMeasurementCallback::GnssData& out);
  46. static void convertGnssData_1_1(GnssMeasurementsNotification& in,
  47. V1_1::IGnssMeasurementCallback::GnssData& out);
  48. static void convertGnssData_2_0(GnssMeasurementsNotification& in,
  49. V2_0::IGnssMeasurementCallback::GnssData& out);
  50. static void convertGnssData_2_1(GnssMeasurementsNotification& in,
  51. V2_1::IGnssMeasurementCallback::GnssData& out);
  52. static void convertGnssMeasurement(GnssMeasurementsData& in,
  53. V1_0::IGnssMeasurementCallback::GnssMeasurement& out);
  54. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out);
  55. static void convertGnssClock_2_1(GnssMeasurementsClock& in,
  56. V2_1::IGnssMeasurementCallback::GnssClock& out);
  57. static void convertGnssMeasurementsCodeType(GnssMeasurementsCodeType& inCodeType,
  58. char* inOtherCodeTypeName,
  59. ::android::hardware::hidl_string& out);
  60. static void convertGnssMeasurementsAccumulatedDeltaRangeState(GnssMeasurementsAdrStateMask& in,
  61. ::android::hardware::hidl_bitfield
  62. <V1_1::IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState>& out);
  63. static void convertGnssMeasurementsState(GnssMeasurementsStateMask& in,
  64. ::android::hardware::hidl_bitfield
  65. <V2_0::IGnssMeasurementCallback::GnssMeasurementState>& out);
  66. static void convertElapsedRealtimeNanos(GnssMeasurementsNotification& in,
  67. ::android::hardware::gnss::V2_0::ElapsedRealtime& elapsedRealtimeNanos);
  68. MeasurementAPIClient::MeasurementAPIClient() :
  69. mGnssMeasurementCbIface(nullptr),
  70. mGnssMeasurementCbIface_1_1(nullptr),
  71. mGnssMeasurementCbIface_2_0(nullptr),
  72. mGnssMeasurementCbIface_2_1(nullptr),
  73. mTracking(false)
  74. {
  75. LOC_LOGD("%s]: ()", __FUNCTION__);
  76. }
  77. MeasurementAPIClient::~MeasurementAPIClient()
  78. {
  79. LOC_LOGD("%s]: ()", __FUNCTION__);
  80. }
  81. void MeasurementAPIClient::clearInterfaces()
  82. {
  83. mGnssMeasurementCbIface = nullptr;
  84. mGnssMeasurementCbIface_1_1 = nullptr;
  85. mGnssMeasurementCbIface_2_0 = nullptr;
  86. mGnssMeasurementCbIface_2_1 = nullptr;
  87. }
  88. // for GpsInterface
  89. Return<IGnssMeasurement::GnssMeasurementStatus>
  90. MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
  91. {
  92. LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
  93. mMutex.lock();
  94. clearInterfaces();
  95. mGnssMeasurementCbIface = callback;
  96. mMutex.unlock();
  97. return startTracking();
  98. }
  99. Return<IGnssMeasurement::GnssMeasurementStatus>
  100. MeasurementAPIClient::measurementSetCallback_1_1(
  101. const sp<V1_1::IGnssMeasurementCallback>& callback,
  102. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  103. {
  104. LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
  105. __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
  106. mMutex.lock();
  107. clearInterfaces();
  108. mGnssMeasurementCbIface_1_1 = callback;
  109. mMutex.unlock();
  110. return startTracking(powerMode, timeBetweenMeasurement);
  111. }
  112. Return<IGnssMeasurement::GnssMeasurementStatus>
  113. MeasurementAPIClient::measurementSetCallback_2_0(
  114. const sp<V2_0::IGnssMeasurementCallback>& callback,
  115. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  116. {
  117. LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
  118. __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
  119. mMutex.lock();
  120. clearInterfaces();
  121. mGnssMeasurementCbIface_2_0 = callback;
  122. mMutex.unlock();
  123. return startTracking(powerMode, timeBetweenMeasurement);
  124. }
  125. Return<IGnssMeasurement::GnssMeasurementStatus> MeasurementAPIClient::measurementSetCallback_2_1(
  126. const sp<V2_1::IGnssMeasurementCallback>& callback,
  127. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement) {
  128. LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
  129. __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
  130. mMutex.lock();
  131. clearInterfaces();
  132. mGnssMeasurementCbIface_2_1 = callback;
  133. mMutex.unlock();
  134. return startTracking(powerMode, timeBetweenMeasurement);
  135. }
  136. Return<IGnssMeasurement::GnssMeasurementStatus>
  137. MeasurementAPIClient::startTracking(
  138. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  139. {
  140. LocationCallbacks locationCallbacks;
  141. memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
  142. locationCallbacks.size = sizeof(LocationCallbacks);
  143. locationCallbacks.trackingCb = nullptr;
  144. locationCallbacks.batchingCb = nullptr;
  145. locationCallbacks.geofenceBreachCb = nullptr;
  146. locationCallbacks.geofenceStatusCb = nullptr;
  147. locationCallbacks.gnssLocationInfoCb = nullptr;
  148. locationCallbacks.gnssNiCb = nullptr;
  149. locationCallbacks.gnssSvCb = nullptr;
  150. locationCallbacks.gnssNmeaCb = nullptr;
  151. locationCallbacks.gnssMeasurementsCb = nullptr;
  152. if (mGnssMeasurementCbIface_2_1 != nullptr ||
  153. mGnssMeasurementCbIface_2_0 != nullptr ||
  154. mGnssMeasurementCbIface_1_1 != nullptr ||
  155. mGnssMeasurementCbIface != nullptr) {
  156. locationCallbacks.gnssMeasurementsCb =
  157. [this](GnssMeasurementsNotification gnssMeasurementsNotification) {
  158. onGnssMeasurementsCb(gnssMeasurementsNotification);
  159. };
  160. }
  161. locAPISetCallbacks(locationCallbacks);
  162. TrackingOptions options = {};
  163. memset(&options, 0, sizeof(TrackingOptions));
  164. options.size = sizeof(TrackingOptions);
  165. options.minInterval = 1000;
  166. options.mode = GNSS_SUPL_MODE_STANDALONE;
  167. if (GNSS_POWER_MODE_INVALID != powerMode) {
  168. options.powerMode = powerMode;
  169. options.tbm = timeBetweenMeasurement;
  170. }
  171. mTracking = true;
  172. LOC_LOGD("%s]: start tracking session", __FUNCTION__);
  173. locAPIStartTracking(options);
  174. return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
  175. }
  176. // for GpsMeasurementInterface
  177. void MeasurementAPIClient::measurementClose() {
  178. LOC_LOGD("%s]: ()", __FUNCTION__);
  179. mTracking = false;
  180. locAPIStopTracking();
  181. }
  182. // callbacks
  183. void MeasurementAPIClient::onGnssMeasurementsCb(
  184. GnssMeasurementsNotification gnssMeasurementsNotification)
  185. {
  186. LOC_LOGD("%s]: (count: %u active: %d)",
  187. __FUNCTION__, gnssMeasurementsNotification.count, mTracking);
  188. if (mTracking) {
  189. mMutex.lock();
  190. sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr;
  191. sp<V1_1::IGnssMeasurementCallback> gnssMeasurementCbIface_1_1 = nullptr;
  192. sp<V2_0::IGnssMeasurementCallback> gnssMeasurementCbIface_2_0 = nullptr;
  193. sp<V2_1::IGnssMeasurementCallback> gnssMeasurementCbIface_2_1 = nullptr;
  194. if (mGnssMeasurementCbIface_2_1 != nullptr) {
  195. gnssMeasurementCbIface_2_1 = mGnssMeasurementCbIface_2_1;
  196. } else if (mGnssMeasurementCbIface_2_0 != nullptr) {
  197. gnssMeasurementCbIface_2_0 = mGnssMeasurementCbIface_2_0;
  198. } else if (mGnssMeasurementCbIface_1_1 != nullptr) {
  199. gnssMeasurementCbIface_1_1 = mGnssMeasurementCbIface_1_1;
  200. } else if (mGnssMeasurementCbIface != nullptr) {
  201. gnssMeasurementCbIface = mGnssMeasurementCbIface;
  202. }
  203. mMutex.unlock();
  204. if (gnssMeasurementCbIface_2_1 != nullptr) {
  205. V2_1::IGnssMeasurementCallback::GnssData gnssData;
  206. convertGnssData_2_1(gnssMeasurementsNotification, gnssData);
  207. auto r = gnssMeasurementCbIface_2_1->gnssMeasurementCb_2_1(gnssData);
  208. if (!r.isOk()) {
  209. LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
  210. __func__, r.description().c_str());
  211. }
  212. } else if (gnssMeasurementCbIface_2_0 != nullptr) {
  213. V2_0::IGnssMeasurementCallback::GnssData gnssData;
  214. convertGnssData_2_0(gnssMeasurementsNotification, gnssData);
  215. auto r = gnssMeasurementCbIface_2_0->gnssMeasurementCb_2_0(gnssData);
  216. if (!r.isOk()) {
  217. LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
  218. __func__, r.description().c_str());
  219. }
  220. } else if (gnssMeasurementCbIface_1_1 != nullptr) {
  221. V1_1::IGnssMeasurementCallback::GnssData gnssData;
  222. convertGnssData_1_1(gnssMeasurementsNotification, gnssData);
  223. auto r = gnssMeasurementCbIface_1_1->gnssMeasurementCb(gnssData);
  224. if (!r.isOk()) {
  225. LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
  226. __func__, r.description().c_str());
  227. }
  228. } else if (gnssMeasurementCbIface != nullptr) {
  229. V1_0::IGnssMeasurementCallback::GnssData gnssData;
  230. convertGnssData(gnssMeasurementsNotification, gnssData);
  231. auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData);
  232. if (!r.isOk()) {
  233. LOC_LOGE("%s] Error from GnssMeasurementCb description=%s",
  234. __func__, r.description().c_str());
  235. }
  236. }
  237. }
  238. }
  239. static void convertGnssMeasurement(GnssMeasurementsData& in,
  240. V1_0::IGnssMeasurementCallback::GnssMeasurement& out)
  241. {
  242. memset(&out, 0, sizeof(out));
  243. if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT)
  244. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SNR;
  245. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT)
  246. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_FREQUENCY;
  247. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT)
  248. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_CYCLES;
  249. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT)
  250. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE;
  251. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT)
  252. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY;
  253. if (in.flags & GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT)
  254. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL;
  255. convertGnssSvid(in, out.svid);
  256. convertGnssConstellationType(in.svType, out.constellation);
  257. out.timeOffsetNs = in.timeOffsetNs;
  258. if (in.stateMask & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT)
  259. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK;
  260. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT)
  261. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC;
  262. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT)
  263. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC;
  264. if (in.stateMask & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT)
  265. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED;
  266. if (in.stateMask & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT)
  267. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS;
  268. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT)
  269. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC;
  270. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT)
  271. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC;
  272. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT)
  273. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED;
  274. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT)
  275. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC;
  276. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT)
  277. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC;
  278. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT)
  279. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK;
  280. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT)
  281. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK;
  282. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT)
  283. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC;
  284. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT)
  285. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC;
  286. out.receivedSvTimeInNs = in.receivedSvTimeNs;
  287. out.receivedSvTimeUncertaintyInNs = in.receivedSvTimeUncertaintyNs;
  288. out.cN0DbHz = in.carrierToNoiseDbHz;
  289. out.pseudorangeRateMps = in.pseudorangeRateMps;
  290. out.pseudorangeRateUncertaintyMps = in.pseudorangeRateUncertaintyMps;
  291. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  292. out.accumulatedDeltaRangeState |=
  293. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  294. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  295. out.accumulatedDeltaRangeState |=
  296. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  297. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  298. out.accumulatedDeltaRangeState |=
  299. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  300. out.accumulatedDeltaRangeM = in.adrMeters;
  301. out.accumulatedDeltaRangeUncertaintyM = in.adrUncertaintyMeters;
  302. out.carrierFrequencyHz = in.carrierFrequencyHz;
  303. out.carrierCycles = in.carrierCycles;
  304. out.carrierPhase = in.carrierPhase;
  305. out.carrierPhaseUncertainty = in.carrierPhaseUncertainty;
  306. uint8_t indicator =
  307. static_cast<uint8_t>(IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN);
  308. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_PRESENT)
  309. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_PRESENT;
  310. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_NOT_PRESENT)
  311. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATIOR_NOT_PRESENT;
  312. out.multipathIndicator =
  313. static_cast<IGnssMeasurementCallback::GnssMultipathIndicator>(indicator);
  314. out.snrDb = in.signalToNoiseRatioDb;
  315. out.agcLevelDb = in.agcLevelDb;
  316. }
  317. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out)
  318. {
  319. memset(&out, 0, sizeof(out));
  320. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT)
  321. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_LEAP_SECOND;
  322. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_UNCERTAINTY_BIT)
  323. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_TIME_UNCERTAINTY;
  324. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT)
  325. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_FULL_BIAS;
  326. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT)
  327. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS;
  328. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT)
  329. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS_UNCERTAINTY;
  330. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_BIT)
  331. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT;
  332. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_UNCERTAINTY_BIT)
  333. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT_UNCERTAINTY;
  334. out.leapSecond = in.leapSecond;
  335. out.timeNs = in.timeNs;
  336. out.timeUncertaintyNs = in.timeUncertaintyNs;
  337. out.fullBiasNs = in.fullBiasNs;
  338. out.biasNs = in.biasNs;
  339. out.biasUncertaintyNs = in.biasUncertaintyNs;
  340. out.driftNsps = in.driftNsps;
  341. out.driftUncertaintyNsps = in.driftUncertaintyNsps;
  342. out.hwClockDiscontinuityCount = in.hwClockDiscontinuityCount;
  343. }
  344. static void convertGnssClock_2_1(GnssMeasurementsClock& in,
  345. V2_1::IGnssMeasurementCallback::GnssClock& out)
  346. {
  347. memset(&out, 0, sizeof(out));
  348. convertGnssClock(in, out.v1_0);
  349. convertGnssConstellationType(in.referenceSignalTypeForIsb.svType,
  350. out.referenceSignalTypeForIsb.constellation);
  351. out.referenceSignalTypeForIsb.carrierFrequencyHz =
  352. in.referenceSignalTypeForIsb.carrierFrequencyHz;
  353. convertGnssMeasurementsCodeType(in.referenceSignalTypeForIsb.codeType,
  354. in.referenceSignalTypeForIsb.otherCodeTypeName,
  355. out.referenceSignalTypeForIsb.codeType);
  356. }
  357. static void convertGnssData(GnssMeasurementsNotification& in,
  358. V1_0::IGnssMeasurementCallback::GnssData& out)
  359. {
  360. memset(&out, 0, sizeof(out));
  361. out.measurementCount = in.count;
  362. if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
  363. LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.",
  364. __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT);
  365. out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
  366. }
  367. for (size_t i = 0; i < out.measurementCount; i++) {
  368. convertGnssMeasurement(in.measurements[i], out.measurements[i]);
  369. }
  370. convertGnssClock(in.clock, out.clock);
  371. }
  372. static void convertGnssData_1_1(GnssMeasurementsNotification& in,
  373. V1_1::IGnssMeasurementCallback::GnssData& out)
  374. {
  375. memset(&out, 0, sizeof(out));
  376. out.measurements.resize(in.count);
  377. for (size_t i = 0; i < in.count; i++) {
  378. convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_0);
  379. convertGnssMeasurementsAccumulatedDeltaRangeState(in.measurements[i].adrStateMask,
  380. out.measurements[i].accumulatedDeltaRangeState);
  381. }
  382. convertGnssClock(in.clock, out.clock);
  383. }
  384. static void convertGnssData_2_0(GnssMeasurementsNotification& in,
  385. V2_0::IGnssMeasurementCallback::GnssData& out)
  386. {
  387. memset(&out, 0, sizeof(out));
  388. out.measurements.resize(in.count);
  389. for (size_t i = 0; i < in.count; i++) {
  390. convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_1.v1_0);
  391. convertGnssConstellationType(in.measurements[i].svType, out.measurements[i].constellation);
  392. convertGnssMeasurementsCodeType(in.measurements[i].codeType,
  393. in.measurements[i].otherCodeTypeName,
  394. out.measurements[i].codeType);
  395. convertGnssMeasurementsAccumulatedDeltaRangeState(in.measurements[i].adrStateMask,
  396. out.measurements[i].v1_1.accumulatedDeltaRangeState);
  397. convertGnssMeasurementsState(in.measurements[i].stateMask, out.measurements[i].state);
  398. }
  399. convertGnssClock(in.clock, out.clock);
  400. convertElapsedRealtimeNanos(in, out.elapsedRealtime);
  401. }
  402. static void convertGnssMeasurementsCodeType(GnssMeasurementsCodeType& inCodeType,
  403. char* inOtherCodeTypeName, ::android::hardware::hidl_string& out)
  404. {
  405. switch(inCodeType) {
  406. case GNSS_MEASUREMENTS_CODE_TYPE_A:
  407. out = "A";
  408. break;
  409. case GNSS_MEASUREMENTS_CODE_TYPE_B:
  410. out = "B";
  411. break;
  412. case GNSS_MEASUREMENTS_CODE_TYPE_C:
  413. out = "C";
  414. break;
  415. case GNSS_MEASUREMENTS_CODE_TYPE_I:
  416. out = "I";
  417. break;
  418. case GNSS_MEASUREMENTS_CODE_TYPE_L:
  419. out = "L";
  420. break;
  421. case GNSS_MEASUREMENTS_CODE_TYPE_M:
  422. out = "M";
  423. break;
  424. case GNSS_MEASUREMENTS_CODE_TYPE_P:
  425. out = "P";
  426. break;
  427. case GNSS_MEASUREMENTS_CODE_TYPE_Q:
  428. out = "Q";
  429. break;
  430. case GNSS_MEASUREMENTS_CODE_TYPE_S:
  431. out = "S";
  432. break;
  433. case GNSS_MEASUREMENTS_CODE_TYPE_W:
  434. out = "W";
  435. break;
  436. case GNSS_MEASUREMENTS_CODE_TYPE_X:
  437. out = "X";
  438. break;
  439. case GNSS_MEASUREMENTS_CODE_TYPE_Y:
  440. out = "Y";
  441. break;
  442. case GNSS_MEASUREMENTS_CODE_TYPE_Z:
  443. out = "Z";
  444. break;
  445. case GNSS_MEASUREMENTS_CODE_TYPE_N:
  446. out = "N";
  447. break;
  448. case GNSS_MEASUREMENTS_CODE_TYPE_OTHER:
  449. default:
  450. out = inOtherCodeTypeName;
  451. break;
  452. }
  453. }
  454. static void convertGnssMeasurementsAccumulatedDeltaRangeState(GnssMeasurementsAdrStateMask& in,
  455. ::android::hardware::hidl_bitfield
  456. <V1_1::IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState>& out)
  457. {
  458. memset(&out, 0, sizeof(out));
  459. if (in & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  460. out |= IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  461. if (in & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  462. out |= IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  463. if (in & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  464. out |= IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  465. if (in & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_HALF_CYCLE_RESOLVED_BIT)
  466. out |= IGnssMeasurementCallback::
  467. GnssAccumulatedDeltaRangeState::ADR_STATE_HALF_CYCLE_RESOLVED;
  468. }
  469. static void convertGnssMeasurementsState(GnssMeasurementsStateMask& in,
  470. ::android::hardware::hidl_bitfield
  471. <V2_0::IGnssMeasurementCallback::GnssMeasurementState>& out)
  472. {
  473. memset(&out, 0, sizeof(out));
  474. if (in & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT)
  475. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK;
  476. if (in & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT)
  477. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC;
  478. if (in & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT)
  479. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC;
  480. if (in & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT)
  481. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED;
  482. if (in & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT)
  483. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS;
  484. if (in & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT)
  485. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC;
  486. if (in & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT)
  487. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC;
  488. if (in & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT)
  489. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED;
  490. if (in & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT)
  491. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC;
  492. if (in & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT)
  493. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC;
  494. if (in & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT)
  495. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK;
  496. if (in & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT)
  497. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK;
  498. if (in & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT)
  499. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC;
  500. if (in & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT)
  501. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC;
  502. if (in & GNSS_MEASUREMENTS_STATE_TOW_KNOWN_BIT)
  503. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_KNOWN;
  504. if (in & GNSS_MEASUREMENTS_STATE_GLO_TOD_KNOWN_BIT)
  505. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_KNOWN;
  506. if (in & GNSS_MEASUREMENTS_STATE_2ND_CODE_LOCK_BIT)
  507. out |= IGnssMeasurementCallback::GnssMeasurementState::STATE_2ND_CODE_LOCK;
  508. }
  509. static void convertGnssData_2_1(GnssMeasurementsNotification& in,
  510. V2_1::IGnssMeasurementCallback::GnssData& out)
  511. {
  512. memset(&out, 0, sizeof(out));
  513. out.measurements.resize(in.count);
  514. for (size_t i = 0; i < in.count; i++) {
  515. out.measurements[i].flags = 0;
  516. convertGnssMeasurement(in.measurements[i], out.measurements[i].v2_0.v1_1.v1_0);
  517. convertGnssConstellationType(in.measurements[i].svType,
  518. out.measurements[i].v2_0.constellation);
  519. convertGnssMeasurementsCodeType(in.measurements[i].codeType,
  520. in.measurements[i].otherCodeTypeName,
  521. out.measurements[i].v2_0.codeType);
  522. convertGnssMeasurementsAccumulatedDeltaRangeState(in.measurements[i].adrStateMask,
  523. out.measurements[i].v2_0.v1_1.accumulatedDeltaRangeState);
  524. convertGnssMeasurementsState(in.measurements[i].stateMask,
  525. out.measurements[i].v2_0.state);
  526. out.measurements[i].basebandCN0DbHz = in.measurements[i].basebandCarrierToNoiseDbHz;
  527. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) {
  528. out.measurements[i].flags |=
  529. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SNR;
  530. }
  531. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT) {
  532. out.measurements[i].flags |=
  533. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_FREQUENCY;
  534. }
  535. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT) {
  536. out.measurements[i].flags |=
  537. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_CYCLES;
  538. }
  539. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT) {
  540. out.measurements[i].flags |=
  541. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE;
  542. }
  543. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT) {
  544. out.measurements[i].flags |=
  545. V2_1::IGnssMeasurementCallback::
  546. GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY;
  547. }
  548. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT) {
  549. out.measurements[i].flags |=
  550. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL;
  551. }
  552. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_FULL_ISB_BIT) {
  553. out.measurements[i].fullInterSignalBiasNs = in.measurements[i].fullInterSignalBiasNs;
  554. out.measurements[i].flags |=
  555. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_FULL_ISB;
  556. }
  557. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_FULL_ISB_UNCERTAINTY_BIT) {
  558. out.measurements[i].fullInterSignalBiasUncertaintyNs =
  559. in.measurements[i].fullInterSignalBiasUncertaintyNs;
  560. out.measurements[i].flags |=
  561. V2_1::IGnssMeasurementCallback::
  562. GnssMeasurementFlags::HAS_FULL_ISB_UNCERTAINTY;
  563. }
  564. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_SATELLITE_ISB_BIT) {
  565. out.measurements[i].satelliteInterSignalBiasNs =
  566. in.measurements[i].satelliteInterSignalBiasNs;
  567. out.measurements[i].flags |=
  568. V2_1::IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SATELLITE_ISB;
  569. }
  570. if (in.measurements[i].flags & GNSS_MEASUREMENTS_DATA_SATELLITE_ISB_UNCERTAINTY_BIT) {
  571. out.measurements[i].satelliteInterSignalBiasUncertaintyNs =
  572. in.measurements[i].satelliteInterSignalBiasUncertaintyNs;
  573. out.measurements[i].flags |=
  574. V2_1::IGnssMeasurementCallback::
  575. GnssMeasurementFlags::HAS_SATELLITE_ISB_UNCERTAINTY;
  576. }
  577. }
  578. convertGnssClock_2_1(in.clock, out.clock);
  579. convertElapsedRealtimeNanos(in, out.elapsedRealtime);
  580. }
  581. static void convertElapsedRealtimeNanos(GnssMeasurementsNotification& in,
  582. ::android::hardware::gnss::V2_0::ElapsedRealtime& elapsedRealtime)
  583. {
  584. if (in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_ELAPSED_REAL_TIME_BIT) {
  585. elapsedRealtime.flags |= V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS;
  586. elapsedRealtime.timestampNs = in.clock.elapsedRealTime;
  587. elapsedRealtime.flags |= V2_0::ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS;
  588. elapsedRealtime.timeUncertaintyNs = in.clock.elapsedRealTimeUnc;
  589. LOC_LOGd("elapsedRealtime.timestampNs=%" PRIi64 ""
  590. " elapsedRealtime.timeUncertaintyNs=%" PRIi64 " elapsedRealtime.flags=0x%X",
  591. elapsedRealtime.timestampNs,
  592. elapsedRealtime.timeUncertaintyNs, elapsedRealtime.flags);
  593. }
  594. }
  595. } // namespace implementation
  596. } // namespace V2_1
  597. } // namespace gnss
  598. } // namespace hardware
  599. } // namespace android