xref: /aosp_15_r20/hardware/interfaces/gnss/1.0/default/GnssUtils.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "GnssUtils.h"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker namespace android {
20*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
21*4d7e907cSAndroid Build Coastguard Worker namespace gnss {
22*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
23*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker using android::hardware::gnss::V1_0::GnssLocation;
26*4d7e907cSAndroid Build Coastguard Worker 
convertToGnssLocation(GpsLocation * location)27*4d7e907cSAndroid Build Coastguard Worker GnssLocation convertToGnssLocation(GpsLocation* location) {
28*4d7e907cSAndroid Build Coastguard Worker     GnssLocation gnssLocation = {};
29*4d7e907cSAndroid Build Coastguard Worker     if (location != nullptr) {
30*4d7e907cSAndroid Build Coastguard Worker         gnssLocation = {
31*4d7e907cSAndroid Build Coastguard Worker             // Bit operation AND with 1f below is needed to clear vertical accuracy,
32*4d7e907cSAndroid Build Coastguard Worker             // speed accuracy and bearing accuracy flags as some vendors are found
33*4d7e907cSAndroid Build Coastguard Worker             // to be setting these bits in pre-Android-O devices
34*4d7e907cSAndroid Build Coastguard Worker             .gnssLocationFlags = static_cast<uint16_t>(location->flags & 0x1f),
35*4d7e907cSAndroid Build Coastguard Worker             .latitudeDegrees = location->latitude,
36*4d7e907cSAndroid Build Coastguard Worker             .longitudeDegrees = location->longitude,
37*4d7e907cSAndroid Build Coastguard Worker             .altitudeMeters = location->altitude,
38*4d7e907cSAndroid Build Coastguard Worker             .speedMetersPerSec = location->speed,
39*4d7e907cSAndroid Build Coastguard Worker             .bearingDegrees = location->bearing,
40*4d7e907cSAndroid Build Coastguard Worker             .horizontalAccuracyMeters = location->accuracy,
41*4d7e907cSAndroid Build Coastguard Worker             // Older chipsets do not provide the following 3 fields, hence the flags
42*4d7e907cSAndroid Build Coastguard Worker             // HAS_VERTICAL_ACCURACY, HAS_SPEED_ACCURACY and HAS_BEARING_ACCURACY are
43*4d7e907cSAndroid Build Coastguard Worker             // not set and the field are set to zeros.
44*4d7e907cSAndroid Build Coastguard Worker             .verticalAccuracyMeters = 0,
45*4d7e907cSAndroid Build Coastguard Worker             .speedAccuracyMetersPerSecond = 0,
46*4d7e907cSAndroid Build Coastguard Worker             .bearingAccuracyDegrees = 0,
47*4d7e907cSAndroid Build Coastguard Worker             .timestamp = location->timestamp
48*4d7e907cSAndroid Build Coastguard Worker         };
49*4d7e907cSAndroid Build Coastguard Worker     }
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker     return gnssLocation;
52*4d7e907cSAndroid Build Coastguard Worker }
53*4d7e907cSAndroid Build Coastguard Worker 
convertToGnssLocation(FlpLocation * flpLocation)54*4d7e907cSAndroid Build Coastguard Worker GnssLocation convertToGnssLocation(FlpLocation* flpLocation) {
55*4d7e907cSAndroid Build Coastguard Worker     GnssLocation gnssLocation = {};
56*4d7e907cSAndroid Build Coastguard Worker     if (flpLocation != nullptr) {
57*4d7e907cSAndroid Build Coastguard Worker         gnssLocation = {.gnssLocationFlags = 0,  // clear here and set below
58*4d7e907cSAndroid Build Coastguard Worker                         .latitudeDegrees = flpLocation->latitude,
59*4d7e907cSAndroid Build Coastguard Worker                         .longitudeDegrees = flpLocation->longitude,
60*4d7e907cSAndroid Build Coastguard Worker                         .altitudeMeters = flpLocation->altitude,
61*4d7e907cSAndroid Build Coastguard Worker                         .speedMetersPerSec = flpLocation->speed,
62*4d7e907cSAndroid Build Coastguard Worker                         .bearingDegrees = flpLocation->bearing,
63*4d7e907cSAndroid Build Coastguard Worker                         .horizontalAccuracyMeters = flpLocation->accuracy,
64*4d7e907cSAndroid Build Coastguard Worker                         .verticalAccuracyMeters = 0,
65*4d7e907cSAndroid Build Coastguard Worker                         .speedAccuracyMetersPerSecond = 0,
66*4d7e907cSAndroid Build Coastguard Worker                         .bearingAccuracyDegrees = 0,
67*4d7e907cSAndroid Build Coastguard Worker                         .timestamp = flpLocation->timestamp};
68*4d7e907cSAndroid Build Coastguard Worker         // FlpLocation flags different from GnssLocation flags
69*4d7e907cSAndroid Build Coastguard Worker         if (flpLocation->flags & FLP_LOCATION_HAS_LAT_LONG) {
70*4d7e907cSAndroid Build Coastguard Worker             gnssLocation.gnssLocationFlags |= GPS_LOCATION_HAS_LAT_LONG;
71*4d7e907cSAndroid Build Coastguard Worker         }
72*4d7e907cSAndroid Build Coastguard Worker         if (flpLocation->flags & FLP_LOCATION_HAS_ALTITUDE) {
73*4d7e907cSAndroid Build Coastguard Worker             gnssLocation.gnssLocationFlags |= GPS_LOCATION_HAS_ALTITUDE;
74*4d7e907cSAndroid Build Coastguard Worker         }
75*4d7e907cSAndroid Build Coastguard Worker         if (flpLocation->flags & FLP_LOCATION_HAS_SPEED) {
76*4d7e907cSAndroid Build Coastguard Worker             gnssLocation.gnssLocationFlags |= GPS_LOCATION_HAS_SPEED;
77*4d7e907cSAndroid Build Coastguard Worker         }
78*4d7e907cSAndroid Build Coastguard Worker         if (flpLocation->flags & FLP_LOCATION_HAS_BEARING) {
79*4d7e907cSAndroid Build Coastguard Worker             gnssLocation.gnssLocationFlags |= GPS_LOCATION_HAS_BEARING;
80*4d7e907cSAndroid Build Coastguard Worker         }
81*4d7e907cSAndroid Build Coastguard Worker         if (flpLocation->flags & FLP_LOCATION_HAS_ACCURACY) {
82*4d7e907cSAndroid Build Coastguard Worker             gnssLocation.gnssLocationFlags |= GPS_LOCATION_HAS_HORIZONTAL_ACCURACY;
83*4d7e907cSAndroid Build Coastguard Worker         }
84*4d7e907cSAndroid Build Coastguard Worker     }
85*4d7e907cSAndroid Build Coastguard Worker 
86*4d7e907cSAndroid Build Coastguard Worker     return gnssLocation;
87*4d7e907cSAndroid Build Coastguard Worker }
88*4d7e907cSAndroid Build Coastguard Worker 
89*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
90*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_0
91*4d7e907cSAndroid Build Coastguard Worker }  // namespace gnss
92*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
93*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
94