1 /*
2 * Copyright (C) 2022 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 // Define LOG_TAG before <log/log.h> to overwrite the default value.
18 #define LOG_TAG "GnssJni"
19
20 #include "Gnss.h"
21
22 #include <binder/IServiceManager.h>
23
24 #include "Utils.h"
25
26 namespace android::gnss {
27
28 using hardware::Return;
29
30 using GnssLocationAidl = hardware::gnss::GnssLocation;
31 using GnssLocation_V1_0 = hardware::gnss::V1_0::GnssLocation;
32 using GnssLocation_V2_0 = hardware::gnss::V2_0::GnssLocation;
33 using IAGnssAidl = hardware::gnss::IAGnss;
34 using IAGnssRilAidl = hardware::gnss::IAGnssRil;
35 using IGnssAidl = hardware::gnss::IGnss;
36 using IGnss_V1_0 = hardware::gnss::V1_0::IGnss;
37 using IGnss_V1_1 = hardware::gnss::V1_1::IGnss;
38 using IGnss_V2_0 = hardware::gnss::V2_0::IGnss;
39 using IGnss_V2_1 = hardware::gnss::V2_1::IGnss;
40 using IGnssAntennaInfoAidl = hardware::gnss::IGnssAntennaInfo;
41 using IGnssCallbackAidl = hardware::gnss::IGnssCallback;
42 using IGnssCallback_V1_0 = hardware::gnss::V1_0::IGnssCallback;
43 using IGnssCallback_V2_0 = hardware::gnss::V2_0::IGnssCallback;
44 using IGnssCallback_V2_1 = hardware::gnss::V2_1::IGnssCallback;
45 using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
46 using IGnssDebugAidl = hardware::gnss::IGnssDebug;
47 using android::hardware::gnss::IGnssPsds;
48
49 namespace {
50
createGnssLocation(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)51 GnssLocationAidl createGnssLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
52 jdouble longitudeDegrees, jdouble altitudeMeters,
53 jfloat speedMetersPerSec, jfloat bearingDegrees,
54 jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
55 jfloat speedAccuracyMetersPerSecond,
56 jfloat bearingAccuracyDegrees, jlong timestamp,
57 jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
58 jdouble elapsedRealtimeUncertaintyNanos) {
59 GnssLocationAidl location;
60 location.gnssLocationFlags = static_cast<int>(gnssLocationFlags);
61 location.latitudeDegrees = static_cast<double>(latitudeDegrees);
62 location.longitudeDegrees = static_cast<double>(longitudeDegrees);
63 location.altitudeMeters = static_cast<double>(altitudeMeters);
64 location.speedMetersPerSec = static_cast<double>(speedMetersPerSec);
65 location.bearingDegrees = static_cast<double>(bearingDegrees);
66 location.horizontalAccuracyMeters = static_cast<double>(horizontalAccuracyMeters);
67 location.verticalAccuracyMeters = static_cast<double>(verticalAccuracyMeters);
68 location.speedAccuracyMetersPerSecond = static_cast<double>(speedAccuracyMetersPerSecond);
69 location.bearingAccuracyDegrees = static_cast<double>(bearingAccuracyDegrees);
70 location.timestampMillis = static_cast<uint64_t>(timestamp);
71
72 location.elapsedRealtime.flags = static_cast<int>(elapsedRealtimeFlags);
73 location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
74 location.elapsedRealtime.timeUncertaintyNs =
75 static_cast<double>(elapsedRealtimeUncertaintyNanos);
76
77 return location;
78 }
79
createGnssLocation_V1_0(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp)80 GnssLocation_V1_0 createGnssLocation_V1_0(jint gnssLocationFlags, jdouble latitudeDegrees,
81 jdouble longitudeDegrees, jdouble altitudeMeters,
82 jfloat speedMetersPerSec, jfloat bearingDegrees,
83 jfloat horizontalAccuracyMeters,
84 jfloat verticalAccuracyMeters,
85 jfloat speedAccuracyMetersPerSecond,
86 jfloat bearingAccuracyDegrees, jlong timestamp) {
87 GnssLocation_V1_0 location;
88 location.gnssLocationFlags = static_cast<uint16_t>(gnssLocationFlags);
89 location.latitudeDegrees = static_cast<double>(latitudeDegrees);
90 location.longitudeDegrees = static_cast<double>(longitudeDegrees);
91 location.altitudeMeters = static_cast<double>(altitudeMeters);
92 location.speedMetersPerSec = static_cast<float>(speedMetersPerSec);
93 location.bearingDegrees = static_cast<float>(bearingDegrees);
94 location.horizontalAccuracyMeters = static_cast<float>(horizontalAccuracyMeters);
95 location.verticalAccuracyMeters = static_cast<float>(verticalAccuracyMeters);
96 location.speedAccuracyMetersPerSecond = static_cast<float>(speedAccuracyMetersPerSecond);
97 location.bearingAccuracyDegrees = static_cast<float>(bearingAccuracyDegrees);
98 location.timestamp = static_cast<uint64_t>(timestamp);
99
100 return location;
101 }
102
createGnssLocation_V2_0(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)103 GnssLocation_V2_0 createGnssLocation_V2_0(jint gnssLocationFlags, jdouble latitudeDegrees,
104 jdouble longitudeDegrees, jdouble altitudeMeters,
105 jfloat speedMetersPerSec, jfloat bearingDegrees,
106 jfloat horizontalAccuracyMeters,
107 jfloat verticalAccuracyMeters,
108 jfloat speedAccuracyMetersPerSecond,
109 jfloat bearingAccuracyDegrees, jlong timestamp,
110 jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
111 jdouble elapsedRealtimeUncertaintyNanos) {
112 GnssLocation_V2_0 location;
113 location.v1_0 = createGnssLocation_V1_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
114 altitudeMeters, speedMetersPerSec, bearingDegrees,
115 horizontalAccuracyMeters, verticalAccuracyMeters,
116 speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
117 timestamp);
118
119 location.elapsedRealtime.flags = static_cast<uint16_t>(elapsedRealtimeFlags);
120 location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
121 location.elapsedRealtime.timeUncertaintyNs =
122 static_cast<uint64_t>(elapsedRealtimeUncertaintyNanos);
123
124 return location;
125 }
126
127 } // anonymous namespace
128
129 // Implementation of GnssHal, which unifies all versions of GNSS HALs
130
GnssHal()131 GnssHal::GnssHal() {
132 gnssHalAidl = waitForVintfService<IGnssAidl>();
133 if (gnssHalAidl != nullptr) {
134 ALOGD("Successfully got GNSS AIDL handle. Version=%d.", gnssHalAidl->getInterfaceVersion());
135 if (gnssHalAidl->getInterfaceVersion() >= 2) {
136 return;
137 }
138 }
139
140 ALOGD("Trying IGnss_V2_1::getService()");
141 gnssHal_V2_1 = IGnss_V2_1::getService();
142 if (gnssHal_V2_1 != nullptr) {
143 gnssHal_V2_0 = gnssHal_V2_1;
144 gnssHal_V1_1 = gnssHal_V2_1;
145 gnssHal = gnssHal_V2_1;
146 return;
147 }
148
149 ALOGD("gnssHal 2.1 was null, trying 2.0");
150 gnssHal_V2_0 = IGnss_V2_0::getService();
151 if (gnssHal_V2_0 != nullptr) {
152 gnssHal_V1_1 = gnssHal_V2_0;
153 gnssHal = gnssHal_V2_0;
154 return;
155 }
156
157 ALOGD("gnssHal 2.0 was null, trying 1.1");
158 gnssHal_V1_1 = IGnss_V1_1::getService();
159 if (gnssHal_V1_1 != nullptr) {
160 gnssHal = gnssHal_V1_1;
161 return;
162 }
163
164 ALOGD("gnssHal 1.1 was null, trying 1.0");
165 gnssHal = IGnss_V1_0::getService();
166 }
167
isSupported()168 jboolean GnssHal::isSupported() {
169 return (gnssHalAidl != nullptr || gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
170 }
171
linkToDeath()172 void GnssHal::linkToDeath() {
173 if (gnssHalAidl != nullptr) {
174 gnssHalDeathRecipientAidl = new GnssDeathRecipientAidl();
175 status_t linked = IInterface::asBinder(gnssHalAidl)->linkToDeath(gnssHalDeathRecipientAidl);
176 if (linked != OK) {
177 ALOGE("Unable to link to GNSS AIDL HAL death notification");
178 } else {
179 ALOGD("Successfully linked to GNSS AIDL HAl death notification");
180 }
181 }
182
183 if (gnssHal != nullptr) {
184 gnssHalDeathRecipient = new GnssDeathRecipient();
185 hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
186 if (!linked.isOk()) {
187 ALOGE("Transaction error in linking to GnssHAL death: %s",
188 linked.description().c_str());
189 } else if (!linked) {
190 ALOGW("Unable to link to GnssHal death notifications");
191 } else {
192 ALOGD("Link to death notification successful");
193 }
194 }
195 }
196
setCallback()197 jboolean GnssHal::setCallback() {
198 if (gnssHalAidl != nullptr) {
199 sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
200 auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl);
201 if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) {
202 return JNI_FALSE;
203 }
204 }
205 if (gnssHal != nullptr) {
206 Return<bool> result = false;
207 sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallbackHidl();
208 if (gnssHal_V2_1 != nullptr) {
209 result = gnssHal_V2_1->setCallback_2_1(gnssCbIface);
210 } else if (gnssHal_V2_0 != nullptr) {
211 result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
212 } else if (gnssHal_V1_1 != nullptr) {
213 result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
214 } else {
215 result = gnssHal->setCallback(gnssCbIface);
216 }
217 if (!checkHidlReturn(result, "IGnss setCallback() failed.")) {
218 return JNI_FALSE;
219 }
220 }
221 return JNI_TRUE;
222 }
223
close()224 void GnssHal::close() {
225 if (gnssHalAidl != nullptr) {
226 auto status = gnssHalAidl->close();
227 checkAidlStatus(status, "IGnssAidl close() failed.");
228 }
229
230 if (gnssHal != nullptr) {
231 auto result = gnssHal->cleanup();
232 checkHidlReturn(result, "IGnss cleanup() failed.");
233 }
234 }
235
start()236 jboolean GnssHal::start() {
237 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
238 auto status = gnssHalAidl->start();
239 return checkAidlStatus(status, "IGnssAidl start() failed.");
240 }
241
242 if (gnssHal == nullptr) {
243 return JNI_FALSE;
244 }
245
246 auto result = gnssHal->start();
247 return checkHidlReturn(result, "IGnss start() failed.");
248 }
249
stop()250 jboolean GnssHal::stop() {
251 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
252 auto status = gnssHalAidl->stop();
253 return checkAidlStatus(status, "IGnssAidl stop() failed.");
254 }
255
256 if (gnssHal == nullptr) {
257 return JNI_FALSE;
258 }
259
260 auto result = gnssHal->stop();
261 return checkHidlReturn(result, "IGnss stop() failed.");
262 }
263
startSvStatus()264 jboolean GnssHal::startSvStatus() {
265 isSvStatusRegistered = true;
266 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
267 auto status = gnssHalAidl->startSvStatus();
268 return checkAidlStatus(status, "IGnssAidl startSvStatus() failed.");
269 }
270 if (gnssHal == nullptr) {
271 return JNI_FALSE;
272 }
273 return JNI_TRUE;
274 }
275
stopSvStatus()276 jboolean GnssHal::stopSvStatus() {
277 isSvStatusRegistered = false;
278 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
279 auto status = gnssHalAidl->stopSvStatus();
280 return checkAidlStatus(status, "IGnssAidl stopSvStatus() failed.");
281 }
282 if (gnssHal == nullptr) {
283 return JNI_FALSE;
284 }
285 return JNI_TRUE;
286 }
287
startNmea()288 jboolean GnssHal::startNmea() {
289 isNmeaRegistered = true;
290 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
291 auto status = gnssHalAidl->startNmea();
292 return checkAidlStatus(status, "IGnssAidl startNmea() failed.");
293 }
294 if (gnssHal == nullptr) {
295 return JNI_FALSE;
296 }
297 return JNI_TRUE;
298 }
299
stopNmea()300 jboolean GnssHal::stopNmea() {
301 isNmeaRegistered = false;
302 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
303 auto status = gnssHalAidl->stopNmea();
304 return checkAidlStatus(status, "IGnssAidl stopNmea() failed.");
305 }
306 if (gnssHal == nullptr) {
307 return JNI_FALSE;
308 }
309 return JNI_TRUE;
310 }
311
readNmea(jbyteArray & nmeaArray,jint & buffer_size)312 jint GnssHal::readNmea(jbyteArray& nmeaArray, jint& buffer_size) {
313 // this should only be called from within a call to reportNmea
314 JNIEnv* env = getJniEnv();
315 jbyte* nmea = reinterpret_cast<jbyte*>(env->GetPrimitiveArrayCritical(nmeaArray, 0));
316 int length = GnssCallbackHidl::sNmeaStringLength;
317 if (length > buffer_size) {
318 length = buffer_size;
319 }
320 memcpy(nmea, GnssCallbackHidl::sNmeaString, length);
321 env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT);
322 return (jint)length;
323 }
324
setPositionMode(jint mode,jint recurrence,jint min_interval,jint preferred_accuracy,jint preferred_time,jboolean low_power_mode)325 jboolean GnssHal::setPositionMode(jint mode, jint recurrence, jint min_interval,
326 jint preferred_accuracy, jint preferred_time,
327 jboolean low_power_mode) {
328 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
329 IGnssAidl::PositionModeOptions options;
330 options.mode = static_cast<IGnssAidl::GnssPositionMode>(mode);
331 options.recurrence = static_cast<IGnssAidl::GnssPositionRecurrence>(recurrence);
332 options.minIntervalMs = min_interval;
333 options.preferredAccuracyMeters = preferred_accuracy;
334 options.preferredTimeMs = preferred_time;
335 options.lowPowerMode = low_power_mode;
336 auto status = gnssHalAidl->setPositionMode(options);
337 return checkAidlStatus(status, "IGnssAidl setPositionMode() failed.");
338 }
339
340 Return<bool> result = false;
341 if (gnssHal_V1_1 != nullptr) {
342 result = gnssHal_V1_1->setPositionMode_1_1(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
343 static_cast<IGnss_V1_0::GnssPositionRecurrence>(
344 recurrence),
345 min_interval, preferred_accuracy, preferred_time,
346 low_power_mode);
347 } else if (gnssHal != nullptr) {
348 result = gnssHal->setPositionMode(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
349 static_cast<IGnss_V1_0::GnssPositionRecurrence>(
350 recurrence),
351 min_interval, preferred_accuracy, preferred_time);
352 }
353 return checkHidlReturn(result, "IGnss setPositionMode() failed.");
354 }
355
deleteAidingData(jint flags)356 void GnssHal::deleteAidingData(jint flags) {
357 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
358 auto status = gnssHalAidl->deleteAidingData(static_cast<IGnssAidl::GnssAidingData>(flags));
359 checkAidlStatus(status, "IGnssAidl deleteAidingData() failed.");
360 return;
361 }
362
363 if (gnssHal == nullptr) {
364 return;
365 }
366
367 auto result = gnssHal->deleteAidingData(static_cast<IGnss_V1_0::GnssAidingData>(flags));
368 checkHidlReturn(result, "IGnss deleteAidingData() failed.");
369 }
370
injectTime(jlong time,jlong timeReference,jint uncertainty)371 void GnssHal::injectTime(jlong time, jlong timeReference, jint uncertainty) {
372 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
373 auto status = gnssHalAidl->injectTime(time, timeReference, uncertainty);
374 checkAidlStatus(status, "IGnssAidl injectTime() failed.");
375 return;
376 }
377
378 if (gnssHal == nullptr) {
379 return;
380 }
381 auto result = gnssHal->injectTime(time, timeReference, uncertainty);
382 checkHidlReturn(result, "IGnss injectTime() failed.");
383 }
384
injectLocation(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)385 void GnssHal::injectLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
386 jdouble longitudeDegrees, jdouble altitudeMeters,
387 jfloat speedMetersPerSec, jfloat bearingDegrees,
388 jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
389 jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
390 jlong timestamp, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
391 jdouble elapsedRealtimeUncertaintyNanos) {
392 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
393 GnssLocationAidl location =
394 createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
395 altitudeMeters, speedMetersPerSec, bearingDegrees,
396 horizontalAccuracyMeters, verticalAccuracyMeters,
397 speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
398 elapsedRealtimeFlags, elapsedRealtimeNanos,
399 elapsedRealtimeUncertaintyNanos);
400 auto status = gnssHalAidl->injectLocation(location);
401 checkAidlStatus(status, "IGnssAidl injectLocation() failed.");
402 return;
403 }
404
405 if (gnssHal == nullptr) {
406 return;
407 }
408 auto result =
409 gnssHal->injectLocation(latitudeDegrees, longitudeDegrees, horizontalAccuracyMeters);
410 checkHidlReturn(result, "IGnss injectLocation() failed.");
411 }
412
injectBestLocation(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)413 void GnssHal::injectBestLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
414 jdouble longitudeDegrees, jdouble altitudeMeters,
415 jfloat speedMetersPerSec, jfloat bearingDegrees,
416 jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
417 jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
418 jlong timestamp, jint elapsedRealtimeFlags,
419 jlong elapsedRealtimeNanos,
420 jdouble elapsedRealtimeUncertaintyNanos) {
421 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
422 GnssLocationAidl location =
423 createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
424 altitudeMeters, speedMetersPerSec, bearingDegrees,
425 horizontalAccuracyMeters, verticalAccuracyMeters,
426 speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
427 elapsedRealtimeFlags, elapsedRealtimeNanos,
428 elapsedRealtimeUncertaintyNanos);
429 auto status = gnssHalAidl->injectBestLocation(location);
430 checkAidlStatus(status, "IGnssAidl injectBestLocation() failed.");
431 return;
432 }
433
434 if (gnssHal_V2_0 != nullptr) {
435 GnssLocation_V2_0 location =
436 createGnssLocation_V2_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
437 altitudeMeters, speedMetersPerSec, bearingDegrees,
438 horizontalAccuracyMeters, verticalAccuracyMeters,
439 speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
440 timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos,
441 elapsedRealtimeUncertaintyNanos);
442 auto result = gnssHal_V2_0->injectBestLocation_2_0(location);
443 checkHidlReturn(result, "IGnss injectBestLocation_2_0() failed.");
444 return;
445 }
446
447 if (gnssHal_V1_1 != nullptr) {
448 GnssLocation_V1_0 location =
449 createGnssLocation_V1_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
450 altitudeMeters, speedMetersPerSec, bearingDegrees,
451 horizontalAccuracyMeters, verticalAccuracyMeters,
452 speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
453 timestamp);
454 auto result = gnssHal_V1_1->injectBestLocation(location);
455 checkHidlReturn(result, "IGnss injectBestLocation() failed.");
456 return;
457 }
458
459 ALOGE("IGnss injectBestLocation() is called but gnssHal_V1_1 is not available.");
460 }
461
getAGnssInterface()462 std::unique_ptr<AGnssInterface> GnssHal::getAGnssInterface() {
463 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
464 sp<IAGnssAidl> agnssAidl;
465 auto status = gnssHalAidl->getExtensionAGnss(&agnssAidl);
466 if (checkAidlStatus(status, "Unable to get a handle to AGnss interface.")) {
467 return std::make_unique<gnss::AGnss>(agnssAidl);
468 }
469 } else if (gnssHal_V2_0 != nullptr) {
470 auto agnss_V2_0 = gnssHal_V2_0->getExtensionAGnss_2_0();
471 if (checkHidlReturn(agnss_V2_0, "Unable to get a handle to AGnss_V2_0")) {
472 return std::make_unique<gnss::AGnss_V2_0>(agnss_V2_0);
473 }
474 } else if (gnssHal != nullptr) {
475 auto agnss_V1_0 = gnssHal->getExtensionAGnss();
476 if (checkHidlReturn(agnss_V1_0, "Unable to get a handle to AGnss_V1_0")) {
477 return std::make_unique<gnss::AGnss_V1_0>(agnss_V1_0);
478 }
479 }
480 return nullptr;
481 }
482
getAGnssRilInterface()483 std::unique_ptr<AGnssRilInterface> GnssHal::getAGnssRilInterface() {
484 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
485 sp<IAGnssRilAidl> agnssRilAidl;
486 auto status = gnssHalAidl->getExtensionAGnssRil(&agnssRilAidl);
487 if (checkAidlStatus(status, "Unable to get a handle to AGnssRil interface.")) {
488 return std::make_unique<gnss::AGnssRil>(agnssRilAidl);
489 }
490 } else if (gnssHal_V2_0 != nullptr) {
491 auto agnssRil_V2_0 = gnssHal_V2_0->getExtensionAGnssRil_2_0();
492 if (checkHidlReturn(agnssRil_V2_0, "Unable to get a handle to AGnssRil_V2_0")) {
493 return std::make_unique<gnss::AGnssRil_V2_0>(agnssRil_V2_0);
494 }
495 } else if (gnssHal != nullptr) {
496 auto agnssRil_V1_0 = gnssHal->getExtensionAGnssRil();
497 if (checkHidlReturn(agnssRil_V1_0, "Unable to get a handle to AGnssRil_V1_0")) {
498 return std::make_unique<gnss::AGnssRil_V1_0>(agnssRil_V1_0);
499 }
500 }
501 return nullptr;
502 }
503
getGnssNavigationMessageInterface()504 std::unique_ptr<GnssNavigationMessageInterface> GnssHal::getGnssNavigationMessageInterface() {
505 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
506 sp<hardware::gnss::IGnssNavigationMessageInterface> gnssNavigationMessage;
507 auto status = gnssHalAidl->getExtensionGnssNavigationMessage(&gnssNavigationMessage);
508 if (checkAidlStatus(status,
509 "Unable to get a handle to GnssNavigationMessage AIDL interface.")) {
510 return std::make_unique<gnss::GnssNavigationMessageAidl>(gnssNavigationMessage);
511 }
512 } else if (gnssHal != nullptr) {
513 auto gnssNavigationMessage = gnssHal->getExtensionGnssNavigationMessage();
514 if (checkHidlReturn(gnssNavigationMessage,
515 "Unable to get a handle to GnssNavigationMessage interface.")) {
516 return std::make_unique<gnss::GnssNavigationMessageHidl>(gnssNavigationMessage);
517 }
518 }
519 return nullptr;
520 }
521
getGnssMeasurementInterface()522 std::unique_ptr<GnssMeasurementInterface> GnssHal::getGnssMeasurementInterface() {
523 // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means,
524 // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement
525 // 2.0@IGnss can be paired with {1.0, 1,1, 2.0}@IGnssMeasurement
526 // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement
527 // 1.0@IGnss is paired with 1.0@IGnssMeasurement
528 if (gnssHalAidl != nullptr) {
529 sp<hardware::gnss::IGnssMeasurementInterface> gnssMeasurement;
530 auto status = gnssHalAidl->getExtensionGnssMeasurement(&gnssMeasurement);
531 if (checkAidlStatus(status, "Unable to get a handle to GnssMeasurement AIDL interface.")) {
532 return std::make_unique<android::gnss::GnssMeasurement>(gnssMeasurement);
533 }
534 }
535 if (gnssHal_V2_1 != nullptr) {
536 auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1();
537 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_1")) {
538 return std::make_unique<android::gnss::GnssMeasurement_V2_1>(gnssMeasurement);
539 }
540 }
541 if (gnssHal_V2_0 != nullptr) {
542 auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0();
543 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_0")) {
544 return std::make_unique<android::gnss::GnssMeasurement_V2_0>(gnssMeasurement);
545 }
546 }
547 if (gnssHal_V1_1 != nullptr) {
548 auto gnssMeasurement = gnssHal_V1_1->getExtensionGnssMeasurement_1_1();
549 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_1")) {
550 return std::make_unique<android::gnss::GnssMeasurement_V1_1>(gnssMeasurement);
551 }
552 }
553 if (gnssHal != nullptr) {
554 auto gnssMeasurement = gnssHal->getExtensionGnssMeasurement();
555 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_0")) {
556 return std::make_unique<android::gnss::GnssMeasurement_V1_0>(gnssMeasurement);
557 }
558 }
559 return nullptr;
560 }
561
getGnssDebugInterface()562 std::unique_ptr<GnssDebugInterface> GnssHal::getGnssDebugInterface() {
563 // Allow all causal combinations between IGnss.hal and IGnssDebug.hal. That means,
564 // 2.0@IGnss can be paired with {1.0, 2.0}@IGnssDebug
565 // 1.0@IGnss is paired with 1.0@IGnssDebug
566 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
567 sp<IGnssDebugAidl> gnssDebugAidl;
568 auto status = gnssHalAidl->getExtensionGnssDebug(&gnssDebugAidl);
569 if (checkAidlStatus(status, "Unable to get a handle to GnssDebug interface.")) {
570 return std::make_unique<gnss::GnssDebug>(gnssDebugAidl);
571 }
572 }
573 if (gnssHal_V2_0 != nullptr) {
574 auto gnssDebug_V2_0 = gnssHal_V2_0->getExtensionGnssDebug_2_0();
575 if (checkHidlReturn(gnssDebug_V2_0, "Unable to get a handle to GnssDebug_V2_0.")) {
576 return std::make_unique<gnss::GnssDebug_V2_0>(gnssDebug_V2_0);
577 }
578 }
579 if (gnssHal != nullptr) {
580 auto gnssDebug_V1_0 = gnssHal->getExtensionGnssDebug();
581 if (checkHidlReturn(gnssDebug_V1_0, "Unable to get a handle to GnssDebug_V1_0.")) {
582 return std::make_unique<gnss::GnssDebug_V1_0>(gnssDebug_V1_0);
583 }
584 }
585 return nullptr;
586 }
587
getGnssConfigurationInterface()588 std::unique_ptr<GnssConfigurationInterface> GnssHal::getGnssConfigurationInterface() {
589 if (gnssHalAidl != nullptr) {
590 sp<IGnssConfigurationAidl> gnssConfigurationAidl;
591 auto status = gnssHalAidl->getExtensionGnssConfiguration(&gnssConfigurationAidl);
592 if (checkAidlStatus(status,
593 "Unable to get a handle to GnssConfiguration AIDL interface.")) {
594 return std::make_unique<android::gnss::GnssConfiguration>(gnssConfigurationAidl);
595 }
596 } else if (gnssHal_V2_1 != nullptr) {
597 auto gnssConfiguration = gnssHal_V2_1->getExtensionGnssConfiguration_2_1();
598 if (checkHidlReturn(gnssConfiguration,
599 "Unable to get a handle to GnssConfiguration_V2_1")) {
600 return std::make_unique<android::gnss::GnssConfiguration_V2_1>(gnssConfiguration);
601 }
602 } else if (gnssHal_V2_0 != nullptr) {
603 auto gnssConfiguration = gnssHal_V2_0->getExtensionGnssConfiguration_2_0();
604 if (checkHidlReturn(gnssConfiguration,
605 "Unable to get a handle to GnssConfiguration_V2_0")) {
606 return std::make_unique<android::gnss::GnssConfiguration_V2_0>(gnssConfiguration);
607 }
608 } else if (gnssHal_V1_1 != nullptr) {
609 auto gnssConfiguration = gnssHal_V1_1->getExtensionGnssConfiguration_1_1();
610 if (checkHidlReturn(gnssConfiguration,
611 "Unable to get a handle to GnssConfiguration_V1_1")) {
612 return std::make_unique<gnss::GnssConfiguration_V1_1>(gnssConfiguration);
613 }
614 } else if (gnssHal != nullptr) {
615 auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
616 if (checkHidlReturn(gnssConfiguration,
617 "Unable to get a handle to GnssConfiguration_V1_0")) {
618 return std::make_unique<gnss::GnssConfiguration_V1_0>(gnssConfiguration);
619 }
620 }
621 return nullptr;
622 }
623
getGnssGeofenceInterface()624 std::unique_ptr<GnssGeofenceInterface> GnssHal::getGnssGeofenceInterface() {
625 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
626 sp<hardware::gnss::IGnssGeofence> gnssGeofence;
627 auto status = gnssHalAidl->getExtensionGnssGeofence(&gnssGeofence);
628 if (checkAidlStatus(status, "Unable to get a handle to GnssGeofence AIDL interface.")) {
629 return std::make_unique<gnss::GnssGeofenceAidl>(gnssGeofence);
630 }
631 } else if (gnssHal != nullptr) {
632 auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
633 if (checkHidlReturn(gnssGeofencing, "Unable to get a handle to GnssGeofencing")) {
634 return std::make_unique<gnss::GnssGeofenceHidl>(gnssGeofencing);
635 }
636 }
637 return nullptr;
638 }
639
getGnssBatchingInterface()640 std::unique_ptr<GnssBatchingInterface> GnssHal::getGnssBatchingInterface() {
641 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
642 sp<android::hardware::gnss::IGnssBatching> gnssBatchingAidl;
643 auto status = gnssHalAidl->getExtensionGnssBatching(&gnssBatchingAidl);
644 if (checkAidlStatus(status, "Unable to get a handle to GnssBatching interface.")) {
645 return std::make_unique<gnss::GnssBatching>(gnssBatchingAidl);
646 }
647 }
648 if (gnssHal_V2_0 != nullptr) {
649 auto gnssBatching_V2_0 = gnssHal_V2_0->getExtensionGnssBatching_2_0();
650 if (checkHidlReturn(gnssBatching_V2_0, "Unable to get a handle to GnssBatching_V2_0")) {
651 return std::make_unique<gnss::GnssBatching_V2_0>(gnssBatching_V2_0);
652 }
653 }
654 if (gnssHal != nullptr) {
655 auto gnssBatching_V1_0 = gnssHal->getExtensionGnssBatching();
656 if (checkHidlReturn(gnssBatching_V1_0, "Unable to get a handle to GnssBatching")) {
657 return std::make_unique<gnss::GnssBatching_V1_0>(gnssBatching_V1_0);
658 }
659 }
660 return nullptr;
661 }
662
getMeasurementCorrectionsInterface()663 std::unique_ptr<MeasurementCorrectionsInterface> GnssHal::getMeasurementCorrectionsInterface() {
664 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
665 sp<android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface>
666 gnssMeasurementCorrectionsAidl;
667 auto status =
668 gnssHalAidl->getExtensionMeasurementCorrections(&gnssMeasurementCorrectionsAidl);
669 if (checkAidlStatus(status,
670 "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
671 return std::make_unique<gnss::MeasurementCorrectionsIface_Aidl>(
672 gnssMeasurementCorrectionsAidl);
673 }
674 }
675 if (gnssHal_V2_1 != nullptr) {
676 auto gnssCorrections = gnssHal_V2_1->getExtensionMeasurementCorrections_1_1();
677 if (checkHidlReturn(gnssCorrections,
678 "Unable to get a handle to GnssMeasurementCorrections HIDL "
679 "interface")) {
680 return std::make_unique<gnss::MeasurementCorrectionsIface_V1_1>(gnssCorrections);
681 }
682 }
683 if (gnssHal_V2_0 != nullptr) {
684 auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
685 if (checkHidlReturn(gnssCorrections,
686 "Unable to get a handle to GnssMeasurementCorrections HIDL "
687 "interface")) {
688 return std::make_unique<gnss::MeasurementCorrectionsIface_V1_0>(gnssCorrections);
689 }
690 }
691 return nullptr;
692 }
693
getGnssVisibilityControlInterface()694 std::unique_ptr<GnssVisibilityControlInterface> GnssHal::getGnssVisibilityControlInterface() {
695 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
696 sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
697 gnssVisibilityControlAidl;
698 auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl);
699 if (checkAidlStatus(status,
700 "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
701 return std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl);
702 }
703 } else if (gnssHal_V2_0 != nullptr) {
704 auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl();
705 if (checkHidlReturn(gnssVisibilityControlHidl,
706 "Unable to get a handle to GnssVisibilityControl HIDL interface")) {
707 return std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl);
708 }
709 }
710 return nullptr;
711 }
712
getGnssAntennaInfoInterface()713 std::unique_ptr<GnssAntennaInfoInterface> GnssHal::getGnssAntennaInfoInterface() {
714 if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
715 sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl;
716 auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl);
717 if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) {
718 return std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl);
719 }
720 } else if (gnssHal_V2_1 != nullptr) {
721 auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo();
722 if (checkHidlReturn(gnssAntennaInfo_V2_1,
723 "Unable to get a handle to GnssAntennaInfo_V2_1")) {
724 return std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1);
725 }
726 }
727 return nullptr;
728 }
729
getGnssPsdsInterface()730 std::unique_ptr<GnssPsdsInterface> GnssHal::getGnssPsdsInterface() {
731 if (gnssHalAidl != nullptr) {
732 sp<IGnssPsds> gnssPsdsAidl;
733 auto status = gnssHalAidl->getExtensionPsds(&gnssPsdsAidl);
734 if (checkAidlStatus(status, "Unable to get a handle to PSDS interface.")) {
735 return std::make_unique<gnss::GnssPsdsAidl>(gnssPsdsAidl);
736 }
737 } else if (gnssHal != nullptr) {
738 auto gnssXtra = gnssHal->getExtensionXtra();
739 if (checkHidlReturn(gnssXtra, "Unable to get a handle to XTRA interface.")) {
740 return std::make_unique<gnss::GnssPsdsHidl>(gnssXtra);
741 }
742 }
743 return nullptr;
744 }
745
getGnssPowerIndicationInterface()746 sp<hardware::gnss::IGnssPowerIndication> GnssHal::getGnssPowerIndicationInterface() {
747 if (gnssHalAidl != nullptr) {
748 sp<hardware::gnss::IGnssPowerIndication> gnssPowerIndication;
749 auto status = gnssHalAidl->getExtensionGnssPowerIndication(&gnssPowerIndication);
750 if (checkAidlStatus(status, "Unable to get a handle to GnssPowerIndication")) {
751 return gnssPowerIndication;
752 }
753 }
754 return nullptr;
755 }
756
getGnssNiInterface()757 sp<hardware::gnss::V1_0::IGnssNi> GnssHal::getGnssNiInterface() {
758 if (gnssHal != nullptr) {
759 auto gnssNi = gnssHal->getExtensionGnssNi();
760 if (checkHidlReturn(gnssNi, "Unable to get a handle to GnssNi")) {
761 return gnssNi;
762 }
763 }
764 return nullptr;
765 }
766
767 } // namespace android::gnss
768