You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
7.9 KiB
185 lines
7.9 KiB
/*
|
|
* Copyright 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <android-base/logging.h>
|
|
#include "TunerTestingConfigReaderV1_0.h"
|
|
|
|
using android::hardware::tv::tuner::V1_1::AudioStreamType;
|
|
using android::hardware::tv::tuner::V1_1::AvStreamType;
|
|
using android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
|
|
using android::hardware::tv::tuner::V1_1::FrontendDvbsSettingsExt1_1;
|
|
using android::hardware::tv::tuner::V1_1::FrontendDvbtSettingsExt1_1;
|
|
using android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
|
|
using android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
|
|
using android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
|
|
using android::hardware::tv::tuner::V1_1::VideoStreamType;
|
|
|
|
struct FrontendConfig1_1 {
|
|
FrontendConfig config1_0;
|
|
bool canConnectToCiCam;
|
|
uint32_t ciCamId;
|
|
FrontendSettingsExt1_1 settingsExt1_1;
|
|
vector<FrontendStatusTypeExt1_1> tuneStatusTypes;
|
|
vector<FrontendStatusExt1_1> expectTuneStatuses;
|
|
};
|
|
|
|
struct FilterConfig1_1 {
|
|
FilterConfig config1_0;
|
|
AvStreamType streamType;
|
|
uint32_t ipCid;
|
|
uint32_t monitorEventTypes;
|
|
|
|
bool operator<(const FilterConfig& /*c*/) const { return false; }
|
|
};
|
|
|
|
struct TunerTestingConfigReader1_1 {
|
|
public:
|
|
static void readFrontendConfig1_1(map<string, FrontendConfig1_1>& frontendMap) {
|
|
map<string, FrontendConfig> frontendMap1_0;
|
|
TunerTestingConfigReader1_0::readFrontendConfig1_0(frontendMap1_0);
|
|
for (auto it = frontendMap1_0.begin(); it != frontendMap1_0.end(); it++) {
|
|
frontendMap[it->first].config1_0 = it->second;
|
|
}
|
|
|
|
auto hardwareConfig = TunerTestingConfigReader1_0::getHardwareConfig();
|
|
if (hardwareConfig.hasFrontends()) {
|
|
// TODO: b/182519645 complete the tune status config
|
|
vector<FrontendStatusTypeExt1_1> types;
|
|
types.push_back(FrontendStatusTypeExt1_1::UEC);
|
|
types.push_back(FrontendStatusTypeExt1_1::IS_MISO);
|
|
vector<FrontendStatusExt1_1> statuses;
|
|
FrontendStatusExt1_1 status;
|
|
status.uec(4);
|
|
statuses.push_back(status);
|
|
status.isMiso(true);
|
|
statuses.push_back(status);
|
|
|
|
auto frontends = *hardwareConfig.getFirstFrontends();
|
|
|
|
for (auto feConfig : frontends.getFrontend()) {
|
|
string id = feConfig.getId();
|
|
switch (feConfig.getType()) {
|
|
case FrontendTypeEnum::DVBS:
|
|
frontendMap[id].settingsExt1_1.settingExt.dvbs(
|
|
readDvbsFrontendSettings1_1(feConfig));
|
|
break;
|
|
case FrontendTypeEnum::DVBT: {
|
|
frontendMap[id].settingsExt1_1.settingExt.dvbt(
|
|
readDvbtFrontendSettings1_1(feConfig));
|
|
break;
|
|
}
|
|
case FrontendTypeEnum::DTMB:
|
|
frontendMap[id].config1_0.type = static_cast<FrontendType>(
|
|
android::hardware::tv::tuner::V1_1::FrontendType::DTMB);
|
|
break;
|
|
case FrontendTypeEnum::UNKNOWN:
|
|
ALOGW("[ConfigReader] invalid frontend type");
|
|
return;
|
|
default:
|
|
ALOGW("[ConfigReader] fe already handled in 1_0 reader.");
|
|
break;
|
|
}
|
|
if (feConfig.hasEndFrequency()) {
|
|
frontendMap[id].settingsExt1_1.endFrequency =
|
|
(uint32_t)feConfig.getEndFrequency();
|
|
}
|
|
// TODO: b/182519645 complete the tune status config
|
|
frontendMap[id].tuneStatusTypes = types;
|
|
frontendMap[id].expectTuneStatuses = statuses;
|
|
getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void readFilterConfig1_1(map<string, FilterConfig1_1>& filterMap) {
|
|
map<string, FilterConfig> filterMap1_0;
|
|
TunerTestingConfigReader1_0::readFilterConfig1_0(filterMap1_0);
|
|
for (auto it = filterMap1_0.begin(); it != filterMap1_0.end(); it++) {
|
|
filterMap[it->first].config1_0 = it->second;
|
|
}
|
|
auto hardwareConfig = TunerTestingConfigReader1_0::getHardwareConfig();
|
|
if (hardwareConfig.hasFilters()) {
|
|
auto filters = *hardwareConfig.getFirstFilters();
|
|
for (auto filterConfig : filters.getFilter()) {
|
|
string id = filterConfig.getId();
|
|
if (filterConfig.hasMonitorEventTypes()) {
|
|
filterMap[id].monitorEventTypes = (uint32_t)filterConfig.getMonitorEventTypes();
|
|
}
|
|
if (filterConfig.hasAvFilterSettings_optional()) {
|
|
AvStreamType type;
|
|
auto av = filterConfig.getFirstAvFilterSettings_optional();
|
|
if (av->hasAudioStreamType_optional()) {
|
|
type.audio(static_cast<AudioStreamType>(av->getAudioStreamType_optional()));
|
|
filterMap[id].streamType = type;
|
|
}
|
|
if (av->hasVideoStreamType_optional()) {
|
|
type.video(static_cast<VideoStreamType>(av->getVideoStreamType_optional()));
|
|
filterMap[id].streamType = type;
|
|
}
|
|
}
|
|
if (filterConfig.hasIpFilterConfig_optional()) {
|
|
auto ip = filterConfig.getFirstIpFilterConfig_optional();
|
|
if (ip->hasIpCid()) {
|
|
filterMap[id].ipCid = ip->getIpCid();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, uint32_t& ciCamId) {
|
|
if (!feConfig.hasConnectToCicamId()) {
|
|
canConnectToCiCam = false;
|
|
ciCamId = -1;
|
|
}
|
|
canConnectToCiCam = true;
|
|
ciCamId = static_cast<uint32_t>(feConfig.getConnectToCicamId());
|
|
}
|
|
|
|
static FrontendDvbsSettingsExt1_1 readDvbsFrontendSettings1_1(Frontend feConfig) {
|
|
FrontendDvbsSettingsExt1_1 dvbsSettings;
|
|
if (!feConfig.hasDvbsFrontendSettings_optional()) {
|
|
return dvbsSettings;
|
|
}
|
|
auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional();
|
|
if (dvbs->hasScanType()) {
|
|
dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType());
|
|
}
|
|
if (dvbs->hasIsDiseqcRxMessage()) {
|
|
dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage();
|
|
}
|
|
return dvbsSettings;
|
|
}
|
|
|
|
static FrontendDvbtSettingsExt1_1 readDvbtFrontendSettings1_1(Frontend feConfig) {
|
|
FrontendDvbtSettingsExt1_1 dvbtSettings;
|
|
if (!feConfig.hasDvbtFrontendSettings_optional()) {
|
|
return dvbtSettings;
|
|
}
|
|
auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional();
|
|
auto trans = dvbt->getTransmissionMode();
|
|
dvbtSettings.transmissionMode =
|
|
static_cast<android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
|
|
trans);
|
|
if (dvbt->hasConstellation()) {
|
|
dvbtSettings.constellation =
|
|
static_cast<android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
|
|
dvbt->getConstellation());
|
|
}
|
|
return dvbtSettings;
|
|
}
|
|
}; |