blob: 3a00133c69e285d0652ff41497c273e1ebc19d03 [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 Zhang379cb482021-02-04 21:05:11 -080094 Status s = mTunerFrontend->setCallback(mAidlCallback);
95 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -080096 }
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) {
Amy Zhang379cb482021-02-04 21:05:11 -0800246 Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
247 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800248 }
249
250 if (mFrontend != NULL) {
251 Result result = mFrontend->setLnb(lnbClient->getId());
252 return result;
253 }
254
255 return Result::INVALID_STATE;
256}
257
Amy Zhangd08c2732021-01-08 17:22:59 -0800258Result FrontendClient::setLna(bool bEnable) {
259 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800260 Status s = mTunerFrontend->setLna(bEnable);
261 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800262 }
263
264 if (mFrontend != NULL) {
265 Result result = mFrontend->setLna(bEnable);
266 return result;
267 }
268
269 return Result::INVALID_STATE;
270}
271
272int FrontendClient::linkCiCamToFrontend(int ciCamId) {
273 int ltsId = (int)Constant::INVALID_LTS_ID;
274
275 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800276 Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
277 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
278 return ltsId;
279 }
280 return (int)Constant::INVALID_LTS_ID;
Amy Zhangd08c2732021-01-08 17:22:59 -0800281 }
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) {
Amy Zhang379cb482021-02-04 21:05:11 -0800300 Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
301 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800302 }
303
304 if (mFrontend_1_1 != NULL) {
305 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
306 }
307
308 return Result::INVALID_STATE;
309}
310
Amy Zhanga6734682020-11-30 16:14:38 -0800311Result FrontendClient::close() {
312 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800313 Status s = mTunerFrontend->close();
314 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800315 }
316
317 if (mFrontend != NULL) {
318 Result result = mFrontend->close();
319 if (result == Result::SUCCESS) {
320 mFrontend = NULL;
321 mFrontend_1_1 = NULL;
322 }
323 return result;
324 }
325
326 return Result::INVALID_STATE;
327}
328
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800329/////////////// TunerFrontend Helper Methods ///////////////////////
330
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800331shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
332 return mTunerFrontend;
333}
334
335int FrontendClient::getId() {
Amy Zhang210c26a2021-01-12 11:25:27 -0800336 return mId;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800337}
338
Amy Zhang46c31ec2021-02-03 18:19:10 -0800339vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
340 vector<FrontendStatus> hidlStatus;
341 for (TunerFrontendStatus s : aidlStatus) {
342 FrontendStatus status;
343 switch (s.getTag()) {
344 case TunerFrontendStatus::isDemodLocked: {
345 status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
346 hidlStatus.push_back(status);
347 break;
348 }
349 case TunerFrontendStatus::snr: {
350 status.snr(s.get<TunerFrontendStatus::snr>());
351 hidlStatus.push_back(status);
352 break;
353 }
354 case TunerFrontendStatus::ber: {
355 status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
356 hidlStatus.push_back(status);
357 break;
358 }
359 case TunerFrontendStatus::per: {
360 status.per((uint32_t)s.get<TunerFrontendStatus::per>());
361 hidlStatus.push_back(status);
362 break;
363 }
364 case TunerFrontendStatus::preBer: {
365 status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
366 hidlStatus.push_back(status);
367 break;
368 }
369 case TunerFrontendStatus::signalQuality: {
370 status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
371 hidlStatus.push_back(status);
372 break;
373 }
374 case TunerFrontendStatus::signalStrength: {
375 status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
376 hidlStatus.push_back(status);
377 break;
378 }
379 case TunerFrontendStatus::symbolRate: {
380 status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
381 hidlStatus.push_back(status);
382 break;
383 }
384 case TunerFrontendStatus::innerFec: {
385 status.innerFec(static_cast<FrontendInnerFec>(
386 s.get<TunerFrontendStatus::innerFec>()));
387 hidlStatus.push_back(status);
388 break;
389 }
390 case TunerFrontendStatus::modulation: {
391 auto aidlMod = s.get<TunerFrontendStatus::modulation>();
392 switch (mType) {
393 case (int)FrontendType::DVBC:
394 status.modulation().dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
395 hidlStatus.push_back(status);
396 break;
397 case (int)FrontendType::DVBS:
398 status.modulation().dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
399 hidlStatus.push_back(status);
400 break;
401 case (int)FrontendType::ISDBS:
402 status.modulation().isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
403 hidlStatus.push_back(status);
404 break;
405 case (int)FrontendType::ISDBS3:
406 status.modulation().isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
407 hidlStatus.push_back(status);
408 break;
409 case (int)FrontendType::ISDBT:
410 status.modulation().isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
411 hidlStatus.push_back(status);
412 break;
413 default:
414 break;
415 }
416 break;
417 }
418 case TunerFrontendStatus::inversion: {
419 status.inversion(static_cast<FrontendDvbcSpectralInversion>(
420 s.get<TunerFrontendStatus::inversion>()));
421 hidlStatus.push_back(status);
422 break;
423 }
424 case TunerFrontendStatus::lnbVoltage: {
425 status.lnbVoltage(static_cast<LnbVoltage>(
426 s.get<TunerFrontendStatus::lnbVoltage>()));
427 hidlStatus.push_back(status);
428 break;
429 }
430 case TunerFrontendStatus::plpId: {
431 status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
432 hidlStatus.push_back(status);
433 break;
434 }
435 case TunerFrontendStatus::isEWBS: {
436 status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
437 hidlStatus.push_back(status);
438 break;
439 }
440 case TunerFrontendStatus::agc: {
441 status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
442 hidlStatus.push_back(status);
443 break;
444 }
445 case TunerFrontendStatus::isLnaOn: {
446 status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
447 hidlStatus.push_back(status);
448 break;
449 }
450 case TunerFrontendStatus::isLayerError: {
451 auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
452 hidl_vec<bool> e(aidlE.begin(), aidlE.end());
453 status.isLayerError(e);
454 hidlStatus.push_back(status);
455 break;
456 }
457 case TunerFrontendStatus::mer: {
458 status.mer(s.get<TunerFrontendStatus::mer>());
459 hidlStatus.push_back(status);
460 break;
461 }
462 case TunerFrontendStatus::freqOffset: {
463 status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
464 hidlStatus.push_back(status);
465 break;
466 }
467 case TunerFrontendStatus::hierarchy: {
468 status.hierarchy(static_cast<FrontendDvbtHierarchy>(
469 s.get<TunerFrontendStatus::freqOffset>()));
470 hidlStatus.push_back(status);
471 break;
472 }
473 case TunerFrontendStatus::isRfLocked: {
474 status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
475 hidlStatus.push_back(status);
476 break;
477 }
478 case TunerFrontendStatus::plpInfo: {
479 int size = s.get<TunerFrontendStatus::plpInfo>().size();
480 status.plpInfo().resize(size);
481 for (int i = 0; i < size; i++) {
482 auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
483 status.plpInfo()[i] = {
484 .plpId = (uint8_t)aidlInfo.plpId,
485 .isLocked = aidlInfo.isLocked,
486 .uec = (uint32_t)aidlInfo.uec,
487 };
488 }
489 hidlStatus.push_back(status);
490 break;
491 }
492 default:
493 break;
494 }
495 }
496 return hidlStatus;
497}
498
499vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
500 vector<TunerFrontendStatus>& aidlStatus) {
501 vector<FrontendStatusExt1_1> hidlStatus;
502 for (TunerFrontendStatus s : aidlStatus) {
503 FrontendStatusExt1_1 status;
504 switch (s.getTag()) {
505 case TunerFrontendStatus::modulations: {
506 for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
507 int size = status.modulations().size();
508 status.modulations().resize(size + 1);
509 switch (mType) {
510 case (int)FrontendType::DVBC:
511 status.modulations()[size].dvbc(
512 static_cast<FrontendDvbcModulation>(aidlMod));
513 break;
514 case (int)FrontendType::DVBS:
515 status.modulations()[size].dvbs(
516 static_cast<FrontendDvbsModulation>(aidlMod));
517 break;
518 case (int)FrontendType::DVBT:
519 status.modulations()[size].dvbt(
520 static_cast<FrontendDvbtConstellation>(aidlMod));
521 break;
522 case (int)FrontendType::ISDBS:
523 status.modulations()[size].isdbs(
524 static_cast<FrontendIsdbsModulation>(aidlMod));
525 break;
526 case (int)FrontendType::ISDBS3:
527 status.modulations()[size].isdbs3(
528 static_cast<FrontendIsdbs3Modulation>(aidlMod));
529 break;
530 case (int)FrontendType::ISDBT:
531 status.modulations()[size].isdbt(
532 static_cast<FrontendIsdbtModulation>(aidlMod));
533 break;
534 case (int)FrontendType::ATSC:
535 status.modulations()[size].atsc(
536 static_cast<FrontendAtscModulation>(aidlMod));
537 break;
538 case (int)FrontendType::ATSC3:
539 status.modulations()[size].atsc3(
540 static_cast<FrontendAtsc3Modulation>(aidlMod));
541 break;
542 case (int)FrontendType::DTMB:
543 status.modulations()[size].dtmb(
544 static_cast<FrontendDtmbModulation>(aidlMod));
545 break;
546 default:
547 status.modulations().resize(size);
548 break;
549 }
550 }
551 hidlStatus.push_back(status);
552 break;
553 }
554 case TunerFrontendStatus::bers: {
555 auto aidlB = s.get<TunerFrontendStatus::bers>();
556 hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
557 status.bers(b);
558 hidlStatus.push_back(status);
559 break;
560 }
561 case TunerFrontendStatus::codeRates: {
562 int size = s.get<TunerFrontendStatus::codeRates>().size();
563 status.codeRates().resize(size);
564 for (int i = 0; i < size; i++) {
565 auto aidlCodeRate = s.get<TunerFrontendStatus::codeRates>()[i];
566 status.codeRates()[i] =
567 static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate);
568 }
569 hidlStatus.push_back(status);
570 break;
571 }
572 case TunerFrontendStatus::bandwidth: {
573 auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
574 switch (mType) {
575 case (int)FrontendType::ATSC3:
576 status.bandwidth().atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
577 hidlStatus.push_back(status);
578 break;
579 case (int)FrontendType::DVBC:
580 status.bandwidth().dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
581 hidlStatus.push_back(status);
582 break;
583 case (int)FrontendType::DVBT:
584 status.bandwidth().dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
585 hidlStatus.push_back(status);
586 break;
587 case (int)FrontendType::ISDBT:
588 status.bandwidth().isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
589 hidlStatus.push_back(status);
590 break;
591 case (int)FrontendType::DTMB:
592 status.bandwidth().dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
593 hidlStatus.push_back(status);
594 break;
595 default:
596 break;
597 }
598 break;
599 }
600 case TunerFrontendStatus::interval: {
601 auto aidlInter = s.get<TunerFrontendStatus::interval>();
602 switch (mType) {
603 case (int)FrontendType::DVBT:
604 status.interval().dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
605 hidlStatus.push_back(status);
606 break;
607 case (int)FrontendType::ISDBT:
608 status.interval().isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
609 hidlStatus.push_back(status);
610 break;
611 case (int)FrontendType::DTMB:
612 status.interval().dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
613 hidlStatus.push_back(status);
614 break;
615 default:
616 break;
617 }
618 break;
619 }
620 case TunerFrontendStatus::transmissionMode: {
621 auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
622 switch (mType) {
623 case (int)FrontendType::DVBT:
624 status.transmissionMode().dvbt(
625 static_cast<FrontendDvbtTransmissionMode>(aidlTran));
626 hidlStatus.push_back(status);
627 break;
628 case (int)FrontendType::ISDBT:
629 status.transmissionMode().isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
630 hidlStatus.push_back(status);
631 break;
632 case (int)FrontendType::DTMB:
633 status.transmissionMode().dtmb(
634 static_cast<FrontendDtmbTransmissionMode>(aidlTran));
635 hidlStatus.push_back(status);
636 break;
637 default:
638 break;
639 }
640 break;
641 }
642 case TunerFrontendStatus::uec: {
643 status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
644 hidlStatus.push_back(status);
645 break;
646 }
647 case TunerFrontendStatus::systemId: {
648 status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
649 hidlStatus.push_back(status);
650 break;
651 }
652 case TunerFrontendStatus::interleaving: {
653 for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
654 int size = status.interleaving().size();
655 status.interleaving().resize(size + 1);
656 switch (mType) {
657 case (int)FrontendType::DVBC:
658 status.interleaving()[size].dvbc(
659 static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
660 break;
661 case (int)FrontendType::ATSC3:
662 status.interleaving()[size].atsc3(
663 static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
664 break;
665 case (int)FrontendType::DTMB:
666 status.interleaving()[size].dtmb(
667 static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
668 break;
669 default:
670 status.interleaving().resize(size);
671 break;
672 }
673 }
674 hidlStatus.push_back(status);
675 break;
676 }
677 case TunerFrontendStatus::isdbtSegment: {
678 auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
679 hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
680 status.isdbtSegment(s);
681 hidlStatus.push_back(status);
682 break;
683 }
684 case TunerFrontendStatus::tsDataRate: {
685 auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
686 hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
687 status.tsDataRate(ts);
688 hidlStatus.push_back(status);
689 break;
690 }
691 case TunerFrontendStatus::rollOff: {
692 auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
693 switch (mType) {
694 case (int)FrontendType::DVBS:
695 status.rollOff().dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
696 hidlStatus.push_back(status);
697 break;
698 case (int)FrontendType::ISDBS:
699 status.rollOff().isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
700 hidlStatus.push_back(status);
701 break;
702 case (int)FrontendType::ISDBS3:
703 status.rollOff().isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
704 hidlStatus.push_back(status);
705 break;
706 default:
707 break;
708 }
709 break;
710 }
711 case TunerFrontendStatus::isMiso: {
712 status.isMiso(s.get<TunerFrontendStatus::isMiso>());
713 hidlStatus.push_back(status);
714 break;
715 }
716 case TunerFrontendStatus::isLinear: {
717 status.isLinear(s.get<TunerFrontendStatus::isLinear>());
718 hidlStatus.push_back(status);
719 break;
720 }
721 case TunerFrontendStatus::isShortFrames: {
722 status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
723 hidlStatus.push_back(status);
724 break;
725 }
726 default:
727 break;
728 }
729 }
730 return hidlStatus;
731}
732
Amy Zhangb5809be2021-01-26 16:27:23 -0800733TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800734 const FrontendSettingsExt1_1& settingsExt1_1) {
735 bool isExtended = validateExtendedSettings(settingsExt1_1);
736 TunerFrontendSettings s{
737 .isExtended = isExtended,
738 .endFrequency = (int) settingsExt1_1.endFrequency,
739 .inversion = (int) settingsExt1_1.inversion,
740 };
741
742 if (settingsExt1_1.settingExt.getDiscriminator()
743 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
744 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
745 return s;
746 }
747
Amy Zhangb5809be2021-01-26 16:27:23 -0800748 switch (settings.getDiscriminator()) {
749 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800750 s.settings.set<TunerFrontendUnionSettings::analog>(
751 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800752 break;
753 }
754 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800755 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800756 break;
757 }
758 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800759 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800760 break;
761 }
762 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800763 s.settings.set<TunerFrontendUnionSettings::dvbs>(
764 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800765 break;
766 }
767 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800768 s.settings.set<TunerFrontendUnionSettings::cable>(
769 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800770 break;
771 }
772 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800773 s.settings.set<TunerFrontendUnionSettings::dvbt>(
774 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800775 break;
776 }
777 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800778 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800779 break;
780 }
781 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800782 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800783 break;
784 }
785 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800786 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800787 break;
788 }
789 default:
790 break;
791 }
792 return s;
793}
794
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800795TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
796 const FrontendSettingsExt1_1& settingsExt1_1) {
797 TunerFrontendAnalogSettings analogSettings{
798 .frequency = (int)settings.analog().frequency,
799 .signalType = (int)settings.analog().type,
800 .sifStandard = (int)settings.analog().sifStandard,
801 };
802 if (settingsExt1_1.settingExt.getDiscriminator()
803 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
804 analogSettings.isExtended = true;
805 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
806 } else {
807 analogSettings.isExtended = false;
808 }
809 return analogSettings;
810}
811
812TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
813 const FrontendSettingsExt1_1& settingsExt1_1) {
814 TunerFrontendDvbsSettings dvbsSettings{
815 .frequency = (int)settings.dvbs().frequency,
816 .modulation = (int)settings.dvbs().modulation,
817 .codeRate = {
818 .fec = (long)settings.dvbs().coderate.fec,
819 .isLinear = settings.dvbs().coderate.isLinear,
820 .isShortFrames = settings.dvbs().coderate.isShortFrames,
821 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
822 },
823 .symbolRate = (int)settings.dvbs().symbolRate,
824 .rolloff = (int)settings.dvbs().rolloff,
825 .pilot = (int)settings.dvbs().pilot,
826 .inputStreamId = (int)settings.dvbs().inputStreamId,
827 .standard = (int)settings.dvbs().standard,
828 .vcm = (int)settings.dvbs().vcmMode,
829 };
830 if (settingsExt1_1.settingExt.getDiscriminator()
831 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
832 dvbsSettings.isExtended = true;
833 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
834 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
835 } else {
836 dvbsSettings.isExtended = false;
837 }
838 return dvbsSettings;
839}
840
841TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
842 const FrontendSettingsExt1_1& settingsExt1_1) {
843 TunerFrontendCableSettings cableSettings{
844 .frequency = (int)settings.dvbc().frequency,
845 .modulation = (int)settings.dvbc().modulation,
846 .innerFec = (long)settings.dvbc().fec,
847 .symbolRate = (int)settings.dvbc().symbolRate,
848 .outerFec = (int)settings.dvbc().outerFec,
849 .annex = (int)settings.dvbc().annex,
850 .spectralInversion = (int)settings.dvbc().spectralInversion,
851 };
852 if (settingsExt1_1.settingExt.getDiscriminator()
853 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
854 cableSettings.isExtended = true;
855 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
856 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
857 } else {
858 cableSettings.isExtended = false;
859 }
860 return cableSettings;
861}
862
863TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
864 const FrontendSettingsExt1_1& settingsExt1_1) {
865 TunerFrontendDvbtSettings dvbtSettings{
866 .frequency = (int)settings.dvbt().frequency,
867 .transmissionMode = (int)settings.dvbt().transmissionMode,
868 .bandwidth = (int)settings.dvbt().bandwidth,
869 .constellation = (int)settings.dvbt().constellation,
870 .hierarchy = (int)settings.dvbt().hierarchy,
871 .hpCodeRate = (int)settings.dvbt().hpCoderate,
872 .lpCodeRate = (int)settings.dvbt().lpCoderate,
873 .guardInterval = (int)settings.dvbt().guardInterval,
874 .isHighPriority = settings.dvbt().isHighPriority,
875 .standard = (int)settings.dvbt().standard,
876 .isMiso = settings.dvbt().isMiso,
877 .plpMode = (int)settings.dvbt().plpMode,
878 .plpId = (int)settings.dvbt().plpId,
879 .plpGroupId = (int)settings.dvbt().plpGroupId,
880 };
881 if (settingsExt1_1.settingExt.getDiscriminator()
882 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
883 dvbtSettings.isExtended = true;
884 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
885 dvbtSettings.transmissionMode =
886 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
887 } else {
888 dvbtSettings.isExtended = false;
889 }
890 return dvbtSettings;
891}
892
893TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
894 const FrontendSettingsExt1_1& settingsExt1_1) {
895 TunerFrontendDtmbSettings dtmbSettings{
896 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
897 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
898 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
899 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
900 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
901 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
902 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
903 };
904 return dtmbSettings;
905}
906
907TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
908 TunerFrontendAtscSettings atscSettings{
909 .frequency = (int)settings.atsc().frequency,
910 .modulation = (int)settings.atsc().modulation,
911 };
912 return atscSettings;
913}
914
915TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
916 TunerFrontendAtsc3Settings atsc3Settings{
917 .frequency = (int)settings.atsc3().frequency,
918 .bandwidth = (int)settings.atsc3().bandwidth,
919 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
920 };
921 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
922 for (auto plpSetting : settings.atsc3().plpSettings) {
923 atsc3Settings.plpSettings.push_back({
924 .plpId = (int)plpSetting.plpId,
925 .modulation = (int)plpSetting.modulation,
926 .interleaveMode = (int)plpSetting.interleaveMode,
927 .codeRate = (int)plpSetting.codeRate,
928 .fec = (int)plpSetting.fec,
929 });
930 }
931 return atsc3Settings;
932}
933
934TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
935 TunerFrontendIsdbsSettings isdbsSettings{
936 .frequency = (int)settings.isdbs().frequency,
937 .streamId = (int)settings.isdbs().streamId,
938 .streamIdType = (int)settings.isdbs().streamIdType,
939 .modulation = (int)settings.isdbs().modulation,
940 .codeRate = (int)settings.isdbs().coderate,
941 .symbolRate = (int)settings.isdbs().symbolRate,
942 .rolloff = (int)settings.isdbs().rolloff,
943 };
944 return isdbsSettings;
945}
946
947TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
948 const FrontendSettings& settings) {
949 TunerFrontendIsdbs3Settings isdbs3Settings{
950 .frequency = (int)settings.isdbs3().frequency,
951 .streamId = (int)settings.isdbs3().streamId,
952 .streamIdType = (int)settings.isdbs3().streamIdType,
953 .modulation = (int)settings.isdbs3().modulation,
954 .codeRate = (int)settings.isdbs3().coderate,
955 .symbolRate = (int)settings.isdbs3().symbolRate,
956 .rolloff = (int)settings.isdbs3().rolloff,
957 };
958 return isdbs3Settings;
959}
960
961TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
962 TunerFrontendIsdbtSettings isdbtSettings{
963 .frequency = (int)settings.isdbt().frequency,
964 .modulation = (int)settings.isdbt().modulation,
965 .bandwidth = (int)settings.isdbt().bandwidth,
966 .mode = (int)settings.isdbt().mode,
967 .codeRate = (int)settings.isdbt().coderate,
968 .guardInterval = (int)settings.isdbt().guardInterval,
969 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
970 };
971 return isdbtSettings;
972}
973
974bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
975 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
976 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
977 || settingsExt1_1.settingExt.getDiscriminator()
978 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
979}
980
Amy Zhanga6734682020-11-30 16:14:38 -0800981/////////////// TunerFrontendCallback ///////////////////////
982
983TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
984 : mFrontendClientCallback(frontendClientCallback) {}
985
986Status TunerFrontendCallback::onEvent(int frontendEventType) {
987 if (mFrontendClientCallback != NULL) {
988 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
989 return Status::ok();
990 }
991 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
992}
993
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800994Status TunerFrontendCallback::onScanMessage(int messageType,
995 const TunerFrontendScanMessage& message) {
996 if (mFrontendClientCallback != NULL) {
997 if (!is1_1ExtendedScanMessage(messageType)) {
998 mFrontendClientCallback->onScanMessage(
999 static_cast<FrontendScanMessageType>(messageType),
1000 getHalScanMessage(messageType, message));
1001 } else {
1002 mFrontendClientCallback->onScanMessageExt1_1(
1003 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
1004 getHalScanMessageExt1_1(messageType, message));
1005 }
1006 return Status::ok();
1007 }
1008 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -08001009}
1010
1011/////////////// IFrontendCallback ///////////////////////
1012
1013HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1014 : mFrontendClientCallback(frontendClientCallback) {}
1015
1016Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
1017 if (mFrontendClientCallback != NULL) {
1018 mFrontendClientCallback->onEvent(frontendEventType);
1019 }
1020 return Void();
1021}
1022
1023Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
1024 const FrontendScanMessage& message) {
1025 if (mFrontendClientCallback != NULL) {
1026 mFrontendClientCallback->onScanMessage(type, message);
1027 }
1028 return Void();
1029}
1030
1031Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
1032 const FrontendScanMessageExt1_1& message) {
1033 if (mFrontendClientCallback != NULL) {
1034 mFrontendClientCallback->onScanMessageExt1_1(type, message);
1035 }
1036 return Void();
1037}
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001038
1039/////////////// FrontendClientCallback Helper Methods ///////////////////////
1040
1041FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
1042 int messageType, const TunerFrontendScanMessage& message) {
1043 FrontendScanMessage scanMessage;
1044 switch (messageType) {
1045 case (int) FrontendScanMessageType::LOCKED:
1046 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
1047 break;
1048 case (int) FrontendScanMessageType::END:
1049 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
1050 break;
1051 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
1052 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
1053 break;
1054 case (int) FrontendScanMessageType::FREQUENCY: {
1055 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
1056 hidl_vec<uint32_t> frequencies(begin(f), end(f));
1057 scanMessage.frequencies(frequencies);
1058 break;
1059 }
1060 case (int) FrontendScanMessageType::SYMBOL_RATE: {
1061 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
1062 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
1063 scanMessage.symbolRates(symbolRates);
1064 break;
1065 }
1066 case (int) FrontendScanMessageType::HIERARCHY:
1067 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
1068 message.get<TunerFrontendScanMessage::hierarchy>()));
1069 break;
1070 case (int) FrontendScanMessageType::ANALOG_TYPE:
1071 scanMessage.analogType(static_cast<FrontendAnalogType>(
1072 message.get<TunerFrontendScanMessage::analogType>()));
1073 break;
1074 case (int) FrontendScanMessageType::PLP_IDS: {
1075 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
1076 hidl_vec<uint8_t> plpIds(begin(p), end(p));
1077 scanMessage.plpIds(plpIds);
1078 break;
1079 }
1080 case (int) FrontendScanMessageType::GROUP_IDS: {
1081 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
1082 hidl_vec<uint8_t> groupIds(begin(g), end(g));
1083 scanMessage.groupIds(groupIds);
1084 break;
1085 }
1086 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
1087 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
1088 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
1089 scanMessage.inputStreamIds(inputStreamIds);
1090 break;
1091 }
1092 case (int) FrontendScanMessageType::STANDARD: {
1093 FrontendScanMessage::Standard std;
1094 int standard = message.get<TunerFrontendScanMessage::std>();
1095 switch (mType) {
1096 case (int) FrontendType::DVBS:
1097 std.sStd(static_cast<FrontendDvbsStandard>(standard));
1098 scanMessage.std(std);
1099 break;
1100 case (int) FrontendType::DVBT:
1101 std.tStd(static_cast<FrontendDvbtStandard>(standard));
1102 scanMessage.std(std);
1103 break;
1104 case (int) FrontendType::ANALOG:
1105 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
1106 scanMessage.std(std);
1107 break;
1108 default:
1109 break;
1110 }
1111 break;
1112 }
1113 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
1114 vector<TunerFrontendScanAtsc3PlpInfo> plp =
1115 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
1116 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -08001117 int size = plp.size();
1118 plpInfo.resize(size);
1119 for (int i = 0; i < size; i++) {
1120 auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001121 FrontendScanAtsc3PlpInfo p{
1122 .plpId = static_cast<uint8_t>(info.plpId),
1123 .bLlsFlag = info.llsFlag,
1124 };
Amy Zhang46c31ec2021-02-03 18:19:10 -08001125 plpInfo[i] = p;
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001126 }
1127 scanMessage.atsc3PlpInfos(plpInfo);
1128 break;
1129 }
1130 default:
1131 break;
1132 }
1133 return scanMessage;
1134}
1135
1136FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
1137 int messageType, const TunerFrontendScanMessage& message) {
1138 FrontendScanMessageExt1_1 scanMessage;
1139 switch (messageType) {
1140 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
1141 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
1142 break;
1143 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
1144 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
1145 message.get<TunerFrontendScanMessage::annex>()));
1146 break;
1147 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
1148 FrontendModulation m;
1149 int modulation = message.get<TunerFrontendScanMessage::modulation>();
1150 switch (mType) {
1151 case (int) FrontendType::DVBC:
1152 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
1153 scanMessage.modulation(m);
1154 break;
1155 case (int) FrontendType::DVBS:
1156 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
1157 scanMessage.modulation(m);
1158 break;
1159 case (int) FrontendType::DVBT:
1160 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
1161 scanMessage.modulation(m);
1162 break;
1163 case (int) FrontendType::ISDBS:
1164 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
1165 scanMessage.modulation(m);
1166 break;
1167 case (int) FrontendType::ISDBS3:
1168 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
1169 scanMessage.modulation(m);
1170 break;
1171 case (int) FrontendType::ISDBT:
1172 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
1173 scanMessage.modulation(m);
1174 break;
1175 case (int) FrontendType::ATSC:
1176 m.atsc(static_cast<FrontendAtscModulation>(modulation));
1177 scanMessage.modulation(m);
1178 break;
1179 case (int) FrontendType::ATSC3:
1180 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
1181 scanMessage.modulation(m);
1182 break;
1183 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
1184 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
1185 scanMessage.modulation(m);
1186 break;
1187 default:
1188 break;
1189 }
1190 break;
1191 }
1192 default:
1193 break;
1194 }
1195 return scanMessage;
1196}
1197
1198bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
1199 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
1200 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
1201}
Amy Zhanga6734682020-11-30 16:14:38 -08001202} // namespace android