1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <Utils.h> 18 #include "gtest/gtest.h" 19 20 namespace android { 21 namespace hardware { 22 namespace gnss { 23 namespace common { 24 25 using V1_0::GnssConstellationType; 26 using V1_0::GnssLocationFlags; 27 28 void Utils::checkLocation(const GnssLocation& location, bool check_speed, 29 bool check_more_accuracies) { 30 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG); 31 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE); 32 if (check_speed) { 33 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED); 34 } 35 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY); 36 // New uncertainties available in O must be provided, 37 // at least when paired with modern hardware (2017+) 38 if (check_more_accuracies) { 39 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY); 40 if (check_speed) { 41 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY); 42 if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) { 43 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY); 44 } 45 } 46 } 47 EXPECT_GE(location.latitudeDegrees, -90.0); 48 EXPECT_LE(location.latitudeDegrees, 90.0); 49 EXPECT_GE(location.longitudeDegrees, -180.0); 50 EXPECT_LE(location.longitudeDegrees, 180.0); 51 EXPECT_GE(location.altitudeMeters, -1000.0); 52 EXPECT_LE(location.altitudeMeters, 30000.0); 53 if (check_speed) { 54 EXPECT_GE(location.speedMetersPerSec, 0.0); 55 EXPECT_LE(location.speedMetersPerSec, 5.0); // VTS tests are stationary. 56 57 // Non-zero speeds must be reported with an associated bearing 58 if (location.speedMetersPerSec > 0.0) { 59 EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING); 60 } 61 } 62 63 /* 64 * Tolerating some especially high values for accuracy estimate, in case of 65 * first fix with especially poor geometry (happens occasionally) 66 */ 67 EXPECT_GT(location.horizontalAccuracyMeters, 0.0); 68 EXPECT_LE(location.horizontalAccuracyMeters, 250.0); 69 70 /* 71 * Some devices may define bearing as -180 to +180, others as 0 to 360. 72 * Both are okay & understandable. 73 */ 74 if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) { 75 EXPECT_GE(location.bearingDegrees, -180.0); 76 EXPECT_LE(location.bearingDegrees, 360.0); 77 } 78 if (location.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) { 79 EXPECT_GT(location.verticalAccuracyMeters, 0.0); 80 EXPECT_LE(location.verticalAccuracyMeters, 500.0); 81 } 82 if (location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY) { 83 EXPECT_GT(location.speedAccuracyMetersPerSecond, 0.0); 84 EXPECT_LE(location.speedAccuracyMetersPerSecond, 50.0); 85 } 86 if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY) { 87 EXPECT_GT(location.bearingAccuracyDegrees, 0.0); 88 EXPECT_LE(location.bearingAccuracyDegrees, 360.0); 89 } 90 91 // Check timestamp > 1.48e12 (47 years in msec - 1970->2017+) 92 EXPECT_GT(location.timestamp, 1.48e12); 93 } 94 95 const MeasurementCorrections Utils::getMockMeasurementCorrections() { 96 ReflectingPlane reflectingPlane = { 97 .latitudeDegrees = 37.4220039, 98 .longitudeDegrees = -122.0840991, 99 .altitudeMeters = 250.35, 100 .azimuthDegrees = 203.0, 101 }; 102 103 SingleSatCorrection singleSatCorrection1 = { 104 .singleSatCorrectionFlags = GnssSingleSatCorrectionFlags::HAS_SAT_IS_LOS_PROBABILITY | 105 GnssSingleSatCorrectionFlags::HAS_EXCESS_PATH_LENGTH | 106 GnssSingleSatCorrectionFlags::HAS_EXCESS_PATH_LENGTH_UNC | 107 GnssSingleSatCorrectionFlags::HAS_REFLECTING_PLANE, 108 .constellation = GnssConstellationType::GPS, 109 .svid = 12, 110 .carrierFrequencyHz = 1.59975e+09, 111 .probSatIsLos = 0.50001, 112 .excessPathLengthMeters = 137.4802, 113 .excessPathLengthUncertaintyMeters = 25.5, 114 .reflectingPlane = reflectingPlane, 115 }; 116 SingleSatCorrection singleSatCorrection2 = { 117 .singleSatCorrectionFlags = GnssSingleSatCorrectionFlags::HAS_SAT_IS_LOS_PROBABILITY | 118 GnssSingleSatCorrectionFlags::HAS_EXCESS_PATH_LENGTH | 119 GnssSingleSatCorrectionFlags::HAS_EXCESS_PATH_LENGTH_UNC, 120 .constellation = GnssConstellationType::GPS, 121 .svid = 9, 122 .carrierFrequencyHz = 1.59975e+09, 123 .probSatIsLos = 0.873, 124 .excessPathLengthMeters = 26.294, 125 .excessPathLengthUncertaintyMeters = 10.0, 126 }; 127 128 hidl_vec<SingleSatCorrection> singleSatCorrections = {singleSatCorrection1, 129 singleSatCorrection2}; 130 MeasurementCorrections mockCorrections = { 131 .latitudeDegrees = 37.4219999, 132 .longitudeDegrees = -122.0840575, 133 .altitudeMeters = 30.60062531, 134 .horizontalPositionUncertaintyMeters = 9.23542, 135 .verticalPositionUncertaintyMeters = 15.02341, 136 .toaGpsNanosecondsOfWeek = 2935633453L, 137 .satCorrections = singleSatCorrections, 138 }; 139 return mockCorrections; 140 } 141 142 } // namespace common 143 } // namespace gnss 144 } // namespace hardware 145 } // namespace android 146