blob: 445d2b6d7c3dd8bce581d3d387f9ac6be71ce08e [file] [log] [blame]
Hongguang4092f2f2021-07-08 18:49:12 -07001/*
2 * Copyright 2021 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_NDEBUG 0
18#define LOG_TAG "android.hardware.tv.tuner-service.example-Frontend"
19
Hongguange423acd2021-07-27 16:56:47 -070020#include <aidl/android/hardware/tv/tuner/Result.h>
Hongguang4092f2f2021-07-08 18:49:12 -070021#include <utils/Log.h>
22
Hongguange423acd2021-07-27 16:56:47 -070023#include "Frontend.h"
24
Hongguang4092f2f2021-07-08 18:49:12 -070025namespace aidl {
26namespace android {
27namespace hardware {
28namespace tv {
29namespace tuner {
30
Hongguang Chenff2c6b02021-08-07 00:12:26 +000031Frontend::Frontend(FrontendType type, int32_t id, std::shared_ptr<Tuner> tuner) {
Hongguang4092f2f2021-07-08 18:49:12 -070032 mType = type;
33 mId = id;
Hongguange423acd2021-07-27 16:56:47 -070034 mTuner = tuner;
Hongguang4092f2f2021-07-08 18:49:12 -070035 // Init callback to nullptr
36 mCallback = nullptr;
37}
38
39Frontend::~Frontend() {}
40
41::ndk::ScopedAStatus Frontend::close() {
42 ALOGV("%s", __FUNCTION__);
43 // Reset callback
44 mCallback = nullptr;
45 mIsLocked = false;
Hongguange423acd2021-07-27 16:56:47 -070046 mTuner->removeFrontend(mId);
Hongguang4092f2f2021-07-08 18:49:12 -070047
48 return ::ndk::ScopedAStatus::ok();
49}
50
51::ndk::ScopedAStatus Frontend::setCallback(const std::shared_ptr<IFrontendCallback>& in_callback) {
52 ALOGV("%s", __FUNCTION__);
53 if (in_callback == nullptr) {
54 ALOGW("[ WARN ] Set Frontend callback with nullptr");
Hongguange423acd2021-07-27 16:56:47 -070055 return ::ndk::ScopedAStatus::fromServiceSpecificError(
56 static_cast<int32_t>(Result::INVALID_ARGUMENT));
Hongguang4092f2f2021-07-08 18:49:12 -070057 }
58
59 mCallback = in_callback;
60 return ::ndk::ScopedAStatus::ok();
61}
62
63::ndk::ScopedAStatus Frontend::tune(const FrontendSettings& /* in_settings */) {
64 ALOGV("%s", __FUNCTION__);
65 if (mCallback == nullptr) {
66 ALOGW("[ WARN ] Frontend callback is not set when tune");
Hongguange423acd2021-07-27 16:56:47 -070067 return ::ndk::ScopedAStatus::fromServiceSpecificError(
68 static_cast<int32_t>(Result::INVALID_STATE));
Hongguang4092f2f2021-07-08 18:49:12 -070069 }
70
Hongguange423acd2021-07-27 16:56:47 -070071 mTuner->frontendStartTune(mId);
Hongguang4092f2f2021-07-08 18:49:12 -070072 mCallback->onEvent(FrontendEventType::LOCKED);
73 mIsLocked = true;
74
75 return ::ndk::ScopedAStatus::ok();
76}
77
78::ndk::ScopedAStatus Frontend::stopTune() {
79 ALOGV("%s", __FUNCTION__);
80
Hongguange423acd2021-07-27 16:56:47 -070081 mTuner->frontendStopTune(mId);
Hongguang4092f2f2021-07-08 18:49:12 -070082 mIsLocked = false;
83
84 return ::ndk::ScopedAStatus::ok();
85}
86
87::ndk::ScopedAStatus Frontend::scan(const FrontendSettings& in_settings, FrontendScanType in_type) {
88 ALOGV("%s", __FUNCTION__);
Hongguang4092f2f2021-07-08 18:49:12 -070089
Hongguang6c09bff2021-12-23 10:50:03 -080090 // If it's in middle of scanning, stop it first.
91 if (mScanThread.joinable()) {
92 mScanThread.join();
93 }
94
95 mFrontendSettings = in_settings;
96 mFrontendScanType = in_type;
97 mScanThread = std::thread(&Frontend::scanThreadLoop, this);
98
99 return ::ndk::ScopedAStatus::ok();
100}
101
102void Frontend::scanThreadLoop() {
Hongguang4092f2f2021-07-08 18:49:12 -0700103 if (mIsLocked) {
Hongguange423acd2021-07-27 16:56:47 -0700104 FrontendScanMessage msg;
Hongguang4092f2f2021-07-08 18:49:12 -0700105 msg.set<FrontendScanMessage::Tag::isEnd>(true);
106 mCallback->onScanMessage(FrontendScanMessageType::END, msg);
Hongguang6c09bff2021-12-23 10:50:03 -0800107 return;
Hongguang4092f2f2021-07-08 18:49:12 -0700108 }
109
Hongguang11da2cb2021-08-05 19:05:12 -0700110 int64_t frequency = 0;
Hongguang6c09bff2021-12-23 10:50:03 -0800111 switch (mFrontendSettings.getTag()) {
Hongguang4092f2f2021-07-08 18:49:12 -0700112 case FrontendSettings::Tag::analog:
Hongguang6c09bff2021-12-23 10:50:03 -0800113 frequency = mFrontendSettings.get<FrontendSettings::Tag::analog>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700114 break;
115 case FrontendSettings::Tag::atsc:
Hongguang6c09bff2021-12-23 10:50:03 -0800116 frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700117 break;
118 case FrontendSettings::Tag::atsc3:
Hongguang6c09bff2021-12-23 10:50:03 -0800119 frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc3>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700120 break;
121 case FrontendSettings::Tag::dvbs:
Hongguang6c09bff2021-12-23 10:50:03 -0800122 frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbs>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700123 break;
124 case FrontendSettings::Tag::dvbc:
Hongguang6c09bff2021-12-23 10:50:03 -0800125 frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbc>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700126 break;
127 case FrontendSettings::Tag::dvbt:
Hongguang6c09bff2021-12-23 10:50:03 -0800128 frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbt>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700129 break;
130 case FrontendSettings::Tag::isdbs:
Hongguang6c09bff2021-12-23 10:50:03 -0800131 frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700132 break;
133 case FrontendSettings::Tag::isdbs3:
Hongguang6c09bff2021-12-23 10:50:03 -0800134 frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs3>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700135 break;
136 case FrontendSettings::Tag::isdbt:
Hongguang6c09bff2021-12-23 10:50:03 -0800137 frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbt>().frequency;
Hongguang4092f2f2021-07-08 18:49:12 -0700138 break;
139 default:
140 break;
141 }
142
Hongguang6c09bff2021-12-23 10:50:03 -0800143 if (mFrontendScanType == FrontendScanType::SCAN_BLIND) {
Gareth Fenn282fb372021-09-27 15:14:11 +0100144 frequency += 100 * 1000;
Hongguang4092f2f2021-07-08 18:49:12 -0700145 }
146
147 {
148 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700149 vector<int64_t> frequencies = {frequency};
Hongguang4092f2f2021-07-08 18:49:12 -0700150 msg.set<FrontendScanMessage::Tag::frequencies>(frequencies);
151 mCallback->onScanMessage(FrontendScanMessageType::FREQUENCY, msg);
152 }
153
154 {
155 FrontendScanMessage msg;
156 msg.set<FrontendScanMessage::Tag::progressPercent>(20);
157 mCallback->onScanMessage(FrontendScanMessageType::PROGRESS_PERCENT, msg);
158 }
159
160 {
161 FrontendScanMessage msg;
162 vector<int32_t> symbolRates = {30};
163 msg.set<FrontendScanMessage::Tag::symbolRates>(symbolRates);
164 mCallback->onScanMessage(FrontendScanMessageType::SYMBOL_RATE, msg);
165 }
166
167 if (mType == FrontendType::DVBT) {
168 FrontendScanMessage msg;
169 msg.set<FrontendScanMessage::Tag::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_NON_NATIVE);
170 mCallback->onScanMessage(FrontendScanMessageType::HIERARCHY, msg);
171 }
172
173 if (mType == FrontendType::ANALOG) {
174 FrontendScanMessage msg;
175 msg.set<FrontendScanMessage::Tag::analogType>(FrontendAnalogType::PAL);
176 mCallback->onScanMessage(FrontendScanMessageType::ANALOG_TYPE, msg);
177 }
178
179 {
180 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700181 vector<int32_t> plpIds = {2};
Hongguang4092f2f2021-07-08 18:49:12 -0700182 msg.set<FrontendScanMessage::Tag::plpIds>(plpIds);
183 mCallback->onScanMessage(FrontendScanMessageType::PLP_IDS, msg);
184 }
185
186 {
187 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700188 vector<int32_t> groupIds = {3};
Hongguang4092f2f2021-07-08 18:49:12 -0700189 msg.set<FrontendScanMessage::Tag::groupIds>(groupIds);
190 mCallback->onScanMessage(FrontendScanMessageType::GROUP_IDS, msg);
191 }
192
193 {
194 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700195 vector<int32_t> inputStreamIds = {1};
Hongguang4092f2f2021-07-08 18:49:12 -0700196 msg.set<FrontendScanMessage::Tag::inputStreamIds>(inputStreamIds);
197 mCallback->onScanMessage(FrontendScanMessageType::INPUT_STREAM_IDS, msg);
198 }
199
200 switch (mType) {
201 case FrontendType::DVBT: {
202 FrontendScanMessage msg;
203 FrontendScanMessageStandard std;
204 std.set<FrontendScanMessageStandard::Tag::tStd>(FrontendDvbtStandard::AUTO);
205 msg.set<FrontendScanMessage::Tag::std>(std);
206 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
207 break;
208 }
209 case FrontendType::DVBS: {
210 FrontendScanMessage msg;
211 FrontendScanMessageStandard std;
212 std.set<FrontendScanMessageStandard::Tag::sStd>(FrontendDvbsStandard::AUTO);
213 msg.set<FrontendScanMessage::Tag::std>(std);
214 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
215 break;
216 }
217 case FrontendType::ANALOG: {
218 FrontendScanMessage msg;
219 FrontendScanMessageStandard std;
220 std.set<FrontendScanMessageStandard::Tag::sifStd>(FrontendAnalogSifStandard::AUTO);
221 msg.set<FrontendScanMessage::Tag::std>(std);
222 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
223 break;
224 }
225 default:
226 break;
227 }
228
229 {
230 FrontendScanMessage msg;
231 FrontendScanAtsc3PlpInfo info;
232 info.plpId = 1;
233 info.bLlsFlag = false;
234 vector<FrontendScanAtsc3PlpInfo> atsc3PlpInfos = {info};
235 msg.set<FrontendScanMessage::Tag::atsc3PlpInfos>(atsc3PlpInfos);
236 mCallback->onScanMessage(FrontendScanMessageType::ATSC3_PLP_INFO, msg);
237 }
238
239 {
240 FrontendScanMessage msg;
241 FrontendModulation modulation;
242 modulation.set<FrontendModulation::Tag::dvbc>(FrontendDvbcModulation::MOD_16QAM);
243 msg.set<FrontendScanMessage::Tag::modulation>(modulation);
244 mCallback->onScanMessage(FrontendScanMessageType::MODULATION, msg);
245 }
246
247 {
248 FrontendScanMessage msg;
249 msg.set<FrontendScanMessage::Tag::isHighPriority>(true);
250 mCallback->onScanMessage(FrontendScanMessageType::HIGH_PRIORITY, msg);
251 }
252
Hongguang7eda7822021-12-20 14:48:14 -0800253 if (mType == FrontendType::DVBT) {
254 FrontendScanMessage msg;
255 vector<int32_t> dvbtCellIds = {0, 1};
256 msg.set<FrontendScanMessage::Tag::dvbtCellIds>(dvbtCellIds);
257 mCallback->onScanMessage(FrontendScanMessageType::DVBT_CELL_IDS, msg);
258 }
259
Hongguang4092f2f2021-07-08 18:49:12 -0700260 {
261 FrontendScanMessage msg;
262 msg.set<FrontendScanMessage::Tag::isLocked>(true);
263 mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
264 mIsLocked = true;
265 }
Hongguang4092f2f2021-07-08 18:49:12 -0700266}
267
268::ndk::ScopedAStatus Frontend::stopScan() {
269 ALOGV("%s", __FUNCTION__);
270
Hongguang6c09bff2021-12-23 10:50:03 -0800271 if (mScanThread.joinable()) {
272 mScanThread.join();
273 }
274
Hongguang4092f2f2021-07-08 18:49:12 -0700275 mIsLocked = false;
276 return ::ndk::ScopedAStatus::ok();
277}
278
279::ndk::ScopedAStatus Frontend::getStatus(const std::vector<FrontendStatusType>& in_statusTypes,
280 std::vector<FrontendStatus>* _aidl_return) {
281 ALOGV("%s", __FUNCTION__);
282
283 for (int i = 0; i < in_statusTypes.size(); i++) {
284 FrontendStatusType type = in_statusTypes[i];
285 FrontendStatus status;
286 // assign randomly selected values for testing.
287 switch (type) {
288 case FrontendStatusType::DEMOD_LOCK: {
289 status.set<FrontendStatus::isDemodLocked>(true);
290 break;
291 }
292 case FrontendStatusType::SNR: {
293 status.set<FrontendStatus::snr>(221);
294 break;
295 }
296 case FrontendStatusType::BER: {
297 status.set<FrontendStatus::ber>(1);
298 break;
299 }
300 case FrontendStatusType::PER: {
301 status.set<FrontendStatus::per>(2);
302 break;
303 }
304 case FrontendStatusType::PRE_BER: {
305 status.set<FrontendStatus::preBer>(3);
306 break;
307 }
308 case FrontendStatusType::SIGNAL_QUALITY: {
309 status.set<FrontendStatus::signalQuality>(4);
310 break;
311 }
312 case FrontendStatusType::SIGNAL_STRENGTH: {
313 status.set<FrontendStatus::signalStrength>(5);
314 break;
315 }
316 case FrontendStatusType::SYMBOL_RATE: {
317 status.set<FrontendStatus::symbolRate>(6);
318 break;
319 }
320 case FrontendStatusType::FEC: {
321 status.set<FrontendStatus::innerFec>(FrontendInnerFec::FEC_2_9); // value = 1 << 7
322 break;
323 }
324 case FrontendStatusType::MODULATION: {
325 switch (mType) {
326 case FrontendType::ISDBS: {
327 FrontendModulationStatus modulationStatus;
328 modulationStatus.set<FrontendModulationStatus::Tag::isdbs>(
329 FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
330 status.set<FrontendStatus::modulationStatus>(modulationStatus);
331 break;
332 }
333 case FrontendType::DVBC: {
334 FrontendModulationStatus modulationStatus;
335 modulationStatus.set<FrontendModulationStatus::Tag::dvbc>(
336 FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
337 status.set<FrontendStatus::modulationStatus>(modulationStatus);
338 break;
339 }
340 case FrontendType::DVBS: {
341 FrontendModulationStatus modulationStatus;
342 modulationStatus.set<FrontendModulationStatus::Tag::dvbs>(
343 FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
344 status.set<FrontendStatus::modulationStatus>(modulationStatus);
345 break;
346 }
347 case FrontendType::ISDBS3: {
348 FrontendModulationStatus modulationStatus;
349 modulationStatus.set<FrontendModulationStatus::Tag::isdbs3>(
350 FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
351 status.set<FrontendStatus::modulationStatus>(modulationStatus);
352 break;
353 }
354 case FrontendType::ISDBT: {
355 FrontendModulationStatus modulationStatus;
356 modulationStatus.set<FrontendModulationStatus::Tag::isdbt>(
357 FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
358 status.set<FrontendStatus::modulationStatus>(modulationStatus);
359 break;
360 }
361 default:
362 break;
363 }
364 break;
365 }
366 case FrontendStatusType::SPECTRAL: {
367 status.set<FrontendStatus::inversion>(FrontendSpectralInversion::NORMAL);
368 break;
369 }
370 case FrontendStatusType::LNB_VOLTAGE: {
371 status.set<FrontendStatus::lnbVoltage>(LnbVoltage::VOLTAGE_5V);
372 break;
373 }
374 case FrontendStatusType::PLP_ID: {
Hongguang11da2cb2021-08-05 19:05:12 -0700375 status.set<FrontendStatus::plpId>(101);
Hongguang4092f2f2021-07-08 18:49:12 -0700376 break;
377 }
378 case FrontendStatusType::EWBS: {
379 status.set<FrontendStatus::isEWBS>(false);
380 break;
381 }
382 case FrontendStatusType::AGC: {
383 status.set<FrontendStatus::agc>(7);
384 break;
385 }
386 case FrontendStatusType::LNA: {
387 status.set<FrontendStatus::isLnaOn>(false);
388 break;
389 }
390 case FrontendStatusType::LAYER_ERROR: {
391 vector<bool> v = {false, true, true};
392 status.set<FrontendStatus::isLayerError>(v);
393 break;
394 }
395 case FrontendStatusType::MER: {
396 status.set<FrontendStatus::mer>(8);
397 break;
398 }
399 case FrontendStatusType::FREQ_OFFSET: {
400 status.set<FrontendStatus::freqOffset>(9);
401 break;
402 }
403 case FrontendStatusType::HIERARCHY: {
404 status.set<FrontendStatus::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_1_NATIVE);
405 break;
406 }
407 case FrontendStatusType::RF_LOCK: {
408 status.set<FrontendStatus::isRfLocked>(false);
409 break;
410 }
411 case FrontendStatusType::ATSC3_PLP_INFO: {
412 FrontendStatusAtsc3PlpInfo info1;
413 info1.plpId = 3;
414 info1.isLocked = false;
415 info1.uec = 313;
416 FrontendStatusAtsc3PlpInfo info2;
417 info2.plpId = 5;
418 info2.isLocked = true;
419 info2.uec = 515;
420 vector<FrontendStatusAtsc3PlpInfo> infos = {info1, info2};
421 status.set<FrontendStatus::plpInfo>(infos);
422 break;
423 }
424 case FrontendStatusType::MODULATIONS: {
425 FrontendModulation modulation;
426 vector<FrontendModulation> modulations;
427 switch (mType) {
428 case FrontendType::ISDBS: {
429 modulation.set<FrontendModulation::Tag::isdbs>(
430 FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
431 modulations.push_back(modulation);
432 status.set<FrontendStatus::modulations>(modulations);
433 break;
434 }
435 case FrontendType::DVBC: {
436 modulation.set<FrontendModulation::Tag::dvbc>(
437 FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
438 modulations.push_back(modulation);
439 status.set<FrontendStatus::modulations>(modulations);
440 break;
441 }
442 case FrontendType::DVBS: {
443 modulation.set<FrontendModulation::Tag::dvbs>(
444 FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
445 modulations.push_back(modulation);
446 status.set<FrontendStatus::modulations>(modulations);
447 break;
448 }
449 case FrontendType::DVBT: {
450 modulation.set<FrontendModulation::Tag::dvbt>(
451 FrontendDvbtConstellation::CONSTELLATION_16QAM_R); // value = 1 <<
452 // 16
453 modulations.push_back(modulation);
454 status.set<FrontendStatus::modulations>(modulations);
455 break;
456 }
457 case FrontendType::ISDBS3: {
458 modulation.set<FrontendModulation::Tag::isdbs3>(
459 FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
460 modulations.push_back(modulation);
461 status.set<FrontendStatus::modulations>(modulations);
462 break;
463 }
464 case FrontendType::ISDBT: {
465 modulation.set<FrontendModulation::Tag::isdbt>(
466 FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
467 modulations.push_back(modulation);
468 status.set<FrontendStatus::modulations>(modulations);
469 break;
470 }
471 case FrontendType::ATSC: {
472 modulation.set<FrontendModulation::Tag::atsc>(
473 FrontendAtscModulation::MOD_8VSB); // value = 1 << 2
474 modulations.push_back(modulation);
475 status.set<FrontendStatus::modulations>(modulations);
476 break;
477 }
478 case FrontendType::ATSC3: {
479 modulation.set<FrontendModulation::Tag::atsc3>(
480 FrontendAtsc3Modulation::MOD_QPSK); // value = 1 << 1
481 modulations.push_back(modulation);
482 status.set<FrontendStatus::modulations>(modulations);
483 break;
484 }
485 case FrontendType::DTMB: {
486 modulation.set<FrontendModulation::Tag::dtmb>(
487 FrontendDtmbModulation::CONSTELLATION_4QAM); // value = 1 << 1
488 modulations.push_back(modulation);
489 status.set<FrontendStatus::modulations>(modulations);
490 break;
491 }
492 default:
493 break;
494 }
495 break;
496 }
497 case FrontendStatusType::BERS: {
498 vector<int32_t> bers = {1};
499 status.set<FrontendStatus::bers>(bers);
500 break;
501 }
502 case FrontendStatusType::CODERATES: {
503 vector<FrontendInnerFec> rates;
504 rates.push_back(FrontendInnerFec::FEC_6_15); // value = 1 << 39
505 status.set<FrontendStatus::codeRates>(rates);
506 break;
507 }
508 case FrontendStatusType::BANDWIDTH: {
509 FrontendBandwidth bandwidth;
510 switch (mType) {
511 case FrontendType::DVBC: {
512 bandwidth.set<FrontendBandwidth::Tag::dvbc>(
513 FrontendDvbcBandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
514 status.set<FrontendStatus::bandwidth>(bandwidth);
515 break;
516 }
517 case FrontendType::DVBT: {
518 bandwidth.set<FrontendBandwidth::Tag::dvbt>(
519 FrontendDvbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
520 status.set<FrontendStatus::bandwidth>(bandwidth);
521 break;
522 }
523 case FrontendType::ISDBT: {
524 bandwidth.set<FrontendBandwidth::Tag::isdbt>(
525 FrontendIsdbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
526 status.set<FrontendStatus::bandwidth>(bandwidth);
527 break;
528 }
529 case FrontendType::ATSC3: {
530 bandwidth.set<FrontendBandwidth::Tag::atsc3>(
531 FrontendAtsc3Bandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
532 status.set<FrontendStatus::bandwidth>(bandwidth);
533 break;
534 }
535 case FrontendType::DTMB: {
536 bandwidth.set<FrontendBandwidth::Tag::dtmb>(
537 FrontendDtmbBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
538 status.set<FrontendStatus::bandwidth>(bandwidth);
539 break;
540 }
541 default:
542 break;
543 }
544 break;
545 }
546 case FrontendStatusType::GUARD_INTERVAL: {
547 FrontendGuardInterval interval;
548 switch (mType) {
549 case FrontendType::DVBT: {
550 interval.set<FrontendGuardInterval::Tag::dvbt>(
551 FrontendDvbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
552 status.set<FrontendStatus::interval>(interval);
553 break;
554 }
555 case FrontendType::ISDBT: {
556 interval.set<FrontendGuardInterval::Tag::isdbt>(
Hongguange69a3b22021-08-03 14:23:42 -0700557 FrontendIsdbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
Hongguang4092f2f2021-07-08 18:49:12 -0700558 status.set<FrontendStatus::interval>(interval);
559 break;
560 }
561 case FrontendType::DTMB: {
562 interval.set<FrontendGuardInterval::Tag::dtmb>(
563 FrontendDtmbGuardInterval::PN_420_VARIOUS); // value = 1 << 1
564 status.set<FrontendStatus::interval>(interval);
565 break;
566 }
567 default:
568 break;
569 }
570 break;
571 }
572 case FrontendStatusType::TRANSMISSION_MODE: {
573 FrontendTransmissionMode transMode;
574 switch (mType) {
575 case FrontendType::DVBT: {
576 transMode.set<FrontendTransmissionMode::Tag::dvbt>(
577 FrontendDvbtTransmissionMode::MODE_16K_E); // value = 1 << 8
578 status.set<FrontendStatus::transmissionMode>(transMode);
579 break;
580 }
581 case FrontendType::ISDBT: {
582 transMode.set<FrontendTransmissionMode::Tag::isdbt>(
583 FrontendIsdbtMode::MODE_1); // value = 1 << 1
584 status.set<FrontendStatus::transmissionMode>(transMode);
585 break;
586 }
587 case FrontendType::DTMB: {
588 transMode.set<FrontendTransmissionMode::Tag::dtmb>(
589 FrontendDtmbTransmissionMode::C1); // value = 1 << 1
590 status.set<FrontendStatus::transmissionMode>(transMode);
591 break;
592 }
593 default:
594 break;
595 }
596 break;
597 }
598 case FrontendStatusType::UEC: {
599 status.set<FrontendStatus::uec>(4);
600 break;
601 }
602 case FrontendStatusType::T2_SYSTEM_ID: {
603 status.set<FrontendStatus::systemId>(5);
604 break;
605 }
606 case FrontendStatusType::INTERLEAVINGS: {
607 FrontendInterleaveMode interleave;
608 vector<FrontendInterleaveMode> interleaves;
609 switch (mType) {
610 case FrontendType::DVBC: {
611 // value = 1 << 1
612 interleave.set<FrontendInterleaveMode::Tag::dvbc>(
613 FrontendCableTimeInterleaveMode::INTERLEAVING_128_1_0);
614 interleaves.push_back(interleave);
615 status.set<FrontendStatus::interleaving>(interleaves);
616 break;
617 }
618 case FrontendType::ATSC3: {
619 interleave.set<FrontendInterleaveMode::Tag::atsc3>(
620 FrontendAtsc3TimeInterleaveMode::CTI); // value = 1 << 1
621 interleaves.push_back(interleave);
622 status.set<FrontendStatus::interleaving>(interleaves);
623 break;
624 }
625 case FrontendType::DTMB: {
626 interleave.set<FrontendInterleaveMode::Tag::dtmb>(
627 FrontendDtmbTimeInterleaveMode::TIMER_INT_240); // value = 1 << 1
628 interleaves.push_back(interleave);
629 status.set<FrontendStatus::interleaving>(interleaves);
630 break;
631 }
Hongguang788284f2021-10-28 15:03:29 -0700632 case FrontendType::ISDBT: {
633 interleave.set<FrontendInterleaveMode::Tag::isdbt>(
634 FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0); // value = 1 << 1
635 interleaves.push_back(interleave);
636 status.set<FrontendStatus::interleaving>(interleaves);
637 break;
638 }
Hongguang4092f2f2021-07-08 18:49:12 -0700639 default:
640 break;
641 }
642 break;
643 }
644 case FrontendStatusType::ISDBT_SEGMENTS: {
Hongguang11da2cb2021-08-05 19:05:12 -0700645 vector<int32_t> segments = {2, 3};
Hongguang4092f2f2021-07-08 18:49:12 -0700646 status.set<FrontendStatus::isdbtSegment>(segments);
647 break;
648 }
649 case FrontendStatusType::TS_DATA_RATES: {
650 vector<int32_t> dataRates = {4, 5};
651 status.set<FrontendStatus::tsDataRate>(dataRates);
652 break;
653 }
654 case FrontendStatusType::ROLL_OFF: {
655 FrontendRollOff rollOff;
656 switch (mType) {
657 case FrontendType::DVBS: {
658 rollOff.set<FrontendRollOff::Tag::dvbs>(
659 FrontendDvbsRolloff::ROLLOFF_0_35); // value = 1
660 status.set<FrontendStatus::rollOff>(rollOff);
661 break;
662 }
663 case FrontendType::ISDBS: {
664 rollOff.set<FrontendRollOff::Tag::isdbs>(
665 FrontendIsdbsRolloff::ROLLOFF_0_35); // value = 1
666 status.set<FrontendStatus::rollOff>(rollOff);
667 break;
668 }
669 case FrontendType::ISDBS3: {
670 rollOff.set<FrontendRollOff::Tag::isdbs3>(
671 FrontendIsdbs3Rolloff::ROLLOFF_0_03); // value = 1
672 status.set<FrontendStatus::rollOff>(rollOff);
673 break;
674 }
675 default:
676 break;
677 }
678 break;
679 }
680 case FrontendStatusType::IS_MISO: {
681 status.set<FrontendStatus::isMiso>(true);
682 break;
683 }
684 case FrontendStatusType::IS_LINEAR: {
685 status.set<FrontendStatus::isLinear>(true);
686 break;
687 }
688 case FrontendStatusType::IS_SHORT_FRAMES: {
689 status.set<FrontendStatus::isShortFrames>(true);
690 break;
691 }
Hongguang788284f2021-10-28 15:03:29 -0700692 case FrontendStatusType::ISDBT_MODE: {
693 status.set<FrontendStatus::isdbtMode>(FrontendIsdbtMode::AUTO);
694 break;
695 }
696 case FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG: {
697 status.set<FrontendStatus::partialReceptionFlag>(
698 FrontendIsdbtPartialReceptionFlag::AUTO);
699 break;
700 }
Hongguang2ecfc392021-11-23 10:29:15 -0800701 case FrontendStatusType::STREAM_ID_LIST: {
702 vector<int32_t> streamIds = {0, 1};
703 status.set<FrontendStatus::streamIdList>(streamIds);
704 break;
705 }
Hongguang7eda7822021-12-20 14:48:14 -0800706 case FrontendStatusType::DVBT_CELL_IDS: {
707 vector<int32_t> dvbtCellIds = {0, 1};
708 status.set<FrontendStatus::dvbtCellIds>(dvbtCellIds);
709 break;
710 }
Hongguangd99c82d2022-01-13 12:42:52 -0800711 case FrontendStatusType::ATSC3_ALL_PLP_INFO: {
712 FrontendScanAtsc3PlpInfo info1;
713 info1.plpId = 1;
714 info1.bLlsFlag = false;
715 FrontendScanAtsc3PlpInfo info2;
716 info2.plpId = 2;
717 info2.bLlsFlag = true;
718 FrontendScanAtsc3PlpInfo info3;
719 info3.plpId = 3;
720 info3.bLlsFlag = false;
721 vector<FrontendScanAtsc3PlpInfo> infos = {info1, info2, info3};
722 status.set<FrontendStatus::allPlpInfo>(infos);
723 break;
724 }
Hongguang4092f2f2021-07-08 18:49:12 -0700725 default: {
726 continue;
727 }
728 }
729 _aidl_return->push_back(status);
730 }
731
732 return ::ndk::ScopedAStatus::ok();
733}
734
Hongguang4092f2f2021-07-08 18:49:12 -0700735::ndk::ScopedAStatus Frontend::setLnb(int32_t /* in_lnbId */) {
736 ALOGV("%s", __FUNCTION__);
737 if (!supportsSatellite()) {
Hongguange423acd2021-07-27 16:56:47 -0700738 return ::ndk::ScopedAStatus::fromServiceSpecificError(
739 static_cast<int32_t>(Result::INVALID_STATE));
Hongguang4092f2f2021-07-08 18:49:12 -0700740 }
741 return ::ndk::ScopedAStatus::ok();
742}
743
744::ndk::ScopedAStatus Frontend::linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) {
745 ALOGV("%s", __FUNCTION__);
746
747 mCiCamId = in_ciCamId;
748 *_aidl_return = 0;
749
750 return ::ndk::ScopedAStatus::ok();
751}
752
753::ndk::ScopedAStatus Frontend::unlinkCiCam(int32_t /* in_ciCamId */) {
754 ALOGV("%s", __FUNCTION__);
755
756 mCiCamId = -1;
757
758 return ::ndk::ScopedAStatus::ok();
759}
760
Hongguang2ecfc392021-11-23 10:29:15 -0800761binder_status_t Frontend::dump(int fd, const char** /* args */, uint32_t /* numArgs */) {
762 dprintf(fd, " Frontend %d\n", mId);
763 dprintf(fd, " mType: %d\n", mType);
764 dprintf(fd, " mIsLocked: %d\n", mIsLocked);
765 dprintf(fd, " mCiCamId: %d\n", mCiCamId);
766 return STATUS_OK;
767}
768
Hongguangfcedda02021-12-13 17:08:02 -0800769::ndk::ScopedAStatus Frontend::getHardwareInfo(std::string* _aidl_return) {
770 ALOGV("%s", __FUNCTION__);
771
772 *_aidl_return = "Sample Frontend";
773 return ::ndk::ScopedAStatus::ok();
774}
775
Hongguang4092f2f2021-07-08 18:49:12 -0700776FrontendType Frontend::getFrontendType() {
777 return mType;
778}
779
780int32_t Frontend::getFrontendId() {
781 return mId;
782}
783
784bool Frontend::supportsSatellite() {
785 return mType == FrontendType::DVBS || mType == FrontendType::ISDBS ||
786 mType == FrontendType::ISDBS3;
787}
788
789bool Frontend::isLocked() {
790 return mIsLocked;
791}
792
793} // namespace tuner
794} // namespace tv
795} // namespace hardware
796} // namespace android
797} // namespace aidl