blob: 9e3664275dac1910e211b4e7a8cfa773b36c7007 [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
2 * Copyright 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "FrontendClient"
18
19#include <android-base/logging.h>
20#include <utils/Log.h>
21
22#include "FrontendClient.h"
23
Amy Zhangb9f3cab2021-01-13 15:24:14 -080024using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080025using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080026
27using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
28using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080030using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080031using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080032using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080033using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080035using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080036using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080038using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080041using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080043using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080044using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080045using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080046using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080047using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
48using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
49using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
50using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080051using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
Amy Zhang9abbe102021-02-08 19:51:18 -080052using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080053using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
Amy Zhang9abbe102021-02-08 19:51:18 -080054using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -080055using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
Amy Zhangd08c2732021-01-08 17:22:59 -080056using ::android::hardware::tv::tuner::V1_1::Constant;
Amy Zhang9abbe102021-02-08 19:51:18 -080057using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
Amy Zhang46c31ec2021-02-03 18:19:10 -080058using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
59using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
60using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080061using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080062using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
63using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
64using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080065using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080066using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
Amy Zhang9abbe102021-02-08 19:51:18 -080067using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
68using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080069using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang9abbe102021-02-08 19:51:18 -080070using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080071using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhang9abbe102021-02-08 19:51:18 -080072using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
Amy Zhang46c31ec2021-02-03 18:19:10 -080073using ::android::hardware::tv::tuner::V1_1::FrontendType;
Amy Zhanga6734682020-11-30 16:14:38 -080074
Amy Zhangbf68a162020-11-23 17:42:40 -080075namespace android {
76
Amy Zhanga6734682020-11-30 16:14:38 -080077/////////////// FrontendClient ///////////////////////
78
Amy Zhang9abbe102021-02-08 19:51:18 -080079FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type) {
Amy Zhangbf68a162020-11-23 17:42:40 -080080 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080081 mAidlCallback = NULL;
82 mHidlCallback = NULL;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080083 mType = type;
Amy Zhangbf68a162020-11-23 17:42:40 -080084}
85
86FrontendClient::~FrontendClient() {
87 mTunerFrontend = NULL;
88 mFrontend = NULL;
89 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080090 mAidlCallback = NULL;
91 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080092 mId = -1;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080093 mType = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080094}
95
96Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
97 if (mTunerFrontend != NULL) {
98 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
Amy Zhangb9f3cab2021-01-13 15:24:14 -080099 mAidlCallback->setFrontendType(mType);
Amy Zhang379cb482021-02-04 21:05:11 -0800100 Status s = mTunerFrontend->setCallback(mAidlCallback);
101 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800102 }
103
104 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
105 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -0800106}
107
108void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
109 mFrontend = frontend;
110 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
111}
Amy Zhanga6734682020-11-30 16:14:38 -0800112
Amy Zhang9abbe102021-02-08 19:51:18 -0800113// TODO: move after migration is done
114void FrontendClient::setId(int id) {
115 mId = id;
116}
117
Amy Zhanga6734682020-11-30 16:14:38 -0800118Result FrontendClient::tune(const FrontendSettings& settings,
119 const FrontendSettingsExt1_1& settingsExt1_1) {
120 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800121 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
122 Status s = mTunerFrontend->tune(tunerFeSettings);
Amy Zhang4a07e802021-01-21 17:10:21 -0800123 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800124 }
125
126 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800127 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhanga6734682020-11-30 16:14:38 -0800128 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
129 return result;
130 }
131
132 if (mFrontend != NULL) {
133 result = mFrontend->tune(settings);
134 return result;
135 }
136
137 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -0800138}
Amy Zhanga6734682020-11-30 16:14:38 -0800139
140Result FrontendClient::stopTune() {
141 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800142 Status s = mTunerFrontend->stopTune();
143 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800144 }
145
146 if (mFrontend != NULL) {
147 Result result = mFrontend->stopTune();
148 return result;
149 }
150
151 return Result::INVALID_STATE;
152}
153
Amy Zhangd08c2732021-01-08 17:22:59 -0800154Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
155 const FrontendSettingsExt1_1& settingsExt1_1) {
156 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800157 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
158 Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
Amy Zhang4a07e802021-01-21 17:10:21 -0800159 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800160 }
161
162 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800163 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhangd08c2732021-01-08 17:22:59 -0800164 result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
165 return result;
166 }
167
168 if (mFrontend != NULL) {
169 result = mFrontend->scan(settings, type);
170 return result;
171 }
172
173 return Result::INVALID_STATE;
174}
175
176Result FrontendClient::stopScan() {
177 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800178 Status s = mTunerFrontend->stopScan();
179 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800180 }
181
182 if (mFrontend != NULL) {
183 Result result = mFrontend->stopScan();
184 return result;
185 }
186
187 return Result::INVALID_STATE;
188}
189
190vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
191 vector<FrontendStatus> status;
192
193 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800194 vector<TunerFrontendStatus> aidlStatus;
195 vector<int> types;
196 for (auto t : statusTypes) {
197 types.push_back((int)t);
198 }
199 Status s = mTunerFrontend->getStatus(types, &aidlStatus);
200 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
201 return status;
202 }
203 return getHidlStatus(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800204 }
205
206 if (mFrontend != NULL && statusTypes.size() > 0) {
207 Result res;
208 mFrontend->getStatus(statusTypes,
209 [&](Result r, const hidl_vec<FrontendStatus>& s) {
210 res = r;
211 status = s;
212 });
213 if (res != Result::SUCCESS) {
214 status.clear();
215 return status;
216 }
217 }
218
219 return status;
220}
Amy Zhang46c31ec2021-02-03 18:19:10 -0800221
Amy Zhangd08c2732021-01-08 17:22:59 -0800222vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
223 vector<FrontendStatusTypeExt1_1> statusTypes) {
224 vector<FrontendStatusExt1_1> status;
225
226 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800227 vector<TunerFrontendStatus> aidlStatus;
228 vector<int> types;
229 for (auto t : statusTypes) {
230 types.push_back((int)t);
231 }
232 Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus);
233 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
234 return status;
235 }
236 return getHidlStatusExt(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800237 }
238
239 if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
240 Result res;
241 mFrontend_1_1->getStatusExt1_1(statusTypes,
242 [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
243 res = r;
244 status = s;
245 });
246 if (res != Result::SUCCESS) {
247 status.clear();
248 return status;
249 }
250 }
251
252 return status;
253}
254
Amy Zhangd3d57b42021-01-07 11:14:43 -0800255Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
256 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800257 Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
258 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800259 }
260
261 if (mFrontend != NULL) {
262 Result result = mFrontend->setLnb(lnbClient->getId());
263 return result;
264 }
265
266 return Result::INVALID_STATE;
267}
268
Amy Zhangd08c2732021-01-08 17:22:59 -0800269Result FrontendClient::setLna(bool bEnable) {
270 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800271 Status s = mTunerFrontend->setLna(bEnable);
272 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800273 }
274
275 if (mFrontend != NULL) {
276 Result result = mFrontend->setLna(bEnable);
277 return result;
278 }
279
280 return Result::INVALID_STATE;
281}
282
283int FrontendClient::linkCiCamToFrontend(int ciCamId) {
284 int ltsId = (int)Constant::INVALID_LTS_ID;
285
286 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800287 Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
288 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
289 return ltsId;
290 }
291 return (int)Constant::INVALID_LTS_ID;
Amy Zhangd08c2732021-01-08 17:22:59 -0800292 }
293
294 if (mFrontend_1_1 != NULL) {
295 Result res;
296 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
297 [&](Result r, uint32_t id) {
298 res = r;
299 ltsId = id;
300 });
301 if (res != Result::SUCCESS) {
302 return (int)Constant::INVALID_LTS_ID;
303 }
304 }
305
306 return ltsId;
307}
308
309Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
310 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800311 Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
312 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800313 }
314
315 if (mFrontend_1_1 != NULL) {
316 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
317 }
318
319 return Result::INVALID_STATE;
320}
321
Amy Zhanga6734682020-11-30 16:14:38 -0800322Result FrontendClient::close() {
323 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800324 Status s = mTunerFrontend->close();
Amy Zhangec3b4872021-02-11 15:38:20 -0800325 mTunerFrontend = NULL;
Amy Zhang4a07e802021-01-21 17:10:21 -0800326 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800327 }
328
329 if (mFrontend != NULL) {
330 Result result = mFrontend->close();
Amy Zhangec3b4872021-02-11 15:38:20 -0800331 mFrontend = NULL;
332 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -0800333 return result;
334 }
335
336 return Result::INVALID_STATE;
337}
338
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800339/////////////// TunerFrontend Helper Methods ///////////////////////
340
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800341shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
342 return mTunerFrontend;
343}
344
345int FrontendClient::getId() {
Amy Zhang9abbe102021-02-08 19:51:18 -0800346 if (mTunerFrontend != NULL) {
347 Status s = mTunerFrontend->getFrontendId(&mId);
348 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
349 return mId;
350 }
351 ALOGE("Failed to getFrontendId from Tuner Frontend");
352 return -1;
353 }
354
355 if (mFrontend != NULL) {
356 return mId;
357 }
358
359 return -1;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800360}
361
Amy Zhang46c31ec2021-02-03 18:19:10 -0800362vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
363 vector<FrontendStatus> hidlStatus;
364 for (TunerFrontendStatus s : aidlStatus) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800365 FrontendStatus status = FrontendStatus();
Amy Zhang46c31ec2021-02-03 18:19:10 -0800366 switch (s.getTag()) {
367 case TunerFrontendStatus::isDemodLocked: {
368 status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
369 hidlStatus.push_back(status);
370 break;
371 }
372 case TunerFrontendStatus::snr: {
373 status.snr(s.get<TunerFrontendStatus::snr>());
374 hidlStatus.push_back(status);
375 break;
376 }
377 case TunerFrontendStatus::ber: {
378 status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
379 hidlStatus.push_back(status);
380 break;
381 }
382 case TunerFrontendStatus::per: {
383 status.per((uint32_t)s.get<TunerFrontendStatus::per>());
384 hidlStatus.push_back(status);
385 break;
386 }
387 case TunerFrontendStatus::preBer: {
388 status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
389 hidlStatus.push_back(status);
390 break;
391 }
392 case TunerFrontendStatus::signalQuality: {
393 status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
394 hidlStatus.push_back(status);
395 break;
396 }
397 case TunerFrontendStatus::signalStrength: {
398 status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
399 hidlStatus.push_back(status);
400 break;
401 }
402 case TunerFrontendStatus::symbolRate: {
403 status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
404 hidlStatus.push_back(status);
405 break;
406 }
407 case TunerFrontendStatus::innerFec: {
408 status.innerFec(static_cast<FrontendInnerFec>(
409 s.get<TunerFrontendStatus::innerFec>()));
410 hidlStatus.push_back(status);
411 break;
412 }
413 case TunerFrontendStatus::modulation: {
414 auto aidlMod = s.get<TunerFrontendStatus::modulation>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800415 FrontendModulationStatus modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800416 switch (mType) {
417 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800418 modulation.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
419 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800420 hidlStatus.push_back(status);
421 break;
422 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800423 modulation.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
424 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800425 hidlStatus.push_back(status);
426 break;
427 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800428 modulation.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
429 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800430 hidlStatus.push_back(status);
431 break;
432 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800433 modulation.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
434 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800435 hidlStatus.push_back(status);
436 break;
437 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800438 modulation.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
439 status.modulation(modulation);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800440 hidlStatus.push_back(status);
441 break;
442 default:
443 break;
444 }
445 break;
446 }
447 case TunerFrontendStatus::inversion: {
448 status.inversion(static_cast<FrontendDvbcSpectralInversion>(
449 s.get<TunerFrontendStatus::inversion>()));
450 hidlStatus.push_back(status);
451 break;
452 }
453 case TunerFrontendStatus::lnbVoltage: {
454 status.lnbVoltage(static_cast<LnbVoltage>(
455 s.get<TunerFrontendStatus::lnbVoltage>()));
456 hidlStatus.push_back(status);
457 break;
458 }
459 case TunerFrontendStatus::plpId: {
460 status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
461 hidlStatus.push_back(status);
462 break;
463 }
464 case TunerFrontendStatus::isEWBS: {
465 status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
466 hidlStatus.push_back(status);
467 break;
468 }
469 case TunerFrontendStatus::agc: {
470 status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
471 hidlStatus.push_back(status);
472 break;
473 }
474 case TunerFrontendStatus::isLnaOn: {
475 status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
476 hidlStatus.push_back(status);
477 break;
478 }
479 case TunerFrontendStatus::isLayerError: {
480 auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
481 hidl_vec<bool> e(aidlE.begin(), aidlE.end());
482 status.isLayerError(e);
483 hidlStatus.push_back(status);
484 break;
485 }
486 case TunerFrontendStatus::mer: {
487 status.mer(s.get<TunerFrontendStatus::mer>());
488 hidlStatus.push_back(status);
489 break;
490 }
491 case TunerFrontendStatus::freqOffset: {
492 status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
493 hidlStatus.push_back(status);
494 break;
495 }
496 case TunerFrontendStatus::hierarchy: {
497 status.hierarchy(static_cast<FrontendDvbtHierarchy>(
Amy Zhang9abbe102021-02-08 19:51:18 -0800498 s.get<TunerFrontendStatus::hierarchy>()));
Amy Zhang46c31ec2021-02-03 18:19:10 -0800499 hidlStatus.push_back(status);
500 break;
501 }
502 case TunerFrontendStatus::isRfLocked: {
503 status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
504 hidlStatus.push_back(status);
505 break;
506 }
507 case TunerFrontendStatus::plpInfo: {
508 int size = s.get<TunerFrontendStatus::plpInfo>().size();
Amy Zhang9abbe102021-02-08 19:51:18 -0800509 hidl_vec<FrontendStatusAtsc3PlpInfo> info(size);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800510 for (int i = 0; i < size; i++) {
511 auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
Amy Zhang9abbe102021-02-08 19:51:18 -0800512 info[i] = {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800513 .plpId = (uint8_t)aidlInfo.plpId,
514 .isLocked = aidlInfo.isLocked,
515 .uec = (uint32_t)aidlInfo.uec,
516 };
517 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800518 status.plpInfo(info);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800519 hidlStatus.push_back(status);
520 break;
521 }
522 default:
523 break;
524 }
525 }
526 return hidlStatus;
527}
528
529vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
530 vector<TunerFrontendStatus>& aidlStatus) {
531 vector<FrontendStatusExt1_1> hidlStatus;
532 for (TunerFrontendStatus s : aidlStatus) {
533 FrontendStatusExt1_1 status;
534 switch (s.getTag()) {
535 case TunerFrontendStatus::modulations: {
Amy Zhang9abbe102021-02-08 19:51:18 -0800536 vector<FrontendModulation> ms;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800537 for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800538 FrontendModulation m;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800539 switch (mType) {
540 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800541 m.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
542 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800543 break;
544 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800545 m.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
546 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800547 break;
548 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800549 m.dvbt(static_cast<FrontendDvbtConstellation>(aidlMod));
550 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800551 break;
552 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800553 m.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
554 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800555 break;
556 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800557 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
558 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800559 break;
560 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800561 m.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
562 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800563 break;
564 case (int)FrontendType::ATSC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800565 m.atsc(static_cast<FrontendAtscModulation>(aidlMod));
566 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800567 break;
568 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800569 m.atsc3(static_cast<FrontendAtsc3Modulation>(aidlMod));
570 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800571 break;
572 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800573 m.dtmb(static_cast<FrontendDtmbModulation>(aidlMod));
574 ms.push_back(m);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800575 break;
576 default:
Amy Zhang46c31ec2021-02-03 18:19:10 -0800577 break;
578 }
579 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800580 if (ms.size() > 0) {
581 status.modulations(ms);
582 hidlStatus.push_back(status);
583 }
Amy Zhang46c31ec2021-02-03 18:19:10 -0800584 break;
585 }
586 case TunerFrontendStatus::bers: {
587 auto aidlB = s.get<TunerFrontendStatus::bers>();
588 hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
589 status.bers(b);
590 hidlStatus.push_back(status);
591 break;
592 }
593 case TunerFrontendStatus::codeRates: {
594 int size = s.get<TunerFrontendStatus::codeRates>().size();
595 status.codeRates().resize(size);
596 for (int i = 0; i < size; i++) {
597 auto aidlCodeRate = s.get<TunerFrontendStatus::codeRates>()[i];
598 status.codeRates()[i] =
599 static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate);
600 }
601 hidlStatus.push_back(status);
602 break;
603 }
604 case TunerFrontendStatus::bandwidth: {
605 auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800606 FrontendBandwidth band;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800607 switch (mType) {
608 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800609 band.atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
610 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800611 hidlStatus.push_back(status);
612 break;
613 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800614 band.dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
615 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800616 hidlStatus.push_back(status);
617 break;
618 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800619 band.dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
620 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800621 hidlStatus.push_back(status);
622 break;
623 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800624 band.isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
625 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800626 hidlStatus.push_back(status);
627 break;
628 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800629 band.dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
630 status.bandwidth(band);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800631 hidlStatus.push_back(status);
632 break;
633 default:
634 break;
635 }
636 break;
637 }
638 case TunerFrontendStatus::interval: {
639 auto aidlInter = s.get<TunerFrontendStatus::interval>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800640 FrontendGuardInterval inter;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800641 switch (mType) {
642 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800643 inter.dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
644 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800645 hidlStatus.push_back(status);
646 break;
647 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800648 inter.isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
649 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800650 hidlStatus.push_back(status);
651 break;
652 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800653 inter.dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
654 status.interval(inter);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800655 hidlStatus.push_back(status);
656 break;
657 default:
658 break;
659 }
660 break;
661 }
662 case TunerFrontendStatus::transmissionMode: {
663 auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800664 FrontendTransmissionMode trans;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800665 switch (mType) {
666 case (int)FrontendType::DVBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800667 trans.dvbt(static_cast<FrontendDvbtTransmissionMode>(aidlTran));
668 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800669 hidlStatus.push_back(status);
670 break;
671 case (int)FrontendType::ISDBT:
Amy Zhang9abbe102021-02-08 19:51:18 -0800672 trans.isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
673 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800674 hidlStatus.push_back(status);
675 break;
676 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800677 trans.dtmb(static_cast<FrontendDtmbTransmissionMode>(aidlTran));
678 status.transmissionMode(trans);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800679 hidlStatus.push_back(status);
680 break;
681 default:
682 break;
683 }
684 break;
685 }
686 case TunerFrontendStatus::uec: {
687 status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
688 hidlStatus.push_back(status);
689 break;
690 }
691 case TunerFrontendStatus::systemId: {
692 status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
693 hidlStatus.push_back(status);
694 break;
695 }
696 case TunerFrontendStatus::interleaving: {
Amy Zhang9abbe102021-02-08 19:51:18 -0800697 vector<FrontendInterleaveMode> modes;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800698 for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
Amy Zhang9abbe102021-02-08 19:51:18 -0800699 FrontendInterleaveMode mode;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800700 switch (mType) {
701 case (int)FrontendType::DVBC:
Amy Zhang9abbe102021-02-08 19:51:18 -0800702 mode.dvbc(static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
703 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800704 break;
705 case (int)FrontendType::ATSC3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800706 mode.atsc3(static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
707 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800708 break;
709 case (int)FrontendType::DTMB:
Amy Zhang9abbe102021-02-08 19:51:18 -0800710 mode.dtmb(static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
711 modes.push_back(mode);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800712 break;
713 default:
Amy Zhang46c31ec2021-02-03 18:19:10 -0800714 break;
715 }
716 }
Amy Zhang9abbe102021-02-08 19:51:18 -0800717 if (modes.size() > 0) {
718 status.interleaving(modes);
719 hidlStatus.push_back(status);
720 }
Amy Zhang46c31ec2021-02-03 18:19:10 -0800721 break;
722 }
723 case TunerFrontendStatus::isdbtSegment: {
724 auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
725 hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
726 status.isdbtSegment(s);
727 hidlStatus.push_back(status);
728 break;
729 }
730 case TunerFrontendStatus::tsDataRate: {
731 auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
732 hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
733 status.tsDataRate(ts);
734 hidlStatus.push_back(status);
735 break;
736 }
737 case TunerFrontendStatus::rollOff: {
738 auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
Amy Zhang9abbe102021-02-08 19:51:18 -0800739 FrontendRollOff roll;
Amy Zhang46c31ec2021-02-03 18:19:10 -0800740 switch (mType) {
741 case (int)FrontendType::DVBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800742 roll.dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
743 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800744 hidlStatus.push_back(status);
745 break;
746 case (int)FrontendType::ISDBS:
Amy Zhang9abbe102021-02-08 19:51:18 -0800747 roll.isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
748 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800749 hidlStatus.push_back(status);
750 break;
751 case (int)FrontendType::ISDBS3:
Amy Zhang9abbe102021-02-08 19:51:18 -0800752 roll.isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
753 status.rollOff(roll);
Amy Zhang46c31ec2021-02-03 18:19:10 -0800754 hidlStatus.push_back(status);
755 break;
756 default:
757 break;
758 }
759 break;
760 }
761 case TunerFrontendStatus::isMiso: {
762 status.isMiso(s.get<TunerFrontendStatus::isMiso>());
763 hidlStatus.push_back(status);
764 break;
765 }
766 case TunerFrontendStatus::isLinear: {
767 status.isLinear(s.get<TunerFrontendStatus::isLinear>());
768 hidlStatus.push_back(status);
769 break;
770 }
771 case TunerFrontendStatus::isShortFrames: {
772 status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
773 hidlStatus.push_back(status);
774 break;
775 }
776 default:
777 break;
778 }
779 }
780 return hidlStatus;
781}
782
Amy Zhangb5809be2021-01-26 16:27:23 -0800783TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800784 const FrontendSettingsExt1_1& settingsExt1_1) {
785 bool isExtended = validateExtendedSettings(settingsExt1_1);
786 TunerFrontendSettings s{
787 .isExtended = isExtended,
788 .endFrequency = (int) settingsExt1_1.endFrequency,
789 .inversion = (int) settingsExt1_1.inversion,
790 };
791
792 if (settingsExt1_1.settingExt.getDiscriminator()
793 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
794 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
795 return s;
796 }
797
Amy Zhangb5809be2021-01-26 16:27:23 -0800798 switch (settings.getDiscriminator()) {
799 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800800 s.settings.set<TunerFrontendUnionSettings::analog>(
801 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800802 break;
803 }
804 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800805 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800806 break;
807 }
808 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800809 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800810 break;
811 }
812 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800813 s.settings.set<TunerFrontendUnionSettings::dvbs>(
814 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800815 break;
816 }
817 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800818 s.settings.set<TunerFrontendUnionSettings::cable>(
819 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800820 break;
821 }
822 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800823 s.settings.set<TunerFrontendUnionSettings::dvbt>(
824 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800825 break;
826 }
827 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800828 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800829 break;
830 }
831 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800832 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800833 break;
834 }
835 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800836 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800837 break;
838 }
839 default:
840 break;
841 }
842 return s;
843}
844
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800845TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
846 const FrontendSettingsExt1_1& settingsExt1_1) {
847 TunerFrontendAnalogSettings analogSettings{
848 .frequency = (int)settings.analog().frequency,
849 .signalType = (int)settings.analog().type,
850 .sifStandard = (int)settings.analog().sifStandard,
851 };
852 if (settingsExt1_1.settingExt.getDiscriminator()
853 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
854 analogSettings.isExtended = true;
855 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
856 } else {
857 analogSettings.isExtended = false;
858 }
859 return analogSettings;
860}
861
862TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
863 const FrontendSettingsExt1_1& settingsExt1_1) {
864 TunerFrontendDvbsSettings dvbsSettings{
865 .frequency = (int)settings.dvbs().frequency,
866 .modulation = (int)settings.dvbs().modulation,
867 .codeRate = {
868 .fec = (long)settings.dvbs().coderate.fec,
869 .isLinear = settings.dvbs().coderate.isLinear,
870 .isShortFrames = settings.dvbs().coderate.isShortFrames,
871 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
872 },
873 .symbolRate = (int)settings.dvbs().symbolRate,
874 .rolloff = (int)settings.dvbs().rolloff,
875 .pilot = (int)settings.dvbs().pilot,
876 .inputStreamId = (int)settings.dvbs().inputStreamId,
877 .standard = (int)settings.dvbs().standard,
878 .vcm = (int)settings.dvbs().vcmMode,
879 };
880 if (settingsExt1_1.settingExt.getDiscriminator()
881 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
882 dvbsSettings.isExtended = true;
883 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
884 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
885 } else {
886 dvbsSettings.isExtended = false;
887 }
888 return dvbsSettings;
889}
890
891TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
892 const FrontendSettingsExt1_1& settingsExt1_1) {
893 TunerFrontendCableSettings cableSettings{
894 .frequency = (int)settings.dvbc().frequency,
895 .modulation = (int)settings.dvbc().modulation,
896 .innerFec = (long)settings.dvbc().fec,
897 .symbolRate = (int)settings.dvbc().symbolRate,
898 .outerFec = (int)settings.dvbc().outerFec,
899 .annex = (int)settings.dvbc().annex,
900 .spectralInversion = (int)settings.dvbc().spectralInversion,
901 };
902 if (settingsExt1_1.settingExt.getDiscriminator()
903 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
904 cableSettings.isExtended = true;
905 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
906 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
907 } else {
908 cableSettings.isExtended = false;
909 }
910 return cableSettings;
911}
912
913TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
914 const FrontendSettingsExt1_1& settingsExt1_1) {
915 TunerFrontendDvbtSettings dvbtSettings{
916 .frequency = (int)settings.dvbt().frequency,
917 .transmissionMode = (int)settings.dvbt().transmissionMode,
918 .bandwidth = (int)settings.dvbt().bandwidth,
919 .constellation = (int)settings.dvbt().constellation,
920 .hierarchy = (int)settings.dvbt().hierarchy,
921 .hpCodeRate = (int)settings.dvbt().hpCoderate,
922 .lpCodeRate = (int)settings.dvbt().lpCoderate,
923 .guardInterval = (int)settings.dvbt().guardInterval,
924 .isHighPriority = settings.dvbt().isHighPriority,
925 .standard = (int)settings.dvbt().standard,
926 .isMiso = settings.dvbt().isMiso,
927 .plpMode = (int)settings.dvbt().plpMode,
928 .plpId = (int)settings.dvbt().plpId,
929 .plpGroupId = (int)settings.dvbt().plpGroupId,
930 };
931 if (settingsExt1_1.settingExt.getDiscriminator()
932 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
933 dvbtSettings.isExtended = true;
934 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
935 dvbtSettings.transmissionMode =
936 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
937 } else {
938 dvbtSettings.isExtended = false;
939 }
940 return dvbtSettings;
941}
942
943TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
944 const FrontendSettingsExt1_1& settingsExt1_1) {
945 TunerFrontendDtmbSettings dtmbSettings{
946 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
947 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
948 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
949 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
950 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
951 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
952 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
953 };
954 return dtmbSettings;
955}
956
957TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
958 TunerFrontendAtscSettings atscSettings{
959 .frequency = (int)settings.atsc().frequency,
960 .modulation = (int)settings.atsc().modulation,
961 };
962 return atscSettings;
963}
964
965TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
966 TunerFrontendAtsc3Settings atsc3Settings{
967 .frequency = (int)settings.atsc3().frequency,
968 .bandwidth = (int)settings.atsc3().bandwidth,
969 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
970 };
971 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
972 for (auto plpSetting : settings.atsc3().plpSettings) {
973 atsc3Settings.plpSettings.push_back({
974 .plpId = (int)plpSetting.plpId,
975 .modulation = (int)plpSetting.modulation,
976 .interleaveMode = (int)plpSetting.interleaveMode,
977 .codeRate = (int)plpSetting.codeRate,
978 .fec = (int)plpSetting.fec,
979 });
980 }
981 return atsc3Settings;
982}
983
984TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
985 TunerFrontendIsdbsSettings isdbsSettings{
986 .frequency = (int)settings.isdbs().frequency,
987 .streamId = (int)settings.isdbs().streamId,
988 .streamIdType = (int)settings.isdbs().streamIdType,
989 .modulation = (int)settings.isdbs().modulation,
990 .codeRate = (int)settings.isdbs().coderate,
991 .symbolRate = (int)settings.isdbs().symbolRate,
992 .rolloff = (int)settings.isdbs().rolloff,
993 };
994 return isdbsSettings;
995}
996
997TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
998 const FrontendSettings& settings) {
999 TunerFrontendIsdbs3Settings isdbs3Settings{
1000 .frequency = (int)settings.isdbs3().frequency,
1001 .streamId = (int)settings.isdbs3().streamId,
1002 .streamIdType = (int)settings.isdbs3().streamIdType,
1003 .modulation = (int)settings.isdbs3().modulation,
1004 .codeRate = (int)settings.isdbs3().coderate,
1005 .symbolRate = (int)settings.isdbs3().symbolRate,
1006 .rolloff = (int)settings.isdbs3().rolloff,
1007 };
1008 return isdbs3Settings;
1009}
1010
1011TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
1012 TunerFrontendIsdbtSettings isdbtSettings{
1013 .frequency = (int)settings.isdbt().frequency,
1014 .modulation = (int)settings.isdbt().modulation,
1015 .bandwidth = (int)settings.isdbt().bandwidth,
1016 .mode = (int)settings.isdbt().mode,
1017 .codeRate = (int)settings.isdbt().coderate,
1018 .guardInterval = (int)settings.isdbt().guardInterval,
1019 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
1020 };
1021 return isdbtSettings;
1022}
1023
1024bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
1025 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
1026 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
1027 || settingsExt1_1.settingExt.getDiscriminator()
1028 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
1029}
1030
Amy Zhanga6734682020-11-30 16:14:38 -08001031/////////////// TunerFrontendCallback ///////////////////////
1032
1033TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1034 : mFrontendClientCallback(frontendClientCallback) {}
1035
1036Status TunerFrontendCallback::onEvent(int frontendEventType) {
1037 if (mFrontendClientCallback != NULL) {
1038 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
1039 return Status::ok();
1040 }
1041 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
1042}
1043
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001044Status TunerFrontendCallback::onScanMessage(int messageType,
1045 const TunerFrontendScanMessage& message) {
1046 if (mFrontendClientCallback != NULL) {
1047 if (!is1_1ExtendedScanMessage(messageType)) {
1048 mFrontendClientCallback->onScanMessage(
1049 static_cast<FrontendScanMessageType>(messageType),
1050 getHalScanMessage(messageType, message));
1051 } else {
1052 mFrontendClientCallback->onScanMessageExt1_1(
1053 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
1054 getHalScanMessageExt1_1(messageType, message));
1055 }
1056 return Status::ok();
1057 }
1058 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -08001059}
1060
1061/////////////// IFrontendCallback ///////////////////////
1062
1063HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1064 : mFrontendClientCallback(frontendClientCallback) {}
1065
1066Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
1067 if (mFrontendClientCallback != NULL) {
1068 mFrontendClientCallback->onEvent(frontendEventType);
1069 }
1070 return Void();
1071}
1072
1073Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
1074 const FrontendScanMessage& message) {
1075 if (mFrontendClientCallback != NULL) {
1076 mFrontendClientCallback->onScanMessage(type, message);
1077 }
1078 return Void();
1079}
1080
1081Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
1082 const FrontendScanMessageExt1_1& message) {
1083 if (mFrontendClientCallback != NULL) {
1084 mFrontendClientCallback->onScanMessageExt1_1(type, message);
1085 }
1086 return Void();
1087}
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001088
1089/////////////// FrontendClientCallback Helper Methods ///////////////////////
1090
1091FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
1092 int messageType, const TunerFrontendScanMessage& message) {
1093 FrontendScanMessage scanMessage;
1094 switch (messageType) {
1095 case (int) FrontendScanMessageType::LOCKED:
1096 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
1097 break;
1098 case (int) FrontendScanMessageType::END:
1099 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
1100 break;
1101 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
1102 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
1103 break;
1104 case (int) FrontendScanMessageType::FREQUENCY: {
1105 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
1106 hidl_vec<uint32_t> frequencies(begin(f), end(f));
1107 scanMessage.frequencies(frequencies);
1108 break;
1109 }
1110 case (int) FrontendScanMessageType::SYMBOL_RATE: {
1111 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
1112 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
1113 scanMessage.symbolRates(symbolRates);
1114 break;
1115 }
1116 case (int) FrontendScanMessageType::HIERARCHY:
1117 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
1118 message.get<TunerFrontendScanMessage::hierarchy>()));
1119 break;
1120 case (int) FrontendScanMessageType::ANALOG_TYPE:
1121 scanMessage.analogType(static_cast<FrontendAnalogType>(
1122 message.get<TunerFrontendScanMessage::analogType>()));
1123 break;
1124 case (int) FrontendScanMessageType::PLP_IDS: {
1125 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
1126 hidl_vec<uint8_t> plpIds(begin(p), end(p));
1127 scanMessage.plpIds(plpIds);
1128 break;
1129 }
1130 case (int) FrontendScanMessageType::GROUP_IDS: {
1131 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
1132 hidl_vec<uint8_t> groupIds(begin(g), end(g));
1133 scanMessage.groupIds(groupIds);
1134 break;
1135 }
1136 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
1137 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
1138 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
1139 scanMessage.inputStreamIds(inputStreamIds);
1140 break;
1141 }
1142 case (int) FrontendScanMessageType::STANDARD: {
1143 FrontendScanMessage::Standard std;
1144 int standard = message.get<TunerFrontendScanMessage::std>();
1145 switch (mType) {
1146 case (int) FrontendType::DVBS:
1147 std.sStd(static_cast<FrontendDvbsStandard>(standard));
1148 scanMessage.std(std);
1149 break;
1150 case (int) FrontendType::DVBT:
1151 std.tStd(static_cast<FrontendDvbtStandard>(standard));
1152 scanMessage.std(std);
1153 break;
1154 case (int) FrontendType::ANALOG:
1155 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
1156 scanMessage.std(std);
1157 break;
1158 default:
1159 break;
1160 }
1161 break;
1162 }
1163 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
1164 vector<TunerFrontendScanAtsc3PlpInfo> plp =
1165 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
1166 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -08001167 int size = plp.size();
1168 plpInfo.resize(size);
1169 for (int i = 0; i < size; i++) {
1170 auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001171 FrontendScanAtsc3PlpInfo p{
1172 .plpId = static_cast<uint8_t>(info.plpId),
1173 .bLlsFlag = info.llsFlag,
1174 };
Amy Zhang46c31ec2021-02-03 18:19:10 -08001175 plpInfo[i] = p;
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001176 }
1177 scanMessage.atsc3PlpInfos(plpInfo);
1178 break;
1179 }
1180 default:
1181 break;
1182 }
1183 return scanMessage;
1184}
1185
1186FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
1187 int messageType, const TunerFrontendScanMessage& message) {
1188 FrontendScanMessageExt1_1 scanMessage;
1189 switch (messageType) {
1190 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
1191 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
1192 break;
1193 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
1194 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
1195 message.get<TunerFrontendScanMessage::annex>()));
1196 break;
1197 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
1198 FrontendModulation m;
1199 int modulation = message.get<TunerFrontendScanMessage::modulation>();
1200 switch (mType) {
1201 case (int) FrontendType::DVBC:
1202 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
1203 scanMessage.modulation(m);
1204 break;
1205 case (int) FrontendType::DVBS:
1206 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
1207 scanMessage.modulation(m);
1208 break;
1209 case (int) FrontendType::DVBT:
1210 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
1211 scanMessage.modulation(m);
1212 break;
1213 case (int) FrontendType::ISDBS:
1214 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
1215 scanMessage.modulation(m);
1216 break;
1217 case (int) FrontendType::ISDBS3:
1218 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
1219 scanMessage.modulation(m);
1220 break;
1221 case (int) FrontendType::ISDBT:
1222 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
1223 scanMessage.modulation(m);
1224 break;
1225 case (int) FrontendType::ATSC:
1226 m.atsc(static_cast<FrontendAtscModulation>(modulation));
1227 scanMessage.modulation(m);
1228 break;
1229 case (int) FrontendType::ATSC3:
1230 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
1231 scanMessage.modulation(m);
1232 break;
1233 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
1234 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
1235 scanMessage.modulation(m);
1236 break;
1237 default:
1238 break;
1239 }
1240 break;
1241 }
1242 default:
1243 break;
1244 }
1245 return scanMessage;
1246}
1247
1248bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
1249 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
1250 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
1251}
Amy Zhanga6734682020-11-30 16:14:38 -08001252} // namespace android