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 #define LOG_TAG "Gnss"
18
19 #include "Gnss.h"
20 #include "GnssAntennaInfo.h"
21 #include "GnssDebug.h"
22 #include "GnssMeasurement.h"
23 #include "GnssMeasurementCorrections.h"
24 #include "Utils.h"
25
26 #include <log/log.h>
27
28 using ::android::hardware::gnss::common::Utils;
29 using ::android::hardware::gnss::measurement_corrections::V1_1::implementation::
30 GnssMeasurementCorrections;
31
32 namespace android {
33 namespace hardware {
34 namespace gnss {
35 namespace V2_1 {
36 namespace implementation {
37
38 sp<V2_1::IGnssCallback> Gnss::sGnssCallback_2_1 = nullptr;
39 sp<V2_0::IGnssCallback> Gnss::sGnssCallback_2_0 = nullptr;
40 sp<V1_1::IGnssCallback> Gnss::sGnssCallback_1_1 = nullptr;
41 sp<V1_0::IGnssCallback> Gnss::sGnssCallback_1_0 = nullptr;
42
Gnss()43 Gnss::Gnss() : mMinIntervalMs(1000), mGnssConfiguration{new GnssConfiguration()} {}
44
~Gnss()45 Gnss::~Gnss() {
46 stop();
47 }
48
start()49 Return<bool> Gnss::start() {
50 ALOGD("start");
51 if (mIsActive) {
52 ALOGW("Gnss has started. Restarting...");
53 stop();
54 }
55
56 mIsActive = true;
57 mThread = std::thread([this]() {
58 while (mIsActive == true) {
59 auto svStatus = filterBlacklistedSatellitesV2_1(Utils::getMockSvInfoListV2_1());
60 this->reportSvStatus(svStatus);
61
62 if (sGnssCallback_2_1 != nullptr || sGnssCallback_2_0 != nullptr) {
63 const auto location = Utils::getMockLocationV2_0();
64 this->reportLocation(location);
65 } else {
66 const auto location = Utils::getMockLocationV1_0();
67 this->reportLocation(location);
68 }
69
70 std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMs));
71 }
72 });
73 return true;
74 }
75
filterBlacklistedSatellitesV2_1(hidl_vec<GnssSvInfo> gnssSvInfoList)76 hidl_vec<GnssSvInfo> Gnss::filterBlacklistedSatellitesV2_1(hidl_vec<GnssSvInfo> gnssSvInfoList) {
77 for (uint32_t i = 0; i < gnssSvInfoList.size(); i++) {
78 if (mGnssConfiguration->isBlacklistedV2_1(gnssSvInfoList[i])) {
79 gnssSvInfoList[i].v2_0.v1_0.svFlag &=
80 ~static_cast<uint8_t>(V1_0::IGnssCallback::GnssSvFlags::USED_IN_FIX);
81 }
82 }
83 return gnssSvInfoList;
84 }
85
stop()86 Return<bool> Gnss::stop() {
87 ALOGD("stop");
88 mIsActive = false;
89 if (mThread.joinable()) {
90 mThread.join();
91 }
92 return true;
93 }
94
95 // Methods from V1_0::IGnss follow.
setCallback(const sp<V1_0::IGnssCallback> & callback)96 Return<bool> Gnss::setCallback(const sp<V1_0::IGnssCallback>& callback) {
97 if (callback == nullptr) {
98 ALOGE("%s: Null callback ignored", __func__);
99 return false;
100 }
101
102 sGnssCallback_1_0 = callback;
103
104 uint32_t capabilities = 0x0 | V1_0::IGnssCallback::Capabilities::MEASUREMENTS |
105 V1_0::IGnssCallback::Capabilities::SCHEDULING;
106 auto ret = sGnssCallback_1_0->gnssSetCapabilitesCb(capabilities);
107 if (!ret.isOk()) {
108 ALOGE("%s: Unable to invoke callback", __func__);
109 }
110
111 IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2018};
112
113 ret = sGnssCallback_1_0->gnssSetSystemInfoCb(gnssInfo);
114 if (!ret.isOk()) {
115 ALOGE("%s: Unable to invoke callback", __func__);
116 }
117
118 return true;
119 }
120
cleanup()121 Return<void> Gnss::cleanup() {
122 sGnssCallback_2_1 = nullptr;
123 sGnssCallback_2_0 = nullptr;
124 return Void();
125 }
126
injectTime(int64_t,int64_t,int32_t)127 Return<bool> Gnss::injectTime(int64_t, int64_t, int32_t) {
128 return true;
129 }
130
injectLocation(double,double,float)131 Return<bool> Gnss::injectLocation(double, double, float) {
132 return true;
133 }
134
deleteAidingData(V1_0::IGnss::GnssAidingData)135 Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData) {
136 // TODO implement
137 return Void();
138 }
139
setPositionMode(V1_0::IGnss::GnssPositionMode,V1_0::IGnss::GnssPositionRecurrence,uint32_t minIntervalMs,uint32_t,uint32_t)140 Return<bool> Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode,
141 V1_0::IGnss::GnssPositionRecurrence, uint32_t minIntervalMs,
142 uint32_t, uint32_t) {
143 mMinIntervalMs = minIntervalMs;
144 return true;
145 }
146
getExtensionAGnssRil()147 Return<sp<V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() {
148 // TODO implement
149 return ::android::sp<V1_0::IAGnssRil>{};
150 }
151
getExtensionGnssGeofencing()152 Return<sp<V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
153 // TODO implement
154 return ::android::sp<V1_0::IGnssGeofencing>{};
155 }
156
getExtensionAGnss()157 Return<sp<V1_0::IAGnss>> Gnss::getExtensionAGnss() {
158 // TODO implement
159 return ::android::sp<V1_0::IAGnss>{};
160 }
161
getExtensionGnssNi()162 Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
163 // TODO implement
164 return ::android::sp<V1_0::IGnssNi>{};
165 }
166
getExtensionGnssMeasurement()167 Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
168 ALOGD("Gnss::getExtensionGnssMeasurement");
169 return new GnssMeasurement();
170 }
171
getExtensionGnssNavigationMessage()172 Return<sp<V1_0::IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
173 // TODO implement
174 return ::android::sp<V1_0::IGnssNavigationMessage>{};
175 }
176
getExtensionXtra()177 Return<sp<V1_0::IGnssXtra>> Gnss::getExtensionXtra() {
178 // TODO implement
179 return ::android::sp<V1_0::IGnssXtra>{};
180 }
181
getExtensionGnssConfiguration()182 Return<sp<V1_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
183 // TODO implement
184 return ::android::sp<V1_0::IGnssConfiguration>{};
185 }
186
getExtensionGnssDebug()187 Return<sp<V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() {
188 return new V1_1::implementation::GnssDebug();
189 }
190
getExtensionGnssBatching()191 Return<sp<V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() {
192 // TODO implement
193 return ::android::sp<V1_0::IGnssBatching>{};
194 }
195
196 // Methods from V1_1::IGnss follow.
setCallback_1_1(const sp<V1_1::IGnssCallback> & callback)197 Return<bool> Gnss::setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) {
198 if (callback == nullptr) {
199 ALOGE("%s: Null callback ignored", __func__);
200 return false;
201 }
202
203 sGnssCallback_1_1 = callback;
204
205 uint32_t capabilities = 0x0;
206 auto ret = sGnssCallback_1_1->gnssSetCapabilitesCb(capabilities);
207 if (!ret.isOk()) {
208 ALOGE("%s: Unable to invoke callback", __func__);
209 }
210
211 IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2018};
212
213 ret = sGnssCallback_1_1->gnssSetSystemInfoCb(gnssInfo);
214 if (!ret.isOk()) {
215 ALOGE("%s: Unable to invoke callback", __func__);
216 }
217
218 auto gnssName = "Google Mock GNSS Implementation v2.1";
219 ret = sGnssCallback_1_1->gnssNameCb(gnssName);
220 if (!ret.isOk()) {
221 ALOGE("%s: Unable to invoke callback", __func__);
222 }
223
224 return true;
225 }
226
setPositionMode_1_1(V1_0::IGnss::GnssPositionMode,V1_0::IGnss::GnssPositionRecurrence,uint32_t minIntervalMs,uint32_t,uint32_t,bool)227 Return<bool> Gnss::setPositionMode_1_1(V1_0::IGnss::GnssPositionMode,
228 V1_0::IGnss::GnssPositionRecurrence, uint32_t minIntervalMs,
229 uint32_t, uint32_t, bool) {
230 mMinIntervalMs = minIntervalMs;
231 return true;
232 }
233
getExtensionGnssConfiguration_1_1()234 Return<sp<V1_1::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_1_1() {
235 // TODO implement
236 return ::android::sp<V1_1::IGnssConfiguration>{};
237 }
238
getExtensionGnssMeasurement_1_1()239 Return<sp<V1_1::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_1_1() {
240 // TODO implement
241 return ::android::sp<V1_1::IGnssMeasurement>{};
242 }
243
injectBestLocation(const V1_0::GnssLocation &)244 Return<bool> Gnss::injectBestLocation(const V1_0::GnssLocation&) {
245 return true;
246 }
247
248 // Methods from V2_0::IGnss follow.
setCallback_2_0(const sp<V2_0::IGnssCallback> & callback)249 Return<bool> Gnss::setCallback_2_0(const sp<V2_0::IGnssCallback>& callback) {
250 ALOGD("Gnss::setCallback_2_0");
251 if (callback == nullptr) {
252 ALOGE("%s: Null callback ignored", __func__);
253 return false;
254 }
255
256 sGnssCallback_2_0 = callback;
257
258 using Capabilities = V2_0::IGnssCallback::Capabilities;
259 const auto capabilities = Capabilities::MEASUREMENTS | Capabilities::MEASUREMENT_CORRECTIONS |
260 Capabilities::LOW_POWER_MODE | Capabilities::SATELLITE_BLACKLIST;
261 auto ret = sGnssCallback_2_0->gnssSetCapabilitiesCb_2_0(capabilities);
262 if (!ret.isOk()) {
263 ALOGE("%s: Unable to invoke callback", __func__);
264 }
265
266 V1_1::IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2019};
267
268 ret = sGnssCallback_2_0->gnssSetSystemInfoCb(gnssInfo);
269 if (!ret.isOk()) {
270 ALOGE("%s: Unable to invoke callback", __func__);
271 }
272
273 auto gnssName = "Google Mock GNSS Implementation v2.1";
274 ret = sGnssCallback_2_0->gnssNameCb(gnssName);
275 if (!ret.isOk()) {
276 ALOGE("%s: Unable to invoke callback", __func__);
277 }
278
279 return true;
280 }
281
getExtensionGnssConfiguration_2_0()282 Return<sp<V2_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_2_0() {
283 ALOGD("Gnss::getExtensionGnssConfiguration_2_0");
284 return mGnssConfiguration;
285 }
286
getExtensionGnssDebug_2_0()287 Return<sp<V2_0::IGnssDebug>> Gnss::getExtensionGnssDebug_2_0() {
288 // TODO implement
289 return ::android::sp<V2_0::IGnssDebug>{};
290 }
291
getExtensionAGnss_2_0()292 Return<sp<V2_0::IAGnss>> Gnss::getExtensionAGnss_2_0() {
293 // TODO implement
294 return ::android::sp<V2_0::IAGnss>{};
295 }
296
getExtensionAGnssRil_2_0()297 Return<sp<V2_0::IAGnssRil>> Gnss::getExtensionAGnssRil_2_0() {
298 // TODO implement
299 return ::android::sp<V2_0::IAGnssRil>{};
300 }
301
getExtensionGnssMeasurement_2_0()302 Return<sp<V2_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_2_0() {
303 ALOGD("Gnss::getExtensionGnssMeasurement_2_0");
304 return new GnssMeasurement();
305 }
306
307 Return<sp<measurement_corrections::V1_0::IMeasurementCorrections>>
getExtensionMeasurementCorrections()308 Gnss::getExtensionMeasurementCorrections() {
309 ALOGD("Gnss::getExtensionMeasurementCorrections()");
310 return new GnssMeasurementCorrections();
311 }
312
getExtensionVisibilityControl()313 Return<sp<visibility_control::V1_0::IGnssVisibilityControl>> Gnss::getExtensionVisibilityControl() {
314 // TODO implement
315 return ::android::sp<visibility_control::V1_0::IGnssVisibilityControl>{};
316 }
317
getExtensionGnssBatching_2_0()318 Return<sp<V2_0::IGnssBatching>> Gnss::getExtensionGnssBatching_2_0() {
319 // TODO implement
320 return ::android::sp<V2_0::IGnssBatching>{};
321 }
322
injectBestLocation_2_0(const V2_0::GnssLocation &)323 Return<bool> Gnss::injectBestLocation_2_0(const V2_0::GnssLocation&) {
324 // TODO(b/124012850): Implement function.
325 return bool{};
326 }
327
328 // Methods from V2_1::IGnss follow.
setCallback_2_1(const sp<V2_1::IGnssCallback> & callback)329 Return<bool> Gnss::setCallback_2_1(const sp<V2_1::IGnssCallback>& callback) {
330 ALOGD("Gnss::setCallback_2_1");
331 if (callback == nullptr) {
332 ALOGE("%s: Null callback ignored", __func__);
333 return false;
334 }
335
336 sGnssCallback_2_1 = callback;
337
338 using Capabilities = V2_1::IGnssCallback::Capabilities;
339 const auto capabilities = Capabilities::MEASUREMENTS | Capabilities::MEASUREMENT_CORRECTIONS |
340 Capabilities::LOW_POWER_MODE | Capabilities::SATELLITE_BLACKLIST |
341 Capabilities::ANTENNA_INFO;
342 auto ret = sGnssCallback_2_1->gnssSetCapabilitiesCb_2_1(capabilities);
343 if (!ret.isOk()) {
344 ALOGE("%s: Unable to invoke callback", __func__);
345 }
346
347 V1_1::IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2020};
348
349 ret = sGnssCallback_2_1->gnssSetSystemInfoCb(gnssInfo);
350 if (!ret.isOk()) {
351 ALOGE("%s: Unable to invoke callback", __func__);
352 }
353
354 auto gnssName = "Android Mock GNSS Implementation v2.1";
355 ret = sGnssCallback_2_1->gnssNameCb(gnssName);
356 if (!ret.isOk()) {
357 ALOGE("%s: Unable to invoke callback", __func__);
358 }
359
360 return true;
361 }
362
getExtensionGnssMeasurement_2_1()363 Return<sp<V2_1::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_2_1() {
364 ALOGD("Gnss::getExtensionGnssMeasurement_2_1");
365 return new GnssMeasurement();
366 }
367
getExtensionGnssConfiguration_2_1()368 Return<sp<V2_1::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_2_1() {
369 ALOGD("Gnss::getExtensionGnssConfiguration_2_1");
370 return mGnssConfiguration;
371 }
372
373 Return<sp<measurement_corrections::V1_1::IMeasurementCorrections>>
getExtensionMeasurementCorrections_1_1()374 Gnss::getExtensionMeasurementCorrections_1_1() {
375 ALOGD("Gnss::getExtensionMeasurementCorrections_1_1()");
376 return new GnssMeasurementCorrections();
377 }
378
getExtensionGnssAntennaInfo()379 Return<sp<V2_1::IGnssAntennaInfo>> Gnss::getExtensionGnssAntennaInfo() {
380 ALOGD("Gnss::getExtensionGnssAntennaInfo");
381 return new GnssAntennaInfo();
382 }
383
reportSvStatus(const hidl_vec<GnssSvInfo> & svInfoList) const384 void Gnss::reportSvStatus(const hidl_vec<GnssSvInfo>& svInfoList) const {
385 std::unique_lock<std::mutex> lock(mMutex);
386 // TODO(skz): update this to call 2_0 callback if non-null
387 if (sGnssCallback_2_1 == nullptr) {
388 ALOGE("%s: sGnssCallback v2.1 is null.", __func__);
389 return;
390 }
391 auto ret = sGnssCallback_2_1->gnssSvStatusCb_2_1(svInfoList);
392 if (!ret.isOk()) {
393 ALOGE("%s: Unable to invoke callback", __func__);
394 }
395 }
396
reportLocation(const V1_0::GnssLocation & location) const397 void Gnss::reportLocation(const V1_0::GnssLocation& location) const {
398 std::unique_lock<std::mutex> lock(mMutex);
399 if (sGnssCallback_1_1 != nullptr) {
400 auto ret = sGnssCallback_1_1->gnssLocationCb(location);
401 if (!ret.isOk()) {
402 ALOGE("%s: Unable to invoke callback v1.1", __func__);
403 }
404 return;
405 }
406 if (sGnssCallback_1_0 == nullptr) {
407 ALOGE("%s: No non-null callback", __func__);
408 return;
409 }
410 auto ret = sGnssCallback_1_0->gnssLocationCb(location);
411 if (!ret.isOk()) {
412 ALOGE("%s: Unable to invoke callback v1.0", __func__);
413 }
414 }
415
reportLocation(const V2_0::GnssLocation & location) const416 void Gnss::reportLocation(const V2_0::GnssLocation& location) const {
417 std::unique_lock<std::mutex> lock(mMutex);
418 if (sGnssCallback_2_1 != nullptr) {
419 auto ret = sGnssCallback_2_1->gnssLocationCb_2_0(location);
420 if (!ret.isOk()) {
421 ALOGE("%s: Unable to invoke callback v2.1", __func__);
422 }
423 return;
424 }
425 if (sGnssCallback_2_0 == nullptr) {
426 ALOGE("%s: No non-null callback", __func__);
427 return;
428 }
429 auto ret = sGnssCallback_2_0->gnssLocationCb_2_0(location);
430 if (!ret.isOk()) {
431 ALOGE("%s: Unable to invoke callback v2.0", __func__);
432 }
433 }
434
435 } // namespace implementation
436 } // namespace V2_1
437 } // namespace gnss
438 } // namespace hardware
439 } // namespace android
440