GnssAPIClient.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  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_GnssAPIClient"
  31. #define SINGLE_SHOT_MIN_TRACKING_INTERVAL_MSEC (590 * 60 * 60 * 1000) // 590 hours
  32. #include <inttypes.h>
  33. #include <log_util.h>
  34. #include <loc_cfg.h>
  35. #include "LocationUtil.h"
  36. #include "GnssAPIClient.h"
  37. #include <LocContext.h>
  38. namespace android {
  39. namespace hardware {
  40. namespace gnss {
  41. namespace V2_1 {
  42. namespace implementation {
  43. using ::android::hardware::gnss::V2_1::IGnss;
  44. using ::android::hardware::gnss::V2_1::IGnssCallback;
  45. using ::android::hardware::gnss::V1_0::IGnssNiCallback;
  46. using ::android::hardware::gnss::V2_0::GnssLocation;
  47. static void convertGnssSvStatus(GnssSvNotification& in, V1_0::IGnssCallback::GnssSvStatus& out);
  48. static void convertGnssSvStatus(GnssSvNotification& in,
  49. hidl_vec<V2_0::IGnssCallback::GnssSvInfo>& out);
  50. static void convertGnssSvStatus(GnssSvNotification& in,
  51. hidl_vec<V2_1::IGnssCallback::GnssSvInfo>& out);
  52. GnssAPIClient::GnssAPIClient(const sp<V1_0::IGnssCallback>& gpsCb,
  53. const sp<V1_0::IGnssNiCallback>& niCb) :
  54. LocationAPIClientBase(),
  55. mGnssCbIface(nullptr),
  56. mGnssNiCbIface(nullptr),
  57. mControlClient(new LocationAPIControlClient()),
  58. mLocationCapabilitiesMask(0),
  59. mLocationCapabilitiesCached(false),
  60. mTracking(false),
  61. mGnssCbIface_2_0(nullptr)
  62. {
  63. LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb);
  64. initLocationOptions();
  65. gnssUpdateCallbacks(gpsCb, niCb);
  66. }
  67. GnssAPIClient::GnssAPIClient(const sp<V2_0::IGnssCallback>& gpsCb) :
  68. LocationAPIClientBase(),
  69. mGnssCbIface(nullptr),
  70. mGnssNiCbIface(nullptr),
  71. mControlClient(new LocationAPIControlClient()),
  72. mLocationCapabilitiesMask(0),
  73. mLocationCapabilitiesCached(false),
  74. mTracking(false),
  75. mGnssCbIface_2_0(nullptr)
  76. {
  77. LOC_LOGD("%s]: (%p)", __FUNCTION__, &gpsCb);
  78. initLocationOptions();
  79. gnssUpdateCallbacks_2_0(gpsCb);
  80. }
  81. GnssAPIClient::GnssAPIClient(const sp<V2_1::IGnssCallback>& gpsCb) :
  82. LocationAPIClientBase(),
  83. mGnssCbIface(nullptr),
  84. mGnssNiCbIface(nullptr),
  85. mControlClient(new LocationAPIControlClient()),
  86. mLocationCapabilitiesMask(0),
  87. mLocationCapabilitiesCached(false),
  88. mTracking(false),
  89. mGnssCbIface_2_1(nullptr)
  90. {
  91. LOC_LOGD("%s]: (%p)", __FUNCTION__, &gpsCb);
  92. initLocationOptions();
  93. gnssUpdateCallbacks_2_1(gpsCb);
  94. }
  95. GnssAPIClient::~GnssAPIClient()
  96. {
  97. LOC_LOGD("%s]: ()", __FUNCTION__);
  98. if (mControlClient) {
  99. delete mControlClient;
  100. mControlClient = nullptr;
  101. }
  102. }
  103. void GnssAPIClient::initLocationOptions()
  104. {
  105. // set default LocationOptions.
  106. memset(&mTrackingOptions, 0, sizeof(TrackingOptions));
  107. mTrackingOptions.size = sizeof(TrackingOptions);
  108. mTrackingOptions.minInterval = 1000;
  109. mTrackingOptions.minDistance = 0;
  110. mTrackingOptions.mode = GNSS_SUPL_MODE_STANDALONE;
  111. }
  112. void GnssAPIClient::setCallbacks()
  113. {
  114. LocationCallbacks locationCallbacks;
  115. memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
  116. locationCallbacks.size = sizeof(LocationCallbacks);
  117. static bool readConfig = false;
  118. // if ANDROID_REPORT_SPE_ONLY is not set in the izat.conf,
  119. // the default behavior is "report SPE PVT to Android GNSS API"
  120. static uint32_t reportSpeOnly = 1;
  121. static loc_param_s_type izatConfParamTable[] = {
  122. {"ANDROID_REPORT_SPE_ONLY", &reportSpeOnly, nullptr, 'n'},
  123. };
  124. if (false == readConfig) {
  125. UTIL_READ_CONF(LOC_PATH_IZAT_CONF, izatConfParamTable);
  126. readConfig = true;
  127. }
  128. /*-------------------|------------- PVT received --------------------|
  129. | Technology used | By trackingCb | By engineLocationInfoCallback|
  130. |-------------------|-------------------|------------------------------|
  131. |Modem PE only | SPE | SPE |
  132. |-------------------|-------------------|---------------------------- |
  133. |Modem + HLOS Boeing| Aggregated | SPE and Aggregated |
  134. |----------------------------------------------------------------------|
  135. * By default always register with engineLocationsInfoCb, drop
  136. * aggreated PVTs(if received), so this call back only report SPE no
  137. * matter what the techonolgy is used;
  138. * When config is set to 0, register with trackingCb, this is the call back
  139. * which will report aggregated PVT to Android GNSS API*/
  140. if (0 == reportSpeOnly) {
  141. locationCallbacks.trackingCb = nullptr;
  142. locationCallbacks.trackingCb = [this](Location location) {
  143. onTrackingCb(location);
  144. };
  145. } else {
  146. locationCallbacks.engineLocationsInfoCb = nullptr;
  147. locationCallbacks.engineLocationsInfoCb = [this](uint32_t count,
  148. GnssLocationInfoNotification* engineLocationInfoNotification) {
  149. onEngineLocationsInfoCb(count, engineLocationInfoNotification);
  150. };
  151. }
  152. locationCallbacks.batchingCb = nullptr;
  153. locationCallbacks.geofenceBreachCb = nullptr;
  154. locationCallbacks.geofenceStatusCb = nullptr;
  155. locationCallbacks.gnssLocationInfoCb = nullptr;
  156. locationCallbacks.gnssNiCb = nullptr;
  157. if (mGnssNiCbIface != nullptr) {
  158. loc_core::ContextBase* context =
  159. loc_core::LocContext::getLocContext(loc_core::LocContext::mLocationHalName);
  160. if (!context->hasAgpsExtendedCapabilities()) {
  161. LOC_LOGD("Registering NI CB");
  162. locationCallbacks.gnssNiCb = [this](uint32_t id, GnssNiNotification gnssNiNotify) {
  163. onGnssNiCb(id, gnssNiNotify);
  164. };
  165. }
  166. }
  167. locationCallbacks.gnssSvCb = nullptr;
  168. locationCallbacks.gnssSvCb = [this](GnssSvNotification gnssSvNotification) {
  169. onGnssSvCb(gnssSvNotification);
  170. };
  171. locationCallbacks.gnssNmeaCb = nullptr;
  172. locationCallbacks.gnssNmeaCb = [this](GnssNmeaNotification gnssNmeaNotification) {
  173. onGnssNmeaCb(gnssNmeaNotification);
  174. };
  175. locationCallbacks.gnssMeasurementsCb = nullptr;
  176. locAPISetCallbacks(locationCallbacks);
  177. }
  178. // for GpsInterface
  179. void GnssAPIClient::gnssUpdateCallbacks(const sp<V1_0::IGnssCallback>& gpsCb,
  180. const sp<IGnssNiCallback>& niCb)
  181. {
  182. LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb);
  183. mMutex.lock();
  184. mGnssCbIface = gpsCb;
  185. mGnssNiCbIface = niCb;
  186. mMutex.unlock();
  187. if (mGnssCbIface != nullptr || mGnssNiCbIface != nullptr) {
  188. setCallbacks();
  189. }
  190. }
  191. void GnssAPIClient::gnssUpdateCallbacks_2_0(const sp<V2_0::IGnssCallback>& gpsCb)
  192. {
  193. LOC_LOGD("%s]: (%p)", __FUNCTION__, &gpsCb);
  194. mMutex.lock();
  195. mGnssCbIface_2_0 = gpsCb;
  196. mMutex.unlock();
  197. if (mGnssCbIface_2_0 != nullptr) {
  198. setCallbacks();
  199. }
  200. }
  201. void GnssAPIClient::gnssUpdateCallbacks_2_1(const sp<V2_1::IGnssCallback>& gpsCb)
  202. {
  203. LOC_LOGD("%s]: (%p)", __FUNCTION__, &gpsCb);
  204. mMutex.lock();
  205. mGnssCbIface_2_1 = gpsCb;
  206. mMutex.unlock();
  207. if (mGnssCbIface_2_1 != nullptr) {
  208. setCallbacks();
  209. }
  210. }
  211. bool GnssAPIClient::gnssStart()
  212. {
  213. LOC_LOGD("%s]: ()", __FUNCTION__);
  214. mMutex.lock();
  215. mTracking = true;
  216. mMutex.unlock();
  217. bool retVal = true;
  218. locAPIStartTracking(mTrackingOptions);
  219. return retVal;
  220. }
  221. bool GnssAPIClient::gnssStop()
  222. {
  223. LOC_LOGD("%s]: ()", __FUNCTION__);
  224. mMutex.lock();
  225. mTracking = false;
  226. mMutex.unlock();
  227. bool retVal = true;
  228. locAPIStopTracking();
  229. return retVal;
  230. }
  231. bool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode,
  232. IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs,
  233. uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs,
  234. GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
  235. {
  236. LOC_LOGD("%s]: (%d %d %d %d %d %d %d)", __FUNCTION__,
  237. (int)mode, recurrence, minIntervalMs, preferredAccuracyMeters,
  238. preferredTimeMs, (int)powerMode, timeBetweenMeasurement);
  239. bool retVal = true;
  240. memset(&mTrackingOptions, 0, sizeof(TrackingOptions));
  241. mTrackingOptions.size = sizeof(TrackingOptions);
  242. mTrackingOptions.minInterval = minIntervalMs;
  243. if (IGnss::GnssPositionMode::MS_ASSISTED == mode ||
  244. IGnss::GnssPositionRecurrence::RECURRENCE_SINGLE == recurrence) {
  245. // We set a very large interval to simulate SINGLE mode. Once we report a fix,
  246. // the caller should take the responsibility to stop the session.
  247. // For MSA, we always treat it as SINGLE mode.
  248. mTrackingOptions.minInterval = SINGLE_SHOT_MIN_TRACKING_INTERVAL_MSEC;
  249. }
  250. if (mode == IGnss::GnssPositionMode::STANDALONE)
  251. mTrackingOptions.mode = GNSS_SUPL_MODE_STANDALONE;
  252. else if (mode == IGnss::GnssPositionMode::MS_BASED)
  253. mTrackingOptions.mode = GNSS_SUPL_MODE_MSB;
  254. else if (mode == IGnss::GnssPositionMode::MS_ASSISTED)
  255. mTrackingOptions.mode = GNSS_SUPL_MODE_MSA;
  256. else {
  257. LOC_LOGD("%s]: invalid GnssPositionMode: %d", __FUNCTION__, (int)mode);
  258. retVal = false;
  259. }
  260. if (GNSS_POWER_MODE_INVALID != powerMode) {
  261. mTrackingOptions.powerMode = powerMode;
  262. mTrackingOptions.tbm = timeBetweenMeasurement;
  263. }
  264. locAPIUpdateTrackingOptions(mTrackingOptions);
  265. return retVal;
  266. }
  267. // for GpsNiInterface
  268. void GnssAPIClient::gnssNiRespond(int32_t notifId,
  269. IGnssNiCallback::GnssUserResponseType userResponse)
  270. {
  271. LOC_LOGD("%s]: (%d %d)", __FUNCTION__, notifId, static_cast<int>(userResponse));
  272. GnssNiResponse data;
  273. switch (userResponse) {
  274. case IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT:
  275. data = GNSS_NI_RESPONSE_ACCEPT;
  276. break;
  277. case IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY:
  278. data = GNSS_NI_RESPONSE_DENY;
  279. break;
  280. case IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP:
  281. data = GNSS_NI_RESPONSE_NO_RESPONSE;
  282. break;
  283. default:
  284. data = GNSS_NI_RESPONSE_IGNORE;
  285. break;
  286. }
  287. locAPIGnssNiResponse(notifId, data);
  288. }
  289. // these apis using LocationAPIControlClient
  290. void GnssAPIClient::gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags)
  291. {
  292. LOC_LOGD("%s]: (%02hx)", __FUNCTION__, aidingDataFlags);
  293. if (mControlClient == nullptr) {
  294. return;
  295. }
  296. GnssAidingData data;
  297. memset(&data, 0, sizeof (GnssAidingData));
  298. data.sv.svTypeMask = GNSS_AIDING_DATA_SV_TYPE_GPS_BIT |
  299. GNSS_AIDING_DATA_SV_TYPE_GLONASS_BIT |
  300. GNSS_AIDING_DATA_SV_TYPE_QZSS_BIT |
  301. GNSS_AIDING_DATA_SV_TYPE_BEIDOU_BIT |
  302. GNSS_AIDING_DATA_SV_TYPE_GALILEO_BIT |
  303. GNSS_AIDING_DATA_SV_TYPE_NAVIC_BIT;
  304. data.posEngineMask = STANDARD_POSITIONING_ENGINE;
  305. if (aidingDataFlags == IGnss::GnssAidingData::DELETE_ALL)
  306. data.deleteAll = true;
  307. else {
  308. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_EPHEMERIS)
  309. data.sv.svMask |= GNSS_AIDING_DATA_SV_EPHEMERIS_BIT;
  310. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_ALMANAC)
  311. data.sv.svMask |= GNSS_AIDING_DATA_SV_ALMANAC_BIT;
  312. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_POSITION)
  313. data.common.mask |= GNSS_AIDING_DATA_COMMON_POSITION_BIT;
  314. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_TIME)
  315. data.common.mask |= GNSS_AIDING_DATA_COMMON_TIME_BIT;
  316. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_IONO)
  317. data.sv.svMask |= GNSS_AIDING_DATA_SV_IONOSPHERE_BIT;
  318. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_UTC)
  319. data.common.mask |= GNSS_AIDING_DATA_COMMON_UTC_BIT;
  320. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_HEALTH)
  321. data.sv.svMask |= GNSS_AIDING_DATA_SV_HEALTH_BIT;
  322. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVDIR)
  323. data.sv.svMask |= GNSS_AIDING_DATA_SV_DIRECTION_BIT;
  324. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVSTEER)
  325. data.sv.svMask |= GNSS_AIDING_DATA_SV_STEER_BIT;
  326. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SADATA)
  327. data.sv.svMask |= GNSS_AIDING_DATA_SV_SA_DATA_BIT;
  328. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_RTI)
  329. data.common.mask |= GNSS_AIDING_DATA_COMMON_RTI_BIT;
  330. if (aidingDataFlags & IGnss::GnssAidingData::DELETE_CELLDB_INFO)
  331. data.common.mask |= GNSS_AIDING_DATA_COMMON_CELLDB_BIT;
  332. }
  333. mControlClient->locAPIGnssDeleteAidingData(data);
  334. }
  335. void GnssAPIClient::gnssEnable(LocationTechnologyType techType)
  336. {
  337. LOC_LOGD("%s]: (%0d)", __FUNCTION__, techType);
  338. if (mControlClient == nullptr) {
  339. return;
  340. }
  341. mControlClient->locAPIEnable(techType);
  342. }
  343. void GnssAPIClient::gnssDisable()
  344. {
  345. LOC_LOGD("%s]: ()", __FUNCTION__);
  346. if (mControlClient == nullptr) {
  347. return;
  348. }
  349. mControlClient->locAPIDisable();
  350. }
  351. void GnssAPIClient::gnssConfigurationUpdate(const GnssConfig& gnssConfig)
  352. {
  353. LOC_LOGD("%s]: (%02x)", __FUNCTION__, gnssConfig.flags);
  354. if (mControlClient == nullptr) {
  355. return;
  356. }
  357. mControlClient->locAPIGnssUpdateConfig(gnssConfig);
  358. }
  359. void GnssAPIClient::requestCapabilities() {
  360. // only send capablities if it's already cached, otherwise the first time LocationAPI
  361. // is initialized, capabilities will be sent by LocationAPI
  362. if (mLocationCapabilitiesCached) {
  363. onCapabilitiesCb(mLocationCapabilitiesMask);
  364. }
  365. }
  366. // callbacks
  367. void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
  368. {
  369. LOC_LOGD("%s]: (%" PRIu64 ")", __FUNCTION__, capabilitiesMask);
  370. mLocationCapabilitiesMask = capabilitiesMask;
  371. mLocationCapabilitiesCached = true;
  372. mMutex.lock();
  373. auto gnssCbIface(mGnssCbIface);
  374. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  375. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  376. mMutex.unlock();
  377. if (gnssCbIface_2_1 != nullptr ||gnssCbIface_2_0 != nullptr || gnssCbIface != nullptr) {
  378. uint32_t antennaInfoVectorSize = 0;
  379. uint32_t data = 0;
  380. loc_param_s_type ant_info_vector_table[] =
  381. {
  382. { "ANTENNA_INFO_VECTOR_SIZE", &antennaInfoVectorSize, NULL, 'n' }
  383. };
  384. UTIL_READ_CONF(LOC_PATH_ANT_CORR, ant_info_vector_table);
  385. if (0 != antennaInfoVectorSize) {
  386. data |= V2_1::IGnssCallback::Capabilities::ANTENNA_INFO;
  387. }
  388. if ((capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT) ||
  389. (capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT) ||
  390. (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT) ||
  391. (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT))
  392. data |= IGnssCallback::Capabilities::SCHEDULING;
  393. if (capabilitiesMask & LOCATION_CAPABILITIES_GEOFENCE_BIT)
  394. data |= V1_0::IGnssCallback::Capabilities::GEOFENCING;
  395. if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT)
  396. data |= V1_0::IGnssCallback::Capabilities::MEASUREMENTS;
  397. if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSB_BIT)
  398. data |= IGnssCallback::Capabilities::MSB;
  399. if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSA_BIT)
  400. data |= IGnssCallback::Capabilities::MSA;
  401. if (capabilitiesMask & LOCATION_CAPABILITIES_AGPM_BIT)
  402. data |= IGnssCallback::Capabilities::LOW_POWER_MODE;
  403. if (capabilitiesMask & LOCATION_CAPABILITIES_CONSTELLATION_ENABLEMENT_BIT)
  404. data |= IGnssCallback::Capabilities::SATELLITE_BLACKLIST;
  405. if (capabilitiesMask & LOCATION_CAPABILITIES_MEASUREMENTS_CORRECTION_BIT)
  406. data |= V2_0::IGnssCallback::Capabilities::MEASUREMENT_CORRECTIONS;
  407. IGnssCallback::GnssSystemInfo gnssInfo = { .yearOfHw = 2015 };
  408. if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT) {
  409. gnssInfo.yearOfHw++; // 2016
  410. if (capabilitiesMask & LOCATION_CAPABILITIES_DEBUG_NMEA_BIT) {
  411. gnssInfo.yearOfHw++; // 2017
  412. if (capabilitiesMask & LOCATION_CAPABILITIES_CONSTELLATION_ENABLEMENT_BIT ||
  413. capabilitiesMask & LOCATION_CAPABILITIES_AGPM_BIT) {
  414. gnssInfo.yearOfHw++; // 2018
  415. if (capabilitiesMask & LOCATION_CAPABILITIES_PRIVACY_BIT) {
  416. gnssInfo.yearOfHw++; // 2019
  417. if (capabilitiesMask & LOCATION_CAPABILITIES_MEASUREMENTS_CORRECTION_BIT) {
  418. gnssInfo.yearOfHw++; // 2020
  419. }
  420. }
  421. }
  422. }
  423. }
  424. LOC_LOGV("%s:%d] set_system_info_cb (%d)", __FUNCTION__, __LINE__, gnssInfo.yearOfHw);
  425. if (gnssCbIface_2_1 != nullptr) {
  426. auto r = gnssCbIface_2_1->gnssSetCapabilitiesCb_2_1(data);
  427. if (!r.isOk()) {
  428. LOC_LOGE("%s] Error from gnssSetCapabilitiesCb_2_1 description=%s",
  429. __func__, r.description().c_str());
  430. }
  431. r = gnssCbIface_2_1->gnssSetSystemInfoCb(gnssInfo);
  432. if (!r.isOk()) {
  433. LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s",
  434. __func__, r.description().c_str());
  435. }
  436. } else if (gnssCbIface_2_0 != nullptr) {
  437. auto r = gnssCbIface_2_0->gnssSetCapabilitiesCb_2_0(data);
  438. if (!r.isOk()) {
  439. LOC_LOGE("%s] Error from gnssSetCapabilitiesCb_2_0 description=%s",
  440. __func__, r.description().c_str());
  441. }
  442. r = gnssCbIface_2_0->gnssSetSystemInfoCb(gnssInfo);
  443. if (!r.isOk()) {
  444. LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s",
  445. __func__, r.description().c_str());
  446. }
  447. } else if (gnssCbIface != nullptr) {
  448. auto r = gnssCbIface->gnssSetCapabilitesCb(data);
  449. if (!r.isOk()) {
  450. LOC_LOGE("%s] Error from gnssSetCapabilitesCb description=%s",
  451. __func__, r.description().c_str());
  452. }
  453. r = gnssCbIface->gnssSetSystemInfoCb(gnssInfo);
  454. if (!r.isOk()) {
  455. LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s",
  456. __func__, r.description().c_str());
  457. }
  458. }
  459. }
  460. }
  461. void GnssAPIClient::onTrackingCb(Location location)
  462. {
  463. mMutex.lock();
  464. auto gnssCbIface(mGnssCbIface);
  465. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  466. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  467. bool isTracking = mTracking;
  468. mMutex.unlock();
  469. LOC_LOGD("%s]: (flags: %02x isTracking: %d)", __FUNCTION__, location.flags, isTracking);
  470. if (!isTracking) {
  471. return;
  472. }
  473. if (gnssCbIface_2_1 != nullptr) {
  474. V2_0::GnssLocation gnssLocation;
  475. convertGnssLocation(location, gnssLocation);
  476. auto r = gnssCbIface_2_1->gnssLocationCb_2_0(gnssLocation);
  477. if (!r.isOk()) {
  478. LOC_LOGE("%s] Error from gnssLocationCb_2_0 description=%s",
  479. __func__, r.description().c_str());
  480. }
  481. } else if (gnssCbIface_2_0 != nullptr) {
  482. V2_0::GnssLocation gnssLocation;
  483. convertGnssLocation(location, gnssLocation);
  484. auto r = gnssCbIface_2_0->gnssLocationCb_2_0(gnssLocation);
  485. if (!r.isOk()) {
  486. LOC_LOGE("%s] Error from gnssLocationCb_2_0 description=%s",
  487. __func__, r.description().c_str());
  488. }
  489. } else if (gnssCbIface != nullptr) {
  490. V1_0::GnssLocation gnssLocation;
  491. convertGnssLocation(location, gnssLocation);
  492. auto r = gnssCbIface->gnssLocationCb(gnssLocation);
  493. if (!r.isOk()) {
  494. LOC_LOGE("%s] Error from gnssLocationCb description=%s",
  495. __func__, r.description().c_str());
  496. }
  497. } else {
  498. LOC_LOGW("%s] No GNSS Interface ready for gnssLocationCb ", __FUNCTION__);
  499. }
  500. }
  501. void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification)
  502. {
  503. LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id);
  504. mMutex.lock();
  505. auto gnssNiCbIface(mGnssNiCbIface);
  506. mMutex.unlock();
  507. if (gnssNiCbIface == nullptr) {
  508. LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__);
  509. return;
  510. }
  511. IGnssNiCallback::GnssNiNotification notificationGnss = {};
  512. notificationGnss.notificationId = id;
  513. if (gnssNiNotification.type == GNSS_NI_TYPE_VOICE)
  514. notificationGnss.niType = IGnssNiCallback::GnssNiType::VOICE;
  515. else if (gnssNiNotification.type == GNSS_NI_TYPE_SUPL)
  516. notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_SUPL;
  517. else if (gnssNiNotification.type == GNSS_NI_TYPE_CONTROL_PLANE)
  518. notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_CTRL_PLANE;
  519. else if (gnssNiNotification.type == GNSS_NI_TYPE_EMERGENCY_SUPL)
  520. notificationGnss.niType = IGnssNiCallback::GnssNiType::EMERGENCY_SUPL;
  521. if (gnssNiNotification.options & GNSS_NI_OPTIONS_NOTIFICATION_BIT)
  522. notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::NEED_NOTIFY;
  523. if (gnssNiNotification.options & GNSS_NI_OPTIONS_VERIFICATION_BIT)
  524. notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::NEED_VERIFY;
  525. if (gnssNiNotification.options & GNSS_NI_OPTIONS_PRIVACY_OVERRIDE_BIT)
  526. notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::PRIVACY_OVERRIDE;
  527. notificationGnss.timeoutSec = gnssNiNotification.timeout;
  528. if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_ACCEPT)
  529. notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT;
  530. else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_DENY)
  531. notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY;
  532. else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_NO_RESPONSE ||
  533. gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_IGNORE)
  534. notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP;
  535. notificationGnss.requestorId = gnssNiNotification.requestor;
  536. notificationGnss.notificationMessage = gnssNiNotification.message;
  537. if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_NONE)
  538. notificationGnss.requestorIdEncoding =
  539. IGnssNiCallback::GnssNiEncodingType::ENC_NONE;
  540. else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT)
  541. notificationGnss.requestorIdEncoding =
  542. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT;
  543. else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UTF8)
  544. notificationGnss.requestorIdEncoding =
  545. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8;
  546. else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UCS2)
  547. notificationGnss.requestorIdEncoding =
  548. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2;
  549. if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_NONE)
  550. notificationGnss.notificationIdEncoding =
  551. IGnssNiCallback::GnssNiEncodingType::ENC_NONE;
  552. else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT)
  553. notificationGnss.notificationIdEncoding =
  554. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT;
  555. else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UTF8)
  556. notificationGnss.notificationIdEncoding =
  557. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8;
  558. else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UCS2)
  559. notificationGnss.notificationIdEncoding =
  560. IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2;
  561. gnssNiCbIface->niNotifyCb(notificationGnss);
  562. }
  563. void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification)
  564. {
  565. LOC_LOGD("%s]: (count: %u)", __FUNCTION__, gnssSvNotification.count);
  566. mMutex.lock();
  567. auto gnssCbIface(mGnssCbIface);
  568. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  569. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  570. mMutex.unlock();
  571. if (gnssCbIface_2_1 != nullptr) {
  572. hidl_vec<V2_1::IGnssCallback::GnssSvInfo> svInfoList;
  573. convertGnssSvStatus(gnssSvNotification, svInfoList);
  574. auto r = gnssCbIface_2_1->gnssSvStatusCb_2_1(svInfoList);
  575. if (!r.isOk()) {
  576. LOC_LOGE("%s] Error from gnssSvStatusCb_2_1 description=%s",
  577. __func__, r.description().c_str());
  578. }
  579. } else if (gnssCbIface_2_0 != nullptr) {
  580. hidl_vec<V2_0::IGnssCallback::GnssSvInfo> svInfoList;
  581. convertGnssSvStatus(gnssSvNotification, svInfoList);
  582. auto r = gnssCbIface_2_0->gnssSvStatusCb_2_0(svInfoList);
  583. if (!r.isOk()) {
  584. LOC_LOGE("%s] Error from gnssSvStatusCb_2_0 description=%s",
  585. __func__, r.description().c_str());
  586. }
  587. } else if (gnssCbIface != nullptr) {
  588. V1_0::IGnssCallback::GnssSvStatus svStatus;
  589. convertGnssSvStatus(gnssSvNotification, svStatus);
  590. auto r = gnssCbIface->gnssSvStatusCb(svStatus);
  591. if (!r.isOk()) {
  592. LOC_LOGE("%s] Error from gnssSvStatusCb description=%s",
  593. __func__, r.description().c_str());
  594. }
  595. }
  596. }
  597. void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
  598. {
  599. mMutex.lock();
  600. auto gnssCbIface(mGnssCbIface);
  601. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  602. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  603. mMutex.unlock();
  604. if (gnssCbIface != nullptr || gnssCbIface_2_0 != nullptr || gnssCbIface_2_1 != nullptr) {
  605. const std::string s(gnssNmeaNotification.nmea);
  606. std::stringstream ss(s);
  607. std::string each;
  608. while(std::getline(ss, each, '\n')) {
  609. each += '\n';
  610. android::hardware::hidl_string nmeaString;
  611. nmeaString.setToExternal(each.c_str(), each.length());
  612. if (gnssCbIface_2_1 != nullptr) {
  613. auto r = gnssCbIface_2_1->gnssNmeaCb(
  614. static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
  615. if (!r.isOk()) {
  616. LOC_LOGE("%s] Error from gnssCbIface_2_1 nmea=%s length=%u description=%s",
  617. __func__, gnssNmeaNotification.nmea, gnssNmeaNotification.length,
  618. r.description().c_str());
  619. }
  620. } else if (gnssCbIface_2_0 != nullptr) {
  621. auto r = gnssCbIface_2_0->gnssNmeaCb(
  622. static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
  623. if (!r.isOk()) {
  624. LOC_LOGE("%s] Error from gnssCbIface_2_0 nmea=%s length=%u description=%s",
  625. __func__, gnssNmeaNotification.nmea, gnssNmeaNotification.length,
  626. r.description().c_str());
  627. }
  628. } else if (gnssCbIface != nullptr) {
  629. auto r = gnssCbIface->gnssNmeaCb(
  630. static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
  631. if (!r.isOk()) {
  632. LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%u description=%s",
  633. __func__, gnssNmeaNotification.nmea, gnssNmeaNotification.length,
  634. r.description().c_str());
  635. }
  636. }
  637. }
  638. }
  639. }
  640. void GnssAPIClient::onEngineLocationsInfoCb(uint32_t count,
  641. GnssLocationInfoNotification* engineLocationInfoNotification) {
  642. if (nullptr == engineLocationInfoNotification) {
  643. LOC_LOGe("engineLocationInfoNotification is nullptr");
  644. return;
  645. }
  646. GnssLocationInfoNotification* locPtr = nullptr;
  647. bool foundSPE = false;
  648. for (int i = 0; i < count; i++) {
  649. locPtr = engineLocationInfoNotification + i;
  650. if (nullptr == locPtr) return;
  651. LOC_LOGv("count %d, type %d", i, locPtr->locOutputEngType);
  652. if (LOC_OUTPUT_ENGINE_SPE == locPtr->locOutputEngType) {
  653. foundSPE = true;
  654. break;
  655. }
  656. }
  657. if (foundSPE) {
  658. onTrackingCb(locPtr->location);
  659. }
  660. }
  661. void GnssAPIClient::onStartTrackingCb(LocationError error)
  662. {
  663. LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
  664. mMutex.lock();
  665. auto gnssCbIface(mGnssCbIface);
  666. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  667. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  668. mMutex.unlock();
  669. if (error == LOCATION_ERROR_SUCCESS) {
  670. if (gnssCbIface_2_1 != nullptr) {
  671. auto r = gnssCbIface_2_1->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
  672. if (!r.isOk()) {
  673. LOC_LOGE("%s] Error from gnssStatusCb 2_0 ENGINE_ON description=%s",
  674. __func__, r.description().c_str());
  675. }
  676. r = gnssCbIface_2_1->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
  677. if (!r.isOk()) {
  678. LOC_LOGE("%s] Error from gnssStatusCb 2_0 SESSION_BEGIN description=%s",
  679. __func__, r.description().c_str());
  680. }
  681. } else if (gnssCbIface_2_0 != nullptr) {
  682. auto r = gnssCbIface_2_0->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
  683. if (!r.isOk()) {
  684. LOC_LOGE("%s] Error from gnssStatusCb 2_0 ENGINE_ON description=%s",
  685. __func__, r.description().c_str());
  686. }
  687. r = gnssCbIface_2_0->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
  688. if (!r.isOk()) {
  689. LOC_LOGE("%s] Error from gnssStatusCb 2_0 SESSION_BEGIN description=%s",
  690. __func__, r.description().c_str());
  691. }
  692. } else if (gnssCbIface != nullptr) {
  693. auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
  694. if (!r.isOk()) {
  695. LOC_LOGE("%s] Error from gnssStatusCb ENGINE_ON description=%s",
  696. __func__, r.description().c_str());
  697. }
  698. r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
  699. if (!r.isOk()) {
  700. LOC_LOGE("%s] Error from gnssStatusCb SESSION_BEGIN description=%s",
  701. __func__, r.description().c_str());
  702. }
  703. }
  704. }
  705. }
  706. void GnssAPIClient::onStopTrackingCb(LocationError error)
  707. {
  708. LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
  709. mMutex.lock();
  710. auto gnssCbIface(mGnssCbIface);
  711. auto gnssCbIface_2_0(mGnssCbIface_2_0);
  712. auto gnssCbIface_2_1(mGnssCbIface_2_1);
  713. mMutex.unlock();
  714. if (error == LOCATION_ERROR_SUCCESS) {
  715. if (gnssCbIface_2_1 != nullptr) {
  716. auto r = gnssCbIface_2_1->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
  717. if (!r.isOk()) {
  718. LOC_LOGE("%s] Error from gnssStatusCb 2_0 SESSION_END description=%s",
  719. __func__, r.description().c_str());
  720. }
  721. r = gnssCbIface_2_1->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF);
  722. if (!r.isOk()) {
  723. LOC_LOGE("%s] Error from gnssStatusCb 2_0 ENGINE_OFF description=%s",
  724. __func__, r.description().c_str());
  725. }
  726. } else if (gnssCbIface_2_0 != nullptr) {
  727. auto r = gnssCbIface_2_0->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
  728. if (!r.isOk()) {
  729. LOC_LOGE("%s] Error from gnssStatusCb 2_0 SESSION_END description=%s",
  730. __func__, r.description().c_str());
  731. }
  732. r = gnssCbIface_2_0->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF);
  733. if (!r.isOk()) {
  734. LOC_LOGE("%s] Error from gnssStatusCb 2_0 ENGINE_OFF description=%s",
  735. __func__, r.description().c_str());
  736. }
  737. } else if (gnssCbIface != nullptr) {
  738. auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
  739. if (!r.isOk()) {
  740. LOC_LOGE("%s] Error from gnssStatusCb SESSION_END description=%s",
  741. __func__, r.description().c_str());
  742. }
  743. r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF);
  744. if (!r.isOk()) {
  745. LOC_LOGE("%s] Error from gnssStatusCb ENGINE_OFF description=%s",
  746. __func__, r.description().c_str());
  747. }
  748. }
  749. }
  750. }
  751. static void convertGnssSvStatus(GnssSvNotification& in, V1_0::IGnssCallback::GnssSvStatus& out)
  752. {
  753. memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus));
  754. out.numSvs = in.count;
  755. if (out.numSvs > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
  756. LOC_LOGW("%s]: Too many satellites %u. Clamps to %d.",
  757. __FUNCTION__, out.numSvs, V1_0::GnssMax::SVS_COUNT);
  758. out.numSvs = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
  759. }
  760. for (size_t i = 0; i < out.numSvs; i++) {
  761. convertGnssSvid(in.gnssSvs[i], out.gnssSvList[i].svid);
  762. convertGnssConstellationType(in.gnssSvs[i].type, out.gnssSvList[i].constellation);
  763. out.gnssSvList[i].cN0Dbhz = in.gnssSvs[i].cN0Dbhz;
  764. out.gnssSvList[i].elevationDegrees = in.gnssSvs[i].elevation;
  765. out.gnssSvList[i].azimuthDegrees = in.gnssSvs[i].azimuth;
  766. out.gnssSvList[i].carrierFrequencyHz = in.gnssSvs[i].carrierFrequencyHz;
  767. out.gnssSvList[i].svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE);
  768. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_EPHEMER_BIT)
  769. out.gnssSvList[i].svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA;
  770. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_ALMANAC_BIT)
  771. out.gnssSvList[i].svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA;
  772. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_USED_IN_FIX_BIT)
  773. out.gnssSvList[i].svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX;
  774. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_CARRIER_FREQUENCY_BIT)
  775. out.gnssSvList[i].svFlag |= IGnssCallback::GnssSvFlags::HAS_CARRIER_FREQUENCY;
  776. }
  777. }
  778. static void convertGnssSvStatus(GnssSvNotification& in,
  779. hidl_vec<V2_0::IGnssCallback::GnssSvInfo>& out)
  780. {
  781. out.resize(in.count);
  782. for (size_t i = 0; i < in.count; i++) {
  783. convertGnssSvid(in.gnssSvs[i], out[i].v1_0.svid);
  784. out[i].v1_0.cN0Dbhz = in.gnssSvs[i].cN0Dbhz;
  785. out[i].v1_0.elevationDegrees = in.gnssSvs[i].elevation;
  786. out[i].v1_0.azimuthDegrees = in.gnssSvs[i].azimuth;
  787. out[i].v1_0.carrierFrequencyHz = in.gnssSvs[i].carrierFrequencyHz;
  788. out[i].v1_0.svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE);
  789. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_EPHEMER_BIT)
  790. out[i].v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA;
  791. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_ALMANAC_BIT)
  792. out[i].v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA;
  793. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_USED_IN_FIX_BIT)
  794. out[i].v1_0.svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX;
  795. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_CARRIER_FREQUENCY_BIT)
  796. out[i].v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_CARRIER_FREQUENCY;
  797. convertGnssConstellationType(in.gnssSvs[i].type, out[i].constellation);
  798. }
  799. }
  800. static void convertGnssSvStatus(GnssSvNotification& in,
  801. hidl_vec<V2_1::IGnssCallback::GnssSvInfo>& out)
  802. {
  803. out.resize(in.count);
  804. for (size_t i = 0; i < in.count; i++) {
  805. convertGnssSvid(in.gnssSvs[i], out[i].v2_0.v1_0.svid);
  806. out[i].v2_0.v1_0.cN0Dbhz = in.gnssSvs[i].cN0Dbhz;
  807. out[i].v2_0.v1_0.elevationDegrees = in.gnssSvs[i].elevation;
  808. out[i].v2_0.v1_0.azimuthDegrees = in.gnssSvs[i].azimuth;
  809. out[i].v2_0.v1_0.carrierFrequencyHz = in.gnssSvs[i].carrierFrequencyHz;
  810. out[i].v2_0.v1_0.svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE);
  811. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_EPHEMER_BIT)
  812. out[i].v2_0.v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA;
  813. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_ALMANAC_BIT)
  814. out[i].v2_0.v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA;
  815. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_USED_IN_FIX_BIT)
  816. out[i].v2_0.v1_0.svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX;
  817. if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_CARRIER_FREQUENCY_BIT)
  818. out[i].v2_0.v1_0.svFlag |= IGnssCallback::GnssSvFlags::HAS_CARRIER_FREQUENCY;
  819. convertGnssConstellationType(in.gnssSvs[i].type, out[i].v2_0.constellation);
  820. out[i].basebandCN0DbHz = in.gnssSvs[i].basebandCarrierToNoiseDbHz;
  821. }
  822. }
  823. } // namespace implementation
  824. } // namespace V2_1
  825. } // namespace gnss
  826. } // namespace hardware
  827. } // namespace android