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