Amy Zhang | 06fa69e | 2021-04-09 09:56:25 -0700 | [diff] [blame] | 1 | /* |
| 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 | |
| 20 | using android::hardware::tv::tuner::V1_1::AudioStreamType; |
| 21 | using android::hardware::tv::tuner::V1_1::AvStreamType; |
| 22 | using android::hardware::tv::tuner::V1_1::FrontendDvbsScanType; |
| 23 | using android::hardware::tv::tuner::V1_1::FrontendDvbsSettingsExt1_1; |
| 24 | using android::hardware::tv::tuner::V1_1::FrontendDvbtSettingsExt1_1; |
| 25 | using android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1; |
| 26 | using android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1; |
| 27 | using android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1; |
| 28 | using android::hardware::tv::tuner::V1_1::VideoStreamType; |
| 29 | |
| 30 | struct 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 | |
| 39 | struct 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 | |
| 48 | struct 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 | }; |