blob: 0613223bd5dc1e7bff06dd51d12cf0bd93ba7a10 [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
2 * Copyright 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 "FrontendClient"
18
19#include <android-base/logging.h>
20#include <utils/Log.h>
21
22#include "FrontendClient.h"
23
Amy Zhangb9f3cab2021-01-13 15:24:14 -080024using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080025using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080026
27using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
28using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080030using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080031using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080032using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080033using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080035using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080036using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080038using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080041using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080043using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080044using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080045using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080046using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080047using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
48using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
49using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
50using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080051using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
Amy Zhang9abbe102021-02-08 19:51:18 -080052using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080053using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
Amy Zhang9abbe102021-02-08 19:51:18 -080054using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -080055using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
Amy Zhangd08c2732021-01-08 17:22:59 -080056using ::android::hardware::tv::tuner::V1_1::Constant;
Amy Zhang9abbe102021-02-08 19:51:18 -080057using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
Amy Zhang46c31ec2021-02-03 18:19:10 -080058using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
59using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
60using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080061using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080062using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
63using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
64using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080065using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080066using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
Amy Zhang9abbe102021-02-08 19:51:18 -080067using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
68using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080069using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang9abbe102021-02-08 19:51:18 -080070using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080071using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhang9abbe102021-02-08 19:51:18 -080072using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
Amy Zhang46c31ec2021-02-03 18:19:10 -080073using ::android::hardware::tv::tuner::V1_1::FrontendType;
Amy Zhanga6734682020-11-30 16:14:38 -080074
Amy Zhangbf68a162020-11-23 17:42:40 -080075namespace android {
76
Amy Zhanga6734682020-11-30 16:14:38 -080077/////////////// FrontendClient ///////////////////////
78
Amy Zhang9abbe102021-02-08 19:51:18 -080079FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type) {
Amy Zhangbf68a162020-11-23 17:42:40 -080080 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080081 mAidlCallback = NULL;
82 mHidlCallback = NULL;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080083 mType = type;
Amy Zhangbf68a162020-11-23 17:42:40 -080084}
85
86FrontendClient::~FrontendClient() {
87 mTunerFrontend = NULL;
88 mFrontend = NULL;
89 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080090 mAidlCallback = NULL;
91 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080092 mId = -1;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080093 mType = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080094}
95
96Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
97 if (mTunerFrontend != NULL) {
98 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
Amy Zhangb9f3cab2021-01-13 15:24:14 -080099 mAidlCallback->setFrontendType(mType);
Amy Zhang379cb482021-02-04 21:05:11 -0800100 Status s = mTunerFrontend->setCallback(mAidlCallback);
101 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800102 }
103
104 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
105 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -0800106}
107
108void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
109 mFrontend = frontend;
110 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
111}
Amy Zhanga6734682020-11-30 16:14:38 -0800112
Amy Zhang9abbe102021-02-08 19:51:18 -0800113// TODO: move after migration is done
114void FrontendClient::setId(int id) {
115 mId = id;
116}
117
Amy Zhanga6734682020-11-30 16:14:38 -0800118Result FrontendClient::tune(const FrontendSettings& settings,
119 const FrontendSettingsExt1_1& settingsExt1_1) {
120 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800121 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
122 Status s = mTunerFrontend->tune(tunerFeSettings);
Amy Zhang4a07e802021-01-21 17:10:21 -0800123 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800124 }
125
126 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800127 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhanga6734682020-11-30 16:14:38 -0800128 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
129 return result;
130 }
131
132 if (mFrontend != NULL) {
133 result = mFrontend->tune(settings);
134 return result;
135 }
136
137 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -0800138}
Amy Zhanga6734682020-11-30 16:14:38 -0800139
140Result FrontendClient::stopTune() {
141 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800142 Status s = mTunerFrontend->stopTune();
143 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800144 }
145
146 if (mFrontend != NULL) {
147 Result result = mFrontend->stopTune();
148 return result;
149 }
150
151 return Result::INVALID_STATE;
152}
153
Amy Zhangd08c2732021-01-08 17:22:59 -0800154Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
155 const FrontendSettingsExt1_1& settingsExt1_1) {
156 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800157 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
158 Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
Amy Zhang4a07e802021-01-21 17:10:21 -0800159 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800160 }
161
162 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800163 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhangd08c2732021-01-08 17:22:59 -0800164 result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
165 return result;
166 }
167
168 if (mFrontend != NULL) {
169 result = mFrontend->scan(settings, type);
170 return result;
171 }
172
173 return Result::INVALID_STATE;
174}
175
176Result FrontendClient::stopScan() {
177 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800178 Status s = mTunerFrontend->stopScan();
179 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800180 }
181
182 if (mFrontend != NULL) {
183 Result result = mFrontend->stopScan();
184 return result;
185 }
186
187 return Result::INVALID_STATE;
188}
189
190vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
191 vector<FrontendStatus> status;
192
193 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800194 vector<TunerFrontendStatus> aidlStatus;
195 vector<int> types;
196 for (auto t : statusTypes) {
197 types.push_back((int)t);
198 }
199 Status s = mTunerFrontend->getStatus(types, &aidlStatus);
200 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
201 return status;
202 }
203 return getHidlStatus(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800204 }
205
206 if (mFrontend != NULL && statusTypes.size() > 0) {
207 Result res;
208 mFrontend->getStatus(statusTypes,
209 [&](Result r, const hidl_vec<FrontendStatus>& s) {
210 res = r;
211 status = s;
212 });
213 if (res != Result::SUCCESS) {
214 status.clear();
215 return status;
216 }
217 }
218
219 return status;
220}
Amy Zhang46c31ec2021-02-03 18:19:10 -0800221
Amy Zhangd08c2732021-01-08 17:22:59 -0800222vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
223 vector<FrontendStatusTypeExt1_1> statusTypes) {
224 vector<FrontendStatusExt1_1> status;
225
226 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800227 vector<TunerFrontendStatus> aidlStatus;
228 vector<int> types;
229 for (auto t : statusTypes) {
230 types.push_back((int)t);
231 }
232 Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus);
233 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
234 return status;
235 }
236 return getHidlStatusExt(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800237 }
238
239 if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
240 Result res;
241 mFrontend_1_1->getStatusExt1_1(statusTypes,
242 [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
243 res = r;
244 status = s;
245 });
246 if (res != Result::SUCCESS) {
247 status.clear();
248 return status;
249 }
250 }
251
252 return status;
253}
254
Amy Zhangd3d57b42021-01-07 11:14:43 -0800255Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
256 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800257 Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
258 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800259 }
260
261 if (mFrontend != NULL) {
262 Result result = mFrontend->setLnb(lnbClient->getId());
263 return result;
264 }
265
266 return Result::INVALID_STATE;
267}
268
Amy Zhangd08c2732021-01-08 17:22:59 -0800269Result FrontendClient::setLna(bool bEnable) {
270 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800271 Status s = mTunerFrontend->setLna(bEnable);
272 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800273 }
274
275 if (mFrontend != NULL) {
276 Result result = mFrontend->setLna(bEnable);
277 return result;
278 }
279
280 return Result::INVALID_STATE;
281}
282
283int FrontendClient::linkCiCamToFrontend(int ciCamId) {
284 int ltsId = (int)Constant::INVALID_LTS_ID;
285
286 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800287 Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
288 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
289 return ltsId;
290 }
291 return (int)Constant::INVALID_LTS_ID;
Amy Zhangd08c2732021-01-08 17:22:59 -0800292 }
293
294 if (mFrontend_1_1 != NULL) {
295 Result res;
296 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
297 [&](Result r, uint32_t id) {
298 res = r;
299 ltsId = id;
300 });
301 if (res != Result::SUCCESS) {
302 return (int)Constant::INVALID_LTS_ID;
303 }
304 }
305
306 return ltsId;
307}
308
309Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
310 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800311 Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
312 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800313 }
314
315 if (mFrontend_1_1 != NULL) {
316 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
317 }
318
319 return Result::INVALID_STATE;
320}
321
Amy Zhanga6734682020-11-30 16:14:38 -0800322Result FrontendClient::close() {
323 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800324 Status s = mTunerFrontend->close();
325 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800326 }
327
328 if (mFrontend != NULL) {
329 Result result = mFrontend->close();
330 if (result == Result::SUCCESS) {
331 mFrontend = NULL;
332 mFrontend_1_1 = NULL;
333 }
334 return result;
335 }
336
337 return Result::INVALID_STATE;
338}
339
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800340/////////////// TunerFrontend Helper Methods ///////////////////////
341
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800342shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
343 return mTunerFrontend;
344}
345
346int FrontendClient::getId() {
Amy Zhang9abbe102021-02-08 19:51:18 -0800347 if (mTunerFrontend != NULL) {
348 Status s = mTunerFrontend->getFrontendId(&mId);
349 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
350 return mId;
351 }
352 ALOGE("Failed to getFrontendId from Tuner Frontend");
353 return -1;
354 }
355
356 if (mFrontend != NULL) {
357 return mId;
358 }
359
360 return -1;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800361}
362
Amy Zhang46c31ec2021-02-03 18:19:10 -0800363vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
364 vector<FrontendStatus> hidlStatus;
365 for (TunerFrontendStatus s : aidlStatus) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800366 FrontendStatus status = FrontendStatus();
Amy Zhang46c31ec2021-02-03 18:19:10 -0800367 switch (s.getTag()) {
368 case TunerFrontendStatus::isDemodLocked: {
369 status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
370 hidlStatus.push_back(status);
371 break;
372 }
373 case TunerFrontendStatus::snr: {
374 status.snr(s.get<TunerFrontendStatus::snr>());
375 hidlStatus.push_back(status);
376 break;
377 }
378 case TunerFrontendStatus::ber: {
379 status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
380 hidlStatus.push_back(status);
381 break;
382 }
383 case TunerFrontendStatus::per: {
384 status.per((uint32_t)s.get<TunerFrontendStatus::per>());
385 hidlStatus.push_back(status);
386 break;
387 }
388 case TunerFrontendStatus::preBer: {
389 status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
390 hidlStatus.push_back(status);
391 break;
392 }
393 case TunerFrontendStatus::signalQuality: {
394 status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
395 hidlStatus.push_back(status);
396 break;
397 }
398 case TunerFrontendStatus::signalStrength: {
399 status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
400 hidlStatus.push_back(status);
401 break;
402 }
403 case TunerFrontendStatus::symbolRate: {
404 status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
405 hidlStatus.push_back(status);
406 break;
407 }
408 case TunerFrontendStatus::innerFec: {
409 status.innerFec(static_cast<FrontendInnerFec>(
410 s.get<TunerFrontendStatus::innerFec>()));
411 hidlStatus.push_back(status);
412 break;
413 }
414 case TunerFrontendStatus::modulation: {
415 auto aidlMod = s.get<TunerFrontendStatus::modulation>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800416 FrontendModulationStatus modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800417 switch (mType) {
418 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800419 modulation.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
420 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800421 hidlStatus.push_back(status);
422 break;
423 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800424 modulation.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
425 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800426 hidlStatus.push_back(status);
427 break;
428 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800429 modulation.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
430 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800431 hidlStatus.push_back(status);
432 break;
433 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800434 modulation.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
435 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800436 hidlStatus.push_back(status);
437 break;
438 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800439 modulation.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
440 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800441 hidlStatus.push_back(status);
442 break;
443 default:
444 break;
445 }
446 break;
447 }
448 case TunerFrontendStatus::inversion: {
449 status.inversion(static_cast<FrontendDvbcSpectralInversion>(
450 s.get<TunerFrontendStatus::inversion>()));
451 hidlStatus.push_back(status);
452 break;
453 }
454 case TunerFrontendStatus::lnbVoltage: {
455 status.lnbVoltage(static_cast<LnbVoltage>(
456 s.get<TunerFrontendStatus::lnbVoltage>()));
457 hidlStatus.push_back(status);
458 break;
459 }
460 case TunerFrontendStatus::plpId: {
461 status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
462 hidlStatus.push_back(status);
463 break;
464 }
465 case TunerFrontendStatus::isEWBS: {
466 status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
467 hidlStatus.push_back(status);
468 break;
469 }
470 case TunerFrontendStatus::agc: {
471 status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
472 hidlStatus.push_back(status);
473 break;
474 }
475 case TunerFrontendStatus::isLnaOn: {
476 status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
477 hidlStatus.push_back(status);
478 break;
479 }
480 case TunerFrontendStatus::isLayerError: {
481 auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
482 hidl_vec<bool> e(aidlE.begin(), aidlE.end());
483 status.isLayerError(e);
484 hidlStatus.push_back(status);
485 break;
486 }
487 case TunerFrontendStatus::mer: {
488 status.mer(s.get<TunerFrontendStatus::mer>());
489 hidlStatus.push_back(status);
490 break;
491 }
492 case TunerFrontendStatus::freqOffset: {
493 status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
494 hidlStatus.push_back(status);
495 break;
496 }
497 case TunerFrontendStatus::hierarchy: {
498 status.hierarchy(static_cast<FrontendDvbtHierarchy>(
Amy Zhang9abbe102021-02-08 19:51:18 -0800499 s.get<TunerFrontendStatus::hierarchy>()));
Amy Zhang46c31ec2021-02-03 18:19:10 -0800500 hidlStatus.push_back(status);
501 break;
502 }
503 case TunerFrontendStatus::isRfLocked: {
504 status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
505 hidlStatus.push_back(status);
506 break;
507 }
508 case TunerFrontendStatus::plpInfo: {
509 int size = s.get<TunerFrontendStatus::plpInfo>().size();
Amy Zhang9abbe102021-02-08 19:51:18 -0800510 hidl_vec<FrontendStatusAtsc3PlpInfo> info(size);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800511 for (int i = 0; i < size; i++) {
512 auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
Amy Zhang9abbe102021-02-08 19:51:18 -0800513 info[i] = {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800514 .plpId = (uint8_t)aidlInfo.plpId,
515 .isLocked = aidlInfo.isLocked,
516 .uec = (uint32_t)aidlInfo.uec,
517 };
518 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800519 status.plpInfo(info);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800520 hidlStatus.push_back(status);
521 break;
522 }
523 default:
524 break;
525 }
526 }
527 return hidlStatus;
528}
529
530vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
531 vector<TunerFrontendStatus>& aidlStatus) {
532 vector<FrontendStatusExt1_1> hidlStatus;
533 for (TunerFrontendStatus s : aidlStatus) {
534 FrontendStatusExt1_1 status;
535 switch (s.getTag()) {
536 case TunerFrontendStatus::modulations: {
Amy Zhang9abbe102021-02-08 19:51:18 -0800537 vector<FrontendModulation> ms;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800538 for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800539 FrontendModulation m;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800540 switch (mType) {
541 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800542 m.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
543 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800544 break;
545 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800546 m.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
547 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800548 break;
549 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800550 m.dvbt(static_cast<FrontendDvbtConstellation>(aidlMod));
551 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800552 break;
553 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800554 m.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
555 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800556 break;
557 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800558 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
559 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800560 break;
561 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800562 m.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
563 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800564 break;
565 case (int)FrontendType::ATSC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800566 m.atsc(static_cast<FrontendAtscModulation>(aidlMod));
567 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800568 break;
569 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800570 m.atsc3(static_cast<FrontendAtsc3Modulation>(aidlMod));
571 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800572 break;
573 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800574 m.dtmb(static_cast<FrontendDtmbModulation>(aidlMod));
575 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800576 break;
577 default:
Amy Zhang46c31ec2021-02-03 18:19:10 -0800578 break;
579 }
580 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800581 if (ms.size() > 0) {
582 status.modulations(ms);
583 hidlStatus.push_back(status);
584 }
Amy Zhang46c31ec2021-02-03 18:19:10 -0800585 break;
586 }
587 case TunerFrontendStatus::bers: {
588 auto aidlB = s.get<TunerFrontendStatus::bers>();
589 hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
590 status.bers(b);
591 hidlStatus.push_back(status);
592 break;
593 }
594 case TunerFrontendStatus::codeRates: {
595 int size = s.get<TunerFrontendStatus::codeRates>().size();
596 status.codeRates().resize(size);
597 for (int i = 0; i < size; i++) {
598 auto aidlCodeRate = s.get<TunerFrontendStatus::codeRates>()[i];
599 status.codeRates()[i] =
600 static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate);
601 }
602 hidlStatus.push_back(status);
603 break;
604 }
605 case TunerFrontendStatus::bandwidth: {
606 auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800607 FrontendBandwidth band;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800608 switch (mType) {
609 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800610 band.atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
611 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800612 hidlStatus.push_back(status);
613 break;
614 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800615 band.dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
616 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800617 hidlStatus.push_back(status);
618 break;
619 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800620 band.dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
621 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800622 hidlStatus.push_back(status);
623 break;
624 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800625 band.isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
626 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800627 hidlStatus.push_back(status);
628 break;
629 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800630 band.dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
631 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800632 hidlStatus.push_back(status);
633 break;
634 default:
635 break;
636 }
637 break;
638 }
639 case TunerFrontendStatus::interval: {
640 auto aidlInter = s.get<TunerFrontendStatus::interval>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800641 FrontendGuardInterval inter;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800642 switch (mType) {
643 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800644 inter.dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
645 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800646 hidlStatus.push_back(status);
647 break;
648 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800649 inter.isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
650 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800651 hidlStatus.push_back(status);
652 break;
653 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800654 inter.dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
655 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800656 hidlStatus.push_back(status);
657 break;
658 default:
659 break;
660 }
661 break;
662 }
663 case TunerFrontendStatus::transmissionMode: {
664 auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800665 FrontendTransmissionMode trans;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800666 switch (mType) {
667 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800668 trans.dvbt(static_cast<FrontendDvbtTransmissionMode>(aidlTran));
669 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800670 hidlStatus.push_back(status);
671 break;
672 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800673 trans.isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
674 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800675 hidlStatus.push_back(status);
676 break;
677 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800678 trans.dtmb(static_cast<FrontendDtmbTransmissionMode>(aidlTran));
679 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800680 hidlStatus.push_back(status);
681 break;
682 default:
683 break;
684 }
685 break;
686 }
687 case TunerFrontendStatus::uec: {
688 status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
689 hidlStatus.push_back(status);
690 break;
691 }
692 case TunerFrontendStatus::systemId: {
693 status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
694 hidlStatus.push_back(status);
695 break;
696 }
697 case TunerFrontendStatus::interleaving: {
Amy Zhang9abbe102021-02-08 19:51:18 -0800698 vector<FrontendInterleaveMode> modes;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800699 for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800700 FrontendInterleaveMode mode;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800701 switch (mType) {
702 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800703 mode.dvbc(static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
704 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800705 break;
706 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800707 mode.atsc3(static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
708 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800709 break;
710 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800711 mode.dtmb(static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
712 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800713 break;
714 default:
Amy Zhang46c31ec2021-02-03 18:19:10 -0800715 break;
716 }
717 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800718 if (modes.size() > 0) {
719 status.interleaving(modes);
720 hidlStatus.push_back(status);
721 }
Amy Zhang46c31ec2021-02-03 18:19:10 -0800722 break;
723 }
724 case TunerFrontendStatus::isdbtSegment: {
725 auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
726 hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
727 status.isdbtSegment(s);
728 hidlStatus.push_back(status);
729 break;
730 }
731 case TunerFrontendStatus::tsDataRate: {
732 auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
733 hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
734 status.tsDataRate(ts);
735 hidlStatus.push_back(status);
736 break;
737 }
738 case TunerFrontendStatus::rollOff: {
739 auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800740 FrontendRollOff roll;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800741 switch (mType) {
742 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800743 roll.dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
744 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800745 hidlStatus.push_back(status);
746 break;
747 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800748 roll.isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
749 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800750 hidlStatus.push_back(status);
751 break;
752 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800753 roll.isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
754 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800755 hidlStatus.push_back(status);
756 break;
757 default:
758 break;
759 }
760 break;
761 }
762 case TunerFrontendStatus::isMiso: {
763 status.isMiso(s.get<TunerFrontendStatus::isMiso>());
764 hidlStatus.push_back(status);
765 break;
766 }
767 case TunerFrontendStatus::isLinear: {
768 status.isLinear(s.get<TunerFrontendStatus::isLinear>());
769 hidlStatus.push_back(status);
770 break;
771 }
772 case TunerFrontendStatus::isShortFrames: {
773 status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
774 hidlStatus.push_back(status);
775 break;
776 }
777 default:
778 break;
779 }
780 }
781 return hidlStatus;
782}
783
Amy Zhangb5809be2021-01-26 16:27:23 -0800784TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800785 const FrontendSettingsExt1_1& settingsExt1_1) {
786 bool isExtended = validateExtendedSettings(settingsExt1_1);
787 TunerFrontendSettings s{
788 .isExtended = isExtended,
789 .endFrequency = (int) settingsExt1_1.endFrequency,
790 .inversion = (int) settingsExt1_1.inversion,
791 };
792
793 if (settingsExt1_1.settingExt.getDiscriminator()
794 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
795 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
796 return s;
797 }
798
Amy Zhangb5809be2021-01-26 16:27:23 -0800799 switch (settings.getDiscriminator()) {
800 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800801 s.settings.set<TunerFrontendUnionSettings::analog>(
802 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800803 break;
804 }
805 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800806 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800807 break;
808 }
809 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800810 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800811 break;
812 }
813 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800814 s.settings.set<TunerFrontendUnionSettings::dvbs>(
815 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800816 break;
817 }
818 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800819 s.settings.set<TunerFrontendUnionSettings::cable>(
820 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800821 break;
822 }
823 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800824 s.settings.set<TunerFrontendUnionSettings::dvbt>(
825 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800826 break;
827 }
828 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800829 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800830 break;
831 }
832 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800833 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800834 break;
835 }
836 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800837 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800838 break;
839 }
840 default:
841 break;
842 }
843 return s;
844}
845
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800846TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
847 const FrontendSettingsExt1_1& settingsExt1_1) {
848 TunerFrontendAnalogSettings analogSettings{
849 .frequency = (int)settings.analog().frequency,
850 .signalType = (int)settings.analog().type,
851 .sifStandard = (int)settings.analog().sifStandard,
852 };
853 if (settingsExt1_1.settingExt.getDiscriminator()
854 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
855 analogSettings.isExtended = true;
856 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
857 } else {
858 analogSettings.isExtended = false;
859 }
860 return analogSettings;
861}
862
863TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
864 const FrontendSettingsExt1_1& settingsExt1_1) {
865 TunerFrontendDvbsSettings dvbsSettings{
866 .frequency = (int)settings.dvbs().frequency,
867 .modulation = (int)settings.dvbs().modulation,
868 .codeRate = {
869 .fec = (long)settings.dvbs().coderate.fec,
870 .isLinear = settings.dvbs().coderate.isLinear,
871 .isShortFrames = settings.dvbs().coderate.isShortFrames,
872 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
873 },
874 .symbolRate = (int)settings.dvbs().symbolRate,
875 .rolloff = (int)settings.dvbs().rolloff,
876 .pilot = (int)settings.dvbs().pilot,
877 .inputStreamId = (int)settings.dvbs().inputStreamId,
878 .standard = (int)settings.dvbs().standard,
879 .vcm = (int)settings.dvbs().vcmMode,
880 };
881 if (settingsExt1_1.settingExt.getDiscriminator()
882 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
883 dvbsSettings.isExtended = true;
884 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
885 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
886 } else {
887 dvbsSettings.isExtended = false;
888 }
889 return dvbsSettings;
890}
891
892TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
893 const FrontendSettingsExt1_1& settingsExt1_1) {
894 TunerFrontendCableSettings cableSettings{
895 .frequency = (int)settings.dvbc().frequency,
896 .modulation = (int)settings.dvbc().modulation,
897 .innerFec = (long)settings.dvbc().fec,
898 .symbolRate = (int)settings.dvbc().symbolRate,
899 .outerFec = (int)settings.dvbc().outerFec,
900 .annex = (int)settings.dvbc().annex,
901 .spectralInversion = (int)settings.dvbc().spectralInversion,
902 };
903 if (settingsExt1_1.settingExt.getDiscriminator()
904 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
905 cableSettings.isExtended = true;
906 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
907 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
908 } else {
909 cableSettings.isExtended = false;
910 }
911 return cableSettings;
912}
913
914TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
915 const FrontendSettingsExt1_1& settingsExt1_1) {
916 TunerFrontendDvbtSettings dvbtSettings{
917 .frequency = (int)settings.dvbt().frequency,
918 .transmissionMode = (int)settings.dvbt().transmissionMode,
919 .bandwidth = (int)settings.dvbt().bandwidth,
920 .constellation = (int)settings.dvbt().constellation,
921 .hierarchy = (int)settings.dvbt().hierarchy,
922 .hpCodeRate = (int)settings.dvbt().hpCoderate,
923 .lpCodeRate = (int)settings.dvbt().lpCoderate,
924 .guardInterval = (int)settings.dvbt().guardInterval,
925 .isHighPriority = settings.dvbt().isHighPriority,
926 .standard = (int)settings.dvbt().standard,
927 .isMiso = settings.dvbt().isMiso,
928 .plpMode = (int)settings.dvbt().plpMode,
929 .plpId = (int)settings.dvbt().plpId,
930 .plpGroupId = (int)settings.dvbt().plpGroupId,
931 };
932 if (settingsExt1_1.settingExt.getDiscriminator()
933 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
934 dvbtSettings.isExtended = true;
935 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
936 dvbtSettings.transmissionMode =
937 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
938 } else {
939 dvbtSettings.isExtended = false;
940 }
941 return dvbtSettings;
942}
943
944TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
945 const FrontendSettingsExt1_1& settingsExt1_1) {
946 TunerFrontendDtmbSettings dtmbSettings{
947 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
948 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
949 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
950 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
951 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
952 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
953 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
954 };
955 return dtmbSettings;
956}
957
958TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
959 TunerFrontendAtscSettings atscSettings{
960 .frequency = (int)settings.atsc().frequency,
961 .modulation = (int)settings.atsc().modulation,
962 };
963 return atscSettings;
964}
965
966TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
967 TunerFrontendAtsc3Settings atsc3Settings{
968 .frequency = (int)settings.atsc3().frequency,
969 .bandwidth = (int)settings.atsc3().bandwidth,
970 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
971 };
972 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
973 for (auto plpSetting : settings.atsc3().plpSettings) {
974 atsc3Settings.plpSettings.push_back({
975 .plpId = (int)plpSetting.plpId,
976 .modulation = (int)plpSetting.modulation,
977 .interleaveMode = (int)plpSetting.interleaveMode,
978 .codeRate = (int)plpSetting.codeRate,
979 .fec = (int)plpSetting.fec,
980 });
981 }
982 return atsc3Settings;
983}
984
985TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
986 TunerFrontendIsdbsSettings isdbsSettings{
987 .frequency = (int)settings.isdbs().frequency,
988 .streamId = (int)settings.isdbs().streamId,
989 .streamIdType = (int)settings.isdbs().streamIdType,
990 .modulation = (int)settings.isdbs().modulation,
991 .codeRate = (int)settings.isdbs().coderate,
992 .symbolRate = (int)settings.isdbs().symbolRate,
993 .rolloff = (int)settings.isdbs().rolloff,
994 };
995 return isdbsSettings;
996}
997
998TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
999 const FrontendSettings& settings) {
1000 TunerFrontendIsdbs3Settings isdbs3Settings{
1001 .frequency = (int)settings.isdbs3().frequency,
1002 .streamId = (int)settings.isdbs3().streamId,
1003 .streamIdType = (int)settings.isdbs3().streamIdType,
1004 .modulation = (int)settings.isdbs3().modulation,
1005 .codeRate = (int)settings.isdbs3().coderate,
1006 .symbolRate = (int)settings.isdbs3().symbolRate,
1007 .rolloff = (int)settings.isdbs3().rolloff,
1008 };
1009 return isdbs3Settings;
1010}
1011
1012TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
1013 TunerFrontendIsdbtSettings isdbtSettings{
1014 .frequency = (int)settings.isdbt().frequency,
1015 .modulation = (int)settings.isdbt().modulation,
1016 .bandwidth = (int)settings.isdbt().bandwidth,
1017 .mode = (int)settings.isdbt().mode,
1018 .codeRate = (int)settings.isdbt().coderate,
1019 .guardInterval = (int)settings.isdbt().guardInterval,
1020 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
1021 };
1022 return isdbtSettings;
1023}
1024
1025bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
1026 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
1027 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
1028 || settingsExt1_1.settingExt.getDiscriminator()
1029 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
1030}
1031
Amy Zhanga6734682020-11-30 16:14:38 -08001032/////////////// TunerFrontendCallback ///////////////////////
1033
1034TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1035 : mFrontendClientCallback(frontendClientCallback) {}
1036
1037Status TunerFrontendCallback::onEvent(int frontendEventType) {
1038 if (mFrontendClientCallback != NULL) {
1039 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
1040 return Status::ok();
1041 }
1042 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
1043}
1044
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001045Status TunerFrontendCallback::onScanMessage(int messageType,
1046 const TunerFrontendScanMessage& message) {
1047 if (mFrontendClientCallback != NULL) {
1048 if (!is1_1ExtendedScanMessage(messageType)) {
1049 mFrontendClientCallback->onScanMessage(
1050 static_cast<FrontendScanMessageType>(messageType),
1051 getHalScanMessage(messageType, message));
1052 } else {
1053 mFrontendClientCallback->onScanMessageExt1_1(
1054 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
1055 getHalScanMessageExt1_1(messageType, message));
1056 }
1057 return Status::ok();
1058 }
1059 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -08001060}
1061
1062/////////////// IFrontendCallback ///////////////////////
1063
1064HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1065 : mFrontendClientCallback(frontendClientCallback) {}
1066
1067Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
1068 if (mFrontendClientCallback != NULL) {
1069 mFrontendClientCallback->onEvent(frontendEventType);
1070 }
1071 return Void();
1072}
1073
1074Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
1075 const FrontendScanMessage& message) {
1076 if (mFrontendClientCallback != NULL) {
1077 mFrontendClientCallback->onScanMessage(type, message);
1078 }
1079 return Void();
1080}
1081
1082Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
1083 const FrontendScanMessageExt1_1& message) {
1084 if (mFrontendClientCallback != NULL) {
1085 mFrontendClientCallback->onScanMessageExt1_1(type, message);
1086 }
1087 return Void();
1088}
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001089
1090/////////////// FrontendClientCallback Helper Methods ///////////////////////
1091
1092FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
1093 int messageType, const TunerFrontendScanMessage& message) {
1094 FrontendScanMessage scanMessage;
1095 switch (messageType) {
1096 case (int) FrontendScanMessageType::LOCKED:
1097 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
1098 break;
1099 case (int) FrontendScanMessageType::END:
1100 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
1101 break;
1102 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
1103 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
1104 break;
1105 case (int) FrontendScanMessageType::FREQUENCY: {
1106 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
1107 hidl_vec<uint32_t> frequencies(begin(f), end(f));
1108 scanMessage.frequencies(frequencies);
1109 break;
1110 }
1111 case (int) FrontendScanMessageType::SYMBOL_RATE: {
1112 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
1113 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
1114 scanMessage.symbolRates(symbolRates);
1115 break;
1116 }
1117 case (int) FrontendScanMessageType::HIERARCHY:
1118 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
1119 message.get<TunerFrontendScanMessage::hierarchy>()));
1120 break;
1121 case (int) FrontendScanMessageType::ANALOG_TYPE:
1122 scanMessage.analogType(static_cast<FrontendAnalogType>(
1123 message.get<TunerFrontendScanMessage::analogType>()));
1124 break;
1125 case (int) FrontendScanMessageType::PLP_IDS: {
1126 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
1127 hidl_vec<uint8_t> plpIds(begin(p), end(p));
1128 scanMessage.plpIds(plpIds);
1129 break;
1130 }
1131 case (int) FrontendScanMessageType::GROUP_IDS: {
1132 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
1133 hidl_vec<uint8_t> groupIds(begin(g), end(g));
1134 scanMessage.groupIds(groupIds);
1135 break;
1136 }
1137 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
1138 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
1139 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
1140 scanMessage.inputStreamIds(inputStreamIds);
1141 break;
1142 }
1143 case (int) FrontendScanMessageType::STANDARD: {
1144 FrontendScanMessage::Standard std;
1145 int standard = message.get<TunerFrontendScanMessage::std>();
1146 switch (mType) {
1147 case (int) FrontendType::DVBS:
1148 std.sStd(static_cast<FrontendDvbsStandard>(standard));
1149 scanMessage.std(std);
1150 break;
1151 case (int) FrontendType::DVBT:
1152 std.tStd(static_cast<FrontendDvbtStandard>(standard));
1153 scanMessage.std(std);
1154 break;
1155 case (int) FrontendType::ANALOG:
1156 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
1157 scanMessage.std(std);
1158 break;
1159 default:
1160 break;
1161 }
1162 break;
1163 }
1164 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
1165 vector<TunerFrontendScanAtsc3PlpInfo> plp =
1166 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
1167 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -08001168 int size = plp.size();
1169 plpInfo.resize(size);
1170 for (int i = 0; i < size; i++) {
1171 auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001172 FrontendScanAtsc3PlpInfo p{
1173 .plpId = static_cast<uint8_t>(info.plpId),
1174 .bLlsFlag = info.llsFlag,
1175 };
Amy Zhang46c31ec2021-02-03 18:19:10 -08001176 plpInfo[i] = p;
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001177 }
1178 scanMessage.atsc3PlpInfos(plpInfo);
1179 break;
1180 }
1181 default:
1182 break;
1183 }
1184 return scanMessage;
1185}
1186
1187FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
1188 int messageType, const TunerFrontendScanMessage& message) {
1189 FrontendScanMessageExt1_1 scanMessage;
1190 switch (messageType) {
1191 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
1192 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
1193 break;
1194 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
1195 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
1196 message.get<TunerFrontendScanMessage::annex>()));
1197 break;
1198 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
1199 FrontendModulation m;
1200 int modulation = message.get<TunerFrontendScanMessage::modulation>();
1201 switch (mType) {
1202 case (int) FrontendType::DVBC:
1203 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
1204 scanMessage.modulation(m);
1205 break;
1206 case (int) FrontendType::DVBS:
1207 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
1208 scanMessage.modulation(m);
1209 break;
1210 case (int) FrontendType::DVBT:
1211 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
1212 scanMessage.modulation(m);
1213 break;
1214 case (int) FrontendType::ISDBS:
1215 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
1216 scanMessage.modulation(m);
1217 break;
1218 case (int) FrontendType::ISDBS3:
1219 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
1220 scanMessage.modulation(m);
1221 break;
1222 case (int) FrontendType::ISDBT:
1223 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
1224 scanMessage.modulation(m);
1225 break;
1226 case (int) FrontendType::ATSC:
1227 m.atsc(static_cast<FrontendAtscModulation>(modulation));
1228 scanMessage.modulation(m);
1229 break;
1230 case (int) FrontendType::ATSC3:
1231 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
1232 scanMessage.modulation(m);
1233 break;
1234 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
1235 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
1236 scanMessage.modulation(m);
1237 break;
1238 default:
1239 break;
1240 }
1241 break;
1242 }
1243 default:
1244 break;
1245 }
1246 return scanMessage;
1247}
1248
1249bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
1250 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
1251 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
1252}
Amy Zhanga6734682020-11-30 16:14:38 -08001253} // namespace android