blob: dd932d447b8d61421212dbd6f9e57f5ade5cbe26 [file] [log] [blame]
Yu-Han Yanga5098612019-02-08 16:22:07 -08001/*
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 <Constants.h>
Enrico Granata3ba5d222020-10-21 17:20:00 -060018#include <MockLocation.h>
Yu-Han Yanga5098612019-02-08 16:22:07 -080019#include <Utils.h>
Yu-Han Yang04832302020-11-20 09:51:18 -080020#include <aidl/android/hardware/gnss/BnGnss.h>
Yu-Han Yangc06b5362019-10-25 14:14:35 -070021#include <utils/SystemClock.h>
Yu-Han Yanga5098612019-02-08 16:22:07 -080022
23namespace android {
24namespace hardware {
25namespace gnss {
26namespace common {
27
Yu-Han Yang04832302020-11-20 09:51:18 -080028using IGnss = aidl::android::hardware::gnss::IGnss;
29using IGnssMeasurementCallback = aidl::android::hardware::gnss::IGnssMeasurementCallback;
30using GnssMeasurement = aidl::android::hardware::gnss::GnssMeasurement;
Yu-Han Yanga5098612019-02-08 16:22:07 -080031using GnssSvFlags = V1_0::IGnssCallback::GnssSvFlags;
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080032using GnssMeasurementFlagsV1_0 = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags;
33using GnssMeasurementFlagsV2_1 = V2_1::IGnssMeasurementCallback::GnssMeasurementFlags;
Yu-Han Yangc06b5362019-10-25 14:14:35 -070034using GnssMeasurementStateV2_0 = V2_0::IGnssMeasurementCallback::GnssMeasurementState;
Yu-Han Yang04832302020-11-20 09:51:18 -080035using ElapsedRealtime = aidl::android::hardware::gnss::ElapsedRealtime;
Yu-Han Yangc06b5362019-10-25 14:14:35 -070036using ElapsedRealtimeFlags = V2_0::ElapsedRealtimeFlags;
37using GnssConstellationTypeV2_0 = V2_0::GnssConstellationType;
38using IGnssMeasurementCallbackV2_0 = V2_0::IGnssMeasurementCallback;
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080039using GnssSignalType = V2_1::GnssSignalType;
Yu-Han Yanga5098612019-02-08 16:22:07 -080040
Yu-Han Yang04832302020-11-20 09:51:18 -080041using GnssDataV2_0 = V2_0::IGnssMeasurementCallback::GnssData;
42using GnssDataV2_1 = V2_1::IGnssMeasurementCallback::GnssData;
43using GnssSvInfoV1_0 = V1_0::IGnssCallback::GnssSvInfo;
44using GnssSvInfoV2_0 = V2_0::IGnssCallback::GnssSvInfo;
45using GnssSvInfoV2_1 = V2_1::IGnssCallback::GnssSvInfo;
46using GnssAntennaInfo = ::android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo;
47using Row = V2_1::IGnssAntennaInfoCallback::Row;
48using Coord = V2_1::IGnssAntennaInfoCallback::Coord;
49
Yu-Han Yangc06b5362019-10-25 14:14:35 -070050GnssDataV2_1 Utils::getMockMeasurementV2_1() {
51 GnssDataV2_0 gnssDataV2_0 = Utils::getMockMeasurementV2_0();
52 V2_1::IGnssMeasurementCallback::GnssMeasurement gnssMeasurementV2_1 = {
53 .v2_0 = gnssDataV2_0.measurements[0],
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080054 .flags = (uint32_t)(GnssMeasurementFlagsV2_1::HAS_CARRIER_FREQUENCY |
55 GnssMeasurementFlagsV2_1::HAS_CARRIER_PHASE |
Yu-Han Yang6668eab2020-03-03 15:23:50 -080056 GnssMeasurementFlagsV2_1::HAS_FULL_ISB |
57 GnssMeasurementFlagsV2_1::HAS_FULL_ISB_UNCERTAINTY |
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080058 GnssMeasurementFlagsV2_1::HAS_SATELLITE_ISB |
59 GnssMeasurementFlagsV2_1::HAS_SATELLITE_ISB_UNCERTAINTY),
Yu-Han Yang6668eab2020-03-03 15:23:50 -080060 .fullInterSignalBiasNs = 30.0,
61 .fullInterSignalBiasUncertaintyNs = 250.0,
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080062 .satelliteInterSignalBiasNs = 20.0,
63 .satelliteInterSignalBiasUncertaintyNs = 150.0,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070064 .basebandCN0DbHz = 25.0,
65 };
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080066 GnssSignalType referenceSignalTypeForIsb = {
67 .constellation = GnssConstellationTypeV2_0::GPS,
68 .carrierFrequencyHz = 1.59975e+09,
69 .codeType = "C",
70 };
71 V2_1::IGnssMeasurementCallback::GnssClock gnssClockV2_1 = {
72 .v1_0 = gnssDataV2_0.clock,
73 .referenceSignalTypeForIsb = referenceSignalTypeForIsb,
74 };
Yu-Han Yangc06b5362019-10-25 14:14:35 -070075 hidl_vec<V2_1::IGnssMeasurementCallback::GnssMeasurement> measurements(1);
76 measurements[0] = gnssMeasurementV2_1;
77 GnssDataV2_1 gnssDataV2_1 = {
78 .measurements = measurements,
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080079 .clock = gnssClockV2_1,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070080 .elapsedRealtime = gnssDataV2_0.elapsedRealtime,
81 };
82 return gnssDataV2_1;
83}
84
85GnssDataV2_0 Utils::getMockMeasurementV2_0() {
86 V1_0::IGnssMeasurementCallback::GnssMeasurement measurement_1_0 = {
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080087 .flags = (uint32_t)GnssMeasurementFlagsV1_0::HAS_CARRIER_FREQUENCY,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070088 .svid = (int16_t)6,
89 .constellation = V1_0::GnssConstellationType::UNKNOWN,
90 .timeOffsetNs = 0.0,
91 .receivedSvTimeInNs = 8195997131077,
92 .receivedSvTimeUncertaintyInNs = 15,
93 .cN0DbHz = 30.0,
94 .pseudorangeRateMps = -484.13739013671875,
95 .pseudorangeRateUncertaintyMps = 1.0379999876022339,
96 .accumulatedDeltaRangeState = (uint32_t)V1_0::IGnssMeasurementCallback::
97 GnssAccumulatedDeltaRangeState::ADR_STATE_UNKNOWN,
98 .accumulatedDeltaRangeM = 0.0,
99 .accumulatedDeltaRangeUncertaintyM = 0.0,
100 .carrierFrequencyHz = 1.59975e+09,
101 .multipathIndicator =
102 V1_0::IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN};
103 V1_1::IGnssMeasurementCallback::GnssMeasurement measurement_1_1 = {.v1_0 = measurement_1_0};
104 V2_0::IGnssMeasurementCallback::GnssMeasurement measurement_2_0 = {
105 .v1_1 = measurement_1_1,
106 .codeType = "C",
107 .state = GnssMeasurementStateV2_0::STATE_CODE_LOCK |
108 GnssMeasurementStateV2_0::STATE_BIT_SYNC |
109 GnssMeasurementStateV2_0::STATE_SUBFRAME_SYNC |
110 GnssMeasurementStateV2_0::STATE_TOW_DECODED |
111 GnssMeasurementStateV2_0::STATE_GLO_STRING_SYNC |
112 GnssMeasurementStateV2_0::STATE_GLO_TOD_DECODED,
113 .constellation = GnssConstellationTypeV2_0::GLONASS,
114 };
115
116 hidl_vec<IGnssMeasurementCallbackV2_0::GnssMeasurement> measurements(1);
117 measurements[0] = measurement_2_0;
118 V1_0::IGnssMeasurementCallback::GnssClock clock = {.timeNs = 2713545000000,
119 .fullBiasNs = -1226701900521857520,
120 .biasNs = 0.59689998626708984,
121 .biasUncertaintyNs = 47514.989972114563,
122 .driftNsps = -51.757811607455452,
123 .driftUncertaintyNsps = 310.64968328491528,
124 .hwClockDiscontinuityCount = 1};
125
Yu-Han Yang04832302020-11-20 09:51:18 -0800126 V2_0::ElapsedRealtime timestamp = {
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700127 .flags = ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
128 ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
129 .timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
130 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
131 // In an actual implementation provide an estimate of the synchronization uncertainty
132 // or don't set the field.
133 .timeUncertaintyNs = 1000000};
134
135 GnssDataV2_0 gnssData = {
136 .measurements = measurements, .clock = clock, .elapsedRealtime = timestamp};
137 return gnssData;
138}
139
Yu-Han Yang04832302020-11-20 09:51:18 -0800140aidl::android::hardware::gnss::GnssData Utils::getMockMeasurement() {
141 aidl::android::hardware::gnss::GnssSignalType signalType = {
142 .constellation = aidl::android::hardware::gnss::GnssConstellationType::GLONASS,
143 .carrierFrequencyHz = 1.59975e+09,
144 .codeType = aidl::android::hardware::gnss::GnssSignalType::CODE_TYPE_C,
145 };
146 aidl::android::hardware::gnss::GnssMeasurement measurement = {
147 .flags = GnssMeasurement::HAS_CARRIER_FREQUENCY,
148 .svid = 6,
149 .signalType = signalType,
150 .timeOffsetNs = 0.0,
151 .receivedSvTimeInNs = 8195997131077,
152 .receivedSvTimeUncertaintyInNs = 15,
153 .antennaCN0DbHz = 30.0,
154 .pseudorangeRateMps = -484.13739013671875,
155 .pseudorangeRateUncertaintyMps = 1.0379999876022339,
156 .accumulatedDeltaRangeState = GnssMeasurement::ADR_STATE_UNKNOWN,
157 .accumulatedDeltaRangeM = 0.0,
158 .accumulatedDeltaRangeUncertaintyM = 0.0,
159 .multipathIndicator = aidl::android::hardware::gnss::GnssMultipathIndicator::UNKNOWN,
160 .state = GnssMeasurement::STATE_CODE_LOCK | GnssMeasurement::STATE_BIT_SYNC |
161 GnssMeasurement::STATE_SUBFRAME_SYNC | GnssMeasurement::STATE_TOW_DECODED |
162 GnssMeasurement::STATE_GLO_STRING_SYNC |
163 GnssMeasurement::STATE_GLO_TOD_DECODED};
164
165 aidl::android::hardware::gnss::GnssClock clock = {.timeNs = 2713545000000,
166 .fullBiasNs = -1226701900521857520,
167 .biasNs = 0.59689998626708984,
168 .biasUncertaintyNs = 47514.989972114563,
169 .driftNsps = -51.757811607455452,
170 .driftUncertaintyNsps = 310.64968328491528,
171 .hwClockDiscontinuityCount = 1};
172
173 ElapsedRealtime timestamp = {
174 .flags = ElapsedRealtime::HAS_TIMESTAMP_NS | ElapsedRealtime::HAS_TIME_UNCERTAINTY_NS,
175 .timestampNs = ::android::elapsedRealtimeNano(),
176 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
177 // In an actual implementation provide an estimate of the synchronization uncertainty
178 // or don't set the field.
179 .timeUncertaintyNs = 1000000};
180
181 aidl::android::hardware::gnss::GnssData gnssData = {
182 .measurements = {measurement}, .clock = clock, .elapsedRealtime = timestamp};
183 return gnssData;
184}
185
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700186V2_0::GnssLocation Utils::getMockLocationV2_0() {
187 const V2_0::ElapsedRealtime timestamp = {
188 .flags = V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
189 V2_0::ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
190 .timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
191 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
192 // In an actual implementation provide an estimate of the synchronization uncertainty
193 // or don't set the field.
194 .timeUncertaintyNs = 1000000};
195
196 V2_0::GnssLocation location = {.v1_0 = Utils::getMockLocationV1_0(),
197 .elapsedRealtime = timestamp};
Yu-Han Yanga5098612019-02-08 16:22:07 -0800198 return location;
199}
200
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700201V1_0::GnssLocation Utils::getMockLocationV1_0() {
202 V1_0::GnssLocation location = {
203 .gnssLocationFlags = 0xFF,
Enrico Granata3ba5d222020-10-21 17:20:00 -0600204 .latitudeDegrees = gMockLatitudeDegrees,
205 .longitudeDegrees = gMockLongitudeDegrees,
206 .altitudeMeters = gMockAltitudeMeters,
Enrico Granata72a47a22020-11-13 12:52:07 -0700207 .speedMetersPerSec = gMockSpeedMetersPerSec,
208 .bearingDegrees = gMockBearingDegrees,
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700209 .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters,
210 .verticalAccuracyMeters = kMockVerticalAccuracyMeters,
211 .speedAccuracyMetersPerSecond = kMockSpeedAccuracyMetersPerSecond,
212 .bearingAccuracyDegrees = kMockBearingAccuracyDegrees,
213 .timestamp = kMockTimestamp};
214 return location;
215}
216
217hidl_vec<GnssSvInfoV2_1> Utils::getMockSvInfoListV2_1() {
218 GnssSvInfoV1_0 gnssSvInfoV1_0 =
219 Utils::getMockSvInfoV1_0(3, V1_0::GnssConstellationType::GPS, 32.5, 59.1, 166.5);
220 GnssSvInfoV2_0 gnssSvInfoV2_0 =
221 Utils::getMockSvInfoV2_0(gnssSvInfoV1_0, V2_0::GnssConstellationType::GPS);
222 hidl_vec<GnssSvInfoV2_1> gnssSvInfoList = {
223 Utils::getMockSvInfoV2_1(gnssSvInfoV2_0, 27.5),
224 getMockSvInfoV2_1(
225 getMockSvInfoV2_0(getMockSvInfoV1_0(5, V1_0::GnssConstellationType::GPS, 27.0,
226 29.0, 56.5),
227 V2_0::GnssConstellationType::GPS),
228 22.0),
229 getMockSvInfoV2_1(
230 getMockSvInfoV2_0(getMockSvInfoV1_0(17, V1_0::GnssConstellationType::GPS, 30.5,
231 71.0, 77.0),
232 V2_0::GnssConstellationType::GPS),
233 25.5),
234 getMockSvInfoV2_1(
235 getMockSvInfoV2_0(getMockSvInfoV1_0(26, V1_0::GnssConstellationType::GPS, 24.1,
236 28.0, 253.0),
237 V2_0::GnssConstellationType::GPS),
238 19.1),
239 getMockSvInfoV2_1(
240 getMockSvInfoV2_0(getMockSvInfoV1_0(5, V1_0::GnssConstellationType::GLONASS,
241 20.5, 11.5, 116.0),
242 V2_0::GnssConstellationType::GLONASS),
243 15.5),
244 getMockSvInfoV2_1(
245 getMockSvInfoV2_0(getMockSvInfoV1_0(17, V1_0::GnssConstellationType::GLONASS,
246 21.5, 28.5, 186.0),
247 V2_0::GnssConstellationType::GLONASS),
248 16.5),
249 getMockSvInfoV2_1(
250 getMockSvInfoV2_0(getMockSvInfoV1_0(18, V1_0::GnssConstellationType::GLONASS,
251 28.3, 38.8, 69.0),
252 V2_0::GnssConstellationType::GLONASS),
253 25.3),
254 getMockSvInfoV2_1(
255 getMockSvInfoV2_0(getMockSvInfoV1_0(10, V1_0::GnssConstellationType::GLONASS,
256 25.0, 66.0, 247.0),
257 V2_0::GnssConstellationType::GLONASS),
258 20.0),
Sasha Kuznetsov845f6d52019-12-04 12:17:50 -0800259 getMockSvInfoV2_1(
260 getMockSvInfoV2_0(getMockSvInfoV1_0(3, V1_0::GnssConstellationType::UNKNOWN,
261 22.0, 35.0, 112.0),
262 V2_0::GnssConstellationType::IRNSS),
263 19.7),
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700264 };
265 return gnssSvInfoList;
266}
267
268GnssSvInfoV2_1 Utils::getMockSvInfoV2_1(GnssSvInfoV2_0 gnssSvInfoV2_0, float basebandCN0DbHz) {
269 GnssSvInfoV2_1 gnssSvInfoV2_1 = {
270 .v2_0 = gnssSvInfoV2_0,
271 .basebandCN0DbHz = basebandCN0DbHz,
272 };
273 return gnssSvInfoV2_1;
274}
275
276GnssSvInfoV2_0 Utils::getMockSvInfoV2_0(GnssSvInfoV1_0 gnssSvInfoV1_0,
277 V2_0::GnssConstellationType type) {
278 GnssSvInfoV2_0 gnssSvInfoV2_0 = {
279 .v1_0 = gnssSvInfoV1_0,
280 .constellation = type,
281 };
282 return gnssSvInfoV2_0;
283}
284
285GnssSvInfoV1_0 Utils::getMockSvInfoV1_0(int16_t svid, V1_0::GnssConstellationType type,
286 float cN0DbHz, float elevationDegrees,
287 float azimuthDegrees) {
288 GnssSvInfoV1_0 svInfo = {.svid = svid,
289 .constellation = type,
290 .cN0Dbhz = cN0DbHz,
291 .elevationDegrees = elevationDegrees,
292 .azimuthDegrees = azimuthDegrees,
293 .svFlag = GnssSvFlags::USED_IN_FIX | GnssSvFlags::HAS_EPHEMERIS_DATA |
294 GnssSvFlags::HAS_ALMANAC_DATA};
Yu-Han Yanga5098612019-02-08 16:22:07 -0800295 return svInfo;
296}
297
Sasha Kuznetsov768de572020-02-11 06:00:10 +0000298hidl_vec<GnssAntennaInfo> Utils::getMockAntennaInfos() {
299 GnssAntennaInfo mockAntennaInfo_1 = {
300 .carrierFrequencyMHz = 123412.12,
301 .phaseCenterOffsetCoordinateMillimeters = Coord{.x = 1,
302 .xUncertainty = 0.1,
303 .y = 2,
304 .yUncertainty = 0.1,
305 .z = 3,
306 .zUncertainty = 0.1},
307 .phaseCenterVariationCorrectionMillimeters =
308 {
309 Row{hidl_vec<double>{1, -1, 5, -2, 3, -1}},
310 Row{hidl_vec<double>{-2, 3, 2, 0, 1, 2}},
311 Row{hidl_vec<double>{1, 3, 2, -1, -3, 5}},
312 },
313 .phaseCenterVariationCorrectionUncertaintyMillimeters =
314 {
315 Row{hidl_vec<double>{0.1, 0.2, 0.4, 0.1, 0.2, 0.3}},
316 Row{hidl_vec<double>{0.3, 0.2, 0.3, 0.6, 0.1, 0.1}},
317 Row{hidl_vec<double>{0.1, 0.1, 0.4, 0.2, 0.5, 0.3}},
318 },
319 .signalGainCorrectionDbi =
320 {
321 Row{hidl_vec<double>{2, -3, 1, -3, 0, -4}},
322 Row{hidl_vec<double>{1, 0, -4, 1, 3, -2}},
323 Row{hidl_vec<double>{3, -2, 0, -2, 3, 0}},
324 },
325 .signalGainCorrectionUncertaintyDbi =
326 {
327 Row{hidl_vec<double>{0.3, 0.1, 0.2, 0.6, 0.1, 0.3}},
328 Row{hidl_vec<double>{0.1, 0.1, 0.5, 0.2, 0.3, 0.1}},
329 Row{hidl_vec<double>{0.2, 0.4, 0.2, 0.1, 0.1, 0.2}},
330 },
331 };
332
333 GnssAntennaInfo mockAntennaInfo_2 = {
334 .carrierFrequencyMHz = 532324.23,
335 .phaseCenterOffsetCoordinateMillimeters = Coord{.x = 5,
336 .xUncertainty = 0.1,
337 .y = 6,
338 .yUncertainty = 0.1,
339 .z = 7,
340 .zUncertainty = 0.1},
341 };
342
343 hidl_vec<GnssAntennaInfo> mockAntennaInfos = {
344 mockAntennaInfo_1,
345 mockAntennaInfo_2,
346 };
347 return mockAntennaInfos;
348}
349
Yu-Han Yanga5098612019-02-08 16:22:07 -0800350} // namespace common
351} // namespace gnss
352} // namespace hardware
353} // namespace android