blob: f454907851a4aad9f5c5b0bca393ef505561de4e [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;
52using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -080053using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
Amy Zhangd08c2732021-01-08 17:22:59 -080054using ::android::hardware::tv::tuner::V1_1::Constant;
Amy Zhang46c31ec2021-02-03 18:19:10 -080055using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
56using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
57using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080058using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080059using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
60using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
61using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080062using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080063using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080064using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080065using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhang46c31ec2021-02-03 18:19:10 -080066using ::android::hardware::tv::tuner::V1_1::FrontendType;
Amy Zhanga6734682020-11-30 16:14:38 -080067
Amy Zhangbf68a162020-11-23 17:42:40 -080068namespace android {
69
Amy Zhanga6734682020-11-30 16:14:38 -080070/////////////// FrontendClient ///////////////////////
71
Amy Zhangb9f3cab2021-01-13 15:24:14 -080072FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type) {
Amy Zhangbf68a162020-11-23 17:42:40 -080073 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080074 mAidlCallback = NULL;
75 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080076 mId = id;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080077 mType = type;
Amy Zhangbf68a162020-11-23 17:42:40 -080078}
79
80FrontendClient::~FrontendClient() {
81 mTunerFrontend = NULL;
82 mFrontend = NULL;
83 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080084 mAidlCallback = NULL;
85 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080086 mId = -1;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080087 mType = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080088}
89
90Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
91 if (mTunerFrontend != NULL) {
92 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
Amy Zhangb9f3cab2021-01-13 15:24:14 -080093 mAidlCallback->setFrontendType(mType);
Amy Zhanga6734682020-11-30 16:14:38 -080094 mTunerFrontend->setCallback(mAidlCallback);
95 return Result::SUCCESS;
96 }
97
98 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
99 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -0800100}
101
102void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
103 mFrontend = frontend;
104 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
105}
Amy Zhanga6734682020-11-30 16:14:38 -0800106
107Result FrontendClient::tune(const FrontendSettings& settings,
108 const FrontendSettingsExt1_1& settingsExt1_1) {
109 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800110 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
111 Status s = mTunerFrontend->tune(tunerFeSettings);
Amy Zhang4a07e802021-01-21 17:10:21 -0800112 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800113 }
114
115 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800116 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhanga6734682020-11-30 16:14:38 -0800117 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
118 return result;
119 }
120
121 if (mFrontend != NULL) {
122 result = mFrontend->tune(settings);
123 return result;
124 }
125
126 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -0800127}
Amy Zhanga6734682020-11-30 16:14:38 -0800128
129Result FrontendClient::stopTune() {
130 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800131 Status s = mTunerFrontend->stopTune();
132 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800133 }
134
135 if (mFrontend != NULL) {
136 Result result = mFrontend->stopTune();
137 return result;
138 }
139
140 return Result::INVALID_STATE;
141}
142
Amy Zhangd08c2732021-01-08 17:22:59 -0800143Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
144 const FrontendSettingsExt1_1& settingsExt1_1) {
145 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800146 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
147 Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
Amy Zhang4a07e802021-01-21 17:10:21 -0800148 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800149 }
150
151 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800152 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhangd08c2732021-01-08 17:22:59 -0800153 result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
154 return result;
155 }
156
157 if (mFrontend != NULL) {
158 result = mFrontend->scan(settings, type);
159 return result;
160 }
161
162 return Result::INVALID_STATE;
163}
164
165Result FrontendClient::stopScan() {
166 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800167 Status s = mTunerFrontend->stopScan();
168 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800169 }
170
171 if (mFrontend != NULL) {
172 Result result = mFrontend->stopScan();
173 return result;
174 }
175
176 return Result::INVALID_STATE;
177}
178
179vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
180 vector<FrontendStatus> status;
181
182 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800183 vector<TunerFrontendStatus> aidlStatus;
184 vector<int> types;
185 for (auto t : statusTypes) {
186 types.push_back((int)t);
187 }
188 Status s = mTunerFrontend->getStatus(types, &aidlStatus);
189 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
190 return status;
191 }
192 return getHidlStatus(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800193 }
194
195 if (mFrontend != NULL && statusTypes.size() > 0) {
196 Result res;
197 mFrontend->getStatus(statusTypes,
198 [&](Result r, const hidl_vec<FrontendStatus>& s) {
199 res = r;
200 status = s;
201 });
202 if (res != Result::SUCCESS) {
203 status.clear();
204 return status;
205 }
206 }
207
208 return status;
209}
Amy Zhang46c31ec2021-02-03 18:19:10 -0800210
Amy Zhangd08c2732021-01-08 17:22:59 -0800211vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
212 vector<FrontendStatusTypeExt1_1> statusTypes) {
213 vector<FrontendStatusExt1_1> status;
214
215 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800216 vector<TunerFrontendStatus> aidlStatus;
217 vector<int> types;
218 for (auto t : statusTypes) {
219 types.push_back((int)t);
220 }
221 Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus);
222 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
223 return status;
224 }
225 return getHidlStatusExt(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800226 }
227
228 if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
229 Result res;
230 mFrontend_1_1->getStatusExt1_1(statusTypes,
231 [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
232 res = r;
233 status = s;
234 });
235 if (res != Result::SUCCESS) {
236 status.clear();
237 return status;
238 }
239 }
240
241 return status;
242}
243
Amy Zhangd3d57b42021-01-07 11:14:43 -0800244Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
245 if (mTunerFrontend != NULL) {
246 // TODO: handle error message.
247 /*mTunerFrontend->setLnb(lnbClient->getAidlLnb());
248 return Result::SUCCESS;*/
249 }
250
251 if (mFrontend != NULL) {
252 Result result = mFrontend->setLnb(lnbClient->getId());
253 return result;
254 }
255
256 return Result::INVALID_STATE;
257}
258
Amy Zhangd08c2732021-01-08 17:22:59 -0800259Result FrontendClient::setLna(bool bEnable) {
260 if (mTunerFrontend != NULL) {
261 // TODO: handle error message.
262 /*mTunerFrontend->setLna(bEnable);
263 return Result::SUCCESS;*/
264 }
265
266 if (mFrontend != NULL) {
267 Result result = mFrontend->setLna(bEnable);
268 return result;
269 }
270
271 return Result::INVALID_STATE;
272}
273
274int FrontendClient::linkCiCamToFrontend(int ciCamId) {
275 int ltsId = (int)Constant::INVALID_LTS_ID;
276
277 if (mTunerFrontend != NULL) {
278 // TODO: handle error message.
279 /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId);
280 return ltsId;*/
281 }
282
283 if (mFrontend_1_1 != NULL) {
284 Result res;
285 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
286 [&](Result r, uint32_t id) {
287 res = r;
288 ltsId = id;
289 });
290 if (res != Result::SUCCESS) {
291 return (int)Constant::INVALID_LTS_ID;
292 }
293 }
294
295 return ltsId;
296}
297
298Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
299 if (mTunerFrontend != NULL) {
300 // TODO: handle error message.
301 /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
302 return Result::SUCCESS;*/
303 }
304
305 if (mFrontend_1_1 != NULL) {
306 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
307 }
308
309 return Result::INVALID_STATE;
310}
311
Amy Zhanga6734682020-11-30 16:14:38 -0800312Result FrontendClient::close() {
313 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800314 Status s = mTunerFrontend->close();
315 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800316 }
317
318 if (mFrontend != NULL) {
319 Result result = mFrontend->close();
320 if (result == Result::SUCCESS) {
321 mFrontend = NULL;
322 mFrontend_1_1 = NULL;
323 }
324 return result;
325 }
326
327 return Result::INVALID_STATE;
328}
329
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800330/////////////// TunerFrontend Helper Methods ///////////////////////
331
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800332shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
333 return mTunerFrontend;
334}
335
336int FrontendClient::getId() {
Amy Zhang210c26a2021-01-12 11:25:27 -0800337 return mId;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800338}
339
Amy Zhang46c31ec2021-02-03 18:19:10 -0800340vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
341 vector<FrontendStatus> hidlStatus;
342 for (TunerFrontendStatus s : aidlStatus) {
343 FrontendStatus status;
344 switch (s.getTag()) {
345 case TunerFrontendStatus::isDemodLocked: {
346 status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
347 hidlStatus.push_back(status);
348 break;
349 }
350 case TunerFrontendStatus::snr: {
351 status.snr(s.get<TunerFrontendStatus::snr>());
352 hidlStatus.push_back(status);
353 break;
354 }
355 case TunerFrontendStatus::ber: {
356 status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
357 hidlStatus.push_back(status);
358 break;
359 }
360 case TunerFrontendStatus::per: {
361 status.per((uint32_t)s.get<TunerFrontendStatus::per>());
362 hidlStatus.push_back(status);
363 break;
364 }
365 case TunerFrontendStatus::preBer: {
366 status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
367 hidlStatus.push_back(status);
368 break;
369 }
370 case TunerFrontendStatus::signalQuality: {
371 status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
372 hidlStatus.push_back(status);
373 break;
374 }
375 case TunerFrontendStatus::signalStrength: {
376 status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
377 hidlStatus.push_back(status);
378 break;
379 }
380 case TunerFrontendStatus::symbolRate: {
381 status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
382 hidlStatus.push_back(status);
383 break;
384 }
385 case TunerFrontendStatus::innerFec: {
386 status.innerFec(static_cast<FrontendInnerFec>(
387 s.get<TunerFrontendStatus::innerFec>()));
388 hidlStatus.push_back(status);
389 break;
390 }
391 case TunerFrontendStatus::modulation: {
392 auto aidlMod = s.get<TunerFrontendStatus::modulation>();
393 switch (mType) {
394 case (int)FrontendType::DVBC:
395 status.modulation().dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
396 hidlStatus.push_back(status);
397 break;
398 case (int)FrontendType::DVBS:
399 status.modulation().dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
400 hidlStatus.push_back(status);
401 break;
402 case (int)FrontendType::ISDBS:
403 status.modulation().isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
404 hidlStatus.push_back(status);
405 break;
406 case (int)FrontendType::ISDBS3:
407 status.modulation().isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
408 hidlStatus.push_back(status);
409 break;
410 case (int)FrontendType::ISDBT:
411 status.modulation().isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
412 hidlStatus.push_back(status);
413 break;
414 default:
415 break;
416 }
417 break;
418 }
419 case TunerFrontendStatus::inversion: {
420 status.inversion(static_cast<FrontendDvbcSpectralInversion>(
421 s.get<TunerFrontendStatus::inversion>()));
422 hidlStatus.push_back(status);
423 break;
424 }
425 case TunerFrontendStatus::lnbVoltage: {
426 status.lnbVoltage(static_cast<LnbVoltage>(
427 s.get<TunerFrontendStatus::lnbVoltage>()));
428 hidlStatus.push_back(status);
429 break;
430 }
431 case TunerFrontendStatus::plpId: {
432 status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
433 hidlStatus.push_back(status);
434 break;
435 }
436 case TunerFrontendStatus::isEWBS: {
437 status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
438 hidlStatus.push_back(status);
439 break;
440 }
441 case TunerFrontendStatus::agc: {
442 status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
443 hidlStatus.push_back(status);
444 break;
445 }
446 case TunerFrontendStatus::isLnaOn: {
447 status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
448 hidlStatus.push_back(status);
449 break;
450 }
451 case TunerFrontendStatus::isLayerError: {
452 auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
453 hidl_vec<bool> e(aidlE.begin(), aidlE.end());
454 status.isLayerError(e);
455 hidlStatus.push_back(status);
456 break;
457 }
458 case TunerFrontendStatus::mer: {
459 status.mer(s.get<TunerFrontendStatus::mer>());
460 hidlStatus.push_back(status);
461 break;
462 }
463 case TunerFrontendStatus::freqOffset: {
464 status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
465 hidlStatus.push_back(status);
466 break;
467 }
468 case TunerFrontendStatus::hierarchy: {
469 status.hierarchy(static_cast<FrontendDvbtHierarchy>(
470 s.get<TunerFrontendStatus::freqOffset>()));
471 hidlStatus.push_back(status);
472 break;
473 }
474 case TunerFrontendStatus::isRfLocked: {
475 status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
476 hidlStatus.push_back(status);
477 break;
478 }
479 case TunerFrontendStatus::plpInfo: {
480 int size = s.get<TunerFrontendStatus::plpInfo>().size();
481 status.plpInfo().resize(size);
482 for (int i = 0; i < size; i++) {
483 auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
484 status.plpInfo()[i] = {
485 .plpId = (uint8_t)aidlInfo.plpId,
486 .isLocked = aidlInfo.isLocked,
487 .uec = (uint32_t)aidlInfo.uec,
488 };
489 }
490 hidlStatus.push_back(status);
491 break;
492 }
493 default:
494 break;
495 }
496 }
497 return hidlStatus;
498}
499
500vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
501 vector<TunerFrontendStatus>& aidlStatus) {
502 vector<FrontendStatusExt1_1> hidlStatus;
503 for (TunerFrontendStatus s : aidlStatus) {
504 FrontendStatusExt1_1 status;
505 switch (s.getTag()) {
506 case TunerFrontendStatus::modulations: {
507 for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
508 int size = status.modulations().size();
509 status.modulations().resize(size + 1);
510 switch (mType) {
511 case (int)FrontendType::DVBC:
512 status.modulations()[size].dvbc(
513 static_cast<FrontendDvbcModulation>(aidlMod));
514 break;
515 case (int)FrontendType::DVBS:
516 status.modulations()[size].dvbs(
517 static_cast<FrontendDvbsModulation>(aidlMod));
518 break;
519 case (int)FrontendType::DVBT:
520 status.modulations()[size].dvbt(
521 static_cast<FrontendDvbtConstellation>(aidlMod));
522 break;
523 case (int)FrontendType::ISDBS:
524 status.modulations()[size].isdbs(
525 static_cast<FrontendIsdbsModulation>(aidlMod));
526 break;
527 case (int)FrontendType::ISDBS3:
528 status.modulations()[size].isdbs3(
529 static_cast<FrontendIsdbs3Modulation>(aidlMod));
530 break;
531 case (int)FrontendType::ISDBT:
532 status.modulations()[size].isdbt(
533 static_cast<FrontendIsdbtModulation>(aidlMod));
534 break;
535 case (int)FrontendType::ATSC:
536 status.modulations()[size].atsc(
537 static_cast<FrontendAtscModulation>(aidlMod));
538 break;
539 case (int)FrontendType::ATSC3:
540 status.modulations()[size].atsc3(
541 static_cast<FrontendAtsc3Modulation>(aidlMod));
542 break;
543 case (int)FrontendType::DTMB:
544 status.modulations()[size].dtmb(
545 static_cast<FrontendDtmbModulation>(aidlMod));
546 break;
547 default:
548 status.modulations().resize(size);
549 break;
550 }
551 }
552 hidlStatus.push_back(status);
553 break;
554 }
555 case TunerFrontendStatus::bers: {
556 auto aidlB = s.get<TunerFrontendStatus::bers>();
557 hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
558 status.bers(b);
559 hidlStatus.push_back(status);
560 break;
561 }
562 case TunerFrontendStatus::codeRates: {
563 int size = s.get<TunerFrontendStatus::codeRates>().size();
564 status.codeRates().resize(size);
565 for (int i = 0; i < size; i++) {
566 auto aidlCodeRate = s.get<TunerFrontendStatus::codeRates>()[i];
567 status.codeRates()[i] =
568 static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate);
569 }
570 hidlStatus.push_back(status);
571 break;
572 }
573 case TunerFrontendStatus::bandwidth: {
574 auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
575 switch (mType) {
576 case (int)FrontendType::ATSC3:
577 status.bandwidth().atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
578 hidlStatus.push_back(status);
579 break;
580 case (int)FrontendType::DVBC:
581 status.bandwidth().dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
582 hidlStatus.push_back(status);
583 break;
584 case (int)FrontendType::DVBT:
585 status.bandwidth().dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
586 hidlStatus.push_back(status);
587 break;
588 case (int)FrontendType::ISDBT:
589 status.bandwidth().isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
590 hidlStatus.push_back(status);
591 break;
592 case (int)FrontendType::DTMB:
593 status.bandwidth().dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
594 hidlStatus.push_back(status);
595 break;
596 default:
597 break;
598 }
599 break;
600 }
601 case TunerFrontendStatus::interval: {
602 auto aidlInter = s.get<TunerFrontendStatus::interval>();
603 switch (mType) {
604 case (int)FrontendType::DVBT:
605 status.interval().dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
606 hidlStatus.push_back(status);
607 break;
608 case (int)FrontendType::ISDBT:
609 status.interval().isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
610 hidlStatus.push_back(status);
611 break;
612 case (int)FrontendType::DTMB:
613 status.interval().dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
614 hidlStatus.push_back(status);
615 break;
616 default:
617 break;
618 }
619 break;
620 }
621 case TunerFrontendStatus::transmissionMode: {
622 auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
623 switch (mType) {
624 case (int)FrontendType::DVBT:
625 status.transmissionMode().dvbt(
626 static_cast<FrontendDvbtTransmissionMode>(aidlTran));
627 hidlStatus.push_back(status);
628 break;
629 case (int)FrontendType::ISDBT:
630 status.transmissionMode().isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
631 hidlStatus.push_back(status);
632 break;
633 case (int)FrontendType::DTMB:
634 status.transmissionMode().dtmb(
635 static_cast<FrontendDtmbTransmissionMode>(aidlTran));
636 hidlStatus.push_back(status);
637 break;
638 default:
639 break;
640 }
641 break;
642 }
643 case TunerFrontendStatus::uec: {
644 status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
645 hidlStatus.push_back(status);
646 break;
647 }
648 case TunerFrontendStatus::systemId: {
649 status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
650 hidlStatus.push_back(status);
651 break;
652 }
653 case TunerFrontendStatus::interleaving: {
654 for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
655 int size = status.interleaving().size();
656 status.interleaving().resize(size + 1);
657 switch (mType) {
658 case (int)FrontendType::DVBC:
659 status.interleaving()[size].dvbc(
660 static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
661 break;
662 case (int)FrontendType::ATSC3:
663 status.interleaving()[size].atsc3(
664 static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
665 break;
666 case (int)FrontendType::DTMB:
667 status.interleaving()[size].dtmb(
668 static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
669 break;
670 default:
671 status.interleaving().resize(size);
672 break;
673 }
674 }
675 hidlStatus.push_back(status);
676 break;
677 }
678 case TunerFrontendStatus::isdbtSegment: {
679 auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
680 hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
681 status.isdbtSegment(s);
682 hidlStatus.push_back(status);
683 break;
684 }
685 case TunerFrontendStatus::tsDataRate: {
686 auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
687 hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
688 status.tsDataRate(ts);
689 hidlStatus.push_back(status);
690 break;
691 }
692 case TunerFrontendStatus::rollOff: {
693 auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
694 switch (mType) {
695 case (int)FrontendType::DVBS:
696 status.rollOff().dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
697 hidlStatus.push_back(status);
698 break;
699 case (int)FrontendType::ISDBS:
700 status.rollOff().isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
701 hidlStatus.push_back(status);
702 break;
703 case (int)FrontendType::ISDBS3:
704 status.rollOff().isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
705 hidlStatus.push_back(status);
706 break;
707 default:
708 break;
709 }
710 break;
711 }
712 case TunerFrontendStatus::isMiso: {
713 status.isMiso(s.get<TunerFrontendStatus::isMiso>());
714 hidlStatus.push_back(status);
715 break;
716 }
717 case TunerFrontendStatus::isLinear: {
718 status.isLinear(s.get<TunerFrontendStatus::isLinear>());
719 hidlStatus.push_back(status);
720 break;
721 }
722 case TunerFrontendStatus::isShortFrames: {
723 status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
724 hidlStatus.push_back(status);
725 break;
726 }
727 default:
728 break;
729 }
730 }
731 return hidlStatus;
732}
733
Amy Zhangb5809be2021-01-26 16:27:23 -0800734TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800735 const FrontendSettingsExt1_1& settingsExt1_1) {
736 bool isExtended = validateExtendedSettings(settingsExt1_1);
737 TunerFrontendSettings s{
738 .isExtended = isExtended,
739 .endFrequency = (int) settingsExt1_1.endFrequency,
740 .inversion = (int) settingsExt1_1.inversion,
741 };
742
743 if (settingsExt1_1.settingExt.getDiscriminator()
744 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
745 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
746 return s;
747 }
748
Amy Zhangb5809be2021-01-26 16:27:23 -0800749 switch (settings.getDiscriminator()) {
750 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800751 s.settings.set<TunerFrontendUnionSettings::analog>(
752 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800753 break;
754 }
755 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800756 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800757 break;
758 }
759 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800760 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800761 break;
762 }
763 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800764 s.settings.set<TunerFrontendUnionSettings::dvbs>(
765 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800766 break;
767 }
768 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800769 s.settings.set<TunerFrontendUnionSettings::cable>(
770 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800771 break;
772 }
773 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800774 s.settings.set<TunerFrontendUnionSettings::dvbt>(
775 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800776 break;
777 }
778 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800779 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800780 break;
781 }
782 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800783 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800784 break;
785 }
786 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800787 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800788 break;
789 }
790 default:
791 break;
792 }
793 return s;
794}
795
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800796TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
797 const FrontendSettingsExt1_1& settingsExt1_1) {
798 TunerFrontendAnalogSettings analogSettings{
799 .frequency = (int)settings.analog().frequency,
800 .signalType = (int)settings.analog().type,
801 .sifStandard = (int)settings.analog().sifStandard,
802 };
803 if (settingsExt1_1.settingExt.getDiscriminator()
804 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
805 analogSettings.isExtended = true;
806 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
807 } else {
808 analogSettings.isExtended = false;
809 }
810 return analogSettings;
811}
812
813TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
814 const FrontendSettingsExt1_1& settingsExt1_1) {
815 TunerFrontendDvbsSettings dvbsSettings{
816 .frequency = (int)settings.dvbs().frequency,
817 .modulation = (int)settings.dvbs().modulation,
818 .codeRate = {
819 .fec = (long)settings.dvbs().coderate.fec,
820 .isLinear = settings.dvbs().coderate.isLinear,
821 .isShortFrames = settings.dvbs().coderate.isShortFrames,
822 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
823 },
824 .symbolRate = (int)settings.dvbs().symbolRate,
825 .rolloff = (int)settings.dvbs().rolloff,
826 .pilot = (int)settings.dvbs().pilot,
827 .inputStreamId = (int)settings.dvbs().inputStreamId,
828 .standard = (int)settings.dvbs().standard,
829 .vcm = (int)settings.dvbs().vcmMode,
830 };
831 if (settingsExt1_1.settingExt.getDiscriminator()
832 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
833 dvbsSettings.isExtended = true;
834 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
835 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
836 } else {
837 dvbsSettings.isExtended = false;
838 }
839 return dvbsSettings;
840}
841
842TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
843 const FrontendSettingsExt1_1& settingsExt1_1) {
844 TunerFrontendCableSettings cableSettings{
845 .frequency = (int)settings.dvbc().frequency,
846 .modulation = (int)settings.dvbc().modulation,
847 .innerFec = (long)settings.dvbc().fec,
848 .symbolRate = (int)settings.dvbc().symbolRate,
849 .outerFec = (int)settings.dvbc().outerFec,
850 .annex = (int)settings.dvbc().annex,
851 .spectralInversion = (int)settings.dvbc().spectralInversion,
852 };
853 if (settingsExt1_1.settingExt.getDiscriminator()
854 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
855 cableSettings.isExtended = true;
856 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
857 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
858 } else {
859 cableSettings.isExtended = false;
860 }
861 return cableSettings;
862}
863
864TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
865 const FrontendSettingsExt1_1& settingsExt1_1) {
866 TunerFrontendDvbtSettings dvbtSettings{
867 .frequency = (int)settings.dvbt().frequency,
868 .transmissionMode = (int)settings.dvbt().transmissionMode,
869 .bandwidth = (int)settings.dvbt().bandwidth,
870 .constellation = (int)settings.dvbt().constellation,
871 .hierarchy = (int)settings.dvbt().hierarchy,
872 .hpCodeRate = (int)settings.dvbt().hpCoderate,
873 .lpCodeRate = (int)settings.dvbt().lpCoderate,
874 .guardInterval = (int)settings.dvbt().guardInterval,
875 .isHighPriority = settings.dvbt().isHighPriority,
876 .standard = (int)settings.dvbt().standard,
877 .isMiso = settings.dvbt().isMiso,
878 .plpMode = (int)settings.dvbt().plpMode,
879 .plpId = (int)settings.dvbt().plpId,
880 .plpGroupId = (int)settings.dvbt().plpGroupId,
881 };
882 if (settingsExt1_1.settingExt.getDiscriminator()
883 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
884 dvbtSettings.isExtended = true;
885 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
886 dvbtSettings.transmissionMode =
887 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
888 } else {
889 dvbtSettings.isExtended = false;
890 }
891 return dvbtSettings;
892}
893
894TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
895 const FrontendSettingsExt1_1& settingsExt1_1) {
896 TunerFrontendDtmbSettings dtmbSettings{
897 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
898 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
899 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
900 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
901 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
902 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
903 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
904 };
905 return dtmbSettings;
906}
907
908TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
909 TunerFrontendAtscSettings atscSettings{
910 .frequency = (int)settings.atsc().frequency,
911 .modulation = (int)settings.atsc().modulation,
912 };
913 return atscSettings;
914}
915
916TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
917 TunerFrontendAtsc3Settings atsc3Settings{
918 .frequency = (int)settings.atsc3().frequency,
919 .bandwidth = (int)settings.atsc3().bandwidth,
920 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
921 };
922 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
923 for (auto plpSetting : settings.atsc3().plpSettings) {
924 atsc3Settings.plpSettings.push_back({
925 .plpId = (int)plpSetting.plpId,
926 .modulation = (int)plpSetting.modulation,
927 .interleaveMode = (int)plpSetting.interleaveMode,
928 .codeRate = (int)plpSetting.codeRate,
929 .fec = (int)plpSetting.fec,
930 });
931 }
932 return atsc3Settings;
933}
934
935TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
936 TunerFrontendIsdbsSettings isdbsSettings{
937 .frequency = (int)settings.isdbs().frequency,
938 .streamId = (int)settings.isdbs().streamId,
939 .streamIdType = (int)settings.isdbs().streamIdType,
940 .modulation = (int)settings.isdbs().modulation,
941 .codeRate = (int)settings.isdbs().coderate,
942 .symbolRate = (int)settings.isdbs().symbolRate,
943 .rolloff = (int)settings.isdbs().rolloff,
944 };
945 return isdbsSettings;
946}
947
948TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
949 const FrontendSettings& settings) {
950 TunerFrontendIsdbs3Settings isdbs3Settings{
951 .frequency = (int)settings.isdbs3().frequency,
952 .streamId = (int)settings.isdbs3().streamId,
953 .streamIdType = (int)settings.isdbs3().streamIdType,
954 .modulation = (int)settings.isdbs3().modulation,
955 .codeRate = (int)settings.isdbs3().coderate,
956 .symbolRate = (int)settings.isdbs3().symbolRate,
957 .rolloff = (int)settings.isdbs3().rolloff,
958 };
959 return isdbs3Settings;
960}
961
962TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
963 TunerFrontendIsdbtSettings isdbtSettings{
964 .frequency = (int)settings.isdbt().frequency,
965 .modulation = (int)settings.isdbt().modulation,
966 .bandwidth = (int)settings.isdbt().bandwidth,
967 .mode = (int)settings.isdbt().mode,
968 .codeRate = (int)settings.isdbt().coderate,
969 .guardInterval = (int)settings.isdbt().guardInterval,
970 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
971 };
972 return isdbtSettings;
973}
974
975bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
976 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
977 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
978 || settingsExt1_1.settingExt.getDiscriminator()
979 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
980}
981
Amy Zhanga6734682020-11-30 16:14:38 -0800982/////////////// TunerFrontendCallback ///////////////////////
983
984TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
985 : mFrontendClientCallback(frontendClientCallback) {}
986
987Status TunerFrontendCallback::onEvent(int frontendEventType) {
988 if (mFrontendClientCallback != NULL) {
989 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
990 return Status::ok();
991 }
992 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
993}
994
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800995Status TunerFrontendCallback::onScanMessage(int messageType,
996 const TunerFrontendScanMessage& message) {
997 if (mFrontendClientCallback != NULL) {
998 if (!is1_1ExtendedScanMessage(messageType)) {
999 mFrontendClientCallback->onScanMessage(
1000 static_cast<FrontendScanMessageType>(messageType),
1001 getHalScanMessage(messageType, message));
1002 } else {
1003 mFrontendClientCallback->onScanMessageExt1_1(
1004 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
1005 getHalScanMessageExt1_1(messageType, message));
1006 }
1007 return Status::ok();
1008 }
1009 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -08001010}
1011
1012/////////////// IFrontendCallback ///////////////////////
1013
1014HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1015 : mFrontendClientCallback(frontendClientCallback) {}
1016
1017Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
1018 if (mFrontendClientCallback != NULL) {
1019 mFrontendClientCallback->onEvent(frontendEventType);
1020 }
1021 return Void();
1022}
1023
1024Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
1025 const FrontendScanMessage& message) {
1026 if (mFrontendClientCallback != NULL) {
1027 mFrontendClientCallback->onScanMessage(type, message);
1028 }
1029 return Void();
1030}
1031
1032Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
1033 const FrontendScanMessageExt1_1& message) {
1034 if (mFrontendClientCallback != NULL) {
1035 mFrontendClientCallback->onScanMessageExt1_1(type, message);
1036 }
1037 return Void();
1038}
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001039
1040/////////////// FrontendClientCallback Helper Methods ///////////////////////
1041
1042FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
1043 int messageType, const TunerFrontendScanMessage& message) {
1044 FrontendScanMessage scanMessage;
1045 switch (messageType) {
1046 case (int) FrontendScanMessageType::LOCKED:
1047 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
1048 break;
1049 case (int) FrontendScanMessageType::END:
1050 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
1051 break;
1052 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
1053 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
1054 break;
1055 case (int) FrontendScanMessageType::FREQUENCY: {
1056 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
1057 hidl_vec<uint32_t> frequencies(begin(f), end(f));
1058 scanMessage.frequencies(frequencies);
1059 break;
1060 }
1061 case (int) FrontendScanMessageType::SYMBOL_RATE: {
1062 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
1063 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
1064 scanMessage.symbolRates(symbolRates);
1065 break;
1066 }
1067 case (int) FrontendScanMessageType::HIERARCHY:
1068 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
1069 message.get<TunerFrontendScanMessage::hierarchy>()));
1070 break;
1071 case (int) FrontendScanMessageType::ANALOG_TYPE:
1072 scanMessage.analogType(static_cast<FrontendAnalogType>(
1073 message.get<TunerFrontendScanMessage::analogType>()));
1074 break;
1075 case (int) FrontendScanMessageType::PLP_IDS: {
1076 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
1077 hidl_vec<uint8_t> plpIds(begin(p), end(p));
1078 scanMessage.plpIds(plpIds);
1079 break;
1080 }
1081 case (int) FrontendScanMessageType::GROUP_IDS: {
1082 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
1083 hidl_vec<uint8_t> groupIds(begin(g), end(g));
1084 scanMessage.groupIds(groupIds);
1085 break;
1086 }
1087 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
1088 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
1089 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
1090 scanMessage.inputStreamIds(inputStreamIds);
1091 break;
1092 }
1093 case (int) FrontendScanMessageType::STANDARD: {
1094 FrontendScanMessage::Standard std;
1095 int standard = message.get<TunerFrontendScanMessage::std>();
1096 switch (mType) {
1097 case (int) FrontendType::DVBS:
1098 std.sStd(static_cast<FrontendDvbsStandard>(standard));
1099 scanMessage.std(std);
1100 break;
1101 case (int) FrontendType::DVBT:
1102 std.tStd(static_cast<FrontendDvbtStandard>(standard));
1103 scanMessage.std(std);
1104 break;
1105 case (int) FrontendType::ANALOG:
1106 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
1107 scanMessage.std(std);
1108 break;
1109 default:
1110 break;
1111 }
1112 break;
1113 }
1114 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
1115 vector<TunerFrontendScanAtsc3PlpInfo> plp =
1116 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
1117 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -08001118 int size = plp.size();
1119 plpInfo.resize(size);
1120 for (int i = 0; i < size; i++) {
1121 auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001122 FrontendScanAtsc3PlpInfo p{
1123 .plpId = static_cast<uint8_t>(info.plpId),
1124 .bLlsFlag = info.llsFlag,
1125 };
Amy Zhang46c31ec2021-02-03 18:19:10 -08001126 plpInfo[i] = p;
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001127 }
1128 scanMessage.atsc3PlpInfos(plpInfo);
1129 break;
1130 }
1131 default:
1132 break;
1133 }
1134 return scanMessage;
1135}
1136
1137FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
1138 int messageType, const TunerFrontendScanMessage& message) {
1139 FrontendScanMessageExt1_1 scanMessage;
1140 switch (messageType) {
1141 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
1142 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
1143 break;
1144 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
1145 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
1146 message.get<TunerFrontendScanMessage::annex>()));
1147 break;
1148 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
1149 FrontendModulation m;
1150 int modulation = message.get<TunerFrontendScanMessage::modulation>();
1151 switch (mType) {
1152 case (int) FrontendType::DVBC:
1153 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
1154 scanMessage.modulation(m);
1155 break;
1156 case (int) FrontendType::DVBS:
1157 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
1158 scanMessage.modulation(m);
1159 break;
1160 case (int) FrontendType::DVBT:
1161 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
1162 scanMessage.modulation(m);
1163 break;
1164 case (int) FrontendType::ISDBS:
1165 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
1166 scanMessage.modulation(m);
1167 break;
1168 case (int) FrontendType::ISDBS3:
1169 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
1170 scanMessage.modulation(m);
1171 break;
1172 case (int) FrontendType::ISDBT:
1173 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
1174 scanMessage.modulation(m);
1175 break;
1176 case (int) FrontendType::ATSC:
1177 m.atsc(static_cast<FrontendAtscModulation>(modulation));
1178 scanMessage.modulation(m);
1179 break;
1180 case (int) FrontendType::ATSC3:
1181 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
1182 scanMessage.modulation(m);
1183 break;
1184 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
1185 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
1186 scanMessage.modulation(m);
1187 break;
1188 default:
1189 break;
1190 }
1191 break;
1192 }
1193 default:
1194 break;
1195 }
1196 return scanMessage;
1197}
1198
1199bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
1200 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
1201 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
1202}
Amy Zhanga6734682020-11-30 16:14:38 -08001203} // namespace android