blob: 6331dfd8dc1c2ad8797a691e01925c5a45bb0ec3 [file] [log] [blame]
Yu-Han Yang274ea0a2020-09-09 17:25:02 -07001/*
2 * Copyright (C) 2020 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 "GnssAidl"
18
19#include "Gnss.h"
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080020#include <inttypes.h>
Yu-Han Yang274ea0a2020-09-09 17:25:02 -070021#include <log/log.h>
Shinru Han7f31c142021-11-05 11:56:40 +080022#include "AGnss.h"
Shinru Han0d91cbe2021-12-14 12:06:02 +080023#include "AGnssRil.h"
Yuchen He42b2d0a2022-01-12 04:39:37 +000024#include "DeviceFileReader.h"
Joe Huang37d77dd2021-12-30 13:14:29 +080025#include "GnssAntennaInfo.h"
Yu-Han Yang3a75dc02021-09-27 01:01:06 -070026#include "GnssBatching.h"
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070027#include "GnssConfiguration.h"
Joe Huang202b02d2021-11-16 23:09:11 +080028#include "GnssDebug.h"
Yu-Han Yang3089df32021-09-29 21:31:23 -070029#include "GnssGeofence.h"
Yu-Han Yang04832302020-11-20 09:51:18 -080030#include "GnssMeasurementInterface.h"
Yu-Han Yang10cf7362021-10-03 22:32:04 -070031#include "GnssNavigationMessageInterface.h"
Yu-Han Yang274ea0a2020-09-09 17:25:02 -070032#include "GnssPsds.h"
Edwin Tungd7a5de22021-12-08 13:27:51 +080033#include "GnssVisibilityControl.h"
Edwin Tungbbf7fb92021-12-27 12:13:02 +080034#include "MeasurementCorrectionsInterface.h"
Yuchen He42b2d0a2022-01-12 04:39:37 +000035#include "NmeaFixInfo.h"
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080036#include "Utils.h"
Yu-Han Yang274ea0a2020-09-09 17:25:02 -070037
38namespace aidl::android::hardware::gnss {
Yuchen He42b2d0a2022-01-12 04:39:37 +000039using ::android::hardware::gnss::common::NmeaFixInfo;
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080040using ::android::hardware::gnss::common::Utils;
Yuchen He42b2d0a2022-01-12 04:39:37 +000041
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080042using ndk::ScopedAStatus;
43using GnssSvInfo = IGnssCallback::GnssSvInfo;
44
45constexpr int TTFF_MILLIS = 2200;
Yu-Han Yang274ea0a2020-09-09 17:25:02 -070046
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070047std::shared_ptr<IGnssCallback> Gnss::sGnssCallback = nullptr;
48
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080049Gnss::Gnss() : mMinIntervalMs(1000), mFirstFixReceived(false) {}
50
51ScopedAStatus Gnss::setCallback(const std::shared_ptr<IGnssCallback>& callback) {
52 ALOGD("setCallback");
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070053 if (callback == nullptr) {
54 ALOGE("%s: Null callback ignored", __func__);
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080055 return ScopedAStatus::fromExceptionCode(STATUS_INVALID_OPERATION);
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070056 }
57
58 sGnssCallback = callback;
59
Joe Huang0d203ba2020-12-07 23:57:48 +080060 int capabilities = (int)(IGnssCallback::CAPABILITY_SATELLITE_BLOCKLIST |
Shinru Han4abab502020-12-09 15:07:18 +080061 IGnssCallback::CAPABILITY_SATELLITE_PVT |
Joe Huangad5d0702022-01-19 19:01:44 +080062 IGnssCallback::CAPABILITY_CORRELATION_VECTOR);
Shinru Han4abab502020-12-09 15:07:18 +080063
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070064 auto status = sGnssCallback->gnssSetCapabilitiesCb(capabilities);
65 if (!status.isOk()) {
66 ALOGE("%s: Unable to invoke callback.gnssSetCapabilities", __func__);
67 }
68
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080069 return ScopedAStatus::ok();
Yu-Han Yang1e1a6762020-09-30 17:01:53 -070070}
71
Yuchen He42b2d0a2022-01-12 04:39:37 +000072std::unique_ptr<GnssLocation> Gnss::getLocationFromHW() {
73 std::string inputStr =
74 ::android::hardware::gnss::common::DeviceFileReader::Instance().getLocationData();
75 return ::android::hardware::gnss::common::NmeaFixInfo::getAidlLocationFromInputStr(inputStr);
76}
77
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080078ScopedAStatus Gnss::start() {
79 ALOGD("start()");
80 if (mIsActive) {
81 ALOGW("Gnss has started. Restarting...");
82 stop();
83 }
84
85 mIsActive = true;
86 this->reportGnssStatusValue(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
87 mThread = std::thread([this]() {
88 auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList());
89 this->reportSvStatus(svStatus);
90 if (!mFirstFixReceived) {
91 std::this_thread::sleep_for(std::chrono::milliseconds(TTFF_MILLIS));
92 mFirstFixReceived = true;
93 }
94 while (mIsActive == true) {
95 auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList());
96 this->reportSvStatus(svStatus);
97
Yuchen He42b2d0a2022-01-12 04:39:37 +000098 auto currentLocation = getLocationFromHW();
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -080099 mGnssPowerIndication->notePowerConsumption();
Yuchen He42b2d0a2022-01-12 04:39:37 +0000100 if (currentLocation != nullptr) {
101 this->reportLocation(*currentLocation);
102 } else {
103 const auto location = Utils::getMockLocation();
104 this->reportLocation(location);
105 }
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800106 std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMs));
107 }
108 });
109 return ScopedAStatus::ok();
110}
111
112void Gnss::reportLocation(const GnssLocation& location) const {
113 std::unique_lock<std::mutex> lock(mMutex);
114 if (sGnssCallback == nullptr) {
115 ALOGE("%s: GnssCallback is null.", __func__);
116 return;
117 }
118 auto status = sGnssCallback->gnssLocationCb(location);
119 if (!status.isOk()) {
120 ALOGE("%s: Unable to invoke gnssLocationCb", __func__);
121 }
122 return;
123}
124
125void Gnss::reportSvStatus(const std::vector<GnssSvInfo>& svInfoList) const {
126 std::unique_lock<std::mutex> lock(mMutex);
127 if (sGnssCallback == nullptr) {
128 ALOGE("%s: sGnssCallback is null.", __func__);
129 return;
130 }
131 auto status = sGnssCallback->gnssSvStatusCb(svInfoList);
132 if (!status.isOk()) {
133 ALOGE("%s: Unable to invoke callback", __func__);
134 }
135}
136
137std::vector<GnssSvInfo> Gnss::filterBlocklistedSatellites(std::vector<GnssSvInfo> gnssSvInfoList) {
138 ALOGD("filterBlocklistedSatellites");
139 for (uint32_t i = 0; i < gnssSvInfoList.size(); i++) {
140 if (mGnssConfiguration->isBlocklisted(gnssSvInfoList[i])) {
141 gnssSvInfoList[i].svFlag &= ~(uint32_t)IGnssCallback::GnssSvFlags::USED_IN_FIX;
142 }
143 }
144 return gnssSvInfoList;
145}
146
147void Gnss::reportGnssStatusValue(const IGnssCallback::GnssStatusValue gnssStatusValue) const {
148 std::unique_lock<std::mutex> lock(mMutex);
149 if (sGnssCallback == nullptr) {
150 ALOGE("%s: sGnssCallback is null.", __func__);
151 return;
152 }
153 auto status = sGnssCallback->gnssStatusCb(gnssStatusValue);
154 if (!status.isOk()) {
155 ALOGE("%s: Unable to invoke gnssStatusCb", __func__);
156 }
157}
158
159ScopedAStatus Gnss::stop() {
160 ALOGD("stop");
161 mIsActive = false;
162 this->reportGnssStatusValue(IGnssCallback::GnssStatusValue::SESSION_END);
163 if (mThread.joinable()) {
164 mThread.join();
165 }
166 return ScopedAStatus::ok();
167}
168
169ScopedAStatus Gnss::close() {
170 ALOGD("close");
Yu-Han Yang1e1a6762020-09-30 17:01:53 -0700171 sGnssCallback = nullptr;
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800172 return ScopedAStatus::ok();
Yu-Han Yang1e1a6762020-09-30 17:01:53 -0700173}
174
Shinru Han0d91cbe2021-12-14 12:06:02 +0800175ScopedAStatus Gnss::getExtensionAGnss(std::shared_ptr<IAGnss>* iAGnss) {
Shinru Han7f31c142021-11-05 11:56:40 +0800176 ALOGD("Gnss::getExtensionAGnss");
177 *iAGnss = SharedRefBase::make<AGnss>();
178 return ndk::ScopedAStatus::ok();
179}
180
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800181ScopedAStatus Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, int uncertaintyMs) {
182 ALOGD("injectTime. timeMs:%" PRId64 ", timeReferenceMs:%" PRId64 ", uncertaintyMs:%d", timeMs,
183 timeReferenceMs, uncertaintyMs);
184 return ScopedAStatus::ok();
Yu-Han Yang274ea0a2020-09-09 17:25:02 -0700185}
186
Shinru Han0d91cbe2021-12-14 12:06:02 +0800187ScopedAStatus Gnss::getExtensionAGnssRil(std::shared_ptr<IAGnssRil>* iAGnssRil) {
188 ALOGD("Gnss::getExtensionAGnssRil");
189 *iAGnssRil = SharedRefBase::make<AGnssRil>();
190 return ndk::ScopedAStatus::ok();
191}
192
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800193ScopedAStatus Gnss::injectLocation(const GnssLocation& location) {
194 ALOGD("injectLocation. lat:%lf, lng:%lf, acc:%f", location.latitudeDegrees,
195 location.longitudeDegrees, location.horizontalAccuracyMeters);
196 return ScopedAStatus::ok();
197}
198
199ScopedAStatus Gnss::injectBestLocation(const GnssLocation& location) {
200 ALOGD("injectBestLocation. lat:%lf, lng:%lf, acc:%f", location.latitudeDegrees,
201 location.longitudeDegrees, location.horizontalAccuracyMeters);
202 return ScopedAStatus::ok();
203}
204
205ScopedAStatus Gnss::deleteAidingData(GnssAidingData aidingDataFlags) {
206 ALOGD("deleteAidingData. flags:%d", (int)aidingDataFlags);
207 mFirstFixReceived = false;
208 return ScopedAStatus::ok();
209}
210
211ScopedAStatus Gnss::setPositionMode(GnssPositionMode, GnssPositionRecurrence, int minIntervalMs,
212 int /* preferredAccuracyMeters */, int /* preferredTimeMs */,
213 bool lowPowerMode) {
214 ALOGD("setPositionMode. minIntervalMs:%d, lowPowerMode:%d", minIntervalMs, (int)lowPowerMode);
215 mMinIntervalMs = minIntervalMs;
216 return ScopedAStatus::ok();
217}
218
219ScopedAStatus Gnss::getExtensionPsds(std::shared_ptr<IGnssPsds>* iGnssPsds) {
220 ALOGD("getExtensionPsds");
221 *iGnssPsds = SharedRefBase::make<GnssPsds>();
222 return ScopedAStatus::ok();
223}
224
225ScopedAStatus Gnss::getExtensionGnssConfiguration(
Yu-Han Yang1e1a6762020-09-30 17:01:53 -0700226 std::shared_ptr<IGnssConfiguration>* iGnssConfiguration) {
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800227 ALOGD("getExtensionGnssConfiguration");
Yu-Han Yang1e1a6762020-09-30 17:01:53 -0700228 if (mGnssConfiguration == nullptr) {
229 mGnssConfiguration = SharedRefBase::make<GnssConfiguration>();
230 }
231 *iGnssConfiguration = mGnssConfiguration;
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800232 return ScopedAStatus::ok();
Yu-Han Yang1e1a6762020-09-30 17:01:53 -0700233}
234
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800235ScopedAStatus Gnss::getExtensionGnssPowerIndication(
Yu-Han Yang24753612020-10-27 14:42:14 -0700236 std::shared_ptr<IGnssPowerIndication>* iGnssPowerIndication) {
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800237 ALOGD("getExtensionGnssPowerIndication");
Yu-Han Yang669be842021-04-26 20:17:53 -0700238 if (mGnssPowerIndication == nullptr) {
239 mGnssPowerIndication = SharedRefBase::make<GnssPowerIndication>();
240 }
Yu-Han Yang24753612020-10-27 14:42:14 -0700241
Yu-Han Yang669be842021-04-26 20:17:53 -0700242 *iGnssPowerIndication = mGnssPowerIndication;
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800243 return ScopedAStatus::ok();
Yu-Han Yang24753612020-10-27 14:42:14 -0700244}
245
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800246ScopedAStatus Gnss::getExtensionGnssMeasurement(
Yu-Han Yang04832302020-11-20 09:51:18 -0800247 std::shared_ptr<IGnssMeasurementInterface>* iGnssMeasurement) {
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800248 ALOGD("getExtensionGnssMeasurement");
Yu-Han Yang04832302020-11-20 09:51:18 -0800249
250 *iGnssMeasurement = SharedRefBase::make<GnssMeasurementInterface>();
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800251 return ScopedAStatus::ok();
Yu-Han Yang04832302020-11-20 09:51:18 -0800252}
253
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800254ScopedAStatus Gnss::getExtensionGnssBatching(std::shared_ptr<IGnssBatching>* iGnssBatching) {
255 ALOGD("getExtensionGnssBatching");
Yu-Han Yang3a75dc02021-09-27 01:01:06 -0700256
257 *iGnssBatching = SharedRefBase::make<GnssBatching>();
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800258 return ScopedAStatus::ok();
Yu-Han Yang3a75dc02021-09-27 01:01:06 -0700259}
260
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800261ScopedAStatus Gnss::getExtensionGnssGeofence(std::shared_ptr<IGnssGeofence>* iGnssGeofence) {
262 ALOGD("getExtensionGnssGeofence");
Yu-Han Yang3089df32021-09-29 21:31:23 -0700263
264 *iGnssGeofence = SharedRefBase::make<GnssGeofence>();
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800265 return ScopedAStatus::ok();
Yu-Han Yang3089df32021-09-29 21:31:23 -0700266}
267
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800268ScopedAStatus Gnss::getExtensionGnssNavigationMessage(
Yu-Han Yang10cf7362021-10-03 22:32:04 -0700269 std::shared_ptr<IGnssNavigationMessageInterface>* iGnssNavigationMessage) {
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800270 ALOGD("getExtensionGnssNavigationMessage");
Yu-Han Yang10cf7362021-10-03 22:32:04 -0700271
272 *iGnssNavigationMessage = SharedRefBase::make<GnssNavigationMessageInterface>();
Yu-Han Yang1afbd5f2021-11-24 16:39:13 -0800273 return ScopedAStatus::ok();
Yu-Han Yang10cf7362021-10-03 22:32:04 -0700274}
275
Joe Huang202b02d2021-11-16 23:09:11 +0800276ndk::ScopedAStatus Gnss::getExtensionGnssDebug(std::shared_ptr<IGnssDebug>* iGnssDebug) {
277 ALOGD("Gnss::getExtensionGnssDebug");
278
279 *iGnssDebug = SharedRefBase::make<GnssDebug>();
280 return ndk::ScopedAStatus::ok();
281}
282
Edwin Tungd7a5de22021-12-08 13:27:51 +0800283ndk::ScopedAStatus Gnss::getExtensionGnssVisibilityControl(
284 std::shared_ptr<visibility_control::IGnssVisibilityControl>* iGnssVisibilityControl) {
285 ALOGD("Gnss::getExtensionGnssVisibilityControl");
286
287 *iGnssVisibilityControl = SharedRefBase::make<visibility_control::GnssVisibilityControl>();
288 return ndk::ScopedAStatus::ok();
289}
290
Joe Huang37d77dd2021-12-30 13:14:29 +0800291ndk::ScopedAStatus Gnss::getExtensionGnssAntennaInfo(
292 std::shared_ptr<IGnssAntennaInfo>* iGnssAntennaInfo) {
293 ALOGD("Gnss::getExtensionGnssAntennaInfo");
294
295 *iGnssAntennaInfo = SharedRefBase::make<GnssAntennaInfo>();
296 return ndk::ScopedAStatus::ok();
297}
298
Edwin Tungbbf7fb92021-12-27 12:13:02 +0800299ndk::ScopedAStatus Gnss::getExtensionMeasurementCorrections(
300 std::shared_ptr<measurement_corrections::IMeasurementCorrectionsInterface>*
301 iMeasurementCorrections) {
302 ALOGD("Gnss::getExtensionMeasurementCorrections");
303
304 *iMeasurementCorrections =
305 SharedRefBase::make<measurement_corrections::MeasurementCorrectionsInterface>();
306 return ndk::ScopedAStatus::ok();
307}
308
Yu-Han Yang274ea0a2020-09-09 17:25:02 -0700309} // namespace aidl::android::hardware::gnss