• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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