xref: /aosp_15_r20/hardware/interfaces/tv/tuner/aidl/default/Frontend.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "android.hardware.tv.tuner-service.example-Frontend"
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <utils/Log.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker #include "Frontend.h"
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
26*4d7e907cSAndroid Build Coastguard Worker namespace android {
27*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
28*4d7e907cSAndroid Build Coastguard Worker namespace tv {
29*4d7e907cSAndroid Build Coastguard Worker namespace tuner {
30*4d7e907cSAndroid Build Coastguard Worker 
Frontend(FrontendType type,int32_t id)31*4d7e907cSAndroid Build Coastguard Worker Frontend::Frontend(FrontendType type, int32_t id) {
32*4d7e907cSAndroid Build Coastguard Worker     mType = type;
33*4d7e907cSAndroid Build Coastguard Worker     mId = id;
34*4d7e907cSAndroid Build Coastguard Worker     mTuner = nullptr;
35*4d7e907cSAndroid Build Coastguard Worker     // Init callback to nullptr
36*4d7e907cSAndroid Build Coastguard Worker     mCallback = nullptr;
37*4d7e907cSAndroid Build Coastguard Worker     mIptvPluginInterface = nullptr;
38*4d7e907cSAndroid Build Coastguard Worker     mIptvPluginStreamer = nullptr;
39*4d7e907cSAndroid Build Coastguard Worker 
40*4d7e907cSAndroid Build Coastguard Worker     switch (mType) {
41*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ISDBS: {
42*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::isdbsCaps>(FrontendIsdbsCapabilities());
43*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
44*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::DEMOD_LOCK,
45*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::SNR,
46*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::FEC,
47*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATION,
48*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,
49*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ROLL_OFF,
50*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::STREAM_ID_LIST,
51*4d7e907cSAndroid Build Coastguard Worker             };
52*4d7e907cSAndroid Build Coastguard Worker             break;
53*4d7e907cSAndroid Build Coastguard Worker         }
54*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ATSC3: {
55*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::atsc3Caps>(FrontendAtsc3Capabilities());
56*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
57*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BER,
58*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::PER,
59*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ATSC3_PLP_INFO,
60*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,
61*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BERS,
62*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::INTERLEAVINGS,
63*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BANDWIDTH,
64*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ATSC3_ALL_PLP_INFO,
65*4d7e907cSAndroid Build Coastguard Worker             };
66*4d7e907cSAndroid Build Coastguard Worker             break;
67*4d7e907cSAndroid Build Coastguard Worker         }
68*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DVBC: {
69*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::dvbcCaps>(FrontendDvbcCapabilities());
70*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
71*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::PRE_BER,       FrontendStatusType::SIGNAL_QUALITY,
72*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATION,    FrontendStatusType::SPECTRAL,
73*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,   FrontendStatusType::CODERATES,
74*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::INTERLEAVINGS, FrontendStatusType::BANDWIDTH,
75*4d7e907cSAndroid Build Coastguard Worker             };
76*4d7e907cSAndroid Build Coastguard Worker             break;
77*4d7e907cSAndroid Build Coastguard Worker         }
78*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DVBS: {
79*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::dvbsCaps>(FrontendDvbsCapabilities());
80*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
81*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::SIGNAL_STRENGTH, FrontendStatusType::SYMBOL_RATE,
82*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATION,      FrontendStatusType::MODULATIONS,
83*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ROLL_OFF,        FrontendStatusType::IS_MISO,
84*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::STANDARD_EXT,
85*4d7e907cSAndroid Build Coastguard Worker             };
86*4d7e907cSAndroid Build Coastguard Worker             break;
87*4d7e907cSAndroid Build Coastguard Worker         }
88*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DVBT: {
89*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::dvbtCaps>(FrontendDvbtCapabilities());
90*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
91*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::EWBS,
92*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::PLP_ID,
93*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::HIERARCHY,
94*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,
95*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BANDWIDTH,
96*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::GUARD_INTERVAL,
97*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::TRANSMISSION_MODE,
98*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::T2_SYSTEM_ID,
99*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::DVBT_CELL_IDS,
100*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::STANDARD_EXT,
101*4d7e907cSAndroid Build Coastguard Worker             };
102*4d7e907cSAndroid Build Coastguard Worker             break;
103*4d7e907cSAndroid Build Coastguard Worker         }
104*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ISDBT: {
105*4d7e907cSAndroid Build Coastguard Worker             FrontendIsdbtCapabilities isdbtCaps{
106*4d7e907cSAndroid Build Coastguard Worker                     .modeCap = (int)FrontendIsdbtMode::MODE_1 | (int)FrontendIsdbtMode::MODE_2,
107*4d7e907cSAndroid Build Coastguard Worker                     .bandwidthCap = (int)FrontendIsdbtBandwidth::BANDWIDTH_6MHZ,
108*4d7e907cSAndroid Build Coastguard Worker                     .modulationCap = (int)FrontendIsdbtModulation::MOD_16QAM,
109*4d7e907cSAndroid Build Coastguard Worker                     .coderateCap = (int)FrontendIsdbtCoderate::CODERATE_4_5 |
110*4d7e907cSAndroid Build Coastguard Worker                                    (int)FrontendIsdbtCoderate::CODERATE_6_7,
111*4d7e907cSAndroid Build Coastguard Worker                     .guardIntervalCap = (int)FrontendIsdbtGuardInterval::INTERVAL_1_128,
112*4d7e907cSAndroid Build Coastguard Worker                     .timeInterleaveCap = (int)FrontendIsdbtTimeInterleaveMode::AUTO |
113*4d7e907cSAndroid Build Coastguard Worker                                          (int)FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0,
114*4d7e907cSAndroid Build Coastguard Worker                     .isSegmentAuto = true,
115*4d7e907cSAndroid Build Coastguard Worker                     .isFullSegment = true,
116*4d7e907cSAndroid Build Coastguard Worker             };
117*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::isdbtCaps>(isdbtCaps);
118*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
119*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::AGC,
120*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::LNA,
121*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATION,
122*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,
123*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BANDWIDTH,
124*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::GUARD_INTERVAL,
125*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::TRANSMISSION_MODE,
126*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ISDBT_SEGMENTS,
127*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ISDBT_MODE,
128*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG,
129*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::INTERLEAVINGS,
130*4d7e907cSAndroid Build Coastguard Worker             };
131*4d7e907cSAndroid Build Coastguard Worker             break;
132*4d7e907cSAndroid Build Coastguard Worker         }
133*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ANALOG: {
134*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::analogCaps>(FrontendAnalogCapabilities());
135*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
136*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::LAYER_ERROR,
137*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MER,
138*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::UEC,
139*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::TS_DATA_RATES,
140*4d7e907cSAndroid Build Coastguard Worker             };
141*4d7e907cSAndroid Build Coastguard Worker             break;
142*4d7e907cSAndroid Build Coastguard Worker         }
143*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ATSC: {
144*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::atscCaps>(FrontendAtscCapabilities());
145*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
146*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::FREQ_OFFSET,
147*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::RF_LOCK,
148*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,
149*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IS_LINEAR,
150*4d7e907cSAndroid Build Coastguard Worker             };
151*4d7e907cSAndroid Build Coastguard Worker             break;
152*4d7e907cSAndroid Build Coastguard Worker         }
153*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ISDBS3: {
154*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::isdbs3Caps>(FrontendIsdbs3Capabilities());
155*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
156*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::DEMOD_LOCK,      FrontendStatusType::MODULATION,
157*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,     FrontendStatusType::ROLL_OFF,
158*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IS_SHORT_FRAMES, FrontendStatusType::STREAM_ID_LIST,
159*4d7e907cSAndroid Build Coastguard Worker             };
160*4d7e907cSAndroid Build Coastguard Worker             break;
161*4d7e907cSAndroid Build Coastguard Worker         }
162*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DTMB: {
163*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::dtmbCaps>(FrontendDtmbCapabilities());
164*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
165*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::MODULATIONS,       FrontendStatusType::INTERLEAVINGS,
166*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::BANDWIDTH,         FrontendStatusType::GUARD_INTERVAL,
167*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::TRANSMISSION_MODE,
168*4d7e907cSAndroid Build Coastguard Worker             };
169*4d7e907cSAndroid Build Coastguard Worker             break;
170*4d7e907cSAndroid Build Coastguard Worker         }
171*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::IPTV: {
172*4d7e907cSAndroid Build Coastguard Worker             mFrontendCaps.set<FrontendCapabilities::Tag::iptvCaps>(FrontendIptvCapabilities());
173*4d7e907cSAndroid Build Coastguard Worker             mFrontendStatusCaps = {
174*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IPTV_CONTENT_URL,
175*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IPTV_PACKETS_LOST,
176*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IPTV_PACKETS_RECEIVED,
177*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IPTV_AVERAGE_JITTER_MS,
178*4d7e907cSAndroid Build Coastguard Worker                     FrontendStatusType::IPTV_WORST_JITTER_MS,
179*4d7e907cSAndroid Build Coastguard Worker             };
180*4d7e907cSAndroid Build Coastguard Worker             break;
181*4d7e907cSAndroid Build Coastguard Worker         }
182*4d7e907cSAndroid Build Coastguard Worker         default: {
183*4d7e907cSAndroid Build Coastguard Worker             break;
184*4d7e907cSAndroid Build Coastguard Worker         }
185*4d7e907cSAndroid Build Coastguard Worker     }
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker 
~Frontend()188*4d7e907cSAndroid Build Coastguard Worker Frontend::~Frontend() {
189*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
190*4d7e907cSAndroid Build Coastguard Worker     mCallback = nullptr;
191*4d7e907cSAndroid Build Coastguard Worker     mIsLocked = false;
192*4d7e907cSAndroid Build Coastguard Worker     mTuner = nullptr;
193*4d7e907cSAndroid Build Coastguard Worker     if (mTuneByteBuffer != nullptr) {
194*4d7e907cSAndroid Build Coastguard Worker         free(mTuneByteBuffer);
195*4d7e907cSAndroid Build Coastguard Worker     }
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker 
close()198*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::close() {
199*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
200*4d7e907cSAndroid Build Coastguard Worker     // Reset callback
201*4d7e907cSAndroid Build Coastguard Worker     mCallback = nullptr;
202*4d7e907cSAndroid Build Coastguard Worker     mIsLocked = false;
203*4d7e907cSAndroid Build Coastguard Worker     if (mTuner != nullptr) {
204*4d7e907cSAndroid Build Coastguard Worker         mTuner->removeFrontend(mId);
205*4d7e907cSAndroid Build Coastguard Worker     }
206*4d7e907cSAndroid Build Coastguard Worker     mTuner = nullptr;
207*4d7e907cSAndroid Build Coastguard Worker 
208*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
209*4d7e907cSAndroid Build Coastguard Worker }
210*4d7e907cSAndroid Build Coastguard Worker 
setCallback(const std::shared_ptr<IFrontendCallback> & in_callback)211*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::setCallback(const std::shared_ptr<IFrontendCallback>& in_callback) {
212*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
213*4d7e907cSAndroid Build Coastguard Worker     if (in_callback == nullptr) {
214*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[   WARN   ] Set Frontend callback with nullptr");
215*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
216*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
217*4d7e907cSAndroid Build Coastguard Worker     }
218*4d7e907cSAndroid Build Coastguard Worker 
219*4d7e907cSAndroid Build Coastguard Worker     mCallback = in_callback;
220*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker 
createIptvPluginInterface()223*4d7e907cSAndroid Build Coastguard Worker dtv_plugin* Frontend::createIptvPluginInterface() {
224*4d7e907cSAndroid Build Coastguard Worker     const char* path = "/vendor/lib/iptv_udp_plugin.so";
225*4d7e907cSAndroid Build Coastguard Worker     DtvPlugin* plugin = new DtvPlugin(path);
226*4d7e907cSAndroid Build Coastguard Worker     bool plugin_loaded = plugin->load();
227*4d7e907cSAndroid Build Coastguard Worker     if (!plugin_loaded) {
228*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Failed to load plugin");
229*4d7e907cSAndroid Build Coastguard Worker         return nullptr;
230*4d7e907cSAndroid Build Coastguard Worker     }
231*4d7e907cSAndroid Build Coastguard Worker     return plugin->interface();
232*4d7e907cSAndroid Build Coastguard Worker }
233*4d7e907cSAndroid Build Coastguard Worker 
createIptvPluginStreamer(dtv_plugin * interface,const char * transport_desc)234*4d7e907cSAndroid Build Coastguard Worker dtv_streamer* Frontend::createIptvPluginStreamer(dtv_plugin* interface,
235*4d7e907cSAndroid Build Coastguard Worker                                                  const char* transport_desc) {
236*4d7e907cSAndroid Build Coastguard Worker     dtv_streamer* streamer = interface->create_streamer();
237*4d7e907cSAndroid Build Coastguard Worker     int open_fd = interface->open_stream(streamer, transport_desc);
238*4d7e907cSAndroid Build Coastguard Worker     if (open_fd < 0) {
239*4d7e907cSAndroid Build Coastguard Worker         return nullptr;
240*4d7e907cSAndroid Build Coastguard Worker     }
241*4d7e907cSAndroid Build Coastguard Worker     ALOGI("[   INFO   ] open_stream successful, open_fd=%d", open_fd);
242*4d7e907cSAndroid Build Coastguard Worker     return streamer;
243*4d7e907cSAndroid Build Coastguard Worker }
244*4d7e907cSAndroid Build Coastguard Worker 
readTuneByte(void * buf)245*4d7e907cSAndroid Build Coastguard Worker void Frontend::readTuneByte(void* buf) {
246*4d7e907cSAndroid Build Coastguard Worker     ssize_t bytes_read = mIptvPluginInterface->read_stream(mIptvPluginStreamer, buf,
247*4d7e907cSAndroid Build Coastguard Worker                                                            TUNE_BUFFER_SIZE, TUNE_BUFFER_TIMEOUT);
248*4d7e907cSAndroid Build Coastguard Worker     if (bytes_read <= 0) {
249*4d7e907cSAndroid Build Coastguard Worker         ALOGI("[   ERROR   ] Tune byte couldn't be read.");
250*4d7e907cSAndroid Build Coastguard Worker         return;
251*4d7e907cSAndroid Build Coastguard Worker     }
252*4d7e907cSAndroid Build Coastguard Worker     mCallback->onEvent(FrontendEventType::LOCKED);
253*4d7e907cSAndroid Build Coastguard Worker     mIsLocked = true;
254*4d7e907cSAndroid Build Coastguard Worker     mTuneByteBuffer = buf;
255*4d7e907cSAndroid Build Coastguard Worker }
256*4d7e907cSAndroid Build Coastguard Worker 
tune(const FrontendSettings & in_settings)257*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::tune(const FrontendSettings& in_settings) {
258*4d7e907cSAndroid Build Coastguard Worker     if (mCallback == nullptr) {
259*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[   WARN   ] Frontend callback is not set for tuning");
260*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
261*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_STATE));
262*4d7e907cSAndroid Build Coastguard Worker     }
263*4d7e907cSAndroid Build Coastguard Worker 
264*4d7e907cSAndroid Build Coastguard Worker     if (mType != FrontendType::IPTV) {
265*4d7e907cSAndroid Build Coastguard Worker         mTuner->frontendStartTune(mId);
266*4d7e907cSAndroid Build Coastguard Worker         mCallback->onEvent(FrontendEventType::LOCKED);
267*4d7e907cSAndroid Build Coastguard Worker         mIsLocked = true;
268*4d7e907cSAndroid Build Coastguard Worker     } else {
269*4d7e907cSAndroid Build Coastguard Worker         // This is a reference implementation for IPTV. It uses an additional socket buffer.
270*4d7e907cSAndroid Build Coastguard Worker         // Vendors can use hardware memory directly to make the implementation more performant.
271*4d7e907cSAndroid Build Coastguard Worker         ALOGI("[   INFO   ] Frontend type is set to IPTV, tag = %d id=%d", in_settings.getTag(),
272*4d7e907cSAndroid Build Coastguard Worker               mId);
273*4d7e907cSAndroid Build Coastguard Worker 
274*4d7e907cSAndroid Build Coastguard Worker         mIptvPluginInterface = createIptvPluginInterface();
275*4d7e907cSAndroid Build Coastguard Worker         if (mIptvPluginInterface == nullptr) {
276*4d7e907cSAndroid Build Coastguard Worker             ALOGE("[   INFO   ] Failed to load plugin.");
277*4d7e907cSAndroid Build Coastguard Worker             return ::ndk::ScopedAStatus::fromServiceSpecificError(
278*4d7e907cSAndroid Build Coastguard Worker                     static_cast<int32_t>(Result::INVALID_ARGUMENT));
279*4d7e907cSAndroid Build Coastguard Worker         }
280*4d7e907cSAndroid Build Coastguard Worker 
281*4d7e907cSAndroid Build Coastguard Worker         // validate content_url format
282*4d7e907cSAndroid Build Coastguard Worker         std::string content_url = in_settings.get<FrontendSettings::Tag::iptv>()->contentUrl;
283*4d7e907cSAndroid Build Coastguard Worker         mIptvTransportDescription = "{ \"uri\": \"" + content_url + "\"}";
284*4d7e907cSAndroid Build Coastguard Worker         ALOGI("[   INFO   ] transport_desc: %s", mIptvTransportDescription.c_str());
285*4d7e907cSAndroid Build Coastguard Worker         bool is_transport_desc_valid =
286*4d7e907cSAndroid Build Coastguard Worker                 mIptvPluginInterface->validate(mIptvTransportDescription.c_str());
287*4d7e907cSAndroid Build Coastguard Worker         if (!is_transport_desc_valid) {  // not of format protocol://ip:port
288*4d7e907cSAndroid Build Coastguard Worker             ALOGE("[   INFO   ] transport_desc is not valid");
289*4d7e907cSAndroid Build Coastguard Worker             return ::ndk::ScopedAStatus::fromServiceSpecificError(
290*4d7e907cSAndroid Build Coastguard Worker                     static_cast<int32_t>(Result::INVALID_ARGUMENT));
291*4d7e907cSAndroid Build Coastguard Worker         }
292*4d7e907cSAndroid Build Coastguard Worker 
293*4d7e907cSAndroid Build Coastguard Worker         // create a streamer and open it for reading data
294*4d7e907cSAndroid Build Coastguard Worker         mIptvPluginStreamer =
295*4d7e907cSAndroid Build Coastguard Worker                 createIptvPluginStreamer(mIptvPluginInterface, mIptvTransportDescription.c_str());
296*4d7e907cSAndroid Build Coastguard Worker 
297*4d7e907cSAndroid Build Coastguard Worker         void* buf = malloc(sizeof(char) * TUNE_BUFFER_SIZE);
298*4d7e907cSAndroid Build Coastguard Worker         if (buf == nullptr) {
299*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Failed to allocate 1 byte buffer for tuning.");
300*4d7e907cSAndroid Build Coastguard Worker             return ::ndk::ScopedAStatus::fromServiceSpecificError(
301*4d7e907cSAndroid Build Coastguard Worker                     static_cast<int32_t>(Result::INVALID_STATE));
302*4d7e907cSAndroid Build Coastguard Worker         }
303*4d7e907cSAndroid Build Coastguard Worker         mIptvFrontendTuneThread = std::thread(&Frontend::readTuneByte, this, buf);
304*4d7e907cSAndroid Build Coastguard Worker         if (mIptvFrontendTuneThread.joinable()) {
305*4d7e907cSAndroid Build Coastguard Worker             mIptvFrontendTuneThread.join();
306*4d7e907cSAndroid Build Coastguard Worker         }
307*4d7e907cSAndroid Build Coastguard Worker     }
308*4d7e907cSAndroid Build Coastguard Worker 
309*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
310*4d7e907cSAndroid Build Coastguard Worker }
311*4d7e907cSAndroid Build Coastguard Worker 
stopTune()312*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::stopTune() {
313*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
314*4d7e907cSAndroid Build Coastguard Worker 
315*4d7e907cSAndroid Build Coastguard Worker     mTuner->frontendStopTune(mId);
316*4d7e907cSAndroid Build Coastguard Worker     mIsLocked = false;
317*4d7e907cSAndroid Build Coastguard Worker 
318*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
319*4d7e907cSAndroid Build Coastguard Worker }
320*4d7e907cSAndroid Build Coastguard Worker 
scan(const FrontendSettings & in_settings,FrontendScanType in_type)321*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::scan(const FrontendSettings& in_settings, FrontendScanType in_type) {
322*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
323*4d7e907cSAndroid Build Coastguard Worker 
324*4d7e907cSAndroid Build Coastguard Worker     // If it's in middle of scanning, stop it first.
325*4d7e907cSAndroid Build Coastguard Worker     if (mScanThread.joinable()) {
326*4d7e907cSAndroid Build Coastguard Worker         mScanThread.join();
327*4d7e907cSAndroid Build Coastguard Worker     }
328*4d7e907cSAndroid Build Coastguard Worker 
329*4d7e907cSAndroid Build Coastguard Worker     mFrontendSettings = in_settings;
330*4d7e907cSAndroid Build Coastguard Worker     mFrontendScanType = in_type;
331*4d7e907cSAndroid Build Coastguard Worker     mScanThread = std::thread(&Frontend::scanThreadLoop, this);
332*4d7e907cSAndroid Build Coastguard Worker 
333*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
334*4d7e907cSAndroid Build Coastguard Worker }
335*4d7e907cSAndroid Build Coastguard Worker 
setTunerService(std::shared_ptr<Tuner> tuner)336*4d7e907cSAndroid Build Coastguard Worker void Frontend::setTunerService(std::shared_ptr<Tuner> tuner) {
337*4d7e907cSAndroid Build Coastguard Worker     mTuner = tuner;
338*4d7e907cSAndroid Build Coastguard Worker }
339*4d7e907cSAndroid Build Coastguard Worker 
scanThreadLoop()340*4d7e907cSAndroid Build Coastguard Worker void Frontend::scanThreadLoop() {
341*4d7e907cSAndroid Build Coastguard Worker     if (mIsLocked) {
342*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
343*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::isEnd>(true);
344*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::END, msg);
345*4d7e907cSAndroid Build Coastguard Worker         return;
346*4d7e907cSAndroid Build Coastguard Worker     }
347*4d7e907cSAndroid Build Coastguard Worker 
348*4d7e907cSAndroid Build Coastguard Worker     int64_t frequency = 0;
349*4d7e907cSAndroid Build Coastguard Worker     switch (mFrontendSettings.getTag()) {
350*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::analog:
351*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::analog>().frequency;
352*4d7e907cSAndroid Build Coastguard Worker             break;
353*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::atsc:
354*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc>().frequency;
355*4d7e907cSAndroid Build Coastguard Worker             break;
356*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::atsc3:
357*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc3>().frequency;
358*4d7e907cSAndroid Build Coastguard Worker             break;
359*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::dvbs:
360*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbs>().frequency;
361*4d7e907cSAndroid Build Coastguard Worker             break;
362*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::dvbc:
363*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbc>().frequency;
364*4d7e907cSAndroid Build Coastguard Worker             break;
365*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::dvbt:
366*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbt>().frequency;
367*4d7e907cSAndroid Build Coastguard Worker             break;
368*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::isdbs:
369*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs>().frequency;
370*4d7e907cSAndroid Build Coastguard Worker             break;
371*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::isdbs3:
372*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs3>().frequency;
373*4d7e907cSAndroid Build Coastguard Worker             break;
374*4d7e907cSAndroid Build Coastguard Worker         case FrontendSettings::Tag::isdbt:
375*4d7e907cSAndroid Build Coastguard Worker             frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbt>().frequency;
376*4d7e907cSAndroid Build Coastguard Worker             break;
377*4d7e907cSAndroid Build Coastguard Worker         default:
378*4d7e907cSAndroid Build Coastguard Worker             break;
379*4d7e907cSAndroid Build Coastguard Worker     }
380*4d7e907cSAndroid Build Coastguard Worker 
381*4d7e907cSAndroid Build Coastguard Worker     if (mFrontendScanType == FrontendScanType::SCAN_BLIND) {
382*4d7e907cSAndroid Build Coastguard Worker         frequency += 100 * 1000;
383*4d7e907cSAndroid Build Coastguard Worker     }
384*4d7e907cSAndroid Build Coastguard Worker 
385*4d7e907cSAndroid Build Coastguard Worker     {
386*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
387*4d7e907cSAndroid Build Coastguard Worker         vector<int64_t> frequencies = {frequency};
388*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::frequencies>(frequencies);
389*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::FREQUENCY, msg);
390*4d7e907cSAndroid Build Coastguard Worker     }
391*4d7e907cSAndroid Build Coastguard Worker 
392*4d7e907cSAndroid Build Coastguard Worker     {
393*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
394*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::progressPercent>(20);
395*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::PROGRESS_PERCENT, msg);
396*4d7e907cSAndroid Build Coastguard Worker     }
397*4d7e907cSAndroid Build Coastguard Worker 
398*4d7e907cSAndroid Build Coastguard Worker     {
399*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
400*4d7e907cSAndroid Build Coastguard Worker         vector<int32_t> symbolRates = {30};
401*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::symbolRates>(symbolRates);
402*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::SYMBOL_RATE, msg);
403*4d7e907cSAndroid Build Coastguard Worker     }
404*4d7e907cSAndroid Build Coastguard Worker 
405*4d7e907cSAndroid Build Coastguard Worker     if (mType == FrontendType::DVBT) {
406*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
407*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_NON_NATIVE);
408*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::HIERARCHY, msg);
409*4d7e907cSAndroid Build Coastguard Worker     }
410*4d7e907cSAndroid Build Coastguard Worker 
411*4d7e907cSAndroid Build Coastguard Worker     if (mType == FrontendType::ANALOG) {
412*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
413*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::analogType>(FrontendAnalogType::PAL);
414*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::ANALOG_TYPE, msg);
415*4d7e907cSAndroid Build Coastguard Worker     }
416*4d7e907cSAndroid Build Coastguard Worker 
417*4d7e907cSAndroid Build Coastguard Worker     {
418*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
419*4d7e907cSAndroid Build Coastguard Worker         vector<int32_t> plpIds = {2};
420*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::plpIds>(plpIds);
421*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::PLP_IDS, msg);
422*4d7e907cSAndroid Build Coastguard Worker     }
423*4d7e907cSAndroid Build Coastguard Worker 
424*4d7e907cSAndroid Build Coastguard Worker     {
425*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
426*4d7e907cSAndroid Build Coastguard Worker         vector<int32_t> groupIds = {3};
427*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::groupIds>(groupIds);
428*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::GROUP_IDS, msg);
429*4d7e907cSAndroid Build Coastguard Worker     }
430*4d7e907cSAndroid Build Coastguard Worker 
431*4d7e907cSAndroid Build Coastguard Worker     {
432*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
433*4d7e907cSAndroid Build Coastguard Worker         vector<int32_t> inputStreamIds = {1};
434*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::inputStreamIds>(inputStreamIds);
435*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::INPUT_STREAM_IDS, msg);
436*4d7e907cSAndroid Build Coastguard Worker     }
437*4d7e907cSAndroid Build Coastguard Worker 
438*4d7e907cSAndroid Build Coastguard Worker     switch (mType) {
439*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DVBT: {
440*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessage msg;
441*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessageStandard std;
442*4d7e907cSAndroid Build Coastguard Worker             std.set<FrontendScanMessageStandard::Tag::tStd>(FrontendDvbtStandard::AUTO);
443*4d7e907cSAndroid Build Coastguard Worker             msg.set<FrontendScanMessage::Tag::std>(std);
444*4d7e907cSAndroid Build Coastguard Worker             mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
445*4d7e907cSAndroid Build Coastguard Worker             break;
446*4d7e907cSAndroid Build Coastguard Worker         }
447*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::DVBS: {
448*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessage msg;
449*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessageStandard std;
450*4d7e907cSAndroid Build Coastguard Worker             std.set<FrontendScanMessageStandard::Tag::sStd>(FrontendDvbsStandard::AUTO);
451*4d7e907cSAndroid Build Coastguard Worker             msg.set<FrontendScanMessage::Tag::std>(std);
452*4d7e907cSAndroid Build Coastguard Worker             mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
453*4d7e907cSAndroid Build Coastguard Worker             break;
454*4d7e907cSAndroid Build Coastguard Worker         }
455*4d7e907cSAndroid Build Coastguard Worker         case FrontendType::ANALOG: {
456*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessage msg;
457*4d7e907cSAndroid Build Coastguard Worker             FrontendScanMessageStandard std;
458*4d7e907cSAndroid Build Coastguard Worker             std.set<FrontendScanMessageStandard::Tag::sifStd>(FrontendAnalogSifStandard::AUTO);
459*4d7e907cSAndroid Build Coastguard Worker             msg.set<FrontendScanMessage::Tag::std>(std);
460*4d7e907cSAndroid Build Coastguard Worker             mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
461*4d7e907cSAndroid Build Coastguard Worker             break;
462*4d7e907cSAndroid Build Coastguard Worker         }
463*4d7e907cSAndroid Build Coastguard Worker         default:
464*4d7e907cSAndroid Build Coastguard Worker             break;
465*4d7e907cSAndroid Build Coastguard Worker     }
466*4d7e907cSAndroid Build Coastguard Worker 
467*4d7e907cSAndroid Build Coastguard Worker     {
468*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
469*4d7e907cSAndroid Build Coastguard Worker         FrontendScanAtsc3PlpInfo info;
470*4d7e907cSAndroid Build Coastguard Worker         info.plpId = 1;
471*4d7e907cSAndroid Build Coastguard Worker         info.bLlsFlag = false;
472*4d7e907cSAndroid Build Coastguard Worker         vector<FrontendScanAtsc3PlpInfo> atsc3PlpInfos = {info};
473*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::atsc3PlpInfos>(atsc3PlpInfos);
474*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::ATSC3_PLP_INFO, msg);
475*4d7e907cSAndroid Build Coastguard Worker     }
476*4d7e907cSAndroid Build Coastguard Worker 
477*4d7e907cSAndroid Build Coastguard Worker     {
478*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
479*4d7e907cSAndroid Build Coastguard Worker         FrontendModulation modulation;
480*4d7e907cSAndroid Build Coastguard Worker         modulation.set<FrontendModulation::Tag::dvbc>(FrontendDvbcModulation::MOD_16QAM);
481*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::modulation>(modulation);
482*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::MODULATION, msg);
483*4d7e907cSAndroid Build Coastguard Worker     }
484*4d7e907cSAndroid Build Coastguard Worker 
485*4d7e907cSAndroid Build Coastguard Worker     {
486*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
487*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::isHighPriority>(true);
488*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::HIGH_PRIORITY, msg);
489*4d7e907cSAndroid Build Coastguard Worker     }
490*4d7e907cSAndroid Build Coastguard Worker 
491*4d7e907cSAndroid Build Coastguard Worker     if (mType == FrontendType::DVBT) {
492*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
493*4d7e907cSAndroid Build Coastguard Worker         vector<int32_t> dvbtCellIds = {0, 1};
494*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::dvbtCellIds>(dvbtCellIds);
495*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::DVBT_CELL_IDS, msg);
496*4d7e907cSAndroid Build Coastguard Worker     }
497*4d7e907cSAndroid Build Coastguard Worker 
498*4d7e907cSAndroid Build Coastguard Worker     {
499*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
500*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::isLocked>(false);
501*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
502*4d7e907cSAndroid Build Coastguard Worker         mIsLocked = false;
503*4d7e907cSAndroid Build Coastguard Worker     }
504*4d7e907cSAndroid Build Coastguard Worker 
505*4d7e907cSAndroid Build Coastguard Worker     {
506*4d7e907cSAndroid Build Coastguard Worker         FrontendScanMessage msg;
507*4d7e907cSAndroid Build Coastguard Worker         msg.set<FrontendScanMessage::Tag::isLocked>(true);
508*4d7e907cSAndroid Build Coastguard Worker         mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
509*4d7e907cSAndroid Build Coastguard Worker         mIsLocked = true;
510*4d7e907cSAndroid Build Coastguard Worker     }
511*4d7e907cSAndroid Build Coastguard Worker }
512*4d7e907cSAndroid Build Coastguard Worker 
stopScan()513*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::stopScan() {
514*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
515*4d7e907cSAndroid Build Coastguard Worker 
516*4d7e907cSAndroid Build Coastguard Worker     if (mScanThread.joinable()) {
517*4d7e907cSAndroid Build Coastguard Worker         mScanThread.join();
518*4d7e907cSAndroid Build Coastguard Worker     }
519*4d7e907cSAndroid Build Coastguard Worker 
520*4d7e907cSAndroid Build Coastguard Worker     mIsLocked = false;
521*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
522*4d7e907cSAndroid Build Coastguard Worker }
523*4d7e907cSAndroid Build Coastguard Worker 
getStatus(const std::vector<FrontendStatusType> & in_statusTypes,std::vector<FrontendStatus> * _aidl_return)524*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getStatus(const std::vector<FrontendStatusType>& in_statusTypes,
525*4d7e907cSAndroid Build Coastguard Worker                                          std::vector<FrontendStatus>* _aidl_return) {
526*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
527*4d7e907cSAndroid Build Coastguard Worker 
528*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < in_statusTypes.size(); i++) {
529*4d7e907cSAndroid Build Coastguard Worker         FrontendStatusType type = in_statusTypes[i];
530*4d7e907cSAndroid Build Coastguard Worker         FrontendStatus status;
531*4d7e907cSAndroid Build Coastguard Worker         // assign randomly selected values for testing.
532*4d7e907cSAndroid Build Coastguard Worker         switch (type) {
533*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::DEMOD_LOCK: {
534*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isDemodLocked>(true);
535*4d7e907cSAndroid Build Coastguard Worker                 break;
536*4d7e907cSAndroid Build Coastguard Worker             }
537*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::SNR: {
538*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::snr>(221);
539*4d7e907cSAndroid Build Coastguard Worker                 break;
540*4d7e907cSAndroid Build Coastguard Worker             }
541*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::BER: {
542*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::ber>(1);
543*4d7e907cSAndroid Build Coastguard Worker                 break;
544*4d7e907cSAndroid Build Coastguard Worker             }
545*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::PER: {
546*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::per>(2);
547*4d7e907cSAndroid Build Coastguard Worker                 break;
548*4d7e907cSAndroid Build Coastguard Worker             }
549*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::PRE_BER: {
550*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::preBer>(3);
551*4d7e907cSAndroid Build Coastguard Worker                 break;
552*4d7e907cSAndroid Build Coastguard Worker             }
553*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::SIGNAL_QUALITY: {
554*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::signalQuality>(4);
555*4d7e907cSAndroid Build Coastguard Worker                 break;
556*4d7e907cSAndroid Build Coastguard Worker             }
557*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::SIGNAL_STRENGTH: {
558*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::signalStrength>(5);
559*4d7e907cSAndroid Build Coastguard Worker                 break;
560*4d7e907cSAndroid Build Coastguard Worker             }
561*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::SYMBOL_RATE: {
562*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::symbolRate>(6);
563*4d7e907cSAndroid Build Coastguard Worker                 break;
564*4d7e907cSAndroid Build Coastguard Worker             }
565*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::FEC: {
566*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::innerFec>(FrontendInnerFec::FEC_2_9);  // value = 1 << 7
567*4d7e907cSAndroid Build Coastguard Worker                 break;
568*4d7e907cSAndroid Build Coastguard Worker             }
569*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::MODULATION: {
570*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
571*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS: {
572*4d7e907cSAndroid Build Coastguard Worker                         FrontendModulationStatus modulationStatus;
573*4d7e907cSAndroid Build Coastguard Worker                         modulationStatus.set<FrontendModulationStatus::Tag::isdbs>(
574*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbsModulation::MOD_BPSK);  // value = 1 << 1
575*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulationStatus>(modulationStatus);
576*4d7e907cSAndroid Build Coastguard Worker                         break;
577*4d7e907cSAndroid Build Coastguard Worker                     }
578*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBC: {
579*4d7e907cSAndroid Build Coastguard Worker                         FrontendModulationStatus modulationStatus;
580*4d7e907cSAndroid Build Coastguard Worker                         modulationStatus.set<FrontendModulationStatus::Tag::dvbc>(
581*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbcModulation::MOD_16QAM);  // value = 1 << 1
582*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulationStatus>(modulationStatus);
583*4d7e907cSAndroid Build Coastguard Worker                         break;
584*4d7e907cSAndroid Build Coastguard Worker                     }
585*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBS: {
586*4d7e907cSAndroid Build Coastguard Worker                         FrontendModulationStatus modulationStatus;
587*4d7e907cSAndroid Build Coastguard Worker                         modulationStatus.set<FrontendModulationStatus::Tag::dvbs>(
588*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbsModulation::MOD_QPSK);  // value = 1 << 1
589*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulationStatus>(modulationStatus);
590*4d7e907cSAndroid Build Coastguard Worker                         break;
591*4d7e907cSAndroid Build Coastguard Worker                     }
592*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS3: {
593*4d7e907cSAndroid Build Coastguard Worker                         FrontendModulationStatus modulationStatus;
594*4d7e907cSAndroid Build Coastguard Worker                         modulationStatus.set<FrontendModulationStatus::Tag::isdbs3>(
595*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbs3Modulation::MOD_BPSK);  // value = 1 << 1
596*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulationStatus>(modulationStatus);
597*4d7e907cSAndroid Build Coastguard Worker                         break;
598*4d7e907cSAndroid Build Coastguard Worker                     }
599*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
600*4d7e907cSAndroid Build Coastguard Worker                         FrontendModulationStatus modulationStatus;
601*4d7e907cSAndroid Build Coastguard Worker                         modulationStatus.set<FrontendModulationStatus::Tag::isdbt>(
602*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtModulation::MOD_DQPSK);  // value = 1 << 1
603*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulationStatus>(modulationStatus);
604*4d7e907cSAndroid Build Coastguard Worker                         break;
605*4d7e907cSAndroid Build Coastguard Worker                     }
606*4d7e907cSAndroid Build Coastguard Worker                     default:
607*4d7e907cSAndroid Build Coastguard Worker                         break;
608*4d7e907cSAndroid Build Coastguard Worker                 }
609*4d7e907cSAndroid Build Coastguard Worker                 break;
610*4d7e907cSAndroid Build Coastguard Worker             }
611*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::SPECTRAL: {
612*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::inversion>(FrontendSpectralInversion::NORMAL);
613*4d7e907cSAndroid Build Coastguard Worker                 break;
614*4d7e907cSAndroid Build Coastguard Worker             }
615*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::LNB_VOLTAGE: {
616*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::lnbVoltage>(LnbVoltage::VOLTAGE_5V);
617*4d7e907cSAndroid Build Coastguard Worker                 break;
618*4d7e907cSAndroid Build Coastguard Worker             }
619*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::PLP_ID: {
620*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::plpId>(101);
621*4d7e907cSAndroid Build Coastguard Worker                 break;
622*4d7e907cSAndroid Build Coastguard Worker             }
623*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::EWBS: {
624*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isEWBS>(false);
625*4d7e907cSAndroid Build Coastguard Worker                 break;
626*4d7e907cSAndroid Build Coastguard Worker             }
627*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::AGC: {
628*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::agc>(7);
629*4d7e907cSAndroid Build Coastguard Worker                 break;
630*4d7e907cSAndroid Build Coastguard Worker             }
631*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::LNA: {
632*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isLnaOn>(false);
633*4d7e907cSAndroid Build Coastguard Worker                 break;
634*4d7e907cSAndroid Build Coastguard Worker             }
635*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::LAYER_ERROR: {
636*4d7e907cSAndroid Build Coastguard Worker                 vector<bool> v = {false, true, true};
637*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isLayerError>(v);
638*4d7e907cSAndroid Build Coastguard Worker                 break;
639*4d7e907cSAndroid Build Coastguard Worker             }
640*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::MER: {
641*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::mer>(8);
642*4d7e907cSAndroid Build Coastguard Worker                 break;
643*4d7e907cSAndroid Build Coastguard Worker             }
644*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::FREQ_OFFSET: {
645*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::freqOffset>(9);
646*4d7e907cSAndroid Build Coastguard Worker                 break;
647*4d7e907cSAndroid Build Coastguard Worker             }
648*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::HIERARCHY: {
649*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_1_NATIVE);
650*4d7e907cSAndroid Build Coastguard Worker                 break;
651*4d7e907cSAndroid Build Coastguard Worker             }
652*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::RF_LOCK: {
653*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isRfLocked>(false);
654*4d7e907cSAndroid Build Coastguard Worker                 break;
655*4d7e907cSAndroid Build Coastguard Worker             }
656*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ATSC3_PLP_INFO: {
657*4d7e907cSAndroid Build Coastguard Worker                 FrontendStatusAtsc3PlpInfo info1;
658*4d7e907cSAndroid Build Coastguard Worker                 info1.plpId = 3;
659*4d7e907cSAndroid Build Coastguard Worker                 info1.isLocked = false;
660*4d7e907cSAndroid Build Coastguard Worker                 info1.uec = 313;
661*4d7e907cSAndroid Build Coastguard Worker                 FrontendStatusAtsc3PlpInfo info2;
662*4d7e907cSAndroid Build Coastguard Worker                 info2.plpId = 5;
663*4d7e907cSAndroid Build Coastguard Worker                 info2.isLocked = true;
664*4d7e907cSAndroid Build Coastguard Worker                 info2.uec = 515;
665*4d7e907cSAndroid Build Coastguard Worker                 vector<FrontendStatusAtsc3PlpInfo> infos = {info1, info2};
666*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::plpInfo>(infos);
667*4d7e907cSAndroid Build Coastguard Worker                 break;
668*4d7e907cSAndroid Build Coastguard Worker             }
669*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::MODULATIONS: {
670*4d7e907cSAndroid Build Coastguard Worker                 FrontendModulation modulation;
671*4d7e907cSAndroid Build Coastguard Worker                 vector<FrontendModulation> modulations;
672*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
673*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS: {
674*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::isdbs>(
675*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbsModulation::MOD_BPSK);  // value = 1 << 1
676*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
677*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
678*4d7e907cSAndroid Build Coastguard Worker                         break;
679*4d7e907cSAndroid Build Coastguard Worker                     }
680*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBC: {
681*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::dvbc>(
682*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbcModulation::MOD_16QAM);  // value = 1 << 1
683*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
684*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
685*4d7e907cSAndroid Build Coastguard Worker                         break;
686*4d7e907cSAndroid Build Coastguard Worker                     }
687*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBS: {
688*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::dvbs>(
689*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbsModulation::MOD_QPSK);  // value = 1 << 1
690*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
691*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
692*4d7e907cSAndroid Build Coastguard Worker                         break;
693*4d7e907cSAndroid Build Coastguard Worker                     }
694*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBT: {
695*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::dvbt>(
696*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbtConstellation::CONSTELLATION_16QAM_R);  // value = 1 <<
697*4d7e907cSAndroid Build Coastguard Worker                                                                                     // 16
698*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
699*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
700*4d7e907cSAndroid Build Coastguard Worker                         break;
701*4d7e907cSAndroid Build Coastguard Worker                     }
702*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS3: {
703*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::isdbs3>(
704*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbs3Modulation::MOD_BPSK);  //  value = 1 << 1
705*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
706*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
707*4d7e907cSAndroid Build Coastguard Worker                         break;
708*4d7e907cSAndroid Build Coastguard Worker                     }
709*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
710*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::isdbt>(
711*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtModulation::MOD_DQPSK);  // value = 1 << 1
712*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
713*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
714*4d7e907cSAndroid Build Coastguard Worker                         break;
715*4d7e907cSAndroid Build Coastguard Worker                     }
716*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ATSC: {
717*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::atsc>(
718*4d7e907cSAndroid Build Coastguard Worker                                 FrontendAtscModulation::MOD_8VSB);  // value = 1 << 2
719*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
720*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
721*4d7e907cSAndroid Build Coastguard Worker                         break;
722*4d7e907cSAndroid Build Coastguard Worker                     }
723*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ATSC3: {
724*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::atsc3>(
725*4d7e907cSAndroid Build Coastguard Worker                                 FrontendAtsc3Modulation::MOD_QPSK);  // value = 1 << 1
726*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
727*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
728*4d7e907cSAndroid Build Coastguard Worker                         break;
729*4d7e907cSAndroid Build Coastguard Worker                     }
730*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DTMB: {
731*4d7e907cSAndroid Build Coastguard Worker                         modulation.set<FrontendModulation::Tag::dtmb>(
732*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDtmbModulation::CONSTELLATION_4QAM);  // value = 1 << 1
733*4d7e907cSAndroid Build Coastguard Worker                         modulations.push_back(modulation);
734*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::modulations>(modulations);
735*4d7e907cSAndroid Build Coastguard Worker                         break;
736*4d7e907cSAndroid Build Coastguard Worker                     }
737*4d7e907cSAndroid Build Coastguard Worker                     default:
738*4d7e907cSAndroid Build Coastguard Worker                         break;
739*4d7e907cSAndroid Build Coastguard Worker                 }
740*4d7e907cSAndroid Build Coastguard Worker                 break;
741*4d7e907cSAndroid Build Coastguard Worker             }
742*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::BERS: {
743*4d7e907cSAndroid Build Coastguard Worker                 vector<int32_t> bers = {1};
744*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::bers>(bers);
745*4d7e907cSAndroid Build Coastguard Worker                 break;
746*4d7e907cSAndroid Build Coastguard Worker             }
747*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::CODERATES: {
748*4d7e907cSAndroid Build Coastguard Worker                 vector<FrontendInnerFec> rates;
749*4d7e907cSAndroid Build Coastguard Worker                 rates.push_back(FrontendInnerFec::FEC_6_15);  // value = 1 << 39
750*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::codeRates>(rates);
751*4d7e907cSAndroid Build Coastguard Worker                 break;
752*4d7e907cSAndroid Build Coastguard Worker             }
753*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::BANDWIDTH: {
754*4d7e907cSAndroid Build Coastguard Worker                 FrontendBandwidth bandwidth;
755*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
756*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBC: {
757*4d7e907cSAndroid Build Coastguard Worker                         bandwidth.set<FrontendBandwidth::Tag::dvbc>(
758*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbcBandwidth::BANDWIDTH_6MHZ);  // value = 1 << 1
759*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::bandwidth>(bandwidth);
760*4d7e907cSAndroid Build Coastguard Worker                         break;
761*4d7e907cSAndroid Build Coastguard Worker                     }
762*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBT: {
763*4d7e907cSAndroid Build Coastguard Worker                         bandwidth.set<FrontendBandwidth::Tag::dvbt>(
764*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbtBandwidth::BANDWIDTH_8MHZ);  // value = 1 << 1
765*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::bandwidth>(bandwidth);
766*4d7e907cSAndroid Build Coastguard Worker                         break;
767*4d7e907cSAndroid Build Coastguard Worker                     }
768*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
769*4d7e907cSAndroid Build Coastguard Worker                         bandwidth.set<FrontendBandwidth::Tag::isdbt>(
770*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtBandwidth::BANDWIDTH_8MHZ);  // value = 1 << 1
771*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::bandwidth>(bandwidth);
772*4d7e907cSAndroid Build Coastguard Worker                         break;
773*4d7e907cSAndroid Build Coastguard Worker                     }
774*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ATSC3: {
775*4d7e907cSAndroid Build Coastguard Worker                         bandwidth.set<FrontendBandwidth::Tag::atsc3>(
776*4d7e907cSAndroid Build Coastguard Worker                                 FrontendAtsc3Bandwidth::BANDWIDTH_6MHZ);  // value = 1 << 1
777*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::bandwidth>(bandwidth);
778*4d7e907cSAndroid Build Coastguard Worker                         break;
779*4d7e907cSAndroid Build Coastguard Worker                     }
780*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DTMB: {
781*4d7e907cSAndroid Build Coastguard Worker                         bandwidth.set<FrontendBandwidth::Tag::dtmb>(
782*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDtmbBandwidth::BANDWIDTH_8MHZ);  // value = 1 << 1
783*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::bandwidth>(bandwidth);
784*4d7e907cSAndroid Build Coastguard Worker                         break;
785*4d7e907cSAndroid Build Coastguard Worker                     }
786*4d7e907cSAndroid Build Coastguard Worker                     default:
787*4d7e907cSAndroid Build Coastguard Worker                         break;
788*4d7e907cSAndroid Build Coastguard Worker                 }
789*4d7e907cSAndroid Build Coastguard Worker                 break;
790*4d7e907cSAndroid Build Coastguard Worker             }
791*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::GUARD_INTERVAL: {
792*4d7e907cSAndroid Build Coastguard Worker                 FrontendGuardInterval interval;
793*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
794*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBT: {
795*4d7e907cSAndroid Build Coastguard Worker                         interval.set<FrontendGuardInterval::Tag::dvbt>(
796*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbtGuardInterval::INTERVAL_1_32);  // value = 1 << 1
797*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interval>(interval);
798*4d7e907cSAndroid Build Coastguard Worker                         break;
799*4d7e907cSAndroid Build Coastguard Worker                     }
800*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
801*4d7e907cSAndroid Build Coastguard Worker                         interval.set<FrontendGuardInterval::Tag::isdbt>(
802*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtGuardInterval::INTERVAL_1_32);  // value = 1 << 1
803*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interval>(interval);
804*4d7e907cSAndroid Build Coastguard Worker                         break;
805*4d7e907cSAndroid Build Coastguard Worker                     }
806*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DTMB: {
807*4d7e907cSAndroid Build Coastguard Worker                         interval.set<FrontendGuardInterval::Tag::dtmb>(
808*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDtmbGuardInterval::PN_420_VARIOUS);  // value = 1 << 1
809*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interval>(interval);
810*4d7e907cSAndroid Build Coastguard Worker                         break;
811*4d7e907cSAndroid Build Coastguard Worker                     }
812*4d7e907cSAndroid Build Coastguard Worker                     default:
813*4d7e907cSAndroid Build Coastguard Worker                         break;
814*4d7e907cSAndroid Build Coastguard Worker                 }
815*4d7e907cSAndroid Build Coastguard Worker                 break;
816*4d7e907cSAndroid Build Coastguard Worker             }
817*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::TRANSMISSION_MODE: {
818*4d7e907cSAndroid Build Coastguard Worker                 FrontendTransmissionMode transMode;
819*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
820*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBT: {
821*4d7e907cSAndroid Build Coastguard Worker                         transMode.set<FrontendTransmissionMode::Tag::dvbt>(
822*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbtTransmissionMode::MODE_16K_E);  // value = 1 << 8
823*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::transmissionMode>(transMode);
824*4d7e907cSAndroid Build Coastguard Worker                         break;
825*4d7e907cSAndroid Build Coastguard Worker                     }
826*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
827*4d7e907cSAndroid Build Coastguard Worker                         transMode.set<FrontendTransmissionMode::Tag::isdbt>(
828*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtMode::MODE_1);  // value = 1 << 1
829*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::transmissionMode>(transMode);
830*4d7e907cSAndroid Build Coastguard Worker                         break;
831*4d7e907cSAndroid Build Coastguard Worker                     }
832*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DTMB: {
833*4d7e907cSAndroid Build Coastguard Worker                         transMode.set<FrontendTransmissionMode::Tag::dtmb>(
834*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDtmbTransmissionMode::C1);  // value = 1 << 1
835*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::transmissionMode>(transMode);
836*4d7e907cSAndroid Build Coastguard Worker                         break;
837*4d7e907cSAndroid Build Coastguard Worker                     }
838*4d7e907cSAndroid Build Coastguard Worker                     default:
839*4d7e907cSAndroid Build Coastguard Worker                         break;
840*4d7e907cSAndroid Build Coastguard Worker                 }
841*4d7e907cSAndroid Build Coastguard Worker                 break;
842*4d7e907cSAndroid Build Coastguard Worker             }
843*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::UEC: {
844*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::uec>(4);
845*4d7e907cSAndroid Build Coastguard Worker                 break;
846*4d7e907cSAndroid Build Coastguard Worker             }
847*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::T2_SYSTEM_ID: {
848*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::systemId>(5);
849*4d7e907cSAndroid Build Coastguard Worker                 break;
850*4d7e907cSAndroid Build Coastguard Worker             }
851*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::INTERLEAVINGS: {
852*4d7e907cSAndroid Build Coastguard Worker                 FrontendInterleaveMode interleave;
853*4d7e907cSAndroid Build Coastguard Worker                 vector<FrontendInterleaveMode> interleaves;
854*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
855*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBC: {
856*4d7e907cSAndroid Build Coastguard Worker                         // value = 1 << 1
857*4d7e907cSAndroid Build Coastguard Worker                         interleave.set<FrontendInterleaveMode::Tag::dvbc>(
858*4d7e907cSAndroid Build Coastguard Worker                                 FrontendCableTimeInterleaveMode::INTERLEAVING_128_1_0);
859*4d7e907cSAndroid Build Coastguard Worker                         interleaves.push_back(interleave);
860*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interleaving>(interleaves);
861*4d7e907cSAndroid Build Coastguard Worker                         break;
862*4d7e907cSAndroid Build Coastguard Worker                     }
863*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ATSC3: {
864*4d7e907cSAndroid Build Coastguard Worker                         interleave.set<FrontendInterleaveMode::Tag::atsc3>(
865*4d7e907cSAndroid Build Coastguard Worker                                 FrontendAtsc3TimeInterleaveMode::CTI);  // value = 1 << 1
866*4d7e907cSAndroid Build Coastguard Worker                         interleaves.push_back(interleave);
867*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interleaving>(interleaves);
868*4d7e907cSAndroid Build Coastguard Worker                         break;
869*4d7e907cSAndroid Build Coastguard Worker                     }
870*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DTMB: {
871*4d7e907cSAndroid Build Coastguard Worker                         interleave.set<FrontendInterleaveMode::Tag::dtmb>(
872*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDtmbTimeInterleaveMode::TIMER_INT_240);  // value = 1 << 1
873*4d7e907cSAndroid Build Coastguard Worker                         interleaves.push_back(interleave);
874*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interleaving>(interleaves);
875*4d7e907cSAndroid Build Coastguard Worker                         break;
876*4d7e907cSAndroid Build Coastguard Worker                     }
877*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBT: {
878*4d7e907cSAndroid Build Coastguard Worker                         interleave.set<FrontendInterleaveMode::Tag::isdbt>(
879*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0); // value = 1 << 1
880*4d7e907cSAndroid Build Coastguard Worker                         interleaves.push_back(interleave);
881*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::interleaving>(interleaves);
882*4d7e907cSAndroid Build Coastguard Worker                         break;
883*4d7e907cSAndroid Build Coastguard Worker                     }
884*4d7e907cSAndroid Build Coastguard Worker                     default:
885*4d7e907cSAndroid Build Coastguard Worker                         break;
886*4d7e907cSAndroid Build Coastguard Worker                 }
887*4d7e907cSAndroid Build Coastguard Worker                 break;
888*4d7e907cSAndroid Build Coastguard Worker             }
889*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ISDBT_SEGMENTS: {
890*4d7e907cSAndroid Build Coastguard Worker                 vector<int32_t> segments = {2, 3};
891*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isdbtSegment>(segments);
892*4d7e907cSAndroid Build Coastguard Worker                 break;
893*4d7e907cSAndroid Build Coastguard Worker             }
894*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::TS_DATA_RATES: {
895*4d7e907cSAndroid Build Coastguard Worker                 vector<int32_t> dataRates = {4, 5};
896*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::tsDataRate>(dataRates);
897*4d7e907cSAndroid Build Coastguard Worker                 break;
898*4d7e907cSAndroid Build Coastguard Worker             }
899*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ROLL_OFF: {
900*4d7e907cSAndroid Build Coastguard Worker                 FrontendRollOff rollOff;
901*4d7e907cSAndroid Build Coastguard Worker                 switch (mType) {
902*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::DVBS: {
903*4d7e907cSAndroid Build Coastguard Worker                         rollOff.set<FrontendRollOff::Tag::dvbs>(
904*4d7e907cSAndroid Build Coastguard Worker                                 FrontendDvbsRolloff::ROLLOFF_0_35);  // value = 1
905*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::rollOff>(rollOff);
906*4d7e907cSAndroid Build Coastguard Worker                         break;
907*4d7e907cSAndroid Build Coastguard Worker                     }
908*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS: {
909*4d7e907cSAndroid Build Coastguard Worker                         rollOff.set<FrontendRollOff::Tag::isdbs>(
910*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbsRolloff::ROLLOFF_0_35);  // value = 1
911*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::rollOff>(rollOff);
912*4d7e907cSAndroid Build Coastguard Worker                         break;
913*4d7e907cSAndroid Build Coastguard Worker                     }
914*4d7e907cSAndroid Build Coastguard Worker                     case FrontendType::ISDBS3: {
915*4d7e907cSAndroid Build Coastguard Worker                         rollOff.set<FrontendRollOff::Tag::isdbs3>(
916*4d7e907cSAndroid Build Coastguard Worker                                 FrontendIsdbs3Rolloff::ROLLOFF_0_03);  // value = 1
917*4d7e907cSAndroid Build Coastguard Worker                         status.set<FrontendStatus::rollOff>(rollOff);
918*4d7e907cSAndroid Build Coastguard Worker                         break;
919*4d7e907cSAndroid Build Coastguard Worker                     }
920*4d7e907cSAndroid Build Coastguard Worker                     default:
921*4d7e907cSAndroid Build Coastguard Worker                         break;
922*4d7e907cSAndroid Build Coastguard Worker                 }
923*4d7e907cSAndroid Build Coastguard Worker                 break;
924*4d7e907cSAndroid Build Coastguard Worker             }
925*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IS_MISO: {
926*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isMiso>(true);
927*4d7e907cSAndroid Build Coastguard Worker                 break;
928*4d7e907cSAndroid Build Coastguard Worker             }
929*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IS_LINEAR: {
930*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isLinear>(true);
931*4d7e907cSAndroid Build Coastguard Worker                 break;
932*4d7e907cSAndroid Build Coastguard Worker             }
933*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IS_SHORT_FRAMES: {
934*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isShortFrames>(true);
935*4d7e907cSAndroid Build Coastguard Worker                 break;
936*4d7e907cSAndroid Build Coastguard Worker             }
937*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ISDBT_MODE: {
938*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::isdbtMode>(FrontendIsdbtMode::AUTO);
939*4d7e907cSAndroid Build Coastguard Worker                 break;
940*4d7e907cSAndroid Build Coastguard Worker             }
941*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG: {
942*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::partialReceptionFlag>(
943*4d7e907cSAndroid Build Coastguard Worker                         FrontendIsdbtPartialReceptionFlag::AUTO);
944*4d7e907cSAndroid Build Coastguard Worker                 break;
945*4d7e907cSAndroid Build Coastguard Worker             }
946*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::STREAM_ID_LIST: {
947*4d7e907cSAndroid Build Coastguard Worker                 vector<int32_t> streamIds = {0, 1};
948*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::streamIdList>(streamIds);
949*4d7e907cSAndroid Build Coastguard Worker                 break;
950*4d7e907cSAndroid Build Coastguard Worker             }
951*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::DVBT_CELL_IDS: {
952*4d7e907cSAndroid Build Coastguard Worker                 vector<int32_t> dvbtCellIds = {0, 1};
953*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::dvbtCellIds>(dvbtCellIds);
954*4d7e907cSAndroid Build Coastguard Worker                 break;
955*4d7e907cSAndroid Build Coastguard Worker             }
956*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::ATSC3_ALL_PLP_INFO: {
957*4d7e907cSAndroid Build Coastguard Worker                 FrontendScanAtsc3PlpInfo info1;
958*4d7e907cSAndroid Build Coastguard Worker                 info1.plpId = 1;
959*4d7e907cSAndroid Build Coastguard Worker                 info1.bLlsFlag = false;
960*4d7e907cSAndroid Build Coastguard Worker                 FrontendScanAtsc3PlpInfo info2;
961*4d7e907cSAndroid Build Coastguard Worker                 info2.plpId = 2;
962*4d7e907cSAndroid Build Coastguard Worker                 info2.bLlsFlag = true;
963*4d7e907cSAndroid Build Coastguard Worker                 FrontendScanAtsc3PlpInfo info3;
964*4d7e907cSAndroid Build Coastguard Worker                 info3.plpId = 3;
965*4d7e907cSAndroid Build Coastguard Worker                 info3.bLlsFlag = false;
966*4d7e907cSAndroid Build Coastguard Worker                 vector<FrontendScanAtsc3PlpInfo> infos = {info1, info2, info3};
967*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::allPlpInfo>(infos);
968*4d7e907cSAndroid Build Coastguard Worker                 break;
969*4d7e907cSAndroid Build Coastguard Worker             }
970*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IPTV_CONTENT_URL: {
971*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::iptvContentUrl>("");
972*4d7e907cSAndroid Build Coastguard Worker                 break;
973*4d7e907cSAndroid Build Coastguard Worker             }
974*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IPTV_PACKETS_LOST: {
975*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::iptvPacketsLost>(5);
976*4d7e907cSAndroid Build Coastguard Worker                 break;
977*4d7e907cSAndroid Build Coastguard Worker             }
978*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IPTV_PACKETS_RECEIVED: {
979*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::iptvPacketsReceived>(5);
980*4d7e907cSAndroid Build Coastguard Worker                 break;
981*4d7e907cSAndroid Build Coastguard Worker             }
982*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IPTV_WORST_JITTER_MS: {
983*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::iptvWorstJitterMs>(5);
984*4d7e907cSAndroid Build Coastguard Worker                 break;
985*4d7e907cSAndroid Build Coastguard Worker             }
986*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::IPTV_AVERAGE_JITTER_MS: {
987*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::iptvAverageJitterMs>(5);
988*4d7e907cSAndroid Build Coastguard Worker                 break;
989*4d7e907cSAndroid Build Coastguard Worker             }
990*4d7e907cSAndroid Build Coastguard Worker             case FrontendStatusType::STANDARD_EXT: {
991*4d7e907cSAndroid Build Coastguard Worker                 FrontendStandardExt standardExt;
992*4d7e907cSAndroid Build Coastguard Worker                 if (mType == FrontendType::DVBS) {
993*4d7e907cSAndroid Build Coastguard Worker                     standardExt.set<FrontendStandardExt::dvbsStandardExt>(
994*4d7e907cSAndroid Build Coastguard Worker                             FrontendDvbsStandard::S2X);
995*4d7e907cSAndroid Build Coastguard Worker                 } else if (mType == FrontendType::DVBT) {
996*4d7e907cSAndroid Build Coastguard Worker                     standardExt.set<FrontendStandardExt::dvbtStandardExt>(FrontendDvbtStandard::T2);
997*4d7e907cSAndroid Build Coastguard Worker                 }
998*4d7e907cSAndroid Build Coastguard Worker                 status.set<FrontendStatus::standardExt>(standardExt);
999*4d7e907cSAndroid Build Coastguard Worker                 break;
1000*4d7e907cSAndroid Build Coastguard Worker             }
1001*4d7e907cSAndroid Build Coastguard Worker             default: {
1002*4d7e907cSAndroid Build Coastguard Worker                 continue;
1003*4d7e907cSAndroid Build Coastguard Worker             }
1004*4d7e907cSAndroid Build Coastguard Worker         }
1005*4d7e907cSAndroid Build Coastguard Worker         _aidl_return->push_back(status);
1006*4d7e907cSAndroid Build Coastguard Worker     }
1007*4d7e907cSAndroid Build Coastguard Worker 
1008*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1009*4d7e907cSAndroid Build Coastguard Worker }
1010*4d7e907cSAndroid Build Coastguard Worker 
setLnb(int32_t)1011*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::setLnb(int32_t /* in_lnbId */) {
1012*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1013*4d7e907cSAndroid Build Coastguard Worker     if (!supportsSatellite()) {
1014*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
1015*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_STATE));
1016*4d7e907cSAndroid Build Coastguard Worker     }
1017*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1018*4d7e907cSAndroid Build Coastguard Worker }
1019*4d7e907cSAndroid Build Coastguard Worker 
linkCiCam(int32_t in_ciCamId,int32_t * _aidl_return)1020*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) {
1021*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1022*4d7e907cSAndroid Build Coastguard Worker 
1023*4d7e907cSAndroid Build Coastguard Worker     mCiCamId = in_ciCamId;
1024*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = 0;
1025*4d7e907cSAndroid Build Coastguard Worker 
1026*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1027*4d7e907cSAndroid Build Coastguard Worker }
1028*4d7e907cSAndroid Build Coastguard Worker 
unlinkCiCam(int32_t)1029*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::unlinkCiCam(int32_t /* in_ciCamId */) {
1030*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1031*4d7e907cSAndroid Build Coastguard Worker 
1032*4d7e907cSAndroid Build Coastguard Worker     mCiCamId = -1;
1033*4d7e907cSAndroid Build Coastguard Worker 
1034*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1035*4d7e907cSAndroid Build Coastguard Worker }
1036*4d7e907cSAndroid Build Coastguard Worker 
dump(int fd,const char **,uint32_t)1037*4d7e907cSAndroid Build Coastguard Worker binder_status_t Frontend::dump(int fd, const char** /* args */, uint32_t /* numArgs */) {
1038*4d7e907cSAndroid Build Coastguard Worker     dprintf(fd, "  Frontend %d\n", mId);
1039*4d7e907cSAndroid Build Coastguard Worker     dprintf(fd, "    mType: %d\n", mType);
1040*4d7e907cSAndroid Build Coastguard Worker     dprintf(fd, "    mIsLocked: %d\n", mIsLocked);
1041*4d7e907cSAndroid Build Coastguard Worker     dprintf(fd, "    mCiCamId: %d\n", mCiCamId);
1042*4d7e907cSAndroid Build Coastguard Worker     dprintf(fd, "    mFrontendStatusCaps:");
1043*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < mFrontendStatusCaps.size(); i++) {
1044*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "        %d\n", mFrontendStatusCaps[i]);
1045*4d7e907cSAndroid Build Coastguard Worker     }
1046*4d7e907cSAndroid Build Coastguard Worker     return STATUS_OK;
1047*4d7e907cSAndroid Build Coastguard Worker }
1048*4d7e907cSAndroid Build Coastguard Worker 
getHardwareInfo(std::string * _aidl_return)1049*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getHardwareInfo(std::string* _aidl_return) {
1050*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1051*4d7e907cSAndroid Build Coastguard Worker 
1052*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = "Sample Frontend";
1053*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1054*4d7e907cSAndroid Build Coastguard Worker }
1055*4d7e907cSAndroid Build Coastguard Worker 
removeOutputPid(int32_t)1056*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::removeOutputPid(int32_t /* in_pid */) {
1057*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1058*4d7e907cSAndroid Build Coastguard Worker 
1059*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
1060*4d7e907cSAndroid Build Coastguard Worker             static_cast<int32_t>(Result::UNAVAILABLE));
1061*4d7e907cSAndroid Build Coastguard Worker }
1062*4d7e907cSAndroid Build Coastguard Worker 
getFrontendStatusReadiness(const std::vector<FrontendStatusType> & in_statusTypes,std::vector<FrontendStatusReadiness> * _aidl_return)1063*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getFrontendStatusReadiness(
1064*4d7e907cSAndroid Build Coastguard Worker         const std::vector<FrontendStatusType>& in_statusTypes,
1065*4d7e907cSAndroid Build Coastguard Worker         std::vector<FrontendStatusReadiness>* _aidl_return) {
1066*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
1067*4d7e907cSAndroid Build Coastguard Worker 
1068*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->resize(in_statusTypes.size());
1069*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < in_statusTypes.size(); i++) {
1070*4d7e907cSAndroid Build Coastguard Worker         int j = 0;
1071*4d7e907cSAndroid Build Coastguard Worker         while (j < mFrontendStatusCaps.size()) {
1072*4d7e907cSAndroid Build Coastguard Worker             if (in_statusTypes[i] == mFrontendStatusCaps[j]) {
1073*4d7e907cSAndroid Build Coastguard Worker                 (*_aidl_return)[i] = FrontendStatusReadiness::STABLE;
1074*4d7e907cSAndroid Build Coastguard Worker                 break;
1075*4d7e907cSAndroid Build Coastguard Worker             }
1076*4d7e907cSAndroid Build Coastguard Worker             j++;
1077*4d7e907cSAndroid Build Coastguard Worker         }
1078*4d7e907cSAndroid Build Coastguard Worker         if (j >= mFrontendStatusCaps.size()) {
1079*4d7e907cSAndroid Build Coastguard Worker             (*_aidl_return)[i] = FrontendStatusReadiness::UNSUPPORTED;
1080*4d7e907cSAndroid Build Coastguard Worker         }
1081*4d7e907cSAndroid Build Coastguard Worker     }
1082*4d7e907cSAndroid Build Coastguard Worker 
1083*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
1084*4d7e907cSAndroid Build Coastguard Worker }
1085*4d7e907cSAndroid Build Coastguard Worker 
getFrontendType()1086*4d7e907cSAndroid Build Coastguard Worker FrontendType Frontend::getFrontendType() {
1087*4d7e907cSAndroid Build Coastguard Worker     return mType;
1088*4d7e907cSAndroid Build Coastguard Worker }
1089*4d7e907cSAndroid Build Coastguard Worker 
getFrontendId()1090*4d7e907cSAndroid Build Coastguard Worker int32_t Frontend::getFrontendId() {
1091*4d7e907cSAndroid Build Coastguard Worker     return mId;
1092*4d7e907cSAndroid Build Coastguard Worker }
1093*4d7e907cSAndroid Build Coastguard Worker 
getIptvPluginInterface()1094*4d7e907cSAndroid Build Coastguard Worker dtv_plugin* Frontend::getIptvPluginInterface() {
1095*4d7e907cSAndroid Build Coastguard Worker     return mIptvPluginInterface;
1096*4d7e907cSAndroid Build Coastguard Worker }
1097*4d7e907cSAndroid Build Coastguard Worker 
getIptvTransportDescription()1098*4d7e907cSAndroid Build Coastguard Worker string Frontend::getIptvTransportDescription() {
1099*4d7e907cSAndroid Build Coastguard Worker     return mIptvTransportDescription;
1100*4d7e907cSAndroid Build Coastguard Worker }
1101*4d7e907cSAndroid Build Coastguard Worker 
getIptvPluginStreamer()1102*4d7e907cSAndroid Build Coastguard Worker dtv_streamer* Frontend::getIptvPluginStreamer() {
1103*4d7e907cSAndroid Build Coastguard Worker     return mIptvPluginStreamer;
1104*4d7e907cSAndroid Build Coastguard Worker }
1105*4d7e907cSAndroid Build Coastguard Worker 
supportsSatellite()1106*4d7e907cSAndroid Build Coastguard Worker bool Frontend::supportsSatellite() {
1107*4d7e907cSAndroid Build Coastguard Worker     return mType == FrontendType::DVBS || mType == FrontendType::ISDBS ||
1108*4d7e907cSAndroid Build Coastguard Worker            mType == FrontendType::ISDBS3;
1109*4d7e907cSAndroid Build Coastguard Worker }
1110*4d7e907cSAndroid Build Coastguard Worker 
isLocked()1111*4d7e907cSAndroid Build Coastguard Worker bool Frontend::isLocked() {
1112*4d7e907cSAndroid Build Coastguard Worker     return mIsLocked;
1113*4d7e907cSAndroid Build Coastguard Worker }
1114*4d7e907cSAndroid Build Coastguard Worker 
getFrontendInfo(FrontendInfo * _aidl_return)1115*4d7e907cSAndroid Build Coastguard Worker void Frontend::getFrontendInfo(FrontendInfo* _aidl_return) {
1116*4d7e907cSAndroid Build Coastguard Worker     // assign randomly selected values for testing.
1117*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = {
1118*4d7e907cSAndroid Build Coastguard Worker             .type = mType,
1119*4d7e907cSAndroid Build Coastguard Worker             .minFrequency = 139000000,
1120*4d7e907cSAndroid Build Coastguard Worker             .maxFrequency = 1139000000,
1121*4d7e907cSAndroid Build Coastguard Worker             .minSymbolRate = 45,
1122*4d7e907cSAndroid Build Coastguard Worker             .maxSymbolRate = 1145,
1123*4d7e907cSAndroid Build Coastguard Worker             .acquireRange = 30,
1124*4d7e907cSAndroid Build Coastguard Worker             .exclusiveGroupId = 57,
1125*4d7e907cSAndroid Build Coastguard Worker             .statusCaps = mFrontendStatusCaps,
1126*4d7e907cSAndroid Build Coastguard Worker             .frontendCaps = mFrontendCaps,
1127*4d7e907cSAndroid Build Coastguard Worker     };
1128*4d7e907cSAndroid Build Coastguard Worker }
1129*4d7e907cSAndroid Build Coastguard Worker 
1130*4d7e907cSAndroid Build Coastguard Worker }  // namespace tuner
1131*4d7e907cSAndroid Build Coastguard Worker }  // namespace tv
1132*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
1133*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
1134*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl
1135