LocationUtil.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. #include <LocationUtil.h>
  30. #include <log_util.h>
  31. #include <inttypes.h>
  32. #include <gps_extended_c.h>
  33. #include <loc_misc_utils.h>
  34. namespace android {
  35. namespace hardware {
  36. namespace gnss {
  37. namespace V2_0 {
  38. namespace implementation {
  39. using ::android::hardware::gnss::V2_0::GnssLocation;
  40. using ::android::hardware::gnss::V2_0::ElapsedRealtimeFlags;
  41. using ::android::hardware::gnss::V2_0::GnssConstellationType;
  42. using ::android::hardware::gnss::V1_0::GnssLocationFlags;
  43. void convertGnssLocation(Location& in, V1_0::GnssLocation& out)
  44. {
  45. memset(&out, 0, sizeof(V1_0::GnssLocation));
  46. if (in.flags & LOCATION_HAS_LAT_LONG_BIT) {
  47. out.gnssLocationFlags |= GnssLocationFlags::HAS_LAT_LONG;
  48. out.latitudeDegrees = in.latitude;
  49. out.longitudeDegrees = in.longitude;
  50. }
  51. if (in.flags & LOCATION_HAS_ALTITUDE_BIT) {
  52. out.gnssLocationFlags |= GnssLocationFlags::HAS_ALTITUDE;
  53. out.altitudeMeters = in.altitude;
  54. }
  55. if (in.flags & LOCATION_HAS_SPEED_BIT) {
  56. out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED;
  57. out.speedMetersPerSec = in.speed;
  58. }
  59. if (in.flags & LOCATION_HAS_BEARING_BIT) {
  60. out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING;
  61. out.bearingDegrees = in.bearing;
  62. }
  63. if (in.flags & LOCATION_HAS_ACCURACY_BIT) {
  64. out.gnssLocationFlags |= GnssLocationFlags::HAS_HORIZONTAL_ACCURACY;
  65. out.horizontalAccuracyMeters = in.accuracy;
  66. }
  67. if (in.flags & LOCATION_HAS_VERTICAL_ACCURACY_BIT) {
  68. out.gnssLocationFlags |= GnssLocationFlags::HAS_VERTICAL_ACCURACY;
  69. out.verticalAccuracyMeters = in.verticalAccuracy;
  70. }
  71. if (in.flags & LOCATION_HAS_SPEED_ACCURACY_BIT) {
  72. out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED_ACCURACY;
  73. out.speedAccuracyMetersPerSecond = in.speedAccuracy;
  74. }
  75. if (in.flags & LOCATION_HAS_BEARING_ACCURACY_BIT) {
  76. out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING_ACCURACY;
  77. out.bearingAccuracyDegrees = in.bearingAccuracy;
  78. }
  79. out.timestamp = static_cast<V1_0::GnssUtcTime>(in.timestamp);
  80. }
  81. void convertGnssLocation(Location& in, V2_0::GnssLocation& out)
  82. {
  83. memset(&out, 0, sizeof(V2_0::GnssLocation));
  84. convertGnssLocation(in, out.v1_0);
  85. if (in.flags & LOCATION_HAS_ELAPSED_REAL_TIME_BIT) {
  86. out.elapsedRealtime.flags |= ElapsedRealtimeFlags::HAS_TIMESTAMP_NS;
  87. out.elapsedRealtime.timestampNs = in.elapsedRealTime;
  88. out.elapsedRealtime.flags |= ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS;
  89. out.elapsedRealtime.timeUncertaintyNs = in.elapsedRealTimeUnc;
  90. LOC_LOGd("out.elapsedRealtime.timestampNs=%" PRIi64 ""
  91. " out.elapsedRealtime.timeUncertaintyNs=%" PRIi64 ""
  92. " out.elapsedRealtime.flags=0x%X",
  93. out.elapsedRealtime.timestampNs,
  94. out.elapsedRealtime.timeUncertaintyNs, out.elapsedRealtime.flags);
  95. }
  96. }
  97. void convertGnssLocation(const V1_0::GnssLocation& in, Location& out)
  98. {
  99. memset(&out, 0, sizeof(out));
  100. if (in.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG) {
  101. out.flags |= LOCATION_HAS_LAT_LONG_BIT;
  102. out.latitude = in.latitudeDegrees;
  103. out.longitude = in.longitudeDegrees;
  104. }
  105. if (in.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE) {
  106. out.flags |= LOCATION_HAS_ALTITUDE_BIT;
  107. out.altitude = in.altitudeMeters;
  108. }
  109. if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED) {
  110. out.flags |= LOCATION_HAS_SPEED_BIT;
  111. out.speed = in.speedMetersPerSec;
  112. }
  113. if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) {
  114. out.flags |= LOCATION_HAS_BEARING_BIT;
  115. out.bearing = in.bearingDegrees;
  116. }
  117. if (in.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) {
  118. out.flags |= LOCATION_HAS_ACCURACY_BIT;
  119. out.accuracy = in.horizontalAccuracyMeters;
  120. }
  121. if (in.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) {
  122. out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT;
  123. out.verticalAccuracy = in.verticalAccuracyMeters;
  124. }
  125. if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY) {
  126. out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT;
  127. out.speedAccuracy = in.speedAccuracyMetersPerSecond;
  128. }
  129. if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY) {
  130. out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT;
  131. out.bearingAccuracy = in.bearingAccuracyDegrees;
  132. }
  133. out.timestamp = static_cast<uint64_t>(in.timestamp);
  134. }
  135. void convertGnssLocation(const V2_0::GnssLocation& in, Location& out)
  136. {
  137. memset(&out, 0, sizeof(out));
  138. convertGnssLocation(in.v1_0, out);
  139. }
  140. void convertGnssConstellationType(GnssSvType& in, V1_0::GnssConstellationType& out)
  141. {
  142. switch(in) {
  143. case GNSS_SV_TYPE_GPS:
  144. out = V1_0::GnssConstellationType::GPS;
  145. break;
  146. case GNSS_SV_TYPE_SBAS:
  147. out = V1_0::GnssConstellationType::SBAS;
  148. break;
  149. case GNSS_SV_TYPE_GLONASS:
  150. out = V1_0::GnssConstellationType::GLONASS;
  151. break;
  152. case GNSS_SV_TYPE_QZSS:
  153. out = V1_0::GnssConstellationType::QZSS;
  154. break;
  155. case GNSS_SV_TYPE_BEIDOU:
  156. out = V1_0::GnssConstellationType::BEIDOU;
  157. break;
  158. case GNSS_SV_TYPE_GALILEO:
  159. out = V1_0::GnssConstellationType::GALILEO;
  160. break;
  161. case GNSS_SV_TYPE_UNKNOWN:
  162. default:
  163. out = V1_0::GnssConstellationType::UNKNOWN;
  164. break;
  165. }
  166. }
  167. void convertGnssConstellationType(GnssSvType& in, V2_0::GnssConstellationType& out)
  168. {
  169. switch(in) {
  170. case GNSS_SV_TYPE_GPS:
  171. out = V2_0::GnssConstellationType::GPS;
  172. break;
  173. case GNSS_SV_TYPE_SBAS:
  174. out = V2_0::GnssConstellationType::SBAS;
  175. break;
  176. case GNSS_SV_TYPE_GLONASS:
  177. out = V2_0::GnssConstellationType::GLONASS;
  178. break;
  179. case GNSS_SV_TYPE_QZSS:
  180. out = V2_0::GnssConstellationType::QZSS;
  181. break;
  182. case GNSS_SV_TYPE_BEIDOU:
  183. out = V2_0::GnssConstellationType::BEIDOU;
  184. break;
  185. case GNSS_SV_TYPE_GALILEO:
  186. out = V2_0::GnssConstellationType::GALILEO;
  187. break;
  188. case GNSS_SV_TYPE_NAVIC:
  189. out = V2_0::GnssConstellationType::IRNSS;
  190. break;
  191. case GNSS_SV_TYPE_UNKNOWN:
  192. default:
  193. out = V2_0::GnssConstellationType::UNKNOWN;
  194. break;
  195. }
  196. }
  197. void convertGnssSvid(GnssSv& in, int16_t& out)
  198. {
  199. switch (in.type) {
  200. case GNSS_SV_TYPE_GPS:
  201. out = in.svId;
  202. break;
  203. case GNSS_SV_TYPE_SBAS:
  204. out = in.svId;
  205. break;
  206. case GNSS_SV_TYPE_GLONASS:
  207. if (!isGloSlotUnknown(in.svId)) { // OSN is known
  208. out = in.svId - GLO_SV_PRN_MIN + 1;
  209. } else { // OSN is not known, report FCN
  210. out = in.gloFrequency + 92;
  211. }
  212. break;
  213. case GNSS_SV_TYPE_QZSS:
  214. out = in.svId;
  215. break;
  216. case GNSS_SV_TYPE_BEIDOU:
  217. out = in.svId - BDS_SV_PRN_MIN + 1;
  218. break;
  219. case GNSS_SV_TYPE_GALILEO:
  220. out = in.svId - GAL_SV_PRN_MIN + 1;
  221. break;
  222. case GNSS_SV_TYPE_NAVIC:
  223. out = in.svId - NAVIC_SV_PRN_MIN + 1;
  224. break;
  225. default:
  226. out = in.svId;
  227. break;
  228. }
  229. }
  230. void convertGnssSvid(GnssMeasurementsData& in, int16_t& out)
  231. {
  232. switch (in.svType) {
  233. case GNSS_SV_TYPE_GPS:
  234. out = in.svId;
  235. break;
  236. case GNSS_SV_TYPE_SBAS:
  237. out = in.svId;
  238. break;
  239. case GNSS_SV_TYPE_GLONASS:
  240. if (!isGloSlotUnknown(in.svId)) { // OSN is known
  241. out = in.svId - GLO_SV_PRN_MIN + 1;
  242. } else { // OSN is not known, report FCN
  243. out = in.gloFrequency + 92;
  244. }
  245. break;
  246. case GNSS_SV_TYPE_QZSS:
  247. out = in.svId;
  248. break;
  249. case GNSS_SV_TYPE_BEIDOU:
  250. out = in.svId - BDS_SV_PRN_MIN + 1;
  251. break;
  252. case GNSS_SV_TYPE_GALILEO:
  253. out = in.svId - GAL_SV_PRN_MIN + 1;
  254. break;
  255. case GNSS_SV_TYPE_NAVIC:
  256. out = in.svId - NAVIC_SV_PRN_MIN + 1;
  257. break;
  258. default:
  259. out = in.svId;
  260. break;
  261. }
  262. }
  263. void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out)
  264. {
  265. switch(in) {
  266. case GNSS_EPH_TYPE_EPHEMERIS:
  267. out = GnssDebug::SatelliteEphemerisType::EPHEMERIS;
  268. break;
  269. case GNSS_EPH_TYPE_ALMANAC:
  270. out = GnssDebug::SatelliteEphemerisType::ALMANAC_ONLY;
  271. break;
  272. case GNSS_EPH_TYPE_UNKNOWN:
  273. default:
  274. out = GnssDebug::SatelliteEphemerisType::NOT_AVAILABLE;
  275. break;
  276. }
  277. }
  278. void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out)
  279. {
  280. switch(in) {
  281. case GNSS_EPH_SOURCE_DEMODULATED:
  282. out = GnssDebug::SatelliteEphemerisSource::DEMODULATED;
  283. break;
  284. case GNSS_EPH_SOURCE_SUPL_PROVIDED:
  285. out = GnssDebug::SatelliteEphemerisSource::SUPL_PROVIDED;
  286. break;
  287. case GNSS_EPH_SOURCE_OTHER_SERVER_PROVIDED:
  288. out = GnssDebug::SatelliteEphemerisSource::OTHER_SERVER_PROVIDED;
  289. break;
  290. case GNSS_EPH_SOURCE_LOCAL:
  291. case GNSS_EPH_SOURCE_UNKNOWN:
  292. default:
  293. out = GnssDebug::SatelliteEphemerisSource::OTHER;
  294. break;
  295. }
  296. }
  297. void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out)
  298. {
  299. switch(in) {
  300. case GNSS_EPH_HEALTH_GOOD:
  301. out = GnssDebug::SatelliteEphemerisHealth::GOOD;
  302. break;
  303. case GNSS_EPH_HEALTH_BAD:
  304. out = GnssDebug::SatelliteEphemerisHealth::BAD;
  305. break;
  306. case GNSS_EPH_HEALTH_UNKNOWN:
  307. default:
  308. out = GnssDebug::SatelliteEphemerisHealth::UNKNOWN;
  309. break;
  310. }
  311. }
  312. } // namespace implementation
  313. } // namespace V2_0
  314. } // namespace gnss
  315. } // namespace hardware
  316. } // namespace android