add basic support for DVB-T

This needs more fine tuning wrt scan setup etc, but should work for now.
This commit is contained in:
Stefan Seyfried
2012-10-07 16:01:19 +02:00
parent 0061aac2b3
commit b02886aa92
17 changed files with 433 additions and 46 deletions

View File

@@ -202,6 +202,18 @@ int CScanTs::exec(CMenuTarget* /*parent*/, const std::string & actionKey)
TP.feparams.dvb_feparams.u.qpsk.symbol_rate = atoi(scansettings.TP_rate);
TP.feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) scansettings.TP_fec;
TP.polarization = scansettings.TP_pol;
} else if (g_info.delivery_system == DVB_T) {
/* DVB-T. TODO: proper menu and parameter setup, not all "AUTO" */
if (TP.feparams.dvb_feparams.frequency < 300000)
TP.feparams.dvb_feparams.u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
else
TP.feparams.dvb_feparams.u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
TP.feparams.dvb_feparams.u.ofdm.code_rate_HP = FEC_AUTO;
TP.feparams.dvb_feparams.u.ofdm.code_rate_LP = FEC_AUTO;
TP.feparams.dvb_feparams.u.ofdm.constellation = QAM_AUTO;
TP.feparams.dvb_feparams.u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
TP.feparams.dvb_feparams.u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
TP.feparams.dvb_feparams.u.ofdm.hierarchy_information = HIERARCHY_AUTO;
} else {
TP.feparams.dvb_feparams.u.qam.symbol_rate = atoi(scansettings.TP_rate);
TP.feparams.dvb_feparams.u.qam.fec_inner = (fe_code_rate_t)scansettings.TP_fec;

View File

@@ -218,7 +218,19 @@ CScanSetup::CScanSetup(bool wizard_mode)
is_wizard = wizard_mode;
//define caption of some forwarders and widgets depends of current receiver type
satprov_locale = (r_system == DVB_S) ? LOCALE_SATSETUP_SATELLITE : LOCALE_CABLESETUP_PROVIDER;
switch (r_system)
{
case DVB_S:
satprov_locale = LOCALE_SATSETUP_SATELLITE;
break;
case DVB_T:
satprov_locale = LOCALE_TERRESTRIALSETUP_PROVIDER;
break;
case DVB_C:
default:
satprov_locale = LOCALE_CABLESETUP_PROVIDER;
break;
}
satSelect = NULL;
frontendSetup = NULL;
@@ -368,7 +380,7 @@ int CScanSetup::showScanMenu()
/* add configured satellites to satSelect */
fillSatSelect();
}
else if (r_system == DVB_C) //cable
else if (r_system == DVB_C || r_system == DVB_T) //cable
{
//--------------------------------------------------------------
settings->addItem(GenericMenuSeparatorLine);
@@ -848,15 +860,20 @@ int CScanSetup::addScanOptionsItems(CMenuWidget *options_menu, const int &shortc
printf("[neutrino] CScanSetup call %s...\n", __FUNCTION__);
int shortCut = shortcut;
CMenuOptionChooser *fec = NULL;
CMenuOptionChooser *mod_pol= NULL;
CStringInput *rate = NULL;
CMenuForwarder *Rate = NULL;
CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, (char *) scansettings.TP_freq, freq_length, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789");
CMenuForwarder *Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++));
CStringInput *rate = new CStringInput(LOCALE_EXTRA_TP_RATE, (char *) scansettings.TP_rate, 8, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789");
CMenuForwarder *Rate = new CMenuDForwarder(LOCALE_EXTRA_TP_RATE, true, scansettings.TP_rate, rate, "", CRCInput::convertDigitToKey(shortCut++));
if (r_system != DVB_T) {
rate = new CStringInput(LOCALE_EXTRA_TP_RATE, (char *) scansettings.TP_rate, 8, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789");
Rate = new CMenuDForwarder(LOCALE_EXTRA_TP_RATE, true, scansettings.TP_rate, rate, "", CRCInput::convertDigitToKey(shortCut++));
}
CMenuOptionChooser *fec = NULL;
CMenuOptionChooser *mod_pol= NULL;
/* TODO: DVB-T scan options */
if (r_system == DVB_S) {
fec = new CMenuOptionChooser(LOCALE_EXTRA_TP_FEC, (int *)&scansettings.TP_fec, SATSETUP_SCANTP_FEC, fec_count, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true);
mod_pol = new CMenuOptionChooser(LOCALE_EXTRA_TP_POL, (int *)&scansettings.TP_pol, SATSETUP_SCANTP_POL, SATSETUP_SCANTP_POL_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++));
@@ -865,10 +882,12 @@ int CScanSetup::addScanOptionsItems(CMenuWidget *options_menu, const int &shortc
}
options_menu->addItem(Freq);
options_menu->addItem(Rate);
if (r_system == DVB_S)
if (Rate)
options_menu->addItem(Rate);
if (fec)
options_menu->addItem(fec);
options_menu->addItem(mod_pol);
if (mod_pol)
options_menu->addItem(mod_pol);
return shortCut;
}

View File

@@ -1869,7 +1869,18 @@ fprintf(stderr, "[neutrino start] %d -> %5ld ms\n", __LINE__, time_monotonic_ms
cpuFreq = new cCpuFreqManager();
cpuFreq->SetCpuFreq(g_settings.cpufreq * 1000 * 1000);
g_info.delivery_system = CFEManager::getInstance()->getLiveFE()->getInfo()->type == FE_QPSK ? DVB_S : DVB_C;
switch (CFEManager::getInstance()->getLiveFE()->getInfo()->type) {
case FE_QPSK:
g_info.delivery_system = DVB_S;
break;
case FE_OFDM:
g_info.delivery_system = DVB_T;
break;
case FE_QAM:
default:
g_info.delivery_system = DVB_C;
break;
}
#if HAVE_COOL_HARDWARE
/* only SAT-hd1 before rev 8 has fan */
g_info.has_fan = (cs_get_revision() < 8 && g_info.delivery_system == DVB_S);

View File

@@ -1215,6 +1215,7 @@ typedef enum
LOCALE_SCANTS_ABORT_HEADER,
LOCALE_SCANTS_ACTCABLE,
LOCALE_SCANTS_ACTSATELLITE,
LOCALE_SCANTS_ACTTERRESTRIAL,
LOCALE_SCANTS_BOUQUET,
LOCALE_SCANTS_BOUQUET_CREATE,
LOCALE_SCANTS_BOUQUET_ERASE,
@@ -1302,6 +1303,7 @@ typedef enum
LOCALE_STRINGINPUT_CLEAR,
LOCALE_SUBTITLES_HEAD,
LOCALE_SUBTITLES_STOP,
LOCALE_TERRESTRIALSETUP_PROVIDER,
LOCALE_TIMER_EVENTRECORD_MSG,
LOCALE_TIMER_EVENTRECORD_TITLE,
LOCALE_TIMER_EVENTTIMED_MSG,

View File

@@ -1215,6 +1215,7 @@ const char * locale_real_names[] =
"scants.abort_header",
"scants.actcable",
"scants.actsatellite",
"scants.actterrestrial",
"scants.bouquet",
"scants.bouquet_create",
"scants.bouquet_erase",
@@ -1302,6 +1303,7 @@ const char * locale_real_names[] =
"stringinput.clear",
"subtitles.head",
"subtitles.stop",
"terrestrialsetup.provider",
"timer.eventrecord.msg",
"timer.eventrecord.title",
"timer.eventtimed.msg",

View File

@@ -88,7 +88,7 @@ class CServiceManager
sat_transponder_map_t satelliteTransponders;
bool ParseScanXml();
void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, bool cable);
void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, fe_type fe);
void ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq, uint8_t polarization);
void FindTransponder(xmlNodePtr search);
void ParseSatTransponders(fe_type_t frontendType, xmlNodePtr search, t_satellite_position satellitePosition);

View File

@@ -60,7 +60,6 @@ class CServiceScan : public OpenThreads::Thread
private:
bool started;
bool running;
bool cable;
bool abort_scan;
scan_type_t scan_mode;
int flags;

View File

@@ -47,6 +47,7 @@
#define CABLES_XML CONFIGDIR "/cables.xml"
#define SATELLITES_XML CONFIGDIR "/satellites.xml"
#define TERRESTRIAL_XML CONFIGDIR "/terrestrial.xml"
#if HAVE_TRIPLEDRAGON == 0
#define AUDIO_DEVICE "/dev/dvb/adapter0/audio0"

View File

@@ -52,17 +52,27 @@ extern int zapit_debug;
#define FREQUENCY 1
#define MODULATION 2
#define INVERSION 3
// common to S/S2/C
#define SYMBOL_RATE 4
#define DELIVERY_SYSTEM 5
#define INNER_FEC 6
// DVB-S/S2 specific
#define PILOTS 7
#define ROLLOFF 8
// DVB-T specific
#define BANDWIDTH 4
#define CODE_RATE_HP 6
#define CODE_RATE_LP 7
#define TRANSMISSION_MODE 8
#define GUARD_INTERVAL 9
#define HIERARCHY 10
#define FE_COMMON_PROPS 2
#define FE_DVBS_PROPS 6
#define FE_DVBS2_PROPS 8
#define FE_DVBC_PROPS 6
#define FE_DVBT_PROPS 10
/* stolen from dvb.c from vlc */
static const struct dtv_property dvbs_cmdargs[] = {
@@ -100,6 +110,21 @@ static const struct dtv_property dvbc_cmdargs[] = {
{ DTV_TUNE, {}, { 0 }, 0},
};
static const struct dtv_property dvbt_cmdargs[] = {
{ DTV_CLEAR, {0,0,0}, { 0 } ,0},
{ DTV_FREQUENCY, {}, { 0 } ,0},
{ DTV_MODULATION, {}, { QAM_AUTO } ,0},
{ DTV_INVERSION, {}, { INVERSION_AUTO } ,0},
{ DTV_BANDWIDTH_HZ, {}, { 8000000 } ,0},
{ DTV_DELIVERY_SYSTEM, {}, { SYS_DVBT } ,0},
{ DTV_CODE_RATE_HP, {}, { FEC_AUTO } ,0},
{ DTV_CODE_RATE_LP, {}, { FEC_AUTO } ,0},
{ DTV_TRANSMISSION_MODE,{}, { TRANSMISSION_MODE_AUTO}, 0},
{ DTV_GUARD_INTERVAL, {}, { GUARD_INTERVAL_AUTO}, 0},
{ DTV_HIERARCHY, {}, { HIERARCHY_AUTO }, 0},
{ DTV_TUNE, {}, { 0 }, 0},
};
#define diff(x,y) (max(x,y) - min(x,y))
@@ -528,7 +553,8 @@ void CFrontend::getDelSys(int f, int m, char *&fec, char *&sys, char *&mod)
void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, char *&mod)
{
if (type == FE_QPSK) {
switch (type) {
case FE_QPSK:
if (f < FEC_S2_QPSK_1_2) {
sys = (char *)"DVB";
mod = (char *)"QPSK";
@@ -539,7 +565,9 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch
sys = (char *)"DVB-S2";
mod = (char *)"8PSK";
}
} else if (type == FE_QAM) {
break;
case FE_QAM:
case FE_OFDM:
sys = (char *)"DVB";
switch (m) {
case QAM_16:
@@ -557,11 +585,23 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch
case QAM_256:
mod = (char *)"QAM_256";
break;
case QPSK:
if (type == FE_OFDM) {
mod = (char *)"QPSK";
break;
}
/* fallthrouh for FE_QAM... */
case QAM_AUTO:
default:
mod = (char *)"QAM_AUTO";
break;
}
break;
default:
printf("[frontend] unknown type %d!\n", type);
sys = (char *)"UNKNOWN";
mod = (char *)"UNKNOWN";
break;
}
switch (f) {
@@ -641,6 +681,11 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
modulation = feparams->dvb_feparams.u.qam.modulation;
delsys = SYS_DVBC_ANNEX_AC;
break;
case FE_OFDM:
fec_inner = FEC_AUTO; /* dummy, for next switch statement */
modulation = feparams->dvb_feparams.u.ofdm.constellation;
delsys = SYS_DVBT;
break;
default:
printf("frontend: unknown frontend type, exiting\n");
return 0;
@@ -739,6 +784,36 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
cmdseq.props[INNER_FEC].u.data = fec_inner;
nrOfProps = FE_DVBC_PROPS;
break;
case FE_OFDM:
memcpy(cmdseq.props, dvbt_cmdargs, sizeof(dvbt_cmdargs));
nrOfProps = FE_DVBT_PROPS;
cmdseq.props[FREQUENCY].u.data = feparams->dvb_feparams.frequency;
cmdseq.props[MODULATION].u.data = modulation;
cmdseq.props[INVERSION].u.data = feparams->dvb_feparams.inversion;
cmdseq.props[CODE_RATE_HP].u.data = feparams->dvb_feparams.u.ofdm.code_rate_HP;
cmdseq.props[CODE_RATE_LP].u.data = feparams->dvb_feparams.u.ofdm.code_rate_LP;
cmdseq.props[TRANSMISSION_MODE].u.data = feparams->dvb_feparams.u.ofdm.transmission_mode;
cmdseq.props[GUARD_INTERVAL].u.data = feparams->dvb_feparams.u.ofdm.guard_interval;
cmdseq.props[HIERARCHY].u.data = feparams->dvb_feparams.u.ofdm.hierarchy_information;
switch (feparams->dvb_feparams.u.ofdm.bandwidth) {
case BANDWIDTH_6_MHZ:
cmdseq.props[BANDWIDTH].u.data = 6000000;
break;
case BANDWIDTH_7_MHZ:
cmdseq.props[BANDWIDTH].u.data = 7000000;
break;
case BANDWIDTH_8_MHZ:
cmdseq.props[BANDWIDTH].u.data = 8000000;
break;
default:
printf("[fe%d] unknown bandwidth for OFDM %d\n",
fenumber, feparams->dvb_feparams.u.ofdm.bandwidth);
/* fallthrough */
case BANDWIDTH_AUTO:
cmdseq.props[BANDWIDTH].u.data = 0;
break;
}
break;
default:
printf("frontend: unknown frontend type, exiting\n");
return false;
@@ -758,7 +833,7 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
int CFrontend::setFrontend(const FrontendParameters *feparams, bool /*nowait*/)
{
struct dtv_property cmdargs[FE_COMMON_PROPS + FE_DVBS2_PROPS]; // WARNING: increase when needed more space
struct dtv_property cmdargs[FE_COMMON_PROPS + FE_DVBT_PROPS]; // WARNING: increase when needed more space
struct dtv_properties cmdseq;
cmdseq.num = FE_COMMON_PROPS;
@@ -1143,10 +1218,10 @@ int CFrontend::setParameters(TP_params *TP, bool /*nowait*/)
feparams = &currTP.feparams;
freq = (int) feparams->dvb_feparams.frequency;
char * f, *s, *m;
bool high_band;
if (info.type == FE_QPSK) {
bool high_band;
switch (info.type) {
case FE_QPSK:
if (freq < lnbSwitch) {
high_band = false;
freq_offset = lnbOffsetLow;
@@ -1158,7 +1233,8 @@ int CFrontend::setParameters(TP_params *TP, bool /*nowait*/)
feparams->dvb_feparams.frequency = abs(freq - freq_offset);
setSec(TP->diseqc, TP->polarization, high_band);
getDelSys(feparams->dvb_feparams.u.qpsk.fec_inner, dvbs_get_modulation(feparams->dvb_feparams.u.qpsk.fec_inner), f, s, m);
} else if (info.type == FE_QAM) {
break;
case FE_QAM:
if (freq < 1000*1000)
feparams->dvb_feparams.frequency = freq * 1000;
getDelSys(feparams->dvb_feparams.u.qam.fec_inner,feparams->dvb_feparams.u.qam.modulation, f, s, m);
@@ -1173,6 +1249,14 @@ int CFrontend::setParameters(TP_params *TP, bool /*nowait*/)
break;
}
#endif
case FE_OFDM:
if (freq < 1000*1000)
feparams->dvb_feparams.frequency = freq * 1000;
getDelSys(feparams->dvb_feparams.u.ofdm.code_rate_HP,feparams->dvb_feparams.u.ofdm.constellation, f, s, m);
break;
default:
printf("[fe%d] unknown type %d\n", fenumber, info.type);
break;
}
//printf("[fe%d] tuner to frequency %d (offset %d timeout %d)\n", fenumber, feparams->dvb_feparams.frequency, freq_offset, TIMEOUT_MAX_MS);

View File

@@ -70,11 +70,12 @@ bool CServiceManager::ParseScanXml(void)
case FE_QPSK:
scanInputParser = parseXmlFile(SATELLITES_XML);
break;
case FE_QAM:
scanInputParser = parseXmlFile(CABLES_XML);
break;
case FE_OFDM:
scanInputParser = parseXmlFile(TERRESTRIAL_XML);
break;
default:
WARN("Unknown type %d", frontendType);
return false;
@@ -291,7 +292,7 @@ std::string CServiceManager::GetServiceName(t_channel_id channel_id)
return "";
}
void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, bool cable)
void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, fe_type fe)
{
uint8_t polarization = 0;
@@ -304,14 +305,18 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa
feparams.dvb_feparams.frequency = xmlGetNumericAttribute(node, "frq", 0);
feparams.dvb_feparams.inversion = (fe_spectral_inversion) xmlGetNumericAttribute(node, "inv", 0);
if(cable) {
switch (fe) {
case FE_QAM:
feparams.dvb_feparams.u.qam.symbol_rate = xmlGetNumericAttribute(node, "sr", 0);
feparams.dvb_feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0);
feparams.dvb_feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "mod", 0);
if (feparams.dvb_feparams.frequency > 1000*1000)
feparams.dvb_feparams.frequency = feparams.dvb_feparams.frequency/1000; //transponderlist was read from tuxbox
} else {
break;
case FE_OFDM:
break;
default:
feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0);
feparams.dvb_feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(node, "sr", 0);
@@ -325,7 +330,8 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa
else
feparams.dvb_feparams.frequency = (int) 1000 * (int) round ((double) feparams.dvb_feparams.frequency / (double) 1000);
}
freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, cable);
freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, fe != FE_QPSK);
transponder_id_t tid = CREATE_TRANSPONDER_ID64(freq, satellitePosition,original_network_id,transport_stream_id);
transponder t(frontendType, tid, feparams, polarization);
@@ -438,18 +444,19 @@ void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id
void CServiceManager::FindTransponder(xmlNodePtr search)
{
while (search) {
bool cable = false;
bool sat = false;
if (!(strcmp(xmlGetName(search), "cable")))
cable = true;
else if ((strcmp(xmlGetName(search), "sat"))) {
if (!(strcmp(xmlGetName(search), "sat")))
sat = true;
else if (strcmp(xmlGetName(search), "cable") && strcmp(xmlGetName(search), "terrestrial")) {
search = search->xmlNextNode;
continue;
}
t_satellite_position satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10);
DBG("going to parse dvb-%c provider %s\n", xmlGetName(search)[0], xmlGetAttribute(search, "name"));
ParseTransponders(search->xmlChildrenNode, satellitePosition, cable);
/* ParseTransponders is only interested in sat / not sat, sp the real type does not matter */
ParseTransponders(search->xmlChildrenNode, satellitePosition, sat ? FE_QPSK : FE_QAM);
newfound++;
search = search->xmlNextNode;
}
@@ -490,7 +497,28 @@ void CServiceManager::ParseSatTransponders(fe_type_t fType, xmlNodePtr search, t
feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) xml_fec;
feparams.dvb_feparams.frequency = (int) 1000 * (int) round ((double) feparams.dvb_feparams.frequency / (double) 1000);
}
freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, fType == FE_QAM);
else if (fType == FE_OFDM) {
feparams.dvb_feparams.u.ofdm.bandwidth = (fe_bandwidth_t)
xmlGetNumericAttribute(tps, "bandwidth", 0);
feparams.dvb_feparams.u.ofdm.constellation = (fe_modulation_t)
xmlGetNumericAttribute(tps, "constellation", 0);
feparams.dvb_feparams.u.ofdm.transmission_mode = (fe_transmit_mode_t)
xmlGetNumericAttribute(tps, "transmission_mode", 0);
feparams.dvb_feparams.u.ofdm.code_rate_HP = (fe_code_rate_t)
xmlGetNumericAttribute(tps, "code_rate_HP", 0);
feparams.dvb_feparams.u.ofdm.code_rate_LP = (fe_code_rate_t)
xmlGetNumericAttribute(tps, "code_rate_LP", 0);
feparams.dvb_feparams.u.ofdm.guard_interval = (fe_guard_interval_t)
xmlGetNumericAttribute(tps, "guard_interval", 0);
feparams.dvb_feparams.u.ofdm.hierarchy_information = (fe_hierarchy_t)
xmlGetNumericAttribute(tps, "hierarchy", 0);
if (feparams.dvb_feparams.frequency > 1000*1000)
feparams.dvb_feparams.frequency /= 1000; // old transponder list
}
else /* we'll probably crash sooner or later, so write to STDERR... */
fprintf(stderr, "[getservices] %s: unknown frontend type %d!\n", __func__, fType);
freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, fType != FE_QPSK);
polarization &= 7;
transponder_id_t tid = CREATE_TRANSPONDER_ID64(freq, satellitePosition, fake_nid, fake_tid);
@@ -636,7 +664,8 @@ bool CServiceManager::LoadServices(bool only_current)
position = xmlGetSignedNumericAttribute(search, "position", 10);
char * name = xmlGetAttribute(search, "name");
InitSatPosition(position, name);
} else if(!(strcmp(xmlGetName(search), "cable"))) {
} else if (!strcmp(xmlGetName(search), "cable") ||
!strcmp(xmlGetName(search), "terrestrial")) {
char * name = xmlGetAttribute(search, "name");
InitSatPosition(position, name);
}
@@ -726,7 +755,9 @@ void CServiceManager::WriteSatHeader(FILE * fd, sat_config_t &config)
case FE_QAM: /* cable */
fprintf(fd, "\t<cable name=\"%s\" position=\"%hd\">\n", config.name.c_str(), config.position);
break;
case FE_OFDM:
case FE_OFDM: /* terrestrial */
fprintf(fd, "\t<terrestrial name=\"%s\" position=\"%hd\">\n", config.name.c_str(), config.position);
break;
default:
break;
}
@@ -792,6 +823,9 @@ void CServiceManager::SaveServices(bool tocopy, bool if_changed)
case FE_QAM:
fprintf(fd, "\t</cable>\n");
break;
case FE_OFDM:
fprintf(fd, "\t</terrestrial>\n");
break;
default:
break;
}
@@ -913,6 +947,8 @@ bool CServiceManager::SaveCurrentServices(transponder_id_t tpid)
sprintf(satstr, "\t<%s name=\"%s\"\n", "cable", spos_it->second.name.c_str());
break;
case FE_OFDM:
sprintf(satstr, "\t<%s name=\"%s\"\n", "terrestrial", spos_it->second.name.c_str());
break;
default:
break;
}

View File

@@ -282,7 +282,7 @@ _repeat:
}
}
freq_id_t freq = CREATE_FREQ_ID(tI->second.feparams.dvb_feparams.frequency, cable);
freq_id_t freq = CREATE_FREQ_ID(tI->second.feparams.dvb_feparams.frequency, frontendType != FE_QPSK);
CNit nit(satellitePosition, freq, cable_nid);
if(flags & SCAN_NIT)
@@ -489,7 +489,6 @@ bool CServiceScan::SetFrontend(t_satellite_position satellitePosition)
frontend = fe;
CFEManager::getInstance()->setLiveFE(frontend);
frontendType = frontend->getInfo()->type;
cable = (frontend->getInfo()->type == FE_QAM);//FIXME
return true;
}
@@ -601,9 +600,10 @@ bool CServiceScan::ScanTransponder()
printf("[scan] NIT %s, fta only: %s, satellites %s\n", flags & SCAN_NIT ? "yes" : "no",
flags & SCAN_FTA ? "yes" : "no", scanProviders.size() == 1 ? "single" : "multi");
freq_id_t freq = CREATE_FREQ_ID(TP->feparams.dvb_feparams.frequency, cable);
freq_id_t freq = CREATE_FREQ_ID(TP->feparams.dvb_feparams.frequency, frontendType != FE_QPSK);
fake_tid++; fake_nid++;
transponder_id_t tid = CREATE_TRANSPONDER_ID64(freq, satellitePosition, fake_nid, fake_tid);
transponder t(frontendType, tid, TP->feparams, TP->polarization);
t.dump("[scan]");
@@ -643,7 +643,7 @@ bool CServiceScan::ReplaceTransponderParams(freq_id_t freq, t_satellite_position
bool ret = false;
for (transponder_list_t::iterator tI = transponders.begin(); tI != transponders.end(); ++tI) {
if (tI->second.satellitePosition == satellitePosition) {
freq_id_t newfreq = CREATE_FREQ_ID(tI->second.feparams.dvb_feparams.frequency, cable);
freq_id_t newfreq = CREATE_FREQ_ID(tI->second.feparams.dvb_feparams.frequency, frontendType != FE_QPSK);
if (freq == newfreq) {
memcpy(&tI->second.feparams, feparams, sizeof(struct dvb_frontend_parameters));
tI->second.polarization = polarization;
@@ -659,7 +659,7 @@ bool CServiceScan::ReplaceTransponderParams(freq_id_t freq, t_satellite_position
void CServiceScan::SendTransponderInfo(transponder &t)
{
uint32_t actual_freq = t.feparams.dvb_feparams.frequency;
if (!cable)
if (frontendType == FE_QAM)
actual_freq /= 1000;
CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCY, &actual_freq,sizeof(actual_freq));
@@ -667,7 +667,7 @@ void CServiceScan::SendTransponderInfo(transponder &t)
CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_PROVIDER, (void *) " ", 2);
CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SERVICENAME, (void *) " ", 2);
if (!cable) {
if (frontendType == FE_QPSK) {
uint32_t actual_polarisation = ((t.feparams.dvb_feparams.u.qpsk.symbol_rate/1000) << 16) | (t.feparams.dvb_feparams.u.qpsk.fec_inner << 8) | (uint)t.polarization;
CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCYP, &actual_polarisation,sizeof(actual_polarisation));
}

View File

@@ -52,13 +52,20 @@ transponder::transponder()
bool transponder::operator==(const transponder& t) const
{
return (
if (type != FE_OFDM)
return (
(satellitePosition == t.satellitePosition) &&
//(transport_stream_id == t.transport_stream_id) &&
//(original_network_id == t.original_network_id) &&
((polarization & 1) == (t.polarization & 1)) &&
(abs((int) feparams.dvb_feparams.frequency - (int)t.feparams.dvb_feparams.frequency) <= 3000)
);
return ((satellitePosition == t.satellitePosition) &&
//(transport_stream_id == t.transport_stream_id) &&
//(original_network_id == t.original_network_id) &&
((polarization & 1) == (t.polarization & 1)) &&
(abs((int) feparams.dvb_feparams.frequency - (int)t.feparams.dvb_feparams.frequency) <= 100)
);
}
bool transponder::compare(const transponder& t) const
@@ -76,13 +83,23 @@ bool transponder::compare(const transponder& t) const
(dvb_feparams1->u.qam.modulation == dvb_feparams2->u.qam.modulation ||
dvb_feparams1->u.qam.modulation == QAM_AUTO || dvb_feparams2->u.qam.modulation == QAM_AUTO)
);
} else {
} else if (type == FE_QPSK) {
ret = (
(t == (*this)) &&
(dvb_feparams1->u.qpsk.symbol_rate == dvb_feparams2->u.qpsk.symbol_rate) &&
(dvb_feparams1->u.qpsk.fec_inner == dvb_feparams2->u.qpsk.fec_inner ||
dvb_feparams1->u.qpsk.fec_inner == FEC_AUTO || dvb_feparams2->u.qpsk.fec_inner == FEC_AUTO)
);
} else if (type == FE_OFDM) {
ret = ( (t == (*this)) &&
(dvb_feparams1->u.ofdm.bandwidth == dvb_feparams2->u.ofdm.bandwidth) &&
(dvb_feparams1->u.ofdm.code_rate_HP == dvb_feparams2->u.ofdm.code_rate_HP ||
dvb_feparams1->u.ofdm.code_rate_HP == FEC_AUTO || dvb_feparams2->u.ofdm.code_rate_HP == FEC_AUTO) &&
(dvb_feparams1->u.ofdm.code_rate_LP == dvb_feparams2->u.ofdm.code_rate_LP ||
dvb_feparams1->u.ofdm.code_rate_LP == FEC_AUTO || dvb_feparams2->u.ofdm.code_rate_LP == FEC_AUTO) &&
(dvb_feparams1->u.ofdm.constellation == dvb_feparams2->u.ofdm.constellation ||
dvb_feparams1->u.ofdm.constellation == QAM_AUTO || dvb_feparams2->u.ofdm.constellation == QAM_AUTO)
);
}
return ret;
}
@@ -98,12 +115,20 @@ void transponder::dumpServiceXml(FILE * fd)
dvb_feparams->u.qam.symbol_rate, dvb_feparams->u.qam.fec_inner,
dvb_feparams->u.qam.modulation);
} else {
} else if (type == FE_QPSK) {
fprintf(fd, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" pol=\"%hu\">\n",
transport_stream_id, original_network_id,
dvb_feparams->frequency, dvb_feparams->inversion,
dvb_feparams->u.qpsk.symbol_rate, dvb_feparams->u.qpsk.fec_inner,
polarization);
} else if (type == FE_OFDM) {
fprintf(fd, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" bw=\"%u\" hp=\"%hu\" lp=\"%hu\" con=\"%u\" tm=\"%u\" gi=\"%u\" hi=\"%u\">\n",
transport_stream_id, original_network_id,
dvb_feparams->frequency, dvb_feparams->inversion,
dvb_feparams->u.ofdm.bandwidth, dvb_feparams->u.ofdm.code_rate_HP,
dvb_feparams->u.ofdm.code_rate_LP, dvb_feparams->u.ofdm.constellation,
dvb_feparams->u.ofdm.transmission_mode, dvb_feparams->u.ofdm.guard_interval,
dvb_feparams->u.ofdm.hierarchy_information);
}
}
@@ -115,10 +140,14 @@ void transponder::dump(std::string label)
printf("%s tp-id %016llx freq %d rate %d fec %d mod %d\n", label.c_str(),
transponder_id, dvb_feparams->frequency, dvb_feparams->u.qam.symbol_rate,
dvb_feparams->u.qam.fec_inner, dvb_feparams->u.qam.modulation);
else
else if (type == FE_QPSK)
printf("%s tp-id %016llx freq %d rate %d fec %d pol %d\n", label.c_str(),
transponder_id, dvb_feparams->frequency, dvb_feparams->u.qpsk.symbol_rate,
dvb_feparams->u.qpsk.fec_inner, polarization);
else if (type == FE_OFDM)
printf("%s tp-id %016llx freq %d bw %d coderate %d\n", label.c_str(),
transponder_id, dvb_feparams->frequency, dvb_feparams->u.ofdm.bandwidth,
dvb_feparams->u.ofdm.code_rate_HP);
}
void transponder::ddump(std::string label)
@@ -142,8 +171,10 @@ char transponder::pol(unsigned char p)
std::string transponder::description()
{
char buf[128] = {0};
char * f, *s, *m;
char *f, *s, *m, *f2;
struct dvb_frontend_parameters *dvb_feparams = &feparams.dvb_feparams;
const char *bw[4] = { "8MHz", "7MHz", "6MHz", "auto" };
int b;
switch(type) {
case FE_QPSK:
@@ -155,7 +186,15 @@ std::string transponder::description()
snprintf(buf, sizeof(buf), "%d %d %s %s %s ", dvb_feparams->frequency/1000, dvb_feparams->u.qam.symbol_rate/1000, f, s, m);
break;
case FE_OFDM:
CFrontend::getDelSys(type, dvb_feparams->u.ofdm.code_rate_HP, dvb_feparams->u.ofdm.constellation, f, s, m);
CFrontend::getDelSys(type, dvb_feparams->u.ofdm.code_rate_LP, dvb_feparams->u.ofdm.constellation, f2, s, m);
b = dvb_feparams->u.ofdm.bandwidth;
if (b > 3)
b = 3;
snprintf(buf, sizeof(buf), "%d %s %s %s %s ", dvb_feparams->frequency, bw[b], f, f2, m);
break;
case FE_ATSC:
snprintf(buf, sizeof(buf), "ATSC not yet supported ");
break;
}
return std::string(buf);