1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "GnssAidl"
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include "Gnss.h"
20*4d7e907cSAndroid Build Coastguard Worker #include <inttypes.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <utils/Timers.h>
23*4d7e907cSAndroid Build Coastguard Worker #include "AGnss.h"
24*4d7e907cSAndroid Build Coastguard Worker #include "AGnssRil.h"
25*4d7e907cSAndroid Build Coastguard Worker #include "DeviceFileReader.h"
26*4d7e907cSAndroid Build Coastguard Worker #include "FixLocationParser.h"
27*4d7e907cSAndroid Build Coastguard Worker #include "GnssAntennaInfo.h"
28*4d7e907cSAndroid Build Coastguard Worker #include "GnssAssistanceInterface.h"
29*4d7e907cSAndroid Build Coastguard Worker #include "GnssBatching.h"
30*4d7e907cSAndroid Build Coastguard Worker #include "GnssConfiguration.h"
31*4d7e907cSAndroid Build Coastguard Worker #include "GnssDebug.h"
32*4d7e907cSAndroid Build Coastguard Worker #include "GnssGeofence.h"
33*4d7e907cSAndroid Build Coastguard Worker #include "GnssNavigationMessageInterface.h"
34*4d7e907cSAndroid Build Coastguard Worker #include "GnssPsds.h"
35*4d7e907cSAndroid Build Coastguard Worker #include "GnssVisibilityControl.h"
36*4d7e907cSAndroid Build Coastguard Worker #include "MeasurementCorrectionsInterface.h"
37*4d7e907cSAndroid Build Coastguard Worker #include "Utils.h"
38*4d7e907cSAndroid Build Coastguard Worker
39*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::gnss {
40*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::gnss::common::Utils;
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker using ndk::ScopedAStatus;
43*4d7e907cSAndroid Build Coastguard Worker using GnssSvInfo = IGnssCallback::GnssSvInfo;
44*4d7e907cSAndroid Build Coastguard Worker
45*4d7e907cSAndroid Build Coastguard Worker constexpr int TTFF_MILLIS = 2200;
46*4d7e907cSAndroid Build Coastguard Worker
47*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssCallback> Gnss::sGnssCallback = nullptr;
48*4d7e907cSAndroid Build Coastguard Worker
Gnss()49*4d7e907cSAndroid Build Coastguard Worker Gnss::Gnss() : mMinIntervalMs(1000), mFirstFixReceived(false) {}
50*4d7e907cSAndroid Build Coastguard Worker
setCallback(const std::shared_ptr<IGnssCallback> & callback)51*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::setCallback(const std::shared_ptr<IGnssCallback>& callback) {
52*4d7e907cSAndroid Build Coastguard Worker ALOGD("setCallback");
53*4d7e907cSAndroid Build Coastguard Worker if (callback == nullptr) {
54*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Null callback ignored", __func__);
55*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::fromExceptionCode(STATUS_INVALID_OPERATION);
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker sGnssCallback = callback;
58*4d7e907cSAndroid Build Coastguard Worker
59*4d7e907cSAndroid Build Coastguard Worker int capabilities =
60*4d7e907cSAndroid Build Coastguard Worker (int)(IGnssCallback::CAPABILITY_MEASUREMENTS | IGnssCallback::CAPABILITY_SCHEDULING |
61*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::CAPABILITY_SATELLITE_BLOCKLIST |
62*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::CAPABILITY_SATELLITE_PVT |
63*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::CAPABILITY_CORRELATION_VECTOR |
64*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::CAPABILITY_ANTENNA_INFO |
65*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::CAPABILITY_ACCUMULATED_DELTA_RANGE);
66*4d7e907cSAndroid Build Coastguard Worker auto status = sGnssCallback->gnssSetCapabilitiesCb(capabilities);
67*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
68*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke callback.gnssSetCapabilitiesCb", __func__);
69*4d7e907cSAndroid Build Coastguard Worker }
70*4d7e907cSAndroid Build Coastguard Worker
71*4d7e907cSAndroid Build Coastguard Worker IGnssCallback::GnssSystemInfo systemInfo = {
72*4d7e907cSAndroid Build Coastguard Worker .yearOfHw = 2022,
73*4d7e907cSAndroid Build Coastguard Worker .name = "Google, Cuttlefish, AIDL v3",
74*4d7e907cSAndroid Build Coastguard Worker };
75*4d7e907cSAndroid Build Coastguard Worker status = sGnssCallback->gnssSetSystemInfoCb(systemInfo);
76*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
77*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke callback.gnssSetSystemInfoCb", __func__);
78*4d7e907cSAndroid Build Coastguard Worker }
79*4d7e907cSAndroid Build Coastguard Worker GnssSignalType signalType1 = {
80*4d7e907cSAndroid Build Coastguard Worker .constellation = GnssConstellationType::GPS,
81*4d7e907cSAndroid Build Coastguard Worker .carrierFrequencyHz = 1.57542e+09,
82*4d7e907cSAndroid Build Coastguard Worker .codeType = GnssSignalType::CODE_TYPE_C,
83*4d7e907cSAndroid Build Coastguard Worker };
84*4d7e907cSAndroid Build Coastguard Worker GnssSignalType signalType2 = {
85*4d7e907cSAndroid Build Coastguard Worker .constellation = GnssConstellationType::GLONASS,
86*4d7e907cSAndroid Build Coastguard Worker .carrierFrequencyHz = 1.5980625e+09,
87*4d7e907cSAndroid Build Coastguard Worker .codeType = GnssSignalType::CODE_TYPE_C,
88*4d7e907cSAndroid Build Coastguard Worker };
89*4d7e907cSAndroid Build Coastguard Worker status = sGnssCallback->gnssSetSignalTypeCapabilitiesCb(
90*4d7e907cSAndroid Build Coastguard Worker std::vector<GnssSignalType>({signalType1, signalType2}));
91*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
92*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke callback.gnssSetSignalTypeCapabilitiesCb", __func__);
93*4d7e907cSAndroid Build Coastguard Worker }
94*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
95*4d7e907cSAndroid Build Coastguard Worker }
96*4d7e907cSAndroid Build Coastguard Worker
getLocationFromHW()97*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<GnssLocation> Gnss::getLocationFromHW() {
98*4d7e907cSAndroid Build Coastguard Worker if (!::android::hardware::gnss::common::ReplayUtils::hasFixedLocationDeviceFile()) {
99*4d7e907cSAndroid Build Coastguard Worker return nullptr;
100*4d7e907cSAndroid Build Coastguard Worker }
101*4d7e907cSAndroid Build Coastguard Worker std::string inputStr =
102*4d7e907cSAndroid Build Coastguard Worker ::android::hardware::gnss::common::DeviceFileReader::Instance().getLocationData();
103*4d7e907cSAndroid Build Coastguard Worker return ::android::hardware::gnss::common::FixLocationParser::getLocationFromInputStr(inputStr);
104*4d7e907cSAndroid Build Coastguard Worker }
105*4d7e907cSAndroid Build Coastguard Worker
start()106*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::start() {
107*4d7e907cSAndroid Build Coastguard Worker ALOGD("start()");
108*4d7e907cSAndroid Build Coastguard Worker if (mIsActive) {
109*4d7e907cSAndroid Build Coastguard Worker ALOGW("Gnss has started. Restarting...");
110*4d7e907cSAndroid Build Coastguard Worker stop();
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker
113*4d7e907cSAndroid Build Coastguard Worker mIsActive = true;
114*4d7e907cSAndroid Build Coastguard Worker mThreadBlocker.reset();
115*4d7e907cSAndroid Build Coastguard Worker // notify measurement engine to update measurement interval
116*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementInterface->setLocationEnabled(true);
117*4d7e907cSAndroid Build Coastguard Worker this->reportGnssStatusValue(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
118*4d7e907cSAndroid Build Coastguard Worker mThread = std::thread([this]() {
119*4d7e907cSAndroid Build Coastguard Worker if (!mGnssMeasurementEnabled || mMinIntervalMs <= mGnssMeasurementIntervalMs) {
120*4d7e907cSAndroid Build Coastguard Worker this->reportSvStatus();
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker if (!mFirstFixReceived) {
123*4d7e907cSAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(TTFF_MILLIS));
124*4d7e907cSAndroid Build Coastguard Worker mFirstFixReceived = true;
125*4d7e907cSAndroid Build Coastguard Worker }
126*4d7e907cSAndroid Build Coastguard Worker int reportGnssCount = 0;
127*4d7e907cSAndroid Build Coastguard Worker do {
128*4d7e907cSAndroid Build Coastguard Worker if (!mIsActive) {
129*4d7e907cSAndroid Build Coastguard Worker ALOGD("Do not report location. mIsActive is false");
130*4d7e907cSAndroid Build Coastguard Worker break;
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker reportGnssCount += 1;
133*4d7e907cSAndroid Build Coastguard Worker if (!mGnssMeasurementEnabled || mMinIntervalMs <= mGnssMeasurementIntervalMs) {
134*4d7e907cSAndroid Build Coastguard Worker this->reportSvStatus();
135*4d7e907cSAndroid Build Coastguard Worker }
136*4d7e907cSAndroid Build Coastguard Worker this->reportNmea();
137*4d7e907cSAndroid Build Coastguard Worker
138*4d7e907cSAndroid Build Coastguard Worker auto currentLocation = getLocationFromHW();
139*4d7e907cSAndroid Build Coastguard Worker mGnssPowerIndication->notePowerConsumption();
140*4d7e907cSAndroid Build Coastguard Worker if (currentLocation != nullptr) {
141*4d7e907cSAndroid Build Coastguard Worker this->reportLocation(*currentLocation);
142*4d7e907cSAndroid Build Coastguard Worker } else {
143*4d7e907cSAndroid Build Coastguard Worker const auto location = Utils::getMockLocation();
144*4d7e907cSAndroid Build Coastguard Worker this->reportLocation(location);
145*4d7e907cSAndroid Build Coastguard Worker }
146*4d7e907cSAndroid Build Coastguard Worker } while (mIsActive && mThreadBlocker.wait_for(std::chrono::milliseconds(mMinIntervalMs)));
147*4d7e907cSAndroid Build Coastguard Worker ALOGD("reportGnssCount: %d", reportGnssCount);
148*4d7e907cSAndroid Build Coastguard Worker });
149*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
150*4d7e907cSAndroid Build Coastguard Worker }
151*4d7e907cSAndroid Build Coastguard Worker
stop()152*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::stop() {
153*4d7e907cSAndroid Build Coastguard Worker ALOGD("stop");
154*4d7e907cSAndroid Build Coastguard Worker mIsActive = false;
155*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementInterface->setLocationEnabled(false);
156*4d7e907cSAndroid Build Coastguard Worker this->reportGnssStatusValue(IGnssCallback::GnssStatusValue::SESSION_END);
157*4d7e907cSAndroid Build Coastguard Worker mThreadBlocker.notify();
158*4d7e907cSAndroid Build Coastguard Worker if (mThread.joinable()) {
159*4d7e907cSAndroid Build Coastguard Worker mThread.join();
160*4d7e907cSAndroid Build Coastguard Worker }
161*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
162*4d7e907cSAndroid Build Coastguard Worker }
163*4d7e907cSAndroid Build Coastguard Worker
close()164*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::close() {
165*4d7e907cSAndroid Build Coastguard Worker ALOGD("close");
166*4d7e907cSAndroid Build Coastguard Worker sGnssCallback = nullptr;
167*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
168*4d7e907cSAndroid Build Coastguard Worker }
169*4d7e907cSAndroid Build Coastguard Worker
reportLocation(const GnssLocation & location)170*4d7e907cSAndroid Build Coastguard Worker void Gnss::reportLocation(const GnssLocation& location) {
171*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex);
172*4d7e907cSAndroid Build Coastguard Worker if (sGnssCallback == nullptr) {
173*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: GnssCallback is null.", __func__);
174*4d7e907cSAndroid Build Coastguard Worker return;
175*4d7e907cSAndroid Build Coastguard Worker }
176*4d7e907cSAndroid Build Coastguard Worker mLastLocation = std::make_shared<GnssLocation>(location);
177*4d7e907cSAndroid Build Coastguard Worker auto status = sGnssCallback->gnssLocationCb(location);
178*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
179*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke gnssLocationCb", __func__);
180*4d7e907cSAndroid Build Coastguard Worker }
181*4d7e907cSAndroid Build Coastguard Worker return;
182*4d7e907cSAndroid Build Coastguard Worker }
183*4d7e907cSAndroid Build Coastguard Worker
reportSvStatus() const184*4d7e907cSAndroid Build Coastguard Worker void Gnss::reportSvStatus() const {
185*4d7e907cSAndroid Build Coastguard Worker if (mIsSvStatusActive) {
186*4d7e907cSAndroid Build Coastguard Worker auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList());
187*4d7e907cSAndroid Build Coastguard Worker reportSvStatus(svStatus);
188*4d7e907cSAndroid Build Coastguard Worker }
189*4d7e907cSAndroid Build Coastguard Worker }
190*4d7e907cSAndroid Build Coastguard Worker
reportSvStatus(const std::vector<GnssSvInfo> & svInfoList) const191*4d7e907cSAndroid Build Coastguard Worker void Gnss::reportSvStatus(const std::vector<GnssSvInfo>& svInfoList) const {
192*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex);
193*4d7e907cSAndroid Build Coastguard Worker if (sGnssCallback == nullptr) {
194*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: sGnssCallback is null.", __func__);
195*4d7e907cSAndroid Build Coastguard Worker return;
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker auto status = sGnssCallback->gnssSvStatusCb(svInfoList);
198*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
199*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke callback", __func__);
200*4d7e907cSAndroid Build Coastguard Worker }
201*4d7e907cSAndroid Build Coastguard Worker }
202*4d7e907cSAndroid Build Coastguard Worker
filterBlocklistedSatellites(std::vector<GnssSvInfo> gnssSvInfoList) const203*4d7e907cSAndroid Build Coastguard Worker std::vector<GnssSvInfo> Gnss::filterBlocklistedSatellites(
204*4d7e907cSAndroid Build Coastguard Worker std::vector<GnssSvInfo> gnssSvInfoList) const {
205*4d7e907cSAndroid Build Coastguard Worker for (uint32_t i = 0; i < gnssSvInfoList.size(); i++) {
206*4d7e907cSAndroid Build Coastguard Worker if (mGnssConfiguration->isBlocklisted(gnssSvInfoList[i])) {
207*4d7e907cSAndroid Build Coastguard Worker gnssSvInfoList[i].svFlag &= ~(uint32_t)IGnssCallback::GnssSvFlags::USED_IN_FIX;
208*4d7e907cSAndroid Build Coastguard Worker }
209*4d7e907cSAndroid Build Coastguard Worker }
210*4d7e907cSAndroid Build Coastguard Worker return gnssSvInfoList;
211*4d7e907cSAndroid Build Coastguard Worker }
212*4d7e907cSAndroid Build Coastguard Worker
reportGnssStatusValue(const IGnssCallback::GnssStatusValue gnssStatusValue) const213*4d7e907cSAndroid Build Coastguard Worker void Gnss::reportGnssStatusValue(const IGnssCallback::GnssStatusValue gnssStatusValue) const {
214*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex);
215*4d7e907cSAndroid Build Coastguard Worker if (sGnssCallback == nullptr) {
216*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: sGnssCallback is null.", __func__);
217*4d7e907cSAndroid Build Coastguard Worker return;
218*4d7e907cSAndroid Build Coastguard Worker }
219*4d7e907cSAndroid Build Coastguard Worker auto status = sGnssCallback->gnssStatusCb(gnssStatusValue);
220*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
221*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke gnssStatusCb", __func__);
222*4d7e907cSAndroid Build Coastguard Worker }
223*4d7e907cSAndroid Build Coastguard Worker }
224*4d7e907cSAndroid Build Coastguard Worker
reportNmea() const225*4d7e907cSAndroid Build Coastguard Worker void Gnss::reportNmea() const {
226*4d7e907cSAndroid Build Coastguard Worker if (mIsNmeaActive) {
227*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex);
228*4d7e907cSAndroid Build Coastguard Worker if (sGnssCallback == nullptr) {
229*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: sGnssCallback is null.", __func__);
230*4d7e907cSAndroid Build Coastguard Worker return;
231*4d7e907cSAndroid Build Coastguard Worker }
232*4d7e907cSAndroid Build Coastguard Worker nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
233*4d7e907cSAndroid Build Coastguard Worker auto status = sGnssCallback->gnssNmeaCb(now, "$TEST,0,1,2,3,4,5");
234*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
235*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: Unable to invoke callback", __func__);
236*4d7e907cSAndroid Build Coastguard Worker }
237*4d7e907cSAndroid Build Coastguard Worker }
238*4d7e907cSAndroid Build Coastguard Worker }
239*4d7e907cSAndroid Build Coastguard Worker
startSvStatus()240*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::startSvStatus() {
241*4d7e907cSAndroid Build Coastguard Worker ALOGD("startSvStatus");
242*4d7e907cSAndroid Build Coastguard Worker mIsSvStatusActive = true;
243*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
244*4d7e907cSAndroid Build Coastguard Worker }
245*4d7e907cSAndroid Build Coastguard Worker
stopSvStatus()246*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::stopSvStatus() {
247*4d7e907cSAndroid Build Coastguard Worker ALOGD("stopSvStatus");
248*4d7e907cSAndroid Build Coastguard Worker mIsSvStatusActive = false;
249*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
250*4d7e907cSAndroid Build Coastguard Worker }
startNmea()251*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::startNmea() {
252*4d7e907cSAndroid Build Coastguard Worker ALOGD("startNmea");
253*4d7e907cSAndroid Build Coastguard Worker mIsNmeaActive = true;
254*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
255*4d7e907cSAndroid Build Coastguard Worker }
stopNmea()256*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::stopNmea() {
257*4d7e907cSAndroid Build Coastguard Worker ALOGD("stopNmea");
258*4d7e907cSAndroid Build Coastguard Worker mIsNmeaActive = false;
259*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
260*4d7e907cSAndroid Build Coastguard Worker }
261*4d7e907cSAndroid Build Coastguard Worker
getExtensionAGnss(std::shared_ptr<IAGnss> * iAGnss)262*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionAGnss(std::shared_ptr<IAGnss>* iAGnss) {
263*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionAGnss");
264*4d7e907cSAndroid Build Coastguard Worker *iAGnss = SharedRefBase::make<AGnss>();
265*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker
injectTime(int64_t timeMs,int64_t timeReferenceMs,int uncertaintyMs)268*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int uncertaintyMs) {
269*4d7e907cSAndroid Build Coastguard Worker ALOGD("injectTime. timeMs:%" PRId64 ", timeReferenceMs:%" PRId64 ", uncertaintyMs:%d", timeMs,
270*4d7e907cSAndroid Build Coastguard Worker timeReferenceMs, uncertaintyMs);
271*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
272*4d7e907cSAndroid Build Coastguard Worker }
273*4d7e907cSAndroid Build Coastguard Worker
getExtensionAGnssRil(std::shared_ptr<IAGnssRil> * iAGnssRil)274*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionAGnssRil(std::shared_ptr<IAGnssRil>* iAGnssRil) {
275*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionAGnssRil");
276*4d7e907cSAndroid Build Coastguard Worker *iAGnssRil = SharedRefBase::make<AGnssRil>();
277*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker
injectLocation(const GnssLocation & location)280*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::injectLocation(const GnssLocation& location) {
281*4d7e907cSAndroid Build Coastguard Worker ALOGD("injectLocation. lat:%lf, lng:%lf, acc:%f", location.latitudeDegrees,
282*4d7e907cSAndroid Build Coastguard Worker location.longitudeDegrees, location.horizontalAccuracyMeters);
283*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
284*4d7e907cSAndroid Build Coastguard Worker }
285*4d7e907cSAndroid Build Coastguard Worker
injectBestLocation(const GnssLocation & location)286*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::injectBestLocation(const GnssLocation& location) {
287*4d7e907cSAndroid Build Coastguard Worker ALOGD("injectBestLocation. lat:%lf, lng:%lf, acc:%f", location.latitudeDegrees,
288*4d7e907cSAndroid Build Coastguard Worker location.longitudeDegrees, location.horizontalAccuracyMeters);
289*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
290*4d7e907cSAndroid Build Coastguard Worker }
291*4d7e907cSAndroid Build Coastguard Worker
deleteAidingData(GnssAidingData aidingDataFlags)292*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::deleteAidingData(GnssAidingData aidingDataFlags) {
293*4d7e907cSAndroid Build Coastguard Worker ALOGD("deleteAidingData. flags:%d", (int)aidingDataFlags);
294*4d7e907cSAndroid Build Coastguard Worker mFirstFixReceived = false;
295*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
296*4d7e907cSAndroid Build Coastguard Worker }
297*4d7e907cSAndroid Build Coastguard Worker
setPositionMode(const PositionModeOptions & options)298*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::setPositionMode(const PositionModeOptions& options) {
299*4d7e907cSAndroid Build Coastguard Worker ALOGD("setPositionMode. minIntervalMs:%d, lowPowerMode:%d", options.minIntervalMs,
300*4d7e907cSAndroid Build Coastguard Worker (int)options.lowPowerMode);
301*4d7e907cSAndroid Build Coastguard Worker mMinIntervalMs = std::max(1000, options.minIntervalMs);
302*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementInterface->setLocationInterval(mMinIntervalMs);
303*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
304*4d7e907cSAndroid Build Coastguard Worker }
305*4d7e907cSAndroid Build Coastguard Worker
getExtensionPsds(std::shared_ptr<IGnssPsds> * iGnssPsds)306*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionPsds(std::shared_ptr<IGnssPsds>* iGnssPsds) {
307*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionPsds");
308*4d7e907cSAndroid Build Coastguard Worker *iGnssPsds = SharedRefBase::make<GnssPsds>();
309*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
310*4d7e907cSAndroid Build Coastguard Worker }
311*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssConfiguration(std::shared_ptr<IGnssConfiguration> * iGnssConfiguration)312*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssConfiguration(
313*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssConfiguration>* iGnssConfiguration) {
314*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssConfiguration");
315*4d7e907cSAndroid Build Coastguard Worker if (mGnssConfiguration == nullptr) {
316*4d7e907cSAndroid Build Coastguard Worker mGnssConfiguration = SharedRefBase::make<GnssConfiguration>();
317*4d7e907cSAndroid Build Coastguard Worker }
318*4d7e907cSAndroid Build Coastguard Worker *iGnssConfiguration = mGnssConfiguration;
319*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
320*4d7e907cSAndroid Build Coastguard Worker }
321*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssPowerIndication(std::shared_ptr<IGnssPowerIndication> * iGnssPowerIndication)322*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssPowerIndication(
323*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssPowerIndication>* iGnssPowerIndication) {
324*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssPowerIndication");
325*4d7e907cSAndroid Build Coastguard Worker if (mGnssPowerIndication == nullptr) {
326*4d7e907cSAndroid Build Coastguard Worker mGnssPowerIndication = SharedRefBase::make<GnssPowerIndication>();
327*4d7e907cSAndroid Build Coastguard Worker }
328*4d7e907cSAndroid Build Coastguard Worker
329*4d7e907cSAndroid Build Coastguard Worker *iGnssPowerIndication = mGnssPowerIndication;
330*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
331*4d7e907cSAndroid Build Coastguard Worker }
332*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssMeasurement(std::shared_ptr<IGnssMeasurementInterface> * iGnssMeasurement)333*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssMeasurement(
334*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssMeasurementInterface>* iGnssMeasurement) {
335*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssMeasurement");
336*4d7e907cSAndroid Build Coastguard Worker if (mGnssMeasurementInterface == nullptr) {
337*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementInterface = SharedRefBase::make<GnssMeasurementInterface>();
338*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementInterface->setGnssInterface(static_cast<std::shared_ptr<Gnss>>(this));
339*4d7e907cSAndroid Build Coastguard Worker }
340*4d7e907cSAndroid Build Coastguard Worker *iGnssMeasurement = mGnssMeasurementInterface;
341*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
342*4d7e907cSAndroid Build Coastguard Worker }
343*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssBatching(std::shared_ptr<IGnssBatching> * iGnssBatching)344*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssBatching(std::shared_ptr<IGnssBatching>* iGnssBatching) {
345*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssBatching");
346*4d7e907cSAndroid Build Coastguard Worker
347*4d7e907cSAndroid Build Coastguard Worker *iGnssBatching = SharedRefBase::make<GnssBatching>();
348*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
349*4d7e907cSAndroid Build Coastguard Worker }
350*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssGeofence(std::shared_ptr<IGnssGeofence> * iGnssGeofence)351*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssGeofence(std::shared_ptr<IGnssGeofence>* iGnssGeofence) {
352*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssGeofence");
353*4d7e907cSAndroid Build Coastguard Worker
354*4d7e907cSAndroid Build Coastguard Worker *iGnssGeofence = SharedRefBase::make<GnssGeofence>();
355*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
356*4d7e907cSAndroid Build Coastguard Worker }
357*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssNavigationMessage(std::shared_ptr<IGnssNavigationMessageInterface> * iGnssNavigationMessage)358*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus Gnss::getExtensionGnssNavigationMessage(
359*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssNavigationMessageInterface>* iGnssNavigationMessage) {
360*4d7e907cSAndroid Build Coastguard Worker ALOGD("getExtensionGnssNavigationMessage");
361*4d7e907cSAndroid Build Coastguard Worker
362*4d7e907cSAndroid Build Coastguard Worker *iGnssNavigationMessage = SharedRefBase::make<GnssNavigationMessageInterface>();
363*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
364*4d7e907cSAndroid Build Coastguard Worker }
365*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssDebug(std::shared_ptr<IGnssDebug> * iGnssDebug)366*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Gnss::getExtensionGnssDebug(std::shared_ptr<IGnssDebug>* iGnssDebug) {
367*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionGnssDebug");
368*4d7e907cSAndroid Build Coastguard Worker *iGnssDebug = SharedRefBase::make<GnssDebug>();
369*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
370*4d7e907cSAndroid Build Coastguard Worker }
371*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssVisibilityControl(std::shared_ptr<visibility_control::IGnssVisibilityControl> * iGnssVisibilityControl)372*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Gnss::getExtensionGnssVisibilityControl(
373*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<visibility_control::IGnssVisibilityControl>* iGnssVisibilityControl) {
374*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionGnssVisibilityControl");
375*4d7e907cSAndroid Build Coastguard Worker
376*4d7e907cSAndroid Build Coastguard Worker *iGnssVisibilityControl = SharedRefBase::make<visibility_control::GnssVisibilityControl>();
377*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
378*4d7e907cSAndroid Build Coastguard Worker }
379*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssAntennaInfo(std::shared_ptr<IGnssAntennaInfo> * iGnssAntennaInfo)380*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Gnss::getExtensionGnssAntennaInfo(
381*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IGnssAntennaInfo>* iGnssAntennaInfo) {
382*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionGnssAntennaInfo");
383*4d7e907cSAndroid Build Coastguard Worker
384*4d7e907cSAndroid Build Coastguard Worker *iGnssAntennaInfo = SharedRefBase::make<GnssAntennaInfo>();
385*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
386*4d7e907cSAndroid Build Coastguard Worker }
387*4d7e907cSAndroid Build Coastguard Worker
getExtensionMeasurementCorrections(std::shared_ptr<measurement_corrections::IMeasurementCorrectionsInterface> * iMeasurementCorrections)388*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Gnss::getExtensionMeasurementCorrections(
389*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<measurement_corrections::IMeasurementCorrectionsInterface>*
390*4d7e907cSAndroid Build Coastguard Worker iMeasurementCorrections) {
391*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionMeasurementCorrections");
392*4d7e907cSAndroid Build Coastguard Worker
393*4d7e907cSAndroid Build Coastguard Worker *iMeasurementCorrections =
394*4d7e907cSAndroid Build Coastguard Worker SharedRefBase::make<measurement_corrections::MeasurementCorrectionsInterface>();
395*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
396*4d7e907cSAndroid Build Coastguard Worker }
397*4d7e907cSAndroid Build Coastguard Worker
getExtensionGnssAssistanceInterface(std::shared_ptr<gnss_assistance::IGnssAssistanceInterface> * iGnssAssistanceInterface)398*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus Gnss::getExtensionGnssAssistanceInterface(
399*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<gnss_assistance::IGnssAssistanceInterface>* iGnssAssistanceInterface) {
400*4d7e907cSAndroid Build Coastguard Worker ALOGD("Gnss::getExtensionGnssAssistanceInterface");
401*4d7e907cSAndroid Build Coastguard Worker
402*4d7e907cSAndroid Build Coastguard Worker *iGnssAssistanceInterface = SharedRefBase::make<gnss_assistance::GnssAssistanceInterface>();
403*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
404*4d7e907cSAndroid Build Coastguard Worker }
405*4d7e907cSAndroid Build Coastguard Worker
setGnssMeasurementEnabled(const bool enabled)406*4d7e907cSAndroid Build Coastguard Worker void Gnss::setGnssMeasurementEnabled(const bool enabled) {
407*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementEnabled = enabled;
408*4d7e907cSAndroid Build Coastguard Worker }
409*4d7e907cSAndroid Build Coastguard Worker
setGnssMeasurementInterval(const long intervalMs)410*4d7e907cSAndroid Build Coastguard Worker void Gnss::setGnssMeasurementInterval(const long intervalMs) {
411*4d7e907cSAndroid Build Coastguard Worker mGnssMeasurementIntervalMs = intervalMs;
412*4d7e907cSAndroid Build Coastguard Worker }
413*4d7e907cSAndroid Build Coastguard Worker
getLastLocation() const414*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<GnssLocation> Gnss::getLastLocation() const {
415*4d7e907cSAndroid Build Coastguard Worker return mLastLocation;
416*4d7e907cSAndroid Build Coastguard Worker }
417*4d7e907cSAndroid Build Coastguard Worker
418*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::gnss
419