blob: 13d5303230aa56cde085a835819355628bf3bdb1 [file] [log] [blame]
Amy Zhang06fa69e2021-04-09 09:56:25 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
18#include "TunerTestingConfigReaderV1_0.h"
19
20using android::hardware::tv::tuner::V1_1::AudioStreamType;
21using android::hardware::tv::tuner::V1_1::AvStreamType;
22using android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
23using android::hardware::tv::tuner::V1_1::FrontendDvbsSettingsExt1_1;
24using android::hardware::tv::tuner::V1_1::FrontendDvbtSettingsExt1_1;
25using android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
26using android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
27using android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
28using android::hardware::tv::tuner::V1_1::VideoStreamType;
29
30struct FrontendConfig1_1 {
31 FrontendConfig config1_0;
32 bool canConnectToCiCam;
33 uint32_t ciCamId;
34 FrontendSettingsExt1_1 settingsExt1_1;
35 vector<FrontendStatusTypeExt1_1> tuneStatusTypes;
36 vector<FrontendStatusExt1_1> expectTuneStatuses;
37};
38
39struct FilterConfig1_1 {
40 FilterConfig config1_0;
41 AvStreamType streamType;
42 uint32_t ipCid;
43 uint32_t monitorEventTypes;
44
45 bool operator<(const FilterConfig& /*c*/) const { return false; }
46};
47
48struct TunerTestingConfigReader1_1 {
49 public:
50 static void readFrontendConfig1_1(map<string, FrontendConfig1_1>& frontendMap) {
51 map<string, FrontendConfig> frontendMap1_0;
52 TunerTestingConfigReader1_0::readFrontendConfig1_0(frontendMap1_0);
53 for (auto it = frontendMap1_0.begin(); it != frontendMap1_0.end(); it++) {
54 frontendMap[it->first].config1_0 = it->second;
55 }
56
57 auto hardwareConfig = TunerTestingConfigReader1_0::getHardwareConfig();
58 if (hardwareConfig.hasFrontends()) {
59 // TODO: b/182519645 complete the tune status config
60 vector<FrontendStatusTypeExt1_1> types;
61 types.push_back(FrontendStatusTypeExt1_1::UEC);
62 types.push_back(FrontendStatusTypeExt1_1::IS_MISO);
63 vector<FrontendStatusExt1_1> statuses;
64 FrontendStatusExt1_1 status;
65 status.uec(4);
66 statuses.push_back(status);
67 status.isMiso(true);
68 statuses.push_back(status);
69
70 auto frontends = *hardwareConfig.getFirstFrontends();
71
72 for (auto feConfig : frontends.getFrontend()) {
73 string id = feConfig.getId();
74 switch (feConfig.getType()) {
75 case FrontendTypeEnum::DVBS:
76 frontendMap[id].settingsExt1_1.settingExt.dvbs(
77 readDvbsFrontendSettings1_1(feConfig));
78 break;
79 case FrontendTypeEnum::DVBT: {
80 frontendMap[id].settingsExt1_1.settingExt.dvbt(
81 readDvbtFrontendSettings1_1(feConfig));
82 break;
83 }
84 case FrontendTypeEnum::DTMB:
85 frontendMap[id].config1_0.type = static_cast<FrontendType>(
86 android::hardware::tv::tuner::V1_1::FrontendType::DTMB);
87 break;
88 case FrontendTypeEnum::UNKNOWN:
89 ALOGW("[ConfigReader] invalid frontend type");
90 return;
91 default:
92 ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
93 break;
94 }
95 if (feConfig.hasEndFrequency()) {
96 frontendMap[id].settingsExt1_1.endFrequency =
97 (uint32_t)feConfig.getEndFrequency();
98 }
99 // TODO: b/182519645 complete the tune status config
100 frontendMap[id].tuneStatusTypes = types;
101 frontendMap[id].expectTuneStatuses = statuses;
102 getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId);
103 }
104 }
105 }
106
107 static void readFilterConfig1_1(map<string, FilterConfig1_1>& filterMap) {
108 map<string, FilterConfig> filterMap1_0;
109 TunerTestingConfigReader1_0::readFilterConfig1_0(filterMap1_0);
110 for (auto it = filterMap1_0.begin(); it != filterMap1_0.end(); it++) {
111 filterMap[it->first].config1_0 = it->second;
112 }
113 auto hardwareConfig = TunerTestingConfigReader1_0::getHardwareConfig();
114 if (hardwareConfig.hasFilters()) {
115 auto filters = *hardwareConfig.getFirstFilters();
116 for (auto filterConfig : filters.getFilter()) {
117 string id = filterConfig.getId();
118 if (filterConfig.hasMonitorEventTypes()) {
119 filterMap[id].monitorEventTypes = (uint32_t)filterConfig.getMonitorEventTypes();
120 }
121 if (filterConfig.hasAvFilterSettings_optional()) {
122 AvStreamType type;
123 auto av = filterConfig.getFirstAvFilterSettings_optional();
124 if (av->hasAudioStreamType_optional()) {
125 type.audio(static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
126 filterMap[id].streamType = type;
127 }
128 if (av->hasVideoStreamType_optional()) {
129 type.video(static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
130 filterMap[id].streamType = type;
131 }
132 }
133 if (filterConfig.hasIpFilterConfig_optional()) {
134 auto ip = filterConfig.getFirstIpFilterConfig_optional();
135 if (ip->hasIpCid()) {
136 filterMap[id].ipCid = ip->getIpCid();
137 }
138 }
139 }
140 }
141 }
142
143 private:
144 static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, uint32_t& ciCamId) {
145 if (!feConfig.hasConnectToCicamId()) {
146 canConnectToCiCam = false;
147 ciCamId = -1;
148 }
149 canConnectToCiCam = true;
150 ciCamId = static_cast<uint32_t>(feConfig.getConnectToCicamId());
151 }
152
153 static FrontendDvbsSettingsExt1_1 readDvbsFrontendSettings1_1(Frontend feConfig) {
154 FrontendDvbsSettingsExt1_1 dvbsSettings;
155 if (!feConfig.hasDvbsFrontendSettings_optional()) {
156 return dvbsSettings;
157 }
158 auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
159 if (dvbs->hasScanType()) {
160 dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
161 }
162 if (dvbs->hasIsDiseqcRxMessage()) {
163 dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
164 }
165 return dvbsSettings;
166 }
167
168 static FrontendDvbtSettingsExt1_1 readDvbtFrontendSettings1_1(Frontend feConfig) {
169 FrontendDvbtSettingsExt1_1 dvbtSettings;
170 if (!feConfig.hasDvbtFrontendSettings_optional()) {
171 return dvbtSettings;
172 }
173 auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
174 auto trans = dvbt->getTransmissionMode();
175 dvbtSettings.transmissionMode =
176 static_cast<android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
177 trans);
178 if (dvbt->hasConstellation()) {
179 dvbtSettings.constellation =
180 static_cast<android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
181 dvbt->getConstellation());
182 }
183 return dvbtSettings;
184 }
185};