blob: d36841c51718bb7d2a47cfc81b6ff68c8a3c6413 [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
90 if (mIsLocked) {
Hongguange423acd2021-07-27 16:56:47 -070091 FrontendScanMessage msg;
Hongguang4092f2f2021-07-08 18:49:12 -070092 msg.set<FrontendScanMessage::Tag::isEnd>(true);
93 mCallback->onScanMessage(FrontendScanMessageType::END, msg);
94 return ::ndk::ScopedAStatus::ok();
95 }
96
Hongguang11da2cb2021-08-05 19:05:12 -070097 int64_t frequency = 0;
Hongguang4092f2f2021-07-08 18:49:12 -070098 switch (in_settings.getTag()) {
99 case FrontendSettings::Tag::analog:
100 frequency = in_settings.get<FrontendSettings::Tag::analog>().frequency;
101 break;
102 case FrontendSettings::Tag::atsc:
103 frequency = in_settings.get<FrontendSettings::Tag::atsc>().frequency;
104 break;
105 case FrontendSettings::Tag::atsc3:
106 frequency = in_settings.get<FrontendSettings::Tag::atsc3>().frequency;
107 break;
108 case FrontendSettings::Tag::dvbs:
109 frequency = in_settings.get<FrontendSettings::Tag::dvbs>().frequency;
110 break;
111 case FrontendSettings::Tag::dvbc:
112 frequency = in_settings.get<FrontendSettings::Tag::dvbc>().frequency;
113 break;
114 case FrontendSettings::Tag::dvbt:
115 frequency = in_settings.get<FrontendSettings::Tag::dvbt>().frequency;
116 break;
117 case FrontendSettings::Tag::isdbs:
118 frequency = in_settings.get<FrontendSettings::Tag::isdbs>().frequency;
119 break;
120 case FrontendSettings::Tag::isdbs3:
121 frequency = in_settings.get<FrontendSettings::Tag::isdbs3>().frequency;
122 break;
123 case FrontendSettings::Tag::isdbt:
124 frequency = in_settings.get<FrontendSettings::Tag::isdbt>().frequency;
125 break;
126 default:
127 break;
128 }
129
130 if (in_type == FrontendScanType::SCAN_BLIND) {
Gareth Fenn282fb372021-09-27 15:14:11 +0100131 frequency += 100 * 1000;
Hongguang4092f2f2021-07-08 18:49:12 -0700132 }
133
134 {
135 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700136 vector<int64_t> frequencies = {frequency};
Hongguang4092f2f2021-07-08 18:49:12 -0700137 msg.set<FrontendScanMessage::Tag::frequencies>(frequencies);
138 mCallback->onScanMessage(FrontendScanMessageType::FREQUENCY, msg);
139 }
140
141 {
142 FrontendScanMessage msg;
143 msg.set<FrontendScanMessage::Tag::progressPercent>(20);
144 mCallback->onScanMessage(FrontendScanMessageType::PROGRESS_PERCENT, msg);
145 }
146
147 {
148 FrontendScanMessage msg;
149 vector<int32_t> symbolRates = {30};
150 msg.set<FrontendScanMessage::Tag::symbolRates>(symbolRates);
151 mCallback->onScanMessage(FrontendScanMessageType::SYMBOL_RATE, msg);
152 }
153
154 if (mType == FrontendType::DVBT) {
155 FrontendScanMessage msg;
156 msg.set<FrontendScanMessage::Tag::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_NON_NATIVE);
157 mCallback->onScanMessage(FrontendScanMessageType::HIERARCHY, msg);
158 }
159
160 if (mType == FrontendType::ANALOG) {
161 FrontendScanMessage msg;
162 msg.set<FrontendScanMessage::Tag::analogType>(FrontendAnalogType::PAL);
163 mCallback->onScanMessage(FrontendScanMessageType::ANALOG_TYPE, msg);
164 }
165
166 {
167 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700168 vector<int32_t> plpIds = {2};
Hongguang4092f2f2021-07-08 18:49:12 -0700169 msg.set<FrontendScanMessage::Tag::plpIds>(plpIds);
170 mCallback->onScanMessage(FrontendScanMessageType::PLP_IDS, msg);
171 }
172
173 {
174 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700175 vector<int32_t> groupIds = {3};
Hongguang4092f2f2021-07-08 18:49:12 -0700176 msg.set<FrontendScanMessage::Tag::groupIds>(groupIds);
177 mCallback->onScanMessage(FrontendScanMessageType::GROUP_IDS, msg);
178 }
179
180 {
181 FrontendScanMessage msg;
Hongguang11da2cb2021-08-05 19:05:12 -0700182 vector<int32_t> inputStreamIds = {1};
Hongguang4092f2f2021-07-08 18:49:12 -0700183 msg.set<FrontendScanMessage::Tag::inputStreamIds>(inputStreamIds);
184 mCallback->onScanMessage(FrontendScanMessageType::INPUT_STREAM_IDS, msg);
185 }
186
187 switch (mType) {
188 case FrontendType::DVBT: {
189 FrontendScanMessage msg;
190 FrontendScanMessageStandard std;
191 std.set<FrontendScanMessageStandard::Tag::tStd>(FrontendDvbtStandard::AUTO);
192 msg.set<FrontendScanMessage::Tag::std>(std);
193 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
194 break;
195 }
196 case FrontendType::DVBS: {
197 FrontendScanMessage msg;
198 FrontendScanMessageStandard std;
199 std.set<FrontendScanMessageStandard::Tag::sStd>(FrontendDvbsStandard::AUTO);
200 msg.set<FrontendScanMessage::Tag::std>(std);
201 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
202 break;
203 }
204 case FrontendType::ANALOG: {
205 FrontendScanMessage msg;
206 FrontendScanMessageStandard std;
207 std.set<FrontendScanMessageStandard::Tag::sifStd>(FrontendAnalogSifStandard::AUTO);
208 msg.set<FrontendScanMessage::Tag::std>(std);
209 mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
210 break;
211 }
212 default:
213 break;
214 }
215
216 {
217 FrontendScanMessage msg;
218 FrontendScanAtsc3PlpInfo info;
219 info.plpId = 1;
220 info.bLlsFlag = false;
221 vector<FrontendScanAtsc3PlpInfo> atsc3PlpInfos = {info};
222 msg.set<FrontendScanMessage::Tag::atsc3PlpInfos>(atsc3PlpInfos);
223 mCallback->onScanMessage(FrontendScanMessageType::ATSC3_PLP_INFO, msg);
224 }
225
226 {
227 FrontendScanMessage msg;
228 FrontendModulation modulation;
229 modulation.set<FrontendModulation::Tag::dvbc>(FrontendDvbcModulation::MOD_16QAM);
230 msg.set<FrontendScanMessage::Tag::modulation>(modulation);
231 mCallback->onScanMessage(FrontendScanMessageType::MODULATION, msg);
232 }
233
234 {
235 FrontendScanMessage msg;
236 msg.set<FrontendScanMessage::Tag::isHighPriority>(true);
237 mCallback->onScanMessage(FrontendScanMessageType::HIGH_PRIORITY, msg);
238 }
239
Hongguang7eda7822021-12-20 14:48:14 -0800240 if (mType == FrontendType::DVBT) {
241 FrontendScanMessage msg;
242 vector<int32_t> dvbtCellIds = {0, 1};
243 msg.set<FrontendScanMessage::Tag::dvbtCellIds>(dvbtCellIds);
244 mCallback->onScanMessage(FrontendScanMessageType::DVBT_CELL_IDS, msg);
245 }
246
Hongguang4092f2f2021-07-08 18:49:12 -0700247 {
248 FrontendScanMessage msg;
249 msg.set<FrontendScanMessage::Tag::isLocked>(true);
250 mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
251 mIsLocked = true;
252 }
253
254 return ::ndk::ScopedAStatus::ok();
255}
256
257::ndk::ScopedAStatus Frontend::stopScan() {
258 ALOGV("%s", __FUNCTION__);
259
260 mIsLocked = false;
261 return ::ndk::ScopedAStatus::ok();
262}
263
264::ndk::ScopedAStatus Frontend::getStatus(const std::vector<FrontendStatusType>& in_statusTypes,
265 std::vector<FrontendStatus>* _aidl_return) {
266 ALOGV("%s", __FUNCTION__);
267
268 for (int i = 0; i < in_statusTypes.size(); i++) {
269 FrontendStatusType type = in_statusTypes[i];
270 FrontendStatus status;
271 // assign randomly selected values for testing.
272 switch (type) {
273 case FrontendStatusType::DEMOD_LOCK: {
274 status.set<FrontendStatus::isDemodLocked>(true);
275 break;
276 }
277 case FrontendStatusType::SNR: {
278 status.set<FrontendStatus::snr>(221);
279 break;
280 }
281 case FrontendStatusType::BER: {
282 status.set<FrontendStatus::ber>(1);
283 break;
284 }
285 case FrontendStatusType::PER: {
286 status.set<FrontendStatus::per>(2);
287 break;
288 }
289 case FrontendStatusType::PRE_BER: {
290 status.set<FrontendStatus::preBer>(3);
291 break;
292 }
293 case FrontendStatusType::SIGNAL_QUALITY: {
294 status.set<FrontendStatus::signalQuality>(4);
295 break;
296 }
297 case FrontendStatusType::SIGNAL_STRENGTH: {
298 status.set<FrontendStatus::signalStrength>(5);
299 break;
300 }
301 case FrontendStatusType::SYMBOL_RATE: {
302 status.set<FrontendStatus::symbolRate>(6);
303 break;
304 }
305 case FrontendStatusType::FEC: {
306 status.set<FrontendStatus::innerFec>(FrontendInnerFec::FEC_2_9); // value = 1 << 7
307 break;
308 }
309 case FrontendStatusType::MODULATION: {
310 switch (mType) {
311 case FrontendType::ISDBS: {
312 FrontendModulationStatus modulationStatus;
313 modulationStatus.set<FrontendModulationStatus::Tag::isdbs>(
314 FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
315 status.set<FrontendStatus::modulationStatus>(modulationStatus);
316 break;
317 }
318 case FrontendType::DVBC: {
319 FrontendModulationStatus modulationStatus;
320 modulationStatus.set<FrontendModulationStatus::Tag::dvbc>(
321 FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
322 status.set<FrontendStatus::modulationStatus>(modulationStatus);
323 break;
324 }
325 case FrontendType::DVBS: {
326 FrontendModulationStatus modulationStatus;
327 modulationStatus.set<FrontendModulationStatus::Tag::dvbs>(
328 FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
329 status.set<FrontendStatus::modulationStatus>(modulationStatus);
330 break;
331 }
332 case FrontendType::ISDBS3: {
333 FrontendModulationStatus modulationStatus;
334 modulationStatus.set<FrontendModulationStatus::Tag::isdbs3>(
335 FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
336 status.set<FrontendStatus::modulationStatus>(modulationStatus);
337 break;
338 }
339 case FrontendType::ISDBT: {
340 FrontendModulationStatus modulationStatus;
341 modulationStatus.set<FrontendModulationStatus::Tag::isdbt>(
342 FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
343 status.set<FrontendStatus::modulationStatus>(modulationStatus);
344 break;
345 }
346 default:
347 break;
348 }
349 break;
350 }
351 case FrontendStatusType::SPECTRAL: {
352 status.set<FrontendStatus::inversion>(FrontendSpectralInversion::NORMAL);
353 break;
354 }
355 case FrontendStatusType::LNB_VOLTAGE: {
356 status.set<FrontendStatus::lnbVoltage>(LnbVoltage::VOLTAGE_5V);
357 break;
358 }
359 case FrontendStatusType::PLP_ID: {
Hongguang11da2cb2021-08-05 19:05:12 -0700360 status.set<FrontendStatus::plpId>(101);
Hongguang4092f2f2021-07-08 18:49:12 -0700361 break;
362 }
363 case FrontendStatusType::EWBS: {
364 status.set<FrontendStatus::isEWBS>(false);
365 break;
366 }
367 case FrontendStatusType::AGC: {
368 status.set<FrontendStatus::agc>(7);
369 break;
370 }
371 case FrontendStatusType::LNA: {
372 status.set<FrontendStatus::isLnaOn>(false);
373 break;
374 }
375 case FrontendStatusType::LAYER_ERROR: {
376 vector<bool> v = {false, true, true};
377 status.set<FrontendStatus::isLayerError>(v);
378 break;
379 }
380 case FrontendStatusType::MER: {
381 status.set<FrontendStatus::mer>(8);
382 break;
383 }
384 case FrontendStatusType::FREQ_OFFSET: {
385 status.set<FrontendStatus::freqOffset>(9);
386 break;
387 }
388 case FrontendStatusType::HIERARCHY: {
389 status.set<FrontendStatus::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_1_NATIVE);
390 break;
391 }
392 case FrontendStatusType::RF_LOCK: {
393 status.set<FrontendStatus::isRfLocked>(false);
394 break;
395 }
396 case FrontendStatusType::ATSC3_PLP_INFO: {
397 FrontendStatusAtsc3PlpInfo info1;
398 info1.plpId = 3;
399 info1.isLocked = false;
400 info1.uec = 313;
401 FrontendStatusAtsc3PlpInfo info2;
402 info2.plpId = 5;
403 info2.isLocked = true;
404 info2.uec = 515;
405 vector<FrontendStatusAtsc3PlpInfo> infos = {info1, info2};
406 status.set<FrontendStatus::plpInfo>(infos);
407 break;
408 }
409 case FrontendStatusType::MODULATIONS: {
410 FrontendModulation modulation;
411 vector<FrontendModulation> modulations;
412 switch (mType) {
413 case FrontendType::ISDBS: {
414 modulation.set<FrontendModulation::Tag::isdbs>(
415 FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
416 modulations.push_back(modulation);
417 status.set<FrontendStatus::modulations>(modulations);
418 break;
419 }
420 case FrontendType::DVBC: {
421 modulation.set<FrontendModulation::Tag::dvbc>(
422 FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
423 modulations.push_back(modulation);
424 status.set<FrontendStatus::modulations>(modulations);
425 break;
426 }
427 case FrontendType::DVBS: {
428 modulation.set<FrontendModulation::Tag::dvbs>(
429 FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
430 modulations.push_back(modulation);
431 status.set<FrontendStatus::modulations>(modulations);
432 break;
433 }
434 case FrontendType::DVBT: {
435 modulation.set<FrontendModulation::Tag::dvbt>(
436 FrontendDvbtConstellation::CONSTELLATION_16QAM_R); // value = 1 <<
437 // 16
438 modulations.push_back(modulation);
439 status.set<FrontendStatus::modulations>(modulations);
440 break;
441 }
442 case FrontendType::ISDBS3: {
443 modulation.set<FrontendModulation::Tag::isdbs3>(
444 FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
445 modulations.push_back(modulation);
446 status.set<FrontendStatus::modulations>(modulations);
447 break;
448 }
449 case FrontendType::ISDBT: {
450 modulation.set<FrontendModulation::Tag::isdbt>(
451 FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
452 modulations.push_back(modulation);
453 status.set<FrontendStatus::modulations>(modulations);
454 break;
455 }
456 case FrontendType::ATSC: {
457 modulation.set<FrontendModulation::Tag::atsc>(
458 FrontendAtscModulation::MOD_8VSB); // value = 1 << 2
459 modulations.push_back(modulation);
460 status.set<FrontendStatus::modulations>(modulations);
461 break;
462 }
463 case FrontendType::ATSC3: {
464 modulation.set<FrontendModulation::Tag::atsc3>(
465 FrontendAtsc3Modulation::MOD_QPSK); // value = 1 << 1
466 modulations.push_back(modulation);
467 status.set<FrontendStatus::modulations>(modulations);
468 break;
469 }
470 case FrontendType::DTMB: {
471 modulation.set<FrontendModulation::Tag::dtmb>(
472 FrontendDtmbModulation::CONSTELLATION_4QAM); // value = 1 << 1
473 modulations.push_back(modulation);
474 status.set<FrontendStatus::modulations>(modulations);
475 break;
476 }
477 default:
478 break;
479 }
480 break;
481 }
482 case FrontendStatusType::BERS: {
483 vector<int32_t> bers = {1};
484 status.set<FrontendStatus::bers>(bers);
485 break;
486 }
487 case FrontendStatusType::CODERATES: {
488 vector<FrontendInnerFec> rates;
489 rates.push_back(FrontendInnerFec::FEC_6_15); // value = 1 << 39
490 status.set<FrontendStatus::codeRates>(rates);
491 break;
492 }
493 case FrontendStatusType::BANDWIDTH: {
494 FrontendBandwidth bandwidth;
495 switch (mType) {
496 case FrontendType::DVBC: {
497 bandwidth.set<FrontendBandwidth::Tag::dvbc>(
498 FrontendDvbcBandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
499 status.set<FrontendStatus::bandwidth>(bandwidth);
500 break;
501 }
502 case FrontendType::DVBT: {
503 bandwidth.set<FrontendBandwidth::Tag::dvbt>(
504 FrontendDvbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
505 status.set<FrontendStatus::bandwidth>(bandwidth);
506 break;
507 }
508 case FrontendType::ISDBT: {
509 bandwidth.set<FrontendBandwidth::Tag::isdbt>(
510 FrontendIsdbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
511 status.set<FrontendStatus::bandwidth>(bandwidth);
512 break;
513 }
514 case FrontendType::ATSC3: {
515 bandwidth.set<FrontendBandwidth::Tag::atsc3>(
516 FrontendAtsc3Bandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
517 status.set<FrontendStatus::bandwidth>(bandwidth);
518 break;
519 }
520 case FrontendType::DTMB: {
521 bandwidth.set<FrontendBandwidth::Tag::dtmb>(
522 FrontendDtmbBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
523 status.set<FrontendStatus::bandwidth>(bandwidth);
524 break;
525 }
526 default:
527 break;
528 }
529 break;
530 }
531 case FrontendStatusType::GUARD_INTERVAL: {
532 FrontendGuardInterval interval;
533 switch (mType) {
534 case FrontendType::DVBT: {
535 interval.set<FrontendGuardInterval::Tag::dvbt>(
536 FrontendDvbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
537 status.set<FrontendStatus::interval>(interval);
538 break;
539 }
540 case FrontendType::ISDBT: {
541 interval.set<FrontendGuardInterval::Tag::isdbt>(
Hongguange69a3b22021-08-03 14:23:42 -0700542 FrontendIsdbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
Hongguang4092f2f2021-07-08 18:49:12 -0700543 status.set<FrontendStatus::interval>(interval);
544 break;
545 }
546 case FrontendType::DTMB: {
547 interval.set<FrontendGuardInterval::Tag::dtmb>(
548 FrontendDtmbGuardInterval::PN_420_VARIOUS); // value = 1 << 1
549 status.set<FrontendStatus::interval>(interval);
550 break;
551 }
552 default:
553 break;
554 }
555 break;
556 }
557 case FrontendStatusType::TRANSMISSION_MODE: {
558 FrontendTransmissionMode transMode;
559 switch (mType) {
560 case FrontendType::DVBT: {
561 transMode.set<FrontendTransmissionMode::Tag::dvbt>(
562 FrontendDvbtTransmissionMode::MODE_16K_E); // value = 1 << 8
563 status.set<FrontendStatus::transmissionMode>(transMode);
564 break;
565 }
566 case FrontendType::ISDBT: {
567 transMode.set<FrontendTransmissionMode::Tag::isdbt>(
568 FrontendIsdbtMode::MODE_1); // value = 1 << 1
569 status.set<FrontendStatus::transmissionMode>(transMode);
570 break;
571 }
572 case FrontendType::DTMB: {
573 transMode.set<FrontendTransmissionMode::Tag::dtmb>(
574 FrontendDtmbTransmissionMode::C1); // value = 1 << 1
575 status.set<FrontendStatus::transmissionMode>(transMode);
576 break;
577 }
578 default:
579 break;
580 }
581 break;
582 }
583 case FrontendStatusType::UEC: {
584 status.set<FrontendStatus::uec>(4);
585 break;
586 }
587 case FrontendStatusType::T2_SYSTEM_ID: {
588 status.set<FrontendStatus::systemId>(5);
589 break;
590 }
591 case FrontendStatusType::INTERLEAVINGS: {
592 FrontendInterleaveMode interleave;
593 vector<FrontendInterleaveMode> interleaves;
594 switch (mType) {
595 case FrontendType::DVBC: {
596 // value = 1 << 1
597 interleave.set<FrontendInterleaveMode::Tag::dvbc>(
598 FrontendCableTimeInterleaveMode::INTERLEAVING_128_1_0);
599 interleaves.push_back(interleave);
600 status.set<FrontendStatus::interleaving>(interleaves);
601 break;
602 }
603 case FrontendType::ATSC3: {
604 interleave.set<FrontendInterleaveMode::Tag::atsc3>(
605 FrontendAtsc3TimeInterleaveMode::CTI); // value = 1 << 1
606 interleaves.push_back(interleave);
607 status.set<FrontendStatus::interleaving>(interleaves);
608 break;
609 }
610 case FrontendType::DTMB: {
611 interleave.set<FrontendInterleaveMode::Tag::dtmb>(
612 FrontendDtmbTimeInterleaveMode::TIMER_INT_240); // value = 1 << 1
613 interleaves.push_back(interleave);
614 status.set<FrontendStatus::interleaving>(interleaves);
615 break;
616 }
Hongguang788284f2021-10-28 15:03:29 -0700617 case FrontendType::ISDBT: {
618 interleave.set<FrontendInterleaveMode::Tag::isdbt>(
619 FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0); // value = 1 << 1
620 interleaves.push_back(interleave);
621 status.set<FrontendStatus::interleaving>(interleaves);
622 break;
623 }
Hongguang4092f2f2021-07-08 18:49:12 -0700624 default:
625 break;
626 }
627 break;
628 }
629 case FrontendStatusType::ISDBT_SEGMENTS: {
Hongguang11da2cb2021-08-05 19:05:12 -0700630 vector<int32_t> segments = {2, 3};
Hongguang4092f2f2021-07-08 18:49:12 -0700631 status.set<FrontendStatus::isdbtSegment>(segments);
632 break;
633 }
634 case FrontendStatusType::TS_DATA_RATES: {
635 vector<int32_t> dataRates = {4, 5};
636 status.set<FrontendStatus::tsDataRate>(dataRates);
637 break;
638 }
639 case FrontendStatusType::ROLL_OFF: {
640 FrontendRollOff rollOff;
641 switch (mType) {
642 case FrontendType::DVBS: {
643 rollOff.set<FrontendRollOff::Tag::dvbs>(
644 FrontendDvbsRolloff::ROLLOFF_0_35); // value = 1
645 status.set<FrontendStatus::rollOff>(rollOff);
646 break;
647 }
648 case FrontendType::ISDBS: {
649 rollOff.set<FrontendRollOff::Tag::isdbs>(
650 FrontendIsdbsRolloff::ROLLOFF_0_35); // value = 1
651 status.set<FrontendStatus::rollOff>(rollOff);
652 break;
653 }
654 case FrontendType::ISDBS3: {
655 rollOff.set<FrontendRollOff::Tag::isdbs3>(
656 FrontendIsdbs3Rolloff::ROLLOFF_0_03); // value = 1
657 status.set<FrontendStatus::rollOff>(rollOff);
658 break;
659 }
660 default:
661 break;
662 }
663 break;
664 }
665 case FrontendStatusType::IS_MISO: {
666 status.set<FrontendStatus::isMiso>(true);
667 break;
668 }
669 case FrontendStatusType::IS_LINEAR: {
670 status.set<FrontendStatus::isLinear>(true);
671 break;
672 }
673 case FrontendStatusType::IS_SHORT_FRAMES: {
674 status.set<FrontendStatus::isShortFrames>(true);
675 break;
676 }
Hongguang788284f2021-10-28 15:03:29 -0700677 case FrontendStatusType::ISDBT_MODE: {
678 status.set<FrontendStatus::isdbtMode>(FrontendIsdbtMode::AUTO);
679 break;
680 }
681 case FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG: {
682 status.set<FrontendStatus::partialReceptionFlag>(
683 FrontendIsdbtPartialReceptionFlag::AUTO);
684 break;
685 }
Hongguang2ecfc392021-11-23 10:29:15 -0800686 case FrontendStatusType::STREAM_ID_LIST: {
687 vector<int32_t> streamIds = {0, 1};
688 status.set<FrontendStatus::streamIdList>(streamIds);
689 break;
690 }
Hongguang7eda7822021-12-20 14:48:14 -0800691 case FrontendStatusType::DVBT_CELL_IDS: {
692 vector<int32_t> dvbtCellIds = {0, 1};
693 status.set<FrontendStatus::dvbtCellIds>(dvbtCellIds);
694 break;
695 }
Hongguang4092f2f2021-07-08 18:49:12 -0700696 default: {
697 continue;
698 }
699 }
700 _aidl_return->push_back(status);
701 }
702
703 return ::ndk::ScopedAStatus::ok();
704}
705
Hongguang4092f2f2021-07-08 18:49:12 -0700706::ndk::ScopedAStatus Frontend::setLnb(int32_t /* in_lnbId */) {
707 ALOGV("%s", __FUNCTION__);
708 if (!supportsSatellite()) {
Hongguange423acd2021-07-27 16:56:47 -0700709 return ::ndk::ScopedAStatus::fromServiceSpecificError(
710 static_cast<int32_t>(Result::INVALID_STATE));
Hongguang4092f2f2021-07-08 18:49:12 -0700711 }
712 return ::ndk::ScopedAStatus::ok();
713}
714
715::ndk::ScopedAStatus Frontend::linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) {
716 ALOGV("%s", __FUNCTION__);
717
718 mCiCamId = in_ciCamId;
719 *_aidl_return = 0;
720
721 return ::ndk::ScopedAStatus::ok();
722}
723
724::ndk::ScopedAStatus Frontend::unlinkCiCam(int32_t /* in_ciCamId */) {
725 ALOGV("%s", __FUNCTION__);
726
727 mCiCamId = -1;
728
729 return ::ndk::ScopedAStatus::ok();
730}
731
Hongguang2ecfc392021-11-23 10:29:15 -0800732binder_status_t Frontend::dump(int fd, const char** /* args */, uint32_t /* numArgs */) {
733 dprintf(fd, " Frontend %d\n", mId);
734 dprintf(fd, " mType: %d\n", mType);
735 dprintf(fd, " mIsLocked: %d\n", mIsLocked);
736 dprintf(fd, " mCiCamId: %d\n", mCiCamId);
737 return STATUS_OK;
738}
739
Hongguangfcedda02021-12-13 17:08:02 -0800740::ndk::ScopedAStatus Frontend::getHardwareInfo(std::string* _aidl_return) {
741 ALOGV("%s", __FUNCTION__);
742
743 *_aidl_return = "Sample Frontend";
744 return ::ndk::ScopedAStatus::ok();
745}
746
Hongguang4092f2f2021-07-08 18:49:12 -0700747FrontendType Frontend::getFrontendType() {
748 return mType;
749}
750
751int32_t Frontend::getFrontendId() {
752 return mId;
753}
754
755bool Frontend::supportsSatellite() {
756 return mType == FrontendType::DVBS || mType == FrontendType::ISDBS ||
757 mType == FrontendType::ISDBS3;
758}
759
760bool Frontend::isLocked() {
761 return mIsLocked;
762}
763
764} // namespace tuner
765} // namespace tv
766} // namespace hardware
767} // namespace android
768} // namespace aidl