blob: 0cdc86584937d7431cf742f27c5263e5021ab25a [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>
18#include <Utils.h>
Yu-Han Yangc06b5362019-10-25 14:14:35 -070019#include <utils/SystemClock.h>
Yu-Han Yanga5098612019-02-08 16:22:07 -080020
21namespace android {
22namespace hardware {
23namespace gnss {
24namespace common {
25
26using GnssSvFlags = V1_0::IGnssCallback::GnssSvFlags;
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080027using GnssMeasurementFlagsV1_0 = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags;
28using GnssMeasurementFlagsV2_1 = V2_1::IGnssMeasurementCallback::GnssMeasurementFlags;
Yu-Han Yangc06b5362019-10-25 14:14:35 -070029using GnssMeasurementStateV2_0 = V2_0::IGnssMeasurementCallback::GnssMeasurementState;
30using ElapsedRealtime = V2_0::ElapsedRealtime;
31using ElapsedRealtimeFlags = V2_0::ElapsedRealtimeFlags;
32using GnssConstellationTypeV2_0 = V2_0::GnssConstellationType;
33using IGnssMeasurementCallbackV2_0 = V2_0::IGnssMeasurementCallback;
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080034using GnssSignalType = V2_1::GnssSignalType;
Yu-Han Yanga5098612019-02-08 16:22:07 -080035
Yu-Han Yangc06b5362019-10-25 14:14:35 -070036GnssDataV2_1 Utils::getMockMeasurementV2_1() {
37 GnssDataV2_0 gnssDataV2_0 = Utils::getMockMeasurementV2_0();
38 V2_1::IGnssMeasurementCallback::GnssMeasurement gnssMeasurementV2_1 = {
39 .v2_0 = gnssDataV2_0.measurements[0],
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080040 .flags = (uint32_t)(GnssMeasurementFlagsV2_1::HAS_CARRIER_FREQUENCY |
41 GnssMeasurementFlagsV2_1::HAS_CARRIER_PHASE |
42 GnssMeasurementFlagsV2_1::HAS_RECEIVER_ISB |
43 GnssMeasurementFlagsV2_1::HAS_RECEIVER_ISB_UNCERTAINTY |
44 GnssMeasurementFlagsV2_1::HAS_SATELLITE_ISB |
45 GnssMeasurementFlagsV2_1::HAS_SATELLITE_ISB_UNCERTAINTY),
46 .receiverInterSignalBiasNs = 10.0,
47 .receiverInterSignalBiasUncertaintyNs = 100.0,
48 .satelliteInterSignalBiasNs = 20.0,
49 .satelliteInterSignalBiasUncertaintyNs = 150.0,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070050 .basebandCN0DbHz = 25.0,
51 };
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080052 GnssSignalType referenceSignalTypeForIsb = {
53 .constellation = GnssConstellationTypeV2_0::GPS,
54 .carrierFrequencyHz = 1.59975e+09,
55 .codeType = "C",
56 };
57 V2_1::IGnssMeasurementCallback::GnssClock gnssClockV2_1 = {
58 .v1_0 = gnssDataV2_0.clock,
59 .referenceSignalTypeForIsb = referenceSignalTypeForIsb,
60 };
Yu-Han Yangc06b5362019-10-25 14:14:35 -070061 hidl_vec<V2_1::IGnssMeasurementCallback::GnssMeasurement> measurements(1);
62 measurements[0] = gnssMeasurementV2_1;
63 GnssDataV2_1 gnssDataV2_1 = {
64 .measurements = measurements,
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080065 .clock = gnssClockV2_1,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070066 .elapsedRealtime = gnssDataV2_0.elapsedRealtime,
67 };
68 return gnssDataV2_1;
69}
70
71GnssDataV2_0 Utils::getMockMeasurementV2_0() {
72 V1_0::IGnssMeasurementCallback::GnssMeasurement measurement_1_0 = {
Yu-Han Yang5fe14fa2019-12-03 20:54:53 -080073 .flags = (uint32_t)GnssMeasurementFlagsV1_0::HAS_CARRIER_FREQUENCY,
Yu-Han Yangc06b5362019-10-25 14:14:35 -070074 .svid = (int16_t)6,
75 .constellation = V1_0::GnssConstellationType::UNKNOWN,
76 .timeOffsetNs = 0.0,
77 .receivedSvTimeInNs = 8195997131077,
78 .receivedSvTimeUncertaintyInNs = 15,
79 .cN0DbHz = 30.0,
80 .pseudorangeRateMps = -484.13739013671875,
81 .pseudorangeRateUncertaintyMps = 1.0379999876022339,
82 .accumulatedDeltaRangeState = (uint32_t)V1_0::IGnssMeasurementCallback::
83 GnssAccumulatedDeltaRangeState::ADR_STATE_UNKNOWN,
84 .accumulatedDeltaRangeM = 0.0,
85 .accumulatedDeltaRangeUncertaintyM = 0.0,
86 .carrierFrequencyHz = 1.59975e+09,
87 .multipathIndicator =
88 V1_0::IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN};
89 V1_1::IGnssMeasurementCallback::GnssMeasurement measurement_1_1 = {.v1_0 = measurement_1_0};
90 V2_0::IGnssMeasurementCallback::GnssMeasurement measurement_2_0 = {
91 .v1_1 = measurement_1_1,
92 .codeType = "C",
93 .state = GnssMeasurementStateV2_0::STATE_CODE_LOCK |
94 GnssMeasurementStateV2_0::STATE_BIT_SYNC |
95 GnssMeasurementStateV2_0::STATE_SUBFRAME_SYNC |
96 GnssMeasurementStateV2_0::STATE_TOW_DECODED |
97 GnssMeasurementStateV2_0::STATE_GLO_STRING_SYNC |
98 GnssMeasurementStateV2_0::STATE_GLO_TOD_DECODED,
99 .constellation = GnssConstellationTypeV2_0::GLONASS,
100 };
101
102 hidl_vec<IGnssMeasurementCallbackV2_0::GnssMeasurement> measurements(1);
103 measurements[0] = measurement_2_0;
104 V1_0::IGnssMeasurementCallback::GnssClock clock = {.timeNs = 2713545000000,
105 .fullBiasNs = -1226701900521857520,
106 .biasNs = 0.59689998626708984,
107 .biasUncertaintyNs = 47514.989972114563,
108 .driftNsps = -51.757811607455452,
109 .driftUncertaintyNsps = 310.64968328491528,
110 .hwClockDiscontinuityCount = 1};
111
112 ElapsedRealtime timestamp = {
113 .flags = ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
114 ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
115 .timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
116 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
117 // In an actual implementation provide an estimate of the synchronization uncertainty
118 // or don't set the field.
119 .timeUncertaintyNs = 1000000};
120
121 GnssDataV2_0 gnssData = {
122 .measurements = measurements, .clock = clock, .elapsedRealtime = timestamp};
123 return gnssData;
124}
125
126V2_0::GnssLocation Utils::getMockLocationV2_0() {
127 const V2_0::ElapsedRealtime timestamp = {
128 .flags = V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
129 V2_0::ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
130 .timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
131 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
132 // In an actual implementation provide an estimate of the synchronization uncertainty
133 // or don't set the field.
134 .timeUncertaintyNs = 1000000};
135
136 V2_0::GnssLocation location = {.v1_0 = Utils::getMockLocationV1_0(),
137 .elapsedRealtime = timestamp};
Yu-Han Yanga5098612019-02-08 16:22:07 -0800138 return location;
139}
140
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700141V1_0::GnssLocation Utils::getMockLocationV1_0() {
142 V1_0::GnssLocation location = {
143 .gnssLocationFlags = 0xFF,
144 .latitudeDegrees = kMockLatitudeDegrees,
145 .longitudeDegrees = kMockLongitudeDegrees,
146 .altitudeMeters = kMockAltitudeMeters,
147 .speedMetersPerSec = kMockSpeedMetersPerSec,
148 .bearingDegrees = kMockBearingDegrees,
149 .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters,
150 .verticalAccuracyMeters = kMockVerticalAccuracyMeters,
151 .speedAccuracyMetersPerSecond = kMockSpeedAccuracyMetersPerSecond,
152 .bearingAccuracyDegrees = kMockBearingAccuracyDegrees,
153 .timestamp = kMockTimestamp};
154 return location;
155}
156
157hidl_vec<GnssSvInfoV2_1> Utils::getMockSvInfoListV2_1() {
158 GnssSvInfoV1_0 gnssSvInfoV1_0 =
159 Utils::getMockSvInfoV1_0(3, V1_0::GnssConstellationType::GPS, 32.5, 59.1, 166.5);
160 GnssSvInfoV2_0 gnssSvInfoV2_0 =
161 Utils::getMockSvInfoV2_0(gnssSvInfoV1_0, V2_0::GnssConstellationType::GPS);
162 hidl_vec<GnssSvInfoV2_1> gnssSvInfoList = {
163 Utils::getMockSvInfoV2_1(gnssSvInfoV2_0, 27.5),
164 getMockSvInfoV2_1(
165 getMockSvInfoV2_0(getMockSvInfoV1_0(5, V1_0::GnssConstellationType::GPS, 27.0,
166 29.0, 56.5),
167 V2_0::GnssConstellationType::GPS),
168 22.0),
169 getMockSvInfoV2_1(
170 getMockSvInfoV2_0(getMockSvInfoV1_0(17, V1_0::GnssConstellationType::GPS, 30.5,
171 71.0, 77.0),
172 V2_0::GnssConstellationType::GPS),
173 25.5),
174 getMockSvInfoV2_1(
175 getMockSvInfoV2_0(getMockSvInfoV1_0(26, V1_0::GnssConstellationType::GPS, 24.1,
176 28.0, 253.0),
177 V2_0::GnssConstellationType::GPS),
178 19.1),
179 getMockSvInfoV2_1(
180 getMockSvInfoV2_0(getMockSvInfoV1_0(5, V1_0::GnssConstellationType::GLONASS,
181 20.5, 11.5, 116.0),
182 V2_0::GnssConstellationType::GLONASS),
183 15.5),
184 getMockSvInfoV2_1(
185 getMockSvInfoV2_0(getMockSvInfoV1_0(17, V1_0::GnssConstellationType::GLONASS,
186 21.5, 28.5, 186.0),
187 V2_0::GnssConstellationType::GLONASS),
188 16.5),
189 getMockSvInfoV2_1(
190 getMockSvInfoV2_0(getMockSvInfoV1_0(18, V1_0::GnssConstellationType::GLONASS,
191 28.3, 38.8, 69.0),
192 V2_0::GnssConstellationType::GLONASS),
193 25.3),
194 getMockSvInfoV2_1(
195 getMockSvInfoV2_0(getMockSvInfoV1_0(10, V1_0::GnssConstellationType::GLONASS,
196 25.0, 66.0, 247.0),
197 V2_0::GnssConstellationType::GLONASS),
198 20.0),
Sasha Kuznetsov845f6d52019-12-04 12:17:50 -0800199 getMockSvInfoV2_1(
200 getMockSvInfoV2_0(getMockSvInfoV1_0(3, V1_0::GnssConstellationType::UNKNOWN,
201 22.0, 35.0, 112.0),
202 V2_0::GnssConstellationType::IRNSS),
203 19.7),
Yu-Han Yangc06b5362019-10-25 14:14:35 -0700204 };
205 return gnssSvInfoList;
206}
207
208GnssSvInfoV2_1 Utils::getMockSvInfoV2_1(GnssSvInfoV2_0 gnssSvInfoV2_0, float basebandCN0DbHz) {
209 GnssSvInfoV2_1 gnssSvInfoV2_1 = {
210 .v2_0 = gnssSvInfoV2_0,
211 .basebandCN0DbHz = basebandCN0DbHz,
212 };
213 return gnssSvInfoV2_1;
214}
215
216GnssSvInfoV2_0 Utils::getMockSvInfoV2_0(GnssSvInfoV1_0 gnssSvInfoV1_0,
217 V2_0::GnssConstellationType type) {
218 GnssSvInfoV2_0 gnssSvInfoV2_0 = {
219 .v1_0 = gnssSvInfoV1_0,
220 .constellation = type,
221 };
222 return gnssSvInfoV2_0;
223}
224
225GnssSvInfoV1_0 Utils::getMockSvInfoV1_0(int16_t svid, V1_0::GnssConstellationType type,
226 float cN0DbHz, float elevationDegrees,
227 float azimuthDegrees) {
228 GnssSvInfoV1_0 svInfo = {.svid = svid,
229 .constellation = type,
230 .cN0Dbhz = cN0DbHz,
231 .elevationDegrees = elevationDegrees,
232 .azimuthDegrees = azimuthDegrees,
233 .svFlag = GnssSvFlags::USED_IN_FIX | GnssSvFlags::HAS_EPHEMERIS_DATA |
234 GnssSvFlags::HAS_ALMANAC_DATA};
Yu-Han Yanga5098612019-02-08 16:22:07 -0800235 return svInfo;
236}
237
Yu-Han Yanga5098612019-02-08 16:22:07 -0800238} // namespace common
239} // namespace gnss
240} // namespace hardware
241} // namespace android