MeasurementAPIClient.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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_0 {
  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 convertGnssMeasurement(GnssMeasurementsData& in,
  51. V1_0::IGnssMeasurementCallback::GnssMeasurement& out);
  52. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out);
  53. static void convertGnssMeasurementsCodeType(GnssMeasurementsCodeType& in,
  54. ::android::hardware::hidl_string& out);
  55. static void convertElapsedRealtimeNanos(GnssMeasurementsNotification& in,
  56. ::android::hardware::gnss::V2_0::ElapsedRealtime& elapsedRealtimeNanos);
  57. MeasurementAPIClient::MeasurementAPIClient() :
  58. mGnssMeasurementCbIface(nullptr),
  59. mGnssMeasurementCbIface_1_1(nullptr),
  60. mGnssMeasurementCbIface_2_0(nullptr),
  61. mTracking(false)
  62. {
  63. LOC_LOGD("%s]: ()", __FUNCTION__);
  64. }
  65. MeasurementAPIClient::~MeasurementAPIClient()
  66. {
  67. LOC_LOGD("%s]: ()", __FUNCTION__);
  68. }
  69. void MeasurementAPIClient::clearInterfaces()
  70. {
  71. mGnssMeasurementCbIface = nullptr;
  72. mGnssMeasurementCbIface_1_1 = nullptr;
  73. mGnssMeasurementCbIface_2_0 = nullptr;
  74. }
  75. // for GpsInterface
  76. Return<IGnssMeasurement::GnssMeasurementStatus>
  77. MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
  78. {
  79. LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
  80. mMutex.lock();
  81. clearInterfaces();
  82. mGnssMeasurementCbIface = callback;
  83. mMutex.unlock();
  84. return startTracking();
  85. }
  86. Return<IGnssMeasurement::GnssMeasurementStatus>
  87. MeasurementAPIClient::measurementSetCallback_1_1(
  88. const sp<V1_1::IGnssMeasurementCallback>& callback,
  89. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  90. {
  91. LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
  92. __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
  93. mMutex.lock();
  94. clearInterfaces();
  95. mGnssMeasurementCbIface_1_1 = callback;
  96. mMutex.unlock();
  97. return startTracking(powerMode, timeBetweenMeasurement);
  98. }
  99. Return<IGnssMeasurement::GnssMeasurementStatus>
  100. MeasurementAPIClient::measurementSetCallback_2_0(
  101. const sp<V2_0::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_2_0 = callback;
  109. mMutex.unlock();
  110. return startTracking(powerMode, timeBetweenMeasurement);
  111. }
  112. Return<IGnssMeasurement::GnssMeasurementStatus>
  113. MeasurementAPIClient::startTracking(
  114. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  115. {
  116. LocationCallbacks locationCallbacks;
  117. memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
  118. locationCallbacks.size = sizeof(LocationCallbacks);
  119. locationCallbacks.trackingCb = nullptr;
  120. locationCallbacks.batchingCb = nullptr;
  121. locationCallbacks.geofenceBreachCb = nullptr;
  122. locationCallbacks.geofenceStatusCb = nullptr;
  123. locationCallbacks.gnssLocationInfoCb = nullptr;
  124. locationCallbacks.gnssNiCb = nullptr;
  125. locationCallbacks.gnssSvCb = nullptr;
  126. locationCallbacks.gnssNmeaCb = nullptr;
  127. locationCallbacks.gnssMeasurementsCb = nullptr;
  128. if (mGnssMeasurementCbIface_2_0 != nullptr ||
  129. mGnssMeasurementCbIface_1_1 != nullptr ||
  130. mGnssMeasurementCbIface != nullptr) {
  131. locationCallbacks.gnssMeasurementsCb =
  132. [this](GnssMeasurementsNotification gnssMeasurementsNotification) {
  133. onGnssMeasurementsCb(gnssMeasurementsNotification);
  134. };
  135. }
  136. locAPISetCallbacks(locationCallbacks);
  137. TrackingOptions options = {};
  138. memset(&options, 0, sizeof(TrackingOptions));
  139. options.size = sizeof(TrackingOptions);
  140. options.minInterval = 1000;
  141. options.mode = GNSS_SUPL_MODE_STANDALONE;
  142. if (GNSS_POWER_MODE_INVALID != powerMode) {
  143. options.powerMode = powerMode;
  144. options.tbm = timeBetweenMeasurement;
  145. }
  146. mTracking = true;
  147. LOC_LOGD("%s]: start tracking session", __FUNCTION__);
  148. locAPIStartTracking(options);
  149. return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
  150. }
  151. // for GpsMeasurementInterface
  152. void MeasurementAPIClient::measurementClose() {
  153. LOC_LOGD("%s]: ()", __FUNCTION__);
  154. mTracking = false;
  155. locAPIStopTracking();
  156. }
  157. // callbacks
  158. void MeasurementAPIClient::onGnssMeasurementsCb(
  159. GnssMeasurementsNotification gnssMeasurementsNotification)
  160. {
  161. LOC_LOGD("%s]: (count: %u active: %d)",
  162. __FUNCTION__, gnssMeasurementsNotification.count, mTracking);
  163. if (mTracking) {
  164. mMutex.lock();
  165. sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr;
  166. sp<V1_1::IGnssMeasurementCallback> gnssMeasurementCbIface_1_1 = nullptr;
  167. sp<V2_0::IGnssMeasurementCallback> gnssMeasurementCbIface_2_0 = nullptr;
  168. if (mGnssMeasurementCbIface_2_0 != nullptr) {
  169. gnssMeasurementCbIface_2_0 = mGnssMeasurementCbIface_2_0;
  170. } else if (mGnssMeasurementCbIface_1_1 != nullptr) {
  171. gnssMeasurementCbIface_1_1 = mGnssMeasurementCbIface_1_1;
  172. } else if (mGnssMeasurementCbIface != nullptr) {
  173. gnssMeasurementCbIface = mGnssMeasurementCbIface;
  174. }
  175. mMutex.unlock();
  176. if (gnssMeasurementCbIface_2_0 != nullptr) {
  177. V2_0::IGnssMeasurementCallback::GnssData gnssData;
  178. convertGnssData_2_0(gnssMeasurementsNotification, gnssData);
  179. auto r = gnssMeasurementCbIface_2_0->gnssMeasurementCb_2_0(gnssData);
  180. if (!r.isOk()) {
  181. LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
  182. __func__, r.description().c_str());
  183. }
  184. } else if (gnssMeasurementCbIface_1_1 != nullptr) {
  185. V1_1::IGnssMeasurementCallback::GnssData gnssData;
  186. convertGnssData_1_1(gnssMeasurementsNotification, gnssData);
  187. auto r = gnssMeasurementCbIface_1_1->gnssMeasurementCb(gnssData);
  188. if (!r.isOk()) {
  189. LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
  190. __func__, r.description().c_str());
  191. }
  192. } else if (gnssMeasurementCbIface != nullptr) {
  193. V1_0::IGnssMeasurementCallback::GnssData gnssData;
  194. convertGnssData(gnssMeasurementsNotification, gnssData);
  195. auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData);
  196. if (!r.isOk()) {
  197. LOC_LOGE("%s] Error from GnssMeasurementCb description=%s",
  198. __func__, r.description().c_str());
  199. }
  200. }
  201. }
  202. }
  203. static void convertGnssMeasurement(GnssMeasurementsData& in,
  204. V1_0::IGnssMeasurementCallback::GnssMeasurement& out)
  205. {
  206. memset(&out, 0, sizeof(out));
  207. if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT)
  208. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SNR;
  209. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT)
  210. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_FREQUENCY;
  211. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT)
  212. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_CYCLES;
  213. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT)
  214. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE;
  215. if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT)
  216. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY;
  217. if (in.flags & GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT)
  218. out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL;
  219. convertGnssSvid(in, out.svid);
  220. convertGnssConstellationType(in.svType, out.constellation);
  221. out.timeOffsetNs = in.timeOffsetNs;
  222. if (in.stateMask & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT)
  223. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK;
  224. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT)
  225. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC;
  226. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT)
  227. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC;
  228. if (in.stateMask & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT)
  229. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED;
  230. if (in.stateMask & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT)
  231. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS;
  232. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT)
  233. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC;
  234. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT)
  235. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC;
  236. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT)
  237. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED;
  238. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT)
  239. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC;
  240. if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT)
  241. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC;
  242. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT)
  243. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK;
  244. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT)
  245. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK;
  246. if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT)
  247. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC;
  248. if (in.stateMask & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT)
  249. out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC;
  250. out.receivedSvTimeInNs = in.receivedSvTimeNs;
  251. out.receivedSvTimeUncertaintyInNs = in.receivedSvTimeUncertaintyNs;
  252. out.cN0DbHz = in.carrierToNoiseDbHz;
  253. out.pseudorangeRateMps = in.pseudorangeRateMps;
  254. out.pseudorangeRateUncertaintyMps = in.pseudorangeRateUncertaintyMps;
  255. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  256. out.accumulatedDeltaRangeState |=
  257. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  258. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  259. out.accumulatedDeltaRangeState |=
  260. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  261. if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  262. out.accumulatedDeltaRangeState |=
  263. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  264. out.accumulatedDeltaRangeM = in.adrMeters;
  265. out.accumulatedDeltaRangeUncertaintyM = in.adrUncertaintyMeters;
  266. out.carrierFrequencyHz = in.carrierFrequencyHz;
  267. out.carrierCycles = in.carrierCycles;
  268. out.carrierPhase = in.carrierPhase;
  269. out.carrierPhaseUncertainty = in.carrierPhaseUncertainty;
  270. uint8_t indicator =
  271. static_cast<uint8_t>(IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN);
  272. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_PRESENT)
  273. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_PRESENT;
  274. if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_NOT_PRESENT)
  275. indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATIOR_NOT_PRESENT;
  276. out.multipathIndicator =
  277. static_cast<IGnssMeasurementCallback::GnssMultipathIndicator>(indicator);
  278. out.snrDb = in.signalToNoiseRatioDb;
  279. out.agcLevelDb = in.agcLevelDb;
  280. }
  281. static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out)
  282. {
  283. memset(&out, 0, sizeof(out));
  284. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT)
  285. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_LEAP_SECOND;
  286. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_UNCERTAINTY_BIT)
  287. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_TIME_UNCERTAINTY;
  288. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT)
  289. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_FULL_BIAS;
  290. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT)
  291. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS;
  292. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT)
  293. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS_UNCERTAINTY;
  294. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_BIT)
  295. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT;
  296. if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_UNCERTAINTY_BIT)
  297. out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT_UNCERTAINTY;
  298. out.leapSecond = in.leapSecond;
  299. out.timeNs = in.timeNs;
  300. out.timeUncertaintyNs = in.timeUncertaintyNs;
  301. out.fullBiasNs = in.fullBiasNs;
  302. out.biasNs = in.biasNs;
  303. out.biasUncertaintyNs = in.biasUncertaintyNs;
  304. out.driftNsps = in.driftNsps;
  305. out.driftUncertaintyNsps = in.driftUncertaintyNsps;
  306. out.hwClockDiscontinuityCount = in.hwClockDiscontinuityCount;
  307. }
  308. static void convertGnssData(GnssMeasurementsNotification& in,
  309. V1_0::IGnssMeasurementCallback::GnssData& out)
  310. {
  311. memset(&out, 0, sizeof(out));
  312. out.measurementCount = in.count;
  313. if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
  314. LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.",
  315. __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT);
  316. out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
  317. }
  318. for (size_t i = 0; i < out.measurementCount; i++) {
  319. convertGnssMeasurement(in.measurements[i], out.measurements[i]);
  320. }
  321. convertGnssClock(in.clock, out.clock);
  322. }
  323. static void convertGnssData_1_1(GnssMeasurementsNotification& in,
  324. V1_1::IGnssMeasurementCallback::GnssData& out)
  325. {
  326. memset(&out, 0, sizeof(out));
  327. out.measurements.resize(in.count);
  328. for (size_t i = 0; i < in.count; i++) {
  329. convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_0);
  330. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  331. out.measurements[i].accumulatedDeltaRangeState |=
  332. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  333. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  334. out.measurements[i].accumulatedDeltaRangeState |=
  335. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  336. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  337. out.measurements[i].accumulatedDeltaRangeState |=
  338. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  339. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_HALF_CYCLE_RESOLVED_BIT)
  340. out.measurements[i].accumulatedDeltaRangeState |=
  341. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_HALF_CYCLE_RESOLVED;
  342. }
  343. convertGnssClock(in.clock, out.clock);
  344. }
  345. static void convertGnssData_2_0(GnssMeasurementsNotification& in,
  346. V2_0::IGnssMeasurementCallback::GnssData& out)
  347. {
  348. memset(&out, 0, sizeof(out));
  349. out.measurements.resize(in.count);
  350. for (size_t i = 0; i < in.count; i++) {
  351. convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_1.v1_0);
  352. convertGnssConstellationType(in.measurements[i].svType, out.measurements[i].constellation);
  353. convertGnssMeasurementsCodeType(in.measurements[i].codeType, out.measurements[i].codeType);
  354. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT)
  355. out.measurements[i].v1_1.accumulatedDeltaRangeState |=
  356. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID;
  357. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT)
  358. out.measurements[i].v1_1.accumulatedDeltaRangeState |=
  359. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET;
  360. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT)
  361. out.measurements[i].v1_1.accumulatedDeltaRangeState |=
  362. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP;
  363. if (in.measurements[i].adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_HALF_CYCLE_RESOLVED_BIT)
  364. out.measurements[i].v1_1.accumulatedDeltaRangeState |=
  365. IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_HALF_CYCLE_RESOLVED;
  366. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT)
  367. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK;
  368. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT)
  369. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC;
  370. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT)
  371. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC;
  372. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT)
  373. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED;
  374. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT)
  375. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS;
  376. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT)
  377. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC;
  378. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT)
  379. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC;
  380. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT)
  381. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED;
  382. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT)
  383. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC;
  384. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT)
  385. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC;
  386. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT)
  387. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK;
  388. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT)
  389. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK;
  390. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT)
  391. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC;
  392. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT)
  393. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC;
  394. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_TOW_KNOWN_BIT)
  395. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_KNOWN;
  396. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_KNOWN_BIT)
  397. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_KNOWN;
  398. if (in.measurements[i].stateMask & GNSS_MEASUREMENTS_STATE_2ND_CODE_LOCK_BIT)
  399. out.measurements[i].state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_2ND_CODE_LOCK;
  400. }
  401. convertGnssClock(in.clock, out.clock);
  402. convertElapsedRealtimeNanos(in, out.elapsedRealtime);
  403. }
  404. static void convertElapsedRealtimeNanos(GnssMeasurementsNotification& in,
  405. ::android::hardware::gnss::V2_0::ElapsedRealtime& elapsedRealtime)
  406. {
  407. if (in.clock.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_ELAPSED_REAL_TIME_BIT) {
  408. elapsedRealtime.flags |= V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS;
  409. elapsedRealtime.timestampNs = in.clock.elapsedRealTime;
  410. elapsedRealtime.flags |= V2_0::ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS;
  411. elapsedRealtime.timeUncertaintyNs = in.clock.elapsedRealTimeUnc;
  412. LOC_LOGd("elapsedRealtime.timestampNs=%" PRIi64 ""
  413. " elapsedRealtime.timeUncertaintyNs=%" PRIi64 " elapsedRealtime.flags=0x%X",
  414. elapsedRealtime.timestampNs,
  415. elapsedRealtime.timeUncertaintyNs, elapsedRealtime.flags);
  416. }
  417. }
  418. static void convertGnssMeasurementsCodeType(GnssMeasurementsCodeType& in,
  419. ::android::hardware::hidl_string& out)
  420. {
  421. switch(in) {
  422. case GNSS_MEASUREMENTS_CODE_TYPE_A:
  423. out = "A";
  424. break;
  425. case GNSS_MEASUREMENTS_CODE_TYPE_B:
  426. out = "B";
  427. break;
  428. case GNSS_MEASUREMENTS_CODE_TYPE_C:
  429. out = "C";
  430. break;
  431. case GNSS_MEASUREMENTS_CODE_TYPE_I:
  432. out = "I";
  433. break;
  434. case GNSS_MEASUREMENTS_CODE_TYPE_L:
  435. out = "L";
  436. break;
  437. case GNSS_MEASUREMENTS_CODE_TYPE_M:
  438. out = "M";
  439. break;
  440. case GNSS_MEASUREMENTS_CODE_TYPE_P:
  441. out = "P";
  442. break;
  443. case GNSS_MEASUREMENTS_CODE_TYPE_Q:
  444. out = "Q";
  445. break;
  446. case GNSS_MEASUREMENTS_CODE_TYPE_S:
  447. out = "S";
  448. break;
  449. case GNSS_MEASUREMENTS_CODE_TYPE_W:
  450. out = "W";
  451. break;
  452. case GNSS_MEASUREMENTS_CODE_TYPE_X:
  453. out = "X";
  454. break;
  455. case GNSS_MEASUREMENTS_CODE_TYPE_Y:
  456. out = "Y";
  457. break;
  458. case GNSS_MEASUREMENTS_CODE_TYPE_Z:
  459. out = "Z";
  460. break;
  461. case GNSS_MEASUREMENTS_CODE_TYPE_N:
  462. out = "N";
  463. break;
  464. default:
  465. out = "UNKNOWN";
  466. }
  467. }
  468. } // namespace implementation
  469. } // namespace V2_0
  470. } // namespace gnss
  471. } // namespace hardware
  472. } // namespace android