LocationUtil.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
  2. *
  3. * Redistribution and use in source and binary forms, with or without
  4. * modification, are permitted provided that the following conditions are
  5. * met:
  6. * * Redistributions of source code must retain the above copyright
  7. * notice, this list of conditions and the following disclaimer.
  8. * * Redistributions in binary form must reproduce the above
  9. * copyright notice, this list of conditions and the following
  10. * disclaimer in the documentation and/or other materials provided
  11. * with the distribution.
  12. * * Neither the name of The Linux Foundation, nor the names of its
  13. * contributors may be used to endorse or promote products derived
  14. * from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  17. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  20. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  21. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  22. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  23. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  24. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  25. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  26. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. *
  28. */
  29. #include <gps_extended_c.h>
  30. #include <LocationUtil.h>
  31. namespace android {
  32. namespace hardware {
  33. namespace gnss {
  34. namespace V1_0 {
  35. namespace implementation {
  36. using ::android::hardware::gnss::V1_0::GnssLocation;
  37. using ::android::hardware::gnss::V1_0::GnssConstellationType;
  38. using ::android::hardware::gnss::V1_0::GnssLocationFlags;
  39. void convertGnssLocation(Location& in, GnssLocation& out)
  40. {
  41. memset(&out, 0, sizeof(GnssLocation));
  42. if (in.flags & LOCATION_HAS_LAT_LONG_BIT) {
  43. out.gnssLocationFlags |= GnssLocationFlags::HAS_LAT_LONG;
  44. out.latitudeDegrees = in.latitude;
  45. out.longitudeDegrees = in.longitude;
  46. }
  47. if (in.flags & LOCATION_HAS_ALTITUDE_BIT) {
  48. out.gnssLocationFlags |= GnssLocationFlags::HAS_ALTITUDE;
  49. out.altitudeMeters = in.altitude;
  50. }
  51. if (in.flags & LOCATION_HAS_SPEED_BIT) {
  52. out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED;
  53. out.speedMetersPerSec = in.speed;
  54. }
  55. if (in.flags & LOCATION_HAS_BEARING_BIT) {
  56. out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING;
  57. out.bearingDegrees = in.bearing;
  58. }
  59. if (in.flags & LOCATION_HAS_ACCURACY_BIT) {
  60. out.gnssLocationFlags |= GnssLocationFlags::HAS_HORIZONTAL_ACCURACY;
  61. out.horizontalAccuracyMeters = in.accuracy;
  62. }
  63. if (in.flags & LOCATION_HAS_VERTICAL_ACCURACY_BIT) {
  64. out.gnssLocationFlags |= GnssLocationFlags::HAS_VERTICAL_ACCURACY;
  65. out.verticalAccuracyMeters = in.verticalAccuracy;
  66. }
  67. if (in.flags & LOCATION_HAS_SPEED_ACCURACY_BIT) {
  68. out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED_ACCURACY;
  69. out.speedAccuracyMetersPerSecond = in.speedAccuracy;
  70. }
  71. if (in.flags & LOCATION_HAS_BEARING_ACCURACY_BIT) {
  72. out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING_ACCURACY;
  73. out.bearingAccuracyDegrees = in.bearingAccuracy;
  74. }
  75. out.timestamp = static_cast<V1_0::GnssUtcTime>(in.timestamp);
  76. }
  77. void convertGnssLocation(const GnssLocation& in, Location& out)
  78. {
  79. memset(&out, 0, sizeof(out));
  80. if (in.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG) {
  81. out.flags |= LOCATION_HAS_LAT_LONG_BIT;
  82. out.latitude = in.latitudeDegrees;
  83. out.longitude = in.longitudeDegrees;
  84. }
  85. if (in.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE) {
  86. out.flags |= LOCATION_HAS_ALTITUDE_BIT;
  87. out.altitude = in.altitudeMeters;
  88. }
  89. if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED) {
  90. out.flags |= LOCATION_HAS_SPEED_BIT;
  91. out.speed = in.speedMetersPerSec;
  92. }
  93. if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) {
  94. out.flags |= LOCATION_HAS_BEARING_BIT;
  95. out.bearing = in.bearingDegrees;
  96. }
  97. if (in.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) {
  98. out.flags |= LOCATION_HAS_ACCURACY_BIT;
  99. out.accuracy = in.horizontalAccuracyMeters;
  100. }
  101. if (in.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) {
  102. out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT;
  103. out.verticalAccuracy = in.verticalAccuracyMeters;
  104. }
  105. if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY) {
  106. out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT;
  107. out.speedAccuracy = in.speedAccuracyMetersPerSecond;
  108. }
  109. if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY) {
  110. out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT;
  111. out.bearingAccuracy = in.bearingAccuracyDegrees;
  112. }
  113. out.timestamp = static_cast<uint64_t>(in.timestamp);
  114. }
  115. void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out)
  116. {
  117. switch(in) {
  118. case GNSS_SV_TYPE_GPS:
  119. out = GnssConstellationType::GPS;
  120. break;
  121. case GNSS_SV_TYPE_SBAS:
  122. out = GnssConstellationType::SBAS;
  123. break;
  124. case GNSS_SV_TYPE_GLONASS:
  125. out = GnssConstellationType::GLONASS;
  126. break;
  127. case GNSS_SV_TYPE_QZSS:
  128. out = GnssConstellationType::QZSS;
  129. break;
  130. case GNSS_SV_TYPE_BEIDOU:
  131. out = GnssConstellationType::BEIDOU;
  132. break;
  133. case GNSS_SV_TYPE_GALILEO:
  134. out = GnssConstellationType::GALILEO;
  135. break;
  136. case GNSS_SV_TYPE_UNKNOWN:
  137. default:
  138. out = GnssConstellationType::UNKNOWN;
  139. break;
  140. }
  141. }
  142. void convertGnssSvid(GnssSv& in, int16_t& out)
  143. {
  144. switch(in.type){
  145. case GNSS_SV_TYPE_GPS:
  146. out = in.svId;
  147. break;
  148. case GNSS_SV_TYPE_SBAS:
  149. out = in.svId;
  150. break;
  151. case GNSS_SV_TYPE_GLONASS:
  152. if (!isGloSlotUnknown(in.svId)) { // OSN is known
  153. out = in.svId - GLO_SV_PRN_MIN + 1;
  154. } else { // OSN is not known, report FCN
  155. out = in.gloFrequency + 92;
  156. }
  157. break;
  158. case GNSS_SV_TYPE_QZSS:
  159. out = in.svId;
  160. break;
  161. case GNSS_SV_TYPE_BEIDOU:
  162. out = in.svId - BDS_SV_PRN_MIN + 1;
  163. break;
  164. case GNSS_SV_TYPE_GALILEO:
  165. out = in.svId - GAL_SV_PRN_MIN + 1;
  166. break;
  167. case GNSS_SV_TYPE_NAVIC:
  168. out = in.svId - NAVIC_SV_PRN_MIN + 1;
  169. break;
  170. default:
  171. out = in.svId;
  172. break;
  173. }
  174. }
  175. void convertGnssSvid(GnssMeasurementsData& in, int16_t& out)
  176. {
  177. switch (in.svType) {
  178. case GNSS_SV_TYPE_GPS:
  179. out = in.svId;
  180. break;
  181. case GNSS_SV_TYPE_SBAS:
  182. out = in.svId;
  183. break;
  184. case GNSS_SV_TYPE_GLONASS:
  185. if (!isGloSlotUnknown(in.svId)) { // OSN is known
  186. out = in.svId - GLO_SV_PRN_MIN + 1;
  187. } else { // OSN is not known, report FCN
  188. out = in.gloFrequency + 92;
  189. }
  190. break;
  191. case GNSS_SV_TYPE_QZSS:
  192. out = in.svId;
  193. break;
  194. case GNSS_SV_TYPE_BEIDOU:
  195. out = in.svId - BDS_SV_PRN_MIN + 1;
  196. break;
  197. case GNSS_SV_TYPE_GALILEO:
  198. out = in.svId - GAL_SV_PRN_MIN + 1;
  199. break;
  200. case GNSS_SV_TYPE_NAVIC:
  201. out = in.svId - NAVIC_SV_PRN_MIN + 1;
  202. break;
  203. default:
  204. out = in.svId;
  205. break;
  206. }
  207. }
  208. void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out)
  209. {
  210. switch(in) {
  211. case GNSS_EPH_TYPE_EPHEMERIS:
  212. out = GnssDebug::SatelliteEphemerisType::EPHEMERIS;
  213. break;
  214. case GNSS_EPH_TYPE_ALMANAC:
  215. out = GnssDebug::SatelliteEphemerisType::ALMANAC_ONLY;
  216. break;
  217. case GNSS_EPH_TYPE_UNKNOWN:
  218. default:
  219. out = GnssDebug::SatelliteEphemerisType::NOT_AVAILABLE;
  220. break;
  221. }
  222. }
  223. void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out)
  224. {
  225. switch(in) {
  226. case GNSS_EPH_SOURCE_DEMODULATED:
  227. out = GnssDebug::SatelliteEphemerisSource::DEMODULATED;
  228. break;
  229. case GNSS_EPH_SOURCE_SUPL_PROVIDED:
  230. out = GnssDebug::SatelliteEphemerisSource::SUPL_PROVIDED;
  231. break;
  232. case GNSS_EPH_SOURCE_OTHER_SERVER_PROVIDED:
  233. out = GnssDebug::SatelliteEphemerisSource::OTHER_SERVER_PROVIDED;
  234. break;
  235. case GNSS_EPH_SOURCE_LOCAL:
  236. case GNSS_EPH_SOURCE_UNKNOWN:
  237. default:
  238. out = GnssDebug::SatelliteEphemerisSource::OTHER;
  239. break;
  240. }
  241. }
  242. void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out)
  243. {
  244. switch(in) {
  245. case GNSS_EPH_HEALTH_GOOD:
  246. out = GnssDebug::SatelliteEphemerisHealth::GOOD;
  247. break;
  248. case GNSS_EPH_HEALTH_BAD:
  249. out = GnssDebug::SatelliteEphemerisHealth::BAD;
  250. break;
  251. case GNSS_EPH_HEALTH_UNKNOWN:
  252. default:
  253. out = GnssDebug::SatelliteEphemerisHealth::UNKNOWN;
  254. break;
  255. }
  256. }
  257. } // namespace implementation
  258. } // namespace V1_0
  259. } // namespace gnss
  260. } // namespace hardware
  261. } // namespace android