diff --git a/acinclude.m4 b/acinclude.m4 index 0f756e7a2..f8a67caec 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -202,7 +202,9 @@ AC_ARG_WITH(dvbincludes, [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) if test "$DVBINCLUDES"; then - CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" + CPPFLAGS="-I$DVBINCLUDES $CPPFLAGS" + CFLAGS="-I$DVBINCLUDES $CFLAGS" + CXXFLAGS="-I$DVBINCLUDES $CXXFLAGS" fi AC_CHECK_HEADERS(ost/dmx.h,[ @@ -219,9 +221,15 @@ AC_CHECK_HEADERS(linux/dvb/version.h,[ version DVB_API_VERSION ]])]) DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` + + AC_LANG_CONFTEST([AC_LANG_SOURCE([[ +#include +version DVB_API_VERSION_MINOR + ]])]) + DVB_API_VERSION_MINOR=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` rm -f conftest* - AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) + AC_MSG_NOTICE([found dvb version $DVB_API_VERSION.$DVB_API_VERSION_MINOR]) ]) fi @@ -231,6 +239,12 @@ if test "$DVB_API_VERSION"; then else AC_MSG_ERROR([can't find dvb headers]) fi + +if test "$DVB_API_VERSION_MINOR"; then + AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION_MINOR,$DVB_API_VERSION_MINOR,[Define to the minor version of the dvb api]) +else + AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION_MINOR,0,[Define to the minor version of the dvb api]) +fi ]) AC_DEFUN([TUXBOX_APPS_CAPTURE],[ diff --git a/configure.ac b/configure.ac index 53674002b..9272b8c68 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ AM_INIT_AUTOMAKE([1.0.1 nostdinc]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES]) TUXBOX_APPS +TUXBOX_APPS_DVB TUXBOX_APPS_DIRECTORY TUXBOX_APPS_PKGCONFIG TUXBOX_BOXTYPE diff --git a/data/locale/english.locale b/data/locale/english.locale index f437693dd..ebd7a1664 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -371,26 +371,12 @@ extra.fec_2_3 2/3 extra.fec_3_4 3/4 extra.fec_5_6 5/6 extra.fec_7_8 7/8 -extra.fec_auto Auto DVB-S -extra.fec_auto_s2 Auto DVB-S2 -extra.fec_s2_8psk_1_2 1/2 s2 8psk -extra.fec_s2_8psk_2_3 2/3 s2 8psk -extra.fec_s2_8psk_3_4 3/4 s2 8psk -extra.fec_s2_8psk_3_5 3/5 s2 8psk -extra.fec_s2_8psk_4_5 4/5 s2 8psk -extra.fec_s2_8psk_5_6 5/6 s2 8psk -extra.fec_s2_8psk_7_8 7/8 s2 8psk -extra.fec_s2_8psk_8_9 8/9 s2 8psk -extra.fec_s2_8psk_9_10 9/10 s2 8psk -extra.fec_s2_qpsk_1_2 1/2 s2 qpsk -extra.fec_s2_qpsk_2_3 2/3 s2 qpsk -extra.fec_s2_qpsk_3_4 3/4 s2 qpsk -extra.fec_s2_qpsk_3_5 3/5 s2 qpsk -extra.fec_s2_qpsk_4_5 4/5 s2 qpsk -extra.fec_s2_qpsk_5_6 5/6 s2 qpsk -extra.fec_s2_qpsk_7_8 7/8 s2 qpsk -extra.fec_s2_qpsk_8_9 8/9 s2 qpsk -extra.fec_s2_qpsk_9_10 9/10 s2 qpsk +extra.fec_auto Auto +extra.fec_2_5 2/5 +extra.fec_3_5 3/5 +extra.fec_4_5 4/5 +extra.fec_8_9 8/9 +extra.fec_9_10 9/10 extra.key_current_transponder Current Transponder Key extra.key_format_mode Video format extra.key_list_end end @@ -427,20 +413,76 @@ extra.south South extra.start_tostandby Startup to standby extra.temp_timeshift Temporary timeshift extra.timeshift_pause Timeshift pause -extra.tp.pol_v V +extra.tp_bandwidth Bandwidth +extra.tp_bandwidth_8mhz 8Mhz +extra.tp_bandwidth_7mhz 7Mhz +extra.tp_bandwidth_6mhz 6Mhz +extra.tp_bandwidth_5mhz 5Mhz +extra.tp_bandwidth_10mhz 10Mhz +extra.tp_bandwidth_1_712mhz 1.712Mhz +extra.tp_bandwidth_auto Auto +extra.tp_coderate_hp Coderate(HP) +extra.tp_coderate_lp Coderate(LP) +extra.tp_constellation Constellation +extra.tp_delsys Delivery system +extra.tp_delsys_dvbc DVB-C +extra.tp_delsys_dvbc2 DVB-C2 +extra.tp_delsys_dvbs DVB-S +extra.tp_delsys_dvbs2 DVB-S2 +extra.tp_delsys_dvbt DVB-T +extra.tp_delsys_dvbt2 DVB-T2 +extra.tp_delsys_dtmb DTMB +extra.tp_delsys_dss DSS +extra.tp_delsys_turbo Turbo +extra.tp_delsys_isdbs ISDB-S +extra.tp_delsys_isdbc ISDB-C +extra.tp_delsys_isdbt ISDB-T extra.tp_fec FEC extra.tp_freq Frequency +extra.tp_gi Guard interval +extra.tp_gi_auto Auto +extra.tp_gi_1_32 1/32 +extra.tp_gi_1_16 1/16 +extra.tp_gi_1_8 1/8 +extra.tp_gi_1_4 1/4 +extra.tp_gi_1_128 1/128 +extra.tp_gi_19_128 19/128 +extra.tp_gi_19_256 19/256 +extra.tp_gi_pn420 PN420 +extra.tp_gi_pn595 PN595 +extra.tp_gi_pn945 PN945 +extra.tp_hierarchy Hierarchy information +extra.tp_hierarchy_none None +extra.tp_hierarchy_1 1 +extra.tp_hierarchy_2 2 +extra.tp_hierarchy_4 4 +extra.tp_hierarchy_auto Auto extra.tp_mod Modulation -extra.tp_mod_128 QAM/128 +extra.tp_mod_4 QPSK +extra.tp_mod_8 8PSK extra.tp_mod_16 QAM/16 -extra.tp_mod_256 QAM/256 extra.tp_mod_32 QAM/32 extra.tp_mod_64 QAM/64 +extra.tp_mod_128 QAM/128 +extra.tp_mod_256 QAM/256 +extra.tp_mod_4_nr QAM/4-NR +extra.tp_mod_auto QAM/AUTO extra.tp_pol Polarization extra.tp_pol_h H extra.tp_pol_l L extra.tp_pol_r R +extra.tp_pol_v V extra.tp_rate Symbol rate +extra.tp_transmit_mode Transmit mode +extra.tp_transmit_mode_1k 1K +extra.tp_transmit_mode_2k 2K +extra.tp_transmit_mode_4k 4K +extra.tp_transmit_mode_8k 8K +extra.tp_transmit_mode_16k 16K +extra.tp_transmit_mode_32k 32K +extra.tp_transmit_mode_c1 C1 +extra.tp_transmit_mode_c3780 C3780 +extra.tp_transmit_mode_auto Auto extra.update_dir Local update directory extra.use_gotoxx Use gotoXX extra.volume_digits Volumebar digits @@ -1119,9 +1161,11 @@ menu.hint_scan_auto Auto-scan selected provider menu.hint_scan_autoall Scan several selected providers at once menu.hint_scan_autoall_select Add selected satellites to scan menu.hint_scan_bouquet Update: add to current bouquets, erase:\nremove old bouquets, leave: dont add or change +menu.hint_scan_bw Select the channel bandwidth menu.hint_scan_cable Select cable network to scan menu.hint_scan_cable_simple Cable scan with optional\nprovider channel numbering menu.hint_scan_commited Select commited input for\nthis satellite +menu.hint_scan_delsys Select delivery system for this channel/TP. menu.hint_scan_diseqc Select diseqc switch input for\nthis satellite menu.hint_scan_diseqcorder Diseqc command order for cascaded switches menu.hint_scan_diseqcrepeat Diseqc repeat for cascaded switches @@ -1138,6 +1182,8 @@ menu.hint_scan_fesetup Configure tuner(s) menu.hint_scan_fetimeout Time to wait for signal, in 1/10 of second menu.hint_scan_freq Enter transponder frequency menu.hint_scan_fta Add only free-to-air (not-scrambled) channels +menu.hint_scan_gi Select the guard interval for this terrestrial channel +menu.hint_scan_hierarchy Select the hierarchy for this terrestrial channel menu.hint_scan_ladirection Select latitude direction menu.hint_scan_latitude Enter your latitude menu.hint_scan_lnbconfig Configure LNB parameters for this satellite @@ -1174,6 +1220,7 @@ menu.hint_scan_setup_fe Configure selected frontend options menu.hint_scan_start Start scan. You can use 'exit' button to stop menu.hint_scan_test Test signal for this transponder menu.hint_scan_tpselect Select transponder to scan +menu.hint_scan_transmit_mode Select the transmission mode for this terrestrial channel menu.hint_scan_uncommited Select uncommited input for\nthis satellite menu.hint_scan_usals USALS options menu.hint_scan_usals_repeat Repeat usals move rotor commands\nif you expirience unstable rotor move @@ -1833,6 +1880,11 @@ satsetup.fastscan_prov_tvv_sd TV Vlaanderen (SD) satsetup.fastscan_sd SD only satsetup.fastscan_type Scan type satsetup.fastscan_update Auto update +satsetup.fe_delsys_mode Delivery system mode +satsetup.fe_delsys_mode_auto Auto +satsetup.fe_delsys_mode_cable Cable +satsetup.fe_delsys_mode_sat Satellite +satsetup.fe_delsys_mode_terrestrial Terrestrial satsetup.fe_mode Tuner mode satsetup.fe_mode_independent Independent satsetup.fe_mode_link_loop Loop @@ -1873,6 +1925,7 @@ sc.waiting Waing for card answer scants.abort_body Should the search really be aborted? scants.abort_header Abortion of channel scan scants.actcable Cable: +scants.acthybrid Hybrid: scants.actsatellite Satellite: scants.actterrestrial Terrestrial: scants.bouquet Bouquet diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index 552f2193e..a37e7d297 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -1442,7 +1442,7 @@ void CInfoViewer::showSNR () std::string polarisation = ""; - if (CFEManager::getInstance()->getLiveFE()->getType() == FE_QPSK) + if (CFrontend::isSat(CFEManager::getInstance()->getLiveFE()->getCurrentDeliverySystem())) polarisation = transponder::pol(CFEManager::getInstance()->getLiveFE()->getPolarization()); int frequency = CFEManager::getInstance()->getLiveFE()->getFrequency(); diff --git a/src/gui/motorcontrol.cpp b/src/gui/motorcontrol.cpp index 75fa484f9..e0aa2501e 100644 --- a/src/gui/motorcontrol.cpp +++ b/src/gui/motorcontrol.cpp @@ -132,10 +132,10 @@ int CMotorControl::exec(CMenuTarget* parent, const std::string &) g_Zapit->setScanSatelliteList(satList); CZapit::getInstance()->SetLiveFrontend(frontend); - TP.feparams.dvb_feparams.frequency = atoi(scansettings.sat_TP_freq.c_str()); - TP.feparams.dvb_feparams.u.qpsk.symbol_rate = atoi(scansettings.sat_TP_rate.c_str()); - TP.feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t)scansettings.sat_TP_fec; - TP.polarization = scansettings.sat_TP_pol; + TP.feparams.frequency = atoi(scansettings.sat_TP_freq.c_str()); + TP.feparams.symbol_rate = atoi(scansettings.sat_TP_rate.c_str()); + TP.feparams.fec_inner = (fe_code_rate_t)scansettings.sat_TP_fec; + TP.feparams.polarization = scansettings.sat_TP_pol; g_Zapit->tune_TP(TP); diff --git a/src/gui/scan.cpp b/src/gui/scan.cpp index 4451abff9..f23414f5e 100644 --- a/src/gui/scan.cpp +++ b/src/gui/scan.cpp @@ -67,13 +67,13 @@ extern cVideo * videoDecoder; #define BAR_WIDTH 150 #define BAR_HEIGHT 16//(13 + BAR_BORDER*2) -CScanTs::CScanTs(int dtype) +CScanTs::CScanTs(delivery_system_t DelSys) { frameBuffer = CFrameBuffer::getInstance(); radar = 0; total = done = 0; freqready = 0; - deltype = dtype; + delsys = DelSys; signalbox = NULL; memset(&TP, 0, sizeof(TP)); // valgrind } @@ -86,10 +86,12 @@ void CScanTs::prev_next_TP( bool up) { t_satellite_position position = 0; - if (deltype == FE_QPSK) + if (CFrontend::isSat(delsys)) position = CServiceManager::getInstance()->GetSatellitePosition(scansettings.satName); - else + else if (CFrontend::isCable(delsys)) position = CServiceManager::getInstance()->GetSatellitePosition(scansettings.cableName); + else if (CFrontend::isTerr(delsys)) + position = CServiceManager::getInstance()->GetSatellitePosition(scansettings.terrestrialName); transponder_list_t &select_transponders = CServiceManager::getInstance()->GetSatelliteTransponders(position); transponder_list_t::iterator tI; @@ -98,14 +100,14 @@ void CScanTs::prev_next_TP( bool up) /* FIXME transponders with duplicate frequency skipped */ if(up) { for (tI = select_transponders.begin(); tI != select_transponders.end(); ++tI) { - if(tI->second.feparams.dvb_feparams.frequency > TP.feparams.dvb_feparams.frequency){ + if(tI->second.feparams.frequency > TP.feparams.frequency){ next_tp = true; break; } } } else { for ( tI=select_transponders.end() ; tI != select_transponders.begin(); --tI ) { - if(tI->second.feparams.dvb_feparams.frequency < TP.feparams.dvb_feparams.frequency) { + if(tI->second.feparams.frequency < TP.feparams.frequency) { next_tp = true; break; } @@ -113,28 +115,7 @@ void CScanTs::prev_next_TP( bool up) } if(next_tp) { - TP.feparams.dvb_feparams.frequency = tI->second.feparams.dvb_feparams.frequency; - if (deltype == FE_QPSK) { - TP.feparams.dvb_feparams.u.qpsk.symbol_rate = tI->second.feparams.dvb_feparams.u.qpsk.symbol_rate; - TP.feparams.dvb_feparams.u.qpsk.fec_inner = tI->second.feparams.dvb_feparams.u.qpsk.fec_inner; - TP.polarization = tI->second.polarization; - } else if (deltype == FE_OFDM) { - /* 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 = tI->second.feparams.dvb_feparams.u.qam.symbol_rate; - TP.feparams.dvb_feparams.u.qam.fec_inner = tI->second.feparams.dvb_feparams.u.qam.fec_inner; - TP.feparams.dvb_feparams.u.qam.modulation = tI->second.feparams.dvb_feparams.u.qam.modulation; - } + TP.feparams = tI->second.feparams; testFunc(); } } @@ -143,16 +124,18 @@ void CScanTs::testFunc() { int w = x + width - xpos2; char buffer[128]; - char * f, *s, *m; + char *f, *s, *m, *f2; - if(deltype == FE_QPSK) { - CFrontend::getDelSys(deltype, TP.feparams.dvb_feparams.u.qpsk.fec_inner, dvbs_get_modulation((fe_code_rate_t)TP.feparams.dvb_feparams.u.qpsk.fec_inner), f, s, m); - snprintf(buffer,sizeof(buffer), "%u %c %d %s %s %s", TP.feparams.dvb_feparams.frequency/1000, transponder::pol(TP.polarization), TP.feparams.dvb_feparams.u.qpsk.symbol_rate/1000, f, s, m); - } else if (deltype == FE_QAM) { - CFrontend::getDelSys(deltype, TP.feparams.dvb_feparams.u.qam.fec_inner, TP.feparams.dvb_feparams.u.qam.modulation, f, s, m); - snprintf(buffer,sizeof(buffer), "%u %d %s %s %s", TP.feparams.dvb_feparams.frequency/1000, TP.feparams.dvb_feparams.u.qam.symbol_rate/1000, f, s, m); - } else if (deltype == FE_OFDM) { - sprintf(buffer, "%u", TP.feparams.dvb_feparams.frequency); /* no way int can overflow the buffer */ + if (CFrontend::isSat(delsys)) { + CFrontend::getDelSys(TP.feparams.delsys, TP.feparams.fec_inner, TP.feparams.modulation, f, s, m); + snprintf(buffer,sizeof(buffer), "%u %c %d %s %s %s", TP.feparams.frequency/1000, transponder::pol(TP.feparams.polarization), TP.feparams.symbol_rate/1000, f, s, m); + } else if (CFrontend::isCable(delsys)) { + CFrontend::getDelSys(TP.feparams.delsys, TP.feparams.fec_inner, TP.feparams.modulation, f, s, m); + snprintf(buffer,sizeof(buffer), "%u %d %s %s %s", TP.feparams.frequency/1000, TP.feparams.symbol_rate/1000, f, s, m); + } else if (CFrontend::isTerr(delsys)) { + CFrontend::getDelSys(TP.feparams.delsys, TP.feparams.code_rate_HP, TP.feparams.modulation, f, s, m); + CFrontend::getDelSys(TP.feparams.delsys, TP.feparams.code_rate_LP, TP.feparams.modulation, f2, s, m); + snprintf(buffer,sizeof(buffer), "%u %d %s %s %s %s", TP.feparams.frequency/1000, TP.feparams.bandwidth, f, f2, s, m); } printf("CScanTs::testFunc: %s\n", buffer); @@ -188,12 +171,14 @@ int CScanTs::exec(CMenuTarget* /*parent*/, const std::string & actionKey) bool manual = (actionKey == "manual") || test; bool fast = (actionKey == "fast"); - switch (deltype) { - case FE_QPSK: pname = scansettings.satName; break; - case FE_QAM: pname = scansettings.cableName; break; - case FE_OFDM: pname = scansettings.terrName; break; - default: printf("CScanTs::exec:%d unknown deltype %d\n", __LINE__, deltype); - } + if (CFrontend::isSat(delsys)) + pname = scansettings.satName; + else if (CFrontend::isCable(delsys)) + pname = scansettings.cableName; + else if (CFrontend::isTerr(delsys)) + pname = scansettings.terrestrialName; + else + printf("CScanTs::exec:%d unknown delivery_system %d\n", __LINE__, delsys); int scan_pids = CZapit::getInstance()->scanPids(); @@ -230,36 +215,41 @@ int CScanTs::exec(CMenuTarget* /*parent*/, const std::string & actionKey) if(scansettings.scan_nit_manual) scan_flags |= CServiceScan::SCAN_NIT; TP.scan_mode = scan_flags; - if (deltype == FE_QPSK) { - TP.feparams.dvb_feparams.frequency = atoi(scansettings.sat_TP_freq.c_str()); - TP.feparams.dvb_feparams.u.qpsk.symbol_rate = atoi(scansettings.sat_TP_rate.c_str()); - TP.feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) scansettings.sat_TP_fec; - TP.polarization = scansettings.sat_TP_pol; - } else if (deltype == FE_OFDM) { + if (CFrontend::isSat(delsys)) { + TP.feparams.frequency = atoi(scansettings.sat_TP_freq.c_str()); + TP.feparams.symbol_rate = atoi(scansettings.sat_TP_rate.c_str()); + TP.feparams.fec_inner = (fe_code_rate_t) scansettings.sat_TP_fec; + TP.feparams.polarization = scansettings.sat_TP_pol; + TP.feparams.delsys = (delivery_system_t)scansettings.sat_TP_delsys; + } else if (CFrontend::isTerr(delsys)) { /* DVB-T. TODO: proper menu and parameter setup, not all "AUTO" */ - TP.feparams.dvb_feparams.frequency = atoi(scansettings.terr_TP_freq.c_str()); - 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.frequency = atoi(scansettings.cable_TP_freq.c_str()); - TP.feparams.dvb_feparams.u.qam.symbol_rate = atoi(scansettings.cable_TP_rate.c_str()); - TP.feparams.dvb_feparams.u.qam.fec_inner = (fe_code_rate_t)scansettings.cable_TP_fec; - TP.feparams.dvb_feparams.u.qam.modulation = (fe_modulation_t) scansettings.cable_TP_mod; + TP.feparams.frequency = atoi(scansettings.terrestrial_TP_freq.c_str()); +// if (TP.feparams.frequency < 300000) +// TP.feparams.bandwidth = BANDWIDTH_7_MHZ; +// else +// TP.feparams.bandwidth = BANDWIDTH_8_MHZ; + TP.feparams.bandwidth = (fe_bandwidth_t)scansettings.terrestrial_TP_bw; + TP.feparams.code_rate_HP = (fe_code_rate_t)scansettings.terrestrial_TP_coderate_HP; + TP.feparams.code_rate_LP = (fe_code_rate_t)scansettings.terrestrial_TP_coderate_LP; + TP.feparams.modulation = (fe_modulation_t)scansettings.terrestrial_TP_constel; + TP.feparams.transmission_mode = (fe_transmit_mode_t)scansettings.terrestrial_TP_transmit_mode; + TP.feparams.guard_interval = (fe_guard_interval_t)scansettings.terrestrial_TP_guard; + TP.feparams.hierarchy = (fe_hierarchy_t)scansettings.terrestrial_TP_hierarchy; + TP.feparams.delsys = (delivery_system_t)scansettings.terrestrial_TP_delsys; + } else if (CFrontend::isCable(delsys)) { + TP.feparams.frequency = atoi(scansettings.cable_TP_freq.c_str()); + TP.feparams.symbol_rate = atoi(scansettings.cable_TP_rate.c_str()); + TP.feparams.fec_inner = (fe_code_rate_t)scansettings.cable_TP_fec; + TP.feparams.modulation = (fe_modulation_t)scansettings.cable_TP_mod; + TP.feparams.delsys = (delivery_system_t)scansettings.cable_TP_delsys; } - //printf("[neutrino] freq %d rate %d fec %d pol %d\n", TP.feparams.dvb_feparams.frequency, TP.feparams.dvb_feparams.u.qpsk.symbol_rate, TP.feparams.dvb_feparams.u.qpsk.fec_inner, TP.polarization); + //printf("[neutrino] freq %d rate %d fec %d pol %d\n", TP.feparams.frequency, TP.feparams.symbol_rate, TP.feparams.fec_inner, TP.feparams.polarization); } else { if(scansettings.scan_nit) scan_flags |= CServiceScan::SCAN_NIT; } - if(deltype == FE_QAM) + + if (CFrontend::isCable(delsys)) CServiceScan::getInstance()->SetCableNID(scansettings.cable_nid); CZapitClient::commandSetScanSatelliteList sat; @@ -421,7 +411,8 @@ int CScanTs::handleMsg(neutrino_msg_t msg, neutrino_msg_data_t data) { int pol = data & 0xFF; int fec = (data >> 8) & 0xFF; - int rate = data >> 16; + int rate = (data >> 16) & 0xFFFF; + //int delsys = (data >> 24) char * f, *s, *m; CFrontend * frontend = CServiceScan::getInstance()->GetFrontend(); frontend->getDelSys(fec, (fe_modulation_t)0, f, s, m); // FIXME @@ -530,16 +521,21 @@ void CScanTs::paint(bool fortest) ypos_cur_satellite = ypos; - if(deltype == FE_QPSK) + if(CFrontend::isSat(delsys)) { //sat paintLineLocale(xpos1, &ypos, width - xpos1, LOCALE_SCANTS_ACTSATELLITE); xpos2 = xpos1 + 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE))+2; } - if(deltype == FE_QAM) + else if(CFrontend::isCable(delsys)) { //cable paintLineLocale(xpos1, &ypos, width - xpos1, LOCALE_SCANTS_ACTCABLE); xpos2 = xpos1 + 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(LOCALE_SCANTS_ACTCABLE))+2; } + else if(CFrontend::isTerr(delsys)) + { //terrestrial + paintLineLocale(xpos1, &ypos, width - xpos1, LOCALE_SCANTS_ACTTERRESTRIAL); + xpos2 = xpos1 + 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL))+2; + } ypos_transponder = ypos; paintLineLocale(xpos1, &ypos, width - xpos1, LOCALE_SCANTS_TRANSPONDERS); diff --git a/src/gui/scan.h b/src/gui/scan.h index b5851d420..7e9394240 100644 --- a/src/gui/scan.h +++ b/src/gui/scan.h @@ -79,11 +79,11 @@ class CScanTs : public CMenuTarget void testFunc(); void prev_next_TP(bool); TP_params TP; - int deltype; + delivery_system_t delsys; std::string pname; public: - CScanTs(int dtype = FE_QPSK); + CScanTs(delivery_system_t DelSys); ~CScanTs(); void hide(); int exec(CMenuTarget* parent, const std::string & actionKey); diff --git a/src/gui/scan_setup.cpp b/src/gui/scan_setup.cpp index cac8942d5..5743ceaea 100644 --- a/src/gui/scan_setup.cpp +++ b/src/gui/scan_setup.cpp @@ -9,7 +9,7 @@ Copyright (C) 2011 T. Graf 'dbt' Homepage: http://www.dbox2-tuning.net/ - Copyright (C) 2011 CoolStream International Ltd + Copyright (C) 2011-2014 CoolStream International Ltd License: GPL @@ -101,48 +101,160 @@ const CMenuOptionChooser::keyval SATSETUP_DISEQC_OPTIONS[SATSETUP_DISEQC_OPTION_ // { SMATV_REMOTE_TUNING, LOCALE_SATSETUP_SMATVREMOTE } }; -#define SATSETUP_SCANTP_FEC_COUNT 21 -#define CABLESETUP_SCANTP_FEC_COUNT 5 -const CMenuOptionChooser::keyval SATSETUP_SCANTP_FEC[SATSETUP_SCANTP_FEC_COUNT] = +#define SATSETUP_SCANTP_DELSYS_COUNT 5 +const CMenuOptionChooser::keyval SATSETUP_SCANTP_DELSYS[SATSETUP_SCANTP_DELSYS_COUNT] = { - { FEC_AUTO, LOCALE_EXTRA_FEC_AUTO }, - { FEC_S2_AUTO, LOCALE_EXTRA_FEC_AUTO_S2 }, - - { FEC_1_2, LOCALE_EXTRA_FEC_1_2 }, - { FEC_2_3, LOCALE_EXTRA_FEC_2_3 }, - { FEC_3_4, LOCALE_EXTRA_FEC_3_4 }, - { FEC_5_6, LOCALE_EXTRA_FEC_5_6 }, - { FEC_7_8, LOCALE_EXTRA_FEC_7_8 }, - - { FEC_S2_QPSK_1_2, LOCALE_EXTRA_FEC_S2_QPSK_1_2 }, - { FEC_S2_QPSK_2_3, LOCALE_EXTRA_FEC_S2_QPSK_2_3 }, - { FEC_S2_QPSK_3_4, LOCALE_EXTRA_FEC_S2_QPSK_3_4 }, - { FEC_S2_QPSK_5_6, LOCALE_EXTRA_FEC_S2_QPSK_5_6 }, - //{ FEC_S2_QPSK_7_8, LOCALE_EXTRA_FEC_S2_QPSK_7_8 }, - { FEC_S2_QPSK_8_9, LOCALE_EXTRA_FEC_S2_QPSK_8_9 }, - { FEC_S2_QPSK_3_5, LOCALE_EXTRA_FEC_S2_QPSK_3_5 }, - { FEC_S2_QPSK_4_5, LOCALE_EXTRA_FEC_S2_QPSK_4_5 }, - { FEC_S2_QPSK_9_10, LOCALE_EXTRA_FEC_S2_QPSK_9_10 }, - - //{ FEC_S2_8PSK_1_2, LOCALE_EXTRA_FEC_S2_8PSK_1_2 }, - { FEC_S2_8PSK_2_3, LOCALE_EXTRA_FEC_S2_8PSK_2_3 }, - { FEC_S2_8PSK_3_4, LOCALE_EXTRA_FEC_S2_8PSK_3_4 }, - { FEC_S2_8PSK_3_5, LOCALE_EXTRA_FEC_S2_8PSK_3_5 }, - { FEC_S2_8PSK_5_6, LOCALE_EXTRA_FEC_S2_8PSK_5_6 }, - //{ FEC_S2_8PSK_7_8, LOCALE_EXTRA_FEC_S2_8PSK_7_8 }, - { FEC_S2_8PSK_8_9, LOCALE_EXTRA_FEC_S2_8PSK_8_9 }, - //{ FEC_S2_8PSK_4_5, LOCALE_EXTRA_FEC_S2_8PSK_4_5 }, - { FEC_S2_8PSK_9_10, LOCALE_EXTRA_FEC_S2_8PSK_9_10 } + { DVB_S, LOCALE_EXTRA_TP_DELSYS_DVBS }, + { DVB_S2, LOCALE_EXTRA_TP_DELSYS_DVBS2 }, + { DSS, LOCALE_EXTRA_TP_DELSYS_DSS }, + { ISDBS, LOCALE_EXTRA_TP_DELSYS_ISDBS }, + { TURBO, LOCALE_EXTRA_TP_DELSYS_TURBO } }; -#define SATSETUP_SCANTP_MOD_COUNT 5 +#define CABLESETUP_SCANTP_DELSYS_COUNT 2 +const CMenuOptionChooser::keyval CABLESETUP_SCANTP_DELSYS[CABLESETUP_SCANTP_DELSYS_COUNT] = +{ + { DVB_C, LOCALE_EXTRA_TP_DELSYS_DVBC }, + { ISDBC, LOCALE_EXTRA_TP_DELSYS_ISDBC } +}; + +#define TERRSETUP_SCANTP_DELSYS_COUNT 4 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_DELSYS[TERRSETUP_SCANTP_DELSYS_COUNT] = +{ + { DVB_T, LOCALE_EXTRA_TP_DELSYS_DVBT }, + { DVB_T2, LOCALE_EXTRA_TP_DELSYS_DVBT2 }, + { DTMB, LOCALE_EXTRA_TP_DELSYS_DTMB }, + { ISDBT, LOCALE_EXTRA_TP_DELSYS_ISDBT } +}; + +#define SATSETUP_SCANTP_FEC_COUNT 10 +//#define CABLESETUP_SCANTP_FEC_COUNT 5 +const CMenuOptionChooser::keyval SATSETUP_SCANTP_FEC[SATSETUP_SCANTP_FEC_COUNT] = +{ + // S + { FEC_1_2, LOCALE_EXTRA_FEC_1_2 }, + { FEC_2_3, LOCALE_EXTRA_FEC_2_3 }, + { FEC_3_4, LOCALE_EXTRA_FEC_3_4 }, + { FEC_5_6, LOCALE_EXTRA_FEC_5_6 }, + { FEC_7_8, LOCALE_EXTRA_FEC_7_8 }, + { FEC_AUTO, LOCALE_EXTRA_FEC_AUTO }, + // S2 + { FEC_3_5, LOCALE_EXTRA_FEC_3_5 }, + { FEC_4_5, LOCALE_EXTRA_FEC_4_5 }, + { FEC_8_9, LOCALE_EXTRA_FEC_8_9 }, + { FEC_9_10, LOCALE_EXTRA_FEC_9_10 } +}; + +#if 0 +#define CABLESETUP_SCANTP_FEC_COUNT 6 +const CMenuOptionChooser::keyval CABLESETUP_SCANTP_FEC[CABLESETUP_SCANTP_FEC_COUNT] = +{ + { FEC_1_2, LOCALE_EXTRA_FEC_1_2 }, + { FEC_2_3, LOCALE_EXTRA_FEC_2_3 }, + { FEC_3_4, LOCALE_EXTRA_FEC_3_4 }, + { FEC_5_6, LOCALE_EXTRA_FEC_5_6 }, + { FEC_7_8, LOCALE_EXTRA_FEC_7_8 }, + { FEC_AUTO, LOCALE_EXTRA_FEC_AUTO }, +}; +#endif + +#define TERRSETUP_SCANTP_FEC_COUNT 9 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_FEC[TERRSETUP_SCANTP_FEC_COUNT] = +{ + // DVB-T + { FEC_1_2, LOCALE_EXTRA_FEC_1_2 }, + { FEC_2_3, LOCALE_EXTRA_FEC_2_3 }, + { FEC_3_4, LOCALE_EXTRA_FEC_3_4 }, + { FEC_5_6, LOCALE_EXTRA_FEC_5_6 }, + { FEC_7_8, LOCALE_EXTRA_FEC_7_8 }, + { FEC_AUTO, LOCALE_EXTRA_FEC_AUTO }, + // DTMB ie + { FEC_2_5, LOCALE_EXTRA_FEC_2_5 }, + { FEC_3_5, LOCALE_EXTRA_FEC_3_5 }, + { FEC_4_5, LOCALE_EXTRA_FEC_4_5 }, + +}; + +#define TERRSETUP_SCANTP_BW_COUNT 7 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_BW[TERRSETUP_SCANTP_BW_COUNT] = +{ + { BANDWIDTH_8_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_8MHZ }, + { BANDWIDTH_7_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_7MHZ }, + { BANDWIDTH_6_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_6MHZ }, + { BANDWIDTH_5_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_5MHZ }, + { BANDWIDTH_10_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_10MHZ }, + { BANDWIDTH_1_712_MHZ, LOCALE_EXTRA_TP_BANDWIDTH_1_712MHZ }, + { BANDWIDTH_AUTO, LOCALE_EXTRA_TP_BANDWIDTH_AUTO } +}; + +#define TERRSETUP_SCANTP_GI_COUNT 11 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_GI[TERRSETUP_SCANTP_GI_COUNT] = +{ + { GUARD_INTERVAL_1_4, LOCALE_EXTRA_TP_GI_1_4 }, + { GUARD_INTERVAL_1_8, LOCALE_EXTRA_TP_GI_1_8 }, + { GUARD_INTERVAL_1_16, LOCALE_EXTRA_TP_GI_1_16 }, + { GUARD_INTERVAL_1_32, LOCALE_EXTRA_TP_GI_1_32 }, + { GUARD_INTERVAL_1_128, LOCALE_EXTRA_TP_GI_1_128 }, + { GUARD_INTERVAL_19_128, LOCALE_EXTRA_TP_GI_19_128 }, + { GUARD_INTERVAL_19_256, LOCALE_EXTRA_TP_GI_19_256 }, + { GUARD_INTERVAL_PN420, LOCALE_EXTRA_TP_GI_PN420 }, + { GUARD_INTERVAL_PN595, LOCALE_EXTRA_TP_GI_PN595 }, + { GUARD_INTERVAL_PN945, LOCALE_EXTRA_TP_GI_PN945 }, + { GUARD_INTERVAL_AUTO, LOCALE_EXTRA_TP_GI_AUTO } +}; + +#define TERRSETUP_SCANTP_HIERARCHY_COUNT 5 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_HIERARCHY[TERRSETUP_SCANTP_HIERARCHY_COUNT] = +{ + { HIERARCHY_NONE, LOCALE_EXTRA_TP_HIERARCHY_NONE }, + { HIERARCHY_1, LOCALE_EXTRA_TP_HIERARCHY_1 }, + { HIERARCHY_2, LOCALE_EXTRA_TP_HIERARCHY_2 }, + { HIERARCHY_4, LOCALE_EXTRA_TP_HIERARCHY_4 }, + { HIERARCHY_AUTO, LOCALE_EXTRA_TP_HIERARCHY_AUTO } +}; + +#define TERRSETUP_SCANTP_TRANSMIT_MODE_COUNT 9 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_TRANSMIT_MODE[TERRSETUP_SCANTP_TRANSMIT_MODE_COUNT] = +{ + { TRANSMISSION_MODE_1K, LOCALE_EXTRA_TP_TRANSMIT_MODE_1K }, + { TRANSMISSION_MODE_2K, LOCALE_EXTRA_TP_TRANSMIT_MODE_2K }, + { TRANSMISSION_MODE_4K, LOCALE_EXTRA_TP_TRANSMIT_MODE_4K }, + { TRANSMISSION_MODE_8K, LOCALE_EXTRA_TP_TRANSMIT_MODE_8K }, + { TRANSMISSION_MODE_16K, LOCALE_EXTRA_TP_TRANSMIT_MODE_16K }, + { TRANSMISSION_MODE_32K, LOCALE_EXTRA_TP_TRANSMIT_MODE_32K }, + { TRANSMISSION_MODE_C1, LOCALE_EXTRA_TP_TRANSMIT_MODE_C1 }, + { TRANSMISSION_MODE_C3780, LOCALE_EXTRA_TP_TRANSMIT_MODE_C3780 }, + { TRANSMISSION_MODE_AUTO, LOCALE_EXTRA_TP_TRANSMIT_MODE_AUTO } +}; + +#define SATSETUP_SCANTP_MOD_COUNT 3 const CMenuOptionChooser::keyval SATSETUP_SCANTP_MOD[SATSETUP_SCANTP_MOD_COUNT] = { - { 1, LOCALE_EXTRA_TP_MOD_16 }, - { 2, LOCALE_EXTRA_TP_MOD_32 }, - { 3, LOCALE_EXTRA_TP_MOD_64 }, - { 4, LOCALE_EXTRA_TP_MOD_128}, - { 5, LOCALE_EXTRA_TP_MOD_256} + { QPSK, LOCALE_EXTRA_TP_MOD_4 }, + { PSK_8, LOCALE_EXTRA_TP_MOD_8 }, + { QAM_AUTO, LOCALE_EXTRA_TP_MOD_AUTO } +}; + +#define CABLESETUP_SCANTP_MOD_COUNT 6 +const CMenuOptionChooser::keyval CABLESETUP_SCANTP_MOD[CABLESETUP_SCANTP_MOD_COUNT] = +{ + { QAM_16, LOCALE_EXTRA_TP_MOD_16 }, + { QAM_32, LOCALE_EXTRA_TP_MOD_32 }, + { QAM_64, LOCALE_EXTRA_TP_MOD_64 }, + { QAM_128, LOCALE_EXTRA_TP_MOD_128 }, + { QAM_256, LOCALE_EXTRA_TP_MOD_256 }, + { QAM_AUTO, LOCALE_EXTRA_TP_MOD_AUTO } +}; + +#define TERRSETUP_SCANTP_MOD_COUNT 6 +const CMenuOptionChooser::keyval TERRSETUP_SCANTP_MOD[TERRSETUP_SCANTP_MOD_COUNT] = +{ + { QPSK, LOCALE_EXTRA_TP_MOD_4 }, + { QAM_16, LOCALE_EXTRA_TP_MOD_16 }, + { QAM_32, LOCALE_EXTRA_TP_MOD_32 }, + { QAM_64, LOCALE_EXTRA_TP_MOD_64 }, + { QAM_4_NR, LOCALE_EXTRA_TP_MOD_4_NR }, + { QAM_AUTO, LOCALE_EXTRA_TP_MOD_AUTO } }; #define SATSETUP_SCANTP_POL_COUNT 4 @@ -298,7 +410,7 @@ int CScanSetup::exec(CMenuTarget* parent, const std::string &actionKey) g_settings.keep_channel_numbers = 1; CServiceManager::getInstance()->KeepNumbers(g_settings.keep_channel_numbers); } - CScanTs scanTs(FE_QAM); + CScanTs scanTs(ALL_CABLE); scanTs.exec(NULL, "manual"); if (is_wizard) return menu_return::RETURN_EXIT_ALL; @@ -315,11 +427,11 @@ int CScanSetup::exec(CMenuTarget* parent, const std::string &actionKey) std::string scants_key[] = {"all", "manual", "test", "fast", "auto"/*doesn't exists in CScanTs!*/}; if (actionKey.size() > 1) { - int delsys; + delivery_system_t delsys; switch (actionKey[0]) { - case 's': delsys = FE_QPSK; break; - case 't': delsys = FE_OFDM; break; - default: delsys = FE_QAM; break; + case 's': delsys = ALL_SAT; break; + case 't': delsys = ALL_TERR; break; + default: delsys = ALL_CABLE; break; } std::string as = actionKey.substr(1); printf("[neutrino] CScanSetup::%s scan %c in %s mode...\n", __FUNCTION__, actionKey[0], as.c_str()); @@ -418,7 +530,7 @@ int CScanSetup::showScanMenu() } #endif if (CFEManager::getInstance()->haveSat()) { - r_system = DVB_S; + r_system = ALL_SAT; //settings->addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_SCANTS_PREVERENCES_RECEIVING_SYSTEM )); @@ -463,8 +575,9 @@ int CScanSetup::showScanMenu() settings->addItem(mf); settings->addItem(GenericMenuSeparatorLine); } + if (CFEManager::getInstance()->haveCable()) { - r_system = DVB_C; + r_system = ALL_CABLE; //tune timeout if(CFEManager::getInstance()->getFrontendCount() <= 1) { @@ -501,8 +614,9 @@ int CScanSetup::showScanMenu() settings->addItem(fcableScan); settings->addItem(GenericMenuSeparatorLine); } + if (CFEManager::getInstance()->haveTerr()) { - r_system = DVB_T; + r_system = ALL_TERR; // tune timeout, "Setup tuner" is not shown for only one non-sat tuner if (CFEManager::getInstance()->getFrontendCount() <= 1) { CMenuOptionNumberChooser * nc = new CMenuOptionNumberChooser(LOCALE_EXTRA_ZAPIT_FE_TIMEOUT, (int *)&zapitCfg.feTimeout, true, 6, 100); @@ -586,15 +700,17 @@ int CScanSetup::showScanMenuFrontendSetup() char name[255]; if (g_settings.easymenu) snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_FE_SETUP), i+1, - fe->getInfo()->type == FE_QPSK ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) - : fe->getInfo()->type == FE_OFDM ? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) + fe->isHybrid() ? g_Locale->getText(LOCALE_SCANTS_ACTHYBRID) + : fe->hasSat() ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) + : fe->hasTerr() ? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) : g_Locale->getText(LOCALE_SCANTS_ACTCABLE)); else snprintf(name, sizeof(name), "%s %d: %s %s", g_Locale->getText(LOCALE_SATSETUP_FE_SETUP), i+1, - fe->getInfo()->type == FE_QPSK ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) - : fe->getInfo()->type == FE_OFDM ? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) + fe->isHybrid() ? g_Locale->getText(LOCALE_SCANTS_ACTHYBRID) + : fe->hasSat() ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) + : fe->hasTerr()? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) : g_Locale->getText(LOCALE_SCANTS_ACTCABLE), - fe->getInfo()->name); + fe->getName()); const char * icon = NULL; neutrino_msg_t key = CRCInput::RC_nokey; @@ -735,11 +851,12 @@ int CScanSetup::showFrontendSetup(int number) char name[255]; if (g_settings.easymenu) snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_FE_SETUP), number+1, - fe->getInfo()->type == FE_QPSK ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) - : fe->getInfo()->type == FE_OFDM ? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) + fe->isHybrid() ? g_Locale->getText(LOCALE_SCANTS_ACTHYBRID) + : fe->hasSat() ? g_Locale->getText(LOCALE_SCANTS_ACTSATELLITE) + : fe->hasTerr() ? g_Locale->getText(LOCALE_SCANTS_ACTTERRESTRIAL) : g_Locale->getText(LOCALE_SCANTS_ACTCABLE)); else - snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_FE_SETUP), number+1, fe->getInfo()->name); + snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_FE_SETUP), number+1, fe->getName()); CMenuWidget * setupMenu = new CMenuWidget(name, NEUTRINO_ICON_SETTINGS, width); setupMenu->setSelected(feselected); @@ -760,14 +877,14 @@ int CScanSetup::showFrontendSetup(int number) /* by default, enable first 2 options */ int mode_count = 2; - if (fe->getInfo()->type == FE_QPSK) { + if (fe->hasSat()) { /* enable master option, check if we have masters to enable link options */ mode_count = 3; for (int i = 0; i < fecount; i++) { CFrontend * testfe = CFEManager::getInstance()->getFE(i); - if (i != fenumber && (fe->getType() == testfe->getType()) && (testfe->getMode() == CFrontend::FE_MODE_MASTER)) { + if (i != fenumber && (fe->getSupportedDeliverySystems() == testfe->getSupportedDeliverySystems()) && (testfe->getMode() == CFrontend::FE_MODE_MASTER)) { int num = testfe->getNumber(); - snprintf(fename[select_count], sizeof(fename[select_count]), "%d: %s", num+1, testfe->getInfo()->name); + snprintf(fename[select_count], sizeof(fename[select_count]), "%d: %s", num+1, testfe->getName()); feselect[select_count].key = num; feselect[select_count].value = NONEXISTANT_LOCALE; feselect[select_count].valname = fename[select_count]; @@ -798,7 +915,7 @@ int CScanSetup::showFrontendSetup(int number) setupMenu->addItem(mc); msettings.Clear(); - if (fe->getInfo()->type == FE_QPSK) { + if (fe->hasSat()) { /* disable all but mode option for linked frontends */ bool allow_moptions = !CFrontend::linked(femode) && femode != CFrontend::FE_MODE_UNUSED; @@ -945,7 +1062,7 @@ int CScanSetup::showScanMenuLnbSetup() CFrontend * fe = CFEManager::getInstance()->getFE(fenumber); char name[255]; - snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_SATELLITE), fenumber+1, fe->getInfo()->name); + snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_SATSETUP_SATELLITE), fenumber+1, fe->getName()); CMenuWidget * sat_setup = new CMenuWidget(name, NEUTRINO_ICON_SETTINGS, width); sat_setup->addIntroItems(); @@ -1001,7 +1118,7 @@ void CScanSetup::fillSatSelect(CMenuOptionStringChooser * select) for(int i = 0; i < count; i++) { CFrontend * fe = CFEManager::getInstance()->getFE(i); - if ((fe->getInfo()->type != FE_QPSK) || (fe->getMode() == CFrontend::FE_MODE_UNUSED)) + if (!fe->hasSat() || (fe->getMode() == CFrontend::FE_MODE_UNUSED)) continue; satellite_map_t & satmap = fe->getSatellites(); @@ -1036,7 +1153,7 @@ void CScanSetup::fillSatSelect(CMenuOptionStringChooser * select) //init cable provider menu void CScanSetup::fillCableSelect(CMenuOptionStringChooser * select) { - const char *what = r_system == DVB_C ? "cable" : "terrestrial"; + const char *what = (r_system & ALL_CABLE) ? "cable" : "terrestrial"; printf("[neutrino] CScanSetup call %s (%s)...\n", __func__, what); //don't misunderstand the name "satSelect", in this context it's actually for cable providers satellite_map_t satmap = CServiceManager::getInstance()->SatelliteList(); @@ -1044,9 +1161,7 @@ void CScanSetup::fillCableSelect(CMenuOptionStringChooser * select) std::string fname; for (sat_iterator_t sit = satmap.begin(); sit != satmap.end(); sit++) { - if (r_system == DVB_C && sit->second.deltype != FE_QAM) - continue; - if (r_system == DVB_T && sit->second.deltype != FE_OFDM) + if (!(r_system & sit->second.delsys)) continue; printf("Adding %s menu for %s position %d\n", what, sit->second.name.c_str(), sit->first); @@ -1060,11 +1175,42 @@ void CScanSetup::fillCableSelect(CMenuOptionStringChooser * select) dprintf(DEBUG_DEBUG, "got scanprovider (%s): %s\n", what, sit->second.name.c_str()); } + if (!sfound && !fname.empty()) { - if (r_system == DVB_C) + if (r_system & ALL_CABLE) scansettings.cableName = fname; - if (r_system == DVB_T) - scansettings.terrName = fname; + } +} + +//init terrestrial provider menu +void CScanSetup::fillTerrSelect(CMenuOptionStringChooser * select) +{ + const char *what = (r_system & ALL_TERR) ? "terrestrial" : "cable"; + printf("[neutrino] CScanSetup call %s (%s)...\n", __func__, what); + //don't misunderstand the name "satSelect", in this context it's actually for cable providers + satellite_map_t satmap = CServiceManager::getInstance()->SatelliteList(); + bool sfound = false; + std::string fname; + for (sat_iterator_t sit = satmap.begin(); sit != satmap.end(); sit++) + { + if (!(r_system & sit->second.delsys)) + continue; + + printf("Adding %s menu for %s position %d\n", what, sit->second.name.c_str(), sit->first); + select->addOption(sit->second.name.c_str()); + + if (fname.empty()) + fname = sit->second.name; + + if (!sfound && (scansettings.terrestrialName == sit->second.name)) + sfound = true; + + dprintf(DEBUG_DEBUG, "got scanprovider (%s): %s\n", what, sit->second.name.c_str()); + } + + if (!sfound && !fname.empty()) { + if (r_system & ALL_TERR) + scansettings.terrestrialName = fname; } } @@ -1076,9 +1222,9 @@ int CScanSetup::showScanMenuSatFind() char name[255]; static int selected = 0; - r_system = DVB_S; + r_system = ALL_SAT; - snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_MOTORCONTROL_HEAD), fenumber+1, fe->getInfo()->name); + snprintf(name, sizeof(name), "%s %d: %s", g_Locale->getText(LOCALE_MOTORCONTROL_HEAD), fenumber+1, fe->getName()); CMenuWidget* sat_findMenu = new CMenuWidget(name /*LOCALE_MOTORCONTROL_HEAD*/, NEUTRINO_ICON_SETTINGS, width); sat_findMenu->setSelected(selected); @@ -1191,7 +1337,7 @@ void CScanSetup::addScanMenuManualScan(CMenuWidget *manual_Scan, bool stest) manual_Scan->addIntroItems(); const char *act_test, *act_manual; //---------------------------------------------------------------------- - if (r_system == DVB_C) { + if (r_system == ALL_CABLE) { act_test = "ctest"; act_manual = "cmanual"; CMenuOptionStringChooser * cableSelect = new CMenuOptionStringChooser(LOCALE_CABLESETUP_PROVIDER, &scansettings.cableName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); cableSelect->setHint("", LOCALE_MENU_HINT_SCAN_CABLE); @@ -1201,14 +1347,14 @@ void CScanSetup::addScanMenuManualScan(CMenuWidget *manual_Scan, bool stest) mf->setHint("", LOCALE_MENU_HINT_SCAN_NID); manual_Scan->addItem(mf); mf = new CMenuDForwarder(LOCALE_SCANTS_SELECT_TP, true, NULL, new CTPSelectHandler(), "cable", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); - } else if (r_system == DVB_T) { + } else if (r_system == ALL_TERR) { act_test = "ttest"; act_manual = "tmanual"; - CMenuOptionStringChooser * terrSelect = new CMenuOptionStringChooser(LOCALE_TERRESTRIALSETUP_PROVIDER, &scansettings.terrName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); + CMenuOptionStringChooser * terrSelect = new CMenuOptionStringChooser(LOCALE_TERRESTRIALSETUP_PROVIDER, &scansettings.terrestrialName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); //terrSelect->setHint("", LOCALE_MENU_HINT_SCAN_CABLE); - fillCableSelect(terrSelect); + fillTerrSelect(terrSelect); manual_Scan->addItem(terrSelect); mf = new CMenuDForwarder(LOCALE_SCANTS_SELECT_TP, true, NULL, new CTPSelectHandler(), "terrestrial", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); - } else { + } else if (r_system == ALL_SAT) { act_test = "stest"; act_manual = "smanual"; CMenuOptionStringChooser * satSelect = new CMenuOptionStringChooser(LOCALE_SATSETUP_SATELLITE, &scansettings.satName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); satSelect->setHint("", LOCALE_MENU_HINT_SCAN_SATELLITE); @@ -1216,6 +1362,8 @@ void CScanSetup::addScanMenuManualScan(CMenuWidget *manual_Scan, bool stest) fillSatSelect(satSelect); manual_Scan->addItem(satSelect); mf = new CMenuDForwarder(LOCALE_SCANTS_SELECT_TP, true, NULL, new CTPSelectHandler(), "sat", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); + } else { + return; } mf->setHint("", LOCALE_MENU_HINT_SCAN_TPSELECT); @@ -1355,7 +1503,7 @@ void CScanSetup::addScanMenuAutoScan(CMenuWidget *auto_Scan) auto_Scan->addIntroItems(); const char *action; - if (r_system == DVB_C) { //cable + if (r_system == ALL_CABLE) { //cable CMenuOptionStringChooser * cableSelect = new CMenuOptionStringChooser(LOCALE_CABLESETUP_PROVIDER, &scansettings.cableName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); cableSelect->setHint("", LOCALE_MENU_HINT_SCAN_CABLE); fillCableSelect(cableSelect); @@ -1364,19 +1512,21 @@ void CScanSetup::addScanMenuAutoScan(CMenuWidget *auto_Scan) mf->setHint("", LOCALE_MENU_HINT_SCAN_NID); auto_Scan->addItem(mf); action = "cauto"; - } else if (r_system == DVB_T) { - CMenuOptionStringChooser * terrSelect = new CMenuOptionStringChooser(LOCALE_TERRESTRIALSETUP_PROVIDER, &scansettings.terrName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); + } else if (r_system == ALL_TERR) { + CMenuOptionStringChooser * terrSelect = new CMenuOptionStringChooser(LOCALE_TERRESTRIALSETUP_PROVIDER, &scansettings.terrestrialName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); //terrSelect->setHint("", LOCALE_MENU_HINT_SCAN_CABLE); fillCableSelect(terrSelect); auto_Scan->addItem(terrSelect); action = "tauto"; - } else { + } else if (r_system == ALL_SAT) { CMenuOptionStringChooser * satSelect = new CMenuOptionStringChooser(LOCALE_SATSETUP_SATELLITE, &scansettings.satName, true, this, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED, true); satSelect->setHint("", LOCALE_MENU_HINT_SCAN_SATELLITE); /* add configured satellites to satSelect */ fillSatSelect(satSelect); auto_Scan->addItem(satSelect); action = "sauto"; + } else { + return; } auto_Scan->addItem(GenericMenuSeparatorLine); @@ -1413,6 +1563,9 @@ void CScanSetup::addScanMenuCable(CMenuWidget *menu) menu->addItem(GenericMenuSeparatorLine); + CMenuOptionChooser *delsys = new CMenuOptionChooser(LOCALE_EXTRA_TP_DELSYS, (int *)&scansettings.cable_TP_delsys, CABLESETUP_SCANTP_DELSYS, CABLESETUP_SCANTP_DELSYS_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + delsys->setHint("", LOCALE_MENU_HINT_SCAN_DELSYS); + CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, &scansettings.cable_TP_freq, 6, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); CMenuForwarder *Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.cable_TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++)); Freq->setHint("", LOCALE_MENU_HINT_SCAN_FREQ); @@ -1421,12 +1574,14 @@ void CScanSetup::addScanMenuCable(CMenuWidget *menu) CMenuForwarder *Rate = new CMenuDForwarder(LOCALE_EXTRA_TP_RATE, true, scansettings.cable_TP_rate, rate, "", CRCInput::convertDigitToKey(shortCut++)); Rate->setHint("", LOCALE_MENU_HINT_SCAN_RATE); - CMenuOptionChooser * mod_pol = new CMenuOptionChooser(LOCALE_EXTRA_TP_MOD, (int *)&scansettings.cable_TP_mod, SATSETUP_SCANTP_MOD, SATSETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); - mod_pol->setHint("", LOCALE_MENU_HINT_SCAN_MOD); + CMenuOptionChooser *mod = new CMenuOptionChooser(LOCALE_EXTRA_TP_MOD, (int *)&scansettings.cable_TP_mod, CABLESETUP_SCANTP_MOD, CABLESETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + mod->setHint("", LOCALE_MENU_HINT_SCAN_MOD); + + menu->addItem(delsys); menu->addItem(Freq); menu->addItem(Rate); - menu->addItem(mod_pol); + menu->addItem(mod); CMenuOptionChooser *lcn = new CMenuOptionChooser(LOCALE_SATSETUP_LOGICAL_NUMBERS, (int *)&scansettings.scan_logical_numbers, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this, CRCInput::convertDigitToKey(shortCut++)); lcn->setHint("", LOCALE_MENU_HINT_SCAN_LOGICAL); @@ -1454,45 +1609,90 @@ int CScanSetup::addScanOptionsItems(CMenuWidget *options_menu, const int &shortc int shortCut = shortcut; CMenuOptionChooser *fec = NULL; - CMenuOptionChooser *mod_pol = NULL; + CMenuOptionChooser *mod = NULL; + CMenuOptionChooser *pol = NULL; + CMenuOptionChooser *bw = NULL; + CMenuOptionChooser *gi = NULL; + CMenuOptionChooser *hi = NULL; + CMenuOptionChooser *delsys = NULL; + CMenuOptionChooser *coderateHP = NULL; + CMenuOptionChooser *coderateLP = NULL; + CMenuOptionChooser *tm = NULL; CMenuForwarder *Freq = NULL; CMenuForwarder *Rate = NULL; - if (r_system == DVB_S) { + if (r_system == ALL_SAT) { + delsys = new CMenuOptionChooser(LOCALE_EXTRA_TP_DELSYS, (int *)&scansettings.sat_TP_delsys, SATSETUP_SCANTP_DELSYS, SATSETUP_SCANTP_DELSYS_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + delsys->setHint("", LOCALE_MENU_HINT_SCAN_DELSYS); CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, &scansettings.sat_TP_freq, 8, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.sat_TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++)); Freq->setHint("", LOCALE_MENU_HINT_SCAN_FREQ); - CStringInput *rate = new CStringInput(LOCALE_EXTRA_TP_RATE, &scansettings.sat_TP_rate, 8, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); Rate = new CMenuDForwarder(LOCALE_EXTRA_TP_RATE, true, scansettings.sat_TP_rate, rate, "", CRCInput::convertDigitToKey(shortCut++)); Rate->setHint("", LOCALE_MENU_HINT_SCAN_RATE); + mod = new CMenuOptionChooser(LOCALE_EXTRA_TP_MOD, (int *)&scansettings.sat_TP_mod, SATSETUP_SCANTP_MOD, SATSETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + mod->setHint("", LOCALE_MENU_HINT_SCAN_MOD); fec = new CMenuOptionChooser(LOCALE_EXTRA_TP_FEC, (int *)&scansettings.sat_TP_fec, SATSETUP_SCANTP_FEC, SATSETUP_SCANTP_FEC_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); fec->setHint("", LOCALE_MENU_HINT_SCAN_FEC); - mod_pol = new CMenuOptionChooser(LOCALE_EXTRA_TP_POL, (int *)&scansettings.sat_TP_pol, SATSETUP_SCANTP_POL, SATSETUP_SCANTP_POL_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); - mod_pol->setHint("", LOCALE_MENU_HINT_SCAN_POL); - } else if (r_system == DVB_C) { + pol = new CMenuOptionChooser(LOCALE_EXTRA_TP_POL, (int *)&scansettings.sat_TP_pol, SATSETUP_SCANTP_POL, SATSETUP_SCANTP_POL_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + pol->setHint("", LOCALE_MENU_HINT_SCAN_POL); + } else if (r_system == ALL_CABLE) { + delsys = new CMenuOptionChooser(LOCALE_EXTRA_TP_DELSYS, (int *)&scansettings.cable_TP_delsys, CABLESETUP_SCANTP_DELSYS, CABLESETUP_SCANTP_DELSYS_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + delsys->setHint("", LOCALE_MENU_HINT_SCAN_DELSYS); CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, &scansettings.cable_TP_freq, 6, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.cable_TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++)); Freq->setHint("", LOCALE_MENU_HINT_SCAN_FREQ); - CStringInput *rate = new CStringInput(LOCALE_EXTRA_TP_RATE, &scansettings.cable_TP_rate, 8, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); Rate = new CMenuDForwarder(LOCALE_EXTRA_TP_RATE, true, scansettings.cable_TP_rate, rate, "", CRCInput::convertDigitToKey(shortCut++)); Rate->setHint("", LOCALE_MENU_HINT_SCAN_RATE); - mod_pol = new CMenuOptionChooser(LOCALE_EXTRA_TP_MOD, (int *)&scansettings.cable_TP_mod, SATSETUP_SCANTP_MOD, SATSETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); - mod_pol->setHint("", LOCALE_MENU_HINT_SCAN_MOD); - } else if (r_system == DVB_T) { + mod = new CMenuOptionChooser(LOCALE_EXTRA_TP_MOD, (int *)&scansettings.cable_TP_mod, CABLESETUP_SCANTP_MOD, CABLESETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + mod->setHint("", LOCALE_MENU_HINT_SCAN_MOD); + } else if (r_system == ALL_TERR) { // TODO: more params ? - CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, &scansettings.terr_TP_freq, 6, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); - Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.terr_TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++)); + delsys = new CMenuOptionChooser(LOCALE_EXTRA_TP_DELSYS, (int *)&scansettings.terrestrial_TP_delsys, TERRSETUP_SCANTP_DELSYS, TERRSETUP_SCANTP_DELSYS_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + delsys->setHint("", LOCALE_MENU_HINT_SCAN_DELSYS); + CStringInput *freq = new CStringInput(LOCALE_EXTRA_TP_FREQ, &scansettings.terrestrial_TP_freq, 6, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, "0123456789"); + Freq = new CMenuDForwarder(LOCALE_EXTRA_TP_FREQ, true, scansettings.terrestrial_TP_freq, freq, "", CRCInput::convertDigitToKey(shortCut++)); Freq->setHint("", LOCALE_MENU_HINT_SCAN_FREQ); + bw = new CMenuOptionChooser(LOCALE_EXTRA_TP_BANDWIDTH, (int *)&scansettings.terrestrial_TP_bw, TERRSETUP_SCANTP_BW, TERRSETUP_SCANTP_BW_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + bw->setHint("", LOCALE_MENU_HINT_SCAN_BW); + mod = new CMenuOptionChooser(LOCALE_EXTRA_TP_CONSTELLATION, (int *)&scansettings.terrestrial_TP_constel, TERRSETUP_SCANTP_MOD, TERRSETUP_SCANTP_MOD_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + mod->setHint("", LOCALE_MENU_HINT_SCAN_MOD); + gi = new CMenuOptionChooser(LOCALE_EXTRA_TP_GI, (int *)&scansettings.terrestrial_TP_guard, TERRSETUP_SCANTP_GI, TERRSETUP_SCANTP_GI_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + gi->setHint("", LOCALE_MENU_HINT_SCAN_GI); + hi = new CMenuOptionChooser(LOCALE_EXTRA_TP_HIERARCHY, (int *)&scansettings.terrestrial_TP_hierarchy, TERRSETUP_SCANTP_HIERARCHY, TERRSETUP_SCANTP_HIERARCHY_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + hi->setHint("", LOCALE_MENU_HINT_SCAN_HIERARCHY); + coderateHP = new CMenuOptionChooser(LOCALE_EXTRA_TP_CODERATE_HP, (int *)&scansettings.terrestrial_TP_coderate_HP, TERRSETUP_SCANTP_FEC, TERRSETUP_SCANTP_FEC_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + coderateHP->setHint("", LOCALE_MENU_HINT_SCAN_FEC); + coderateLP = new CMenuOptionChooser(LOCALE_EXTRA_TP_CODERATE_LP, (int *)&scansettings.terrestrial_TP_coderate_LP, TERRSETUP_SCANTP_FEC, TERRSETUP_SCANTP_FEC_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++), "", true); + coderateLP->setHint("", LOCALE_MENU_HINT_SCAN_FEC); + tm = new CMenuOptionChooser(LOCALE_EXTRA_TP_TRANSMIT_MODE, (int *)&scansettings.terrestrial_TP_transmit_mode, TERRSETUP_SCANTP_TRANSMIT_MODE, TERRSETUP_SCANTP_TRANSMIT_MODE_COUNT, true, NULL, CRCInput::convertDigitToKey(shortCut++)); + tm->setHint("", LOCALE_MENU_HINT_SCAN_TRANSMIT_MODE); } - options_menu->addItem(Freq); + if (delsys) + options_menu->addItem(delsys); + if (Freq) + options_menu->addItem(Freq); if (Rate) options_menu->addItem(Rate); + if (bw) + options_menu->addItem(bw); + if (mod) + options_menu->addItem(mod); if (fec) options_menu->addItem(fec); - if (mod_pol) - options_menu->addItem(mod_pol); + if (gi) + options_menu->addItem(gi); + if (hi) + options_menu->addItem(hi); + if (coderateHP) + options_menu->addItem(coderateHP); + if (coderateLP) + options_menu->addItem(coderateLP); + if (tm) + options_menu->addItem(tm); + if (pol) + options_menu->addItem(pol); return shortCut; } @@ -1582,13 +1782,16 @@ bool CScanSetup::changeNotify(const neutrino_locale_t OptionName, void * /*data* else if(ARE_LOCALES_EQUAL(OptionName, LOCALE_SATSETUP_FE_MODE)) { printf("[neutrino] CScanSetup::%s: fe%d mode %d master %d\n", __FUNCTION__, fenumber, femode, femaster); CFrontend * fe = CFEManager::getInstance()->getFE(fenumber); - if (fe->getMode() == femode) + + if (fe && fe->getMode() == femode) return ret; modestr[fenumber] = g_Locale->getText(getModeLocale(femode)); fe_restart = true; - fe->setMode(femode); - if (fe && fe->getType() == FE_QPSK) { + if (fe) + fe->setMode(femode); + + if (fe && fe->hasSat()) { if (linkfe) linkfe->setActive(CFrontend::linked(femode)); /* leave diseqc type enabled for TWIN in case user need different unicable setup */ @@ -1664,25 +1867,33 @@ void CScanSetup::updateManualSettings() transponder_list_t::iterator tI; tI = transponders.find(channel->getTransponderId()); if(tI != transponders.end()) { - CFrontend * frontend = CFEManager::getInstance()->getLiveFE(); - switch (frontend->getType()) { - case FE_QPSK: - scansettings.sat_TP_freq = to_string(tI->second.feparams.dvb_feparams.frequency); - scansettings.sat_TP_rate = to_string(tI->second.feparams.dvb_feparams.u.qpsk.symbol_rate); - scansettings.sat_TP_fec = tI->second.feparams.dvb_feparams.u.qpsk.fec_inner; - scansettings.sat_TP_pol = tI->second.polarization; - scansettings.satName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); - break; - case FE_QAM: - scansettings.cable_TP_freq = to_string(tI->second.feparams.dvb_feparams.frequency); - scansettings.cable_TP_rate = to_string(tI->second.feparams.dvb_feparams.u.qam.symbol_rate); - scansettings.cable_TP_fec = tI->second.feparams.dvb_feparams.u.qam.fec_inner; - scansettings.cable_TP_mod = tI->second.feparams.dvb_feparams.u.qam.modulation; - scansettings.cableName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); - break; - case FE_OFDM: - case FE_ATSC: - break; + // CFrontend *frontend = CFEManager::getInstance()->getLiveFE(); + // FIXME: should this be live fe current delsys or delsys from tuned TP + if (CFrontend::isSat(tI->second.feparams.delsys)) { + scansettings.sat_TP_freq = to_string(tI->second.feparams.frequency); + scansettings.sat_TP_rate = to_string(tI->second.feparams.symbol_rate); + scansettings.sat_TP_fec = tI->second.feparams.fec_inner; + scansettings.sat_TP_pol = tI->second.feparams.polarization; + scansettings.sat_TP_delsys = tI->second.feparams.delsys; + scansettings.satName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); + } else if (CFrontend::isCable(tI->second.feparams.delsys)) { + scansettings.cable_TP_freq = to_string(tI->second.feparams.frequency); + scansettings.cable_TP_rate = to_string(tI->second.feparams.symbol_rate); + scansettings.cable_TP_fec = tI->second.feparams.fec_inner; + scansettings.cable_TP_mod = tI->second.feparams.modulation; + scansettings.cable_TP_delsys = tI->second.feparams.delsys; + scansettings.cableName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); + } else if (CFrontend::isTerr(tI->second.feparams.delsys)) { + scansettings.terrestrial_TP_freq = to_string(tI->second.feparams.frequency); + scansettings.terrestrial_TP_bw = tI->second.feparams.bandwidth; + scansettings.terrestrial_TP_constel = tI->second.feparams.modulation; + scansettings.terrestrial_TP_hierarchy = tI->second.feparams.hierarchy; + scansettings.terrestrial_TP_delsys = tI->second.feparams.delsys; + scansettings.terrestrial_TP_transmit_mode = tI->second.feparams.transmission_mode; + scansettings.terrestrial_TP_coderate_HP = tI->second.feparams.code_rate_HP; + scansettings.terrestrial_TP_coderate_LP = tI->second.feparams.code_rate_LP; + + scansettings.terrestrialName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); } } } @@ -1707,7 +1918,7 @@ int CTPSelectHandler::exec(CMenuTarget* parent, const std::string &actionkey) if (actionkey == "sat") name = scansettings.satName; else if (actionkey == "terrestrial") - name = scansettings.terrName; + name = scansettings.terrestrialName; else name = scansettings.cableName; @@ -1763,27 +1974,43 @@ int CTPSelectHandler::exec(CMenuTarget* parent, const std::string &actionkey) tmpI = tmplist.find(select); - printf("CTPSelectHandler::exec: selected TP: freq %d pol %d SR %d\n", tmpI->second.feparams.dvb_feparams.frequency, - tmpI->second.polarization, tmpI->second.feparams.dvb_feparams.u.qpsk.symbol_rate); - switch (tmpI->second.deltype) { - case FE_QPSK: - scansettings.sat_TP_freq = to_string(tmpI->second.feparams.dvb_feparams.frequency); - scansettings.sat_TP_rate = to_string(tmpI->second.feparams.dvb_feparams.u.qpsk.symbol_rate); - scansettings.sat_TP_fec = tmpI->second.feparams.dvb_feparams.u.qpsk.fec_inner; - scansettings.sat_TP_pol = tmpI->second.polarization; - break; - case FE_QAM: - scansettings.cable_TP_freq = to_string(tmpI->second.feparams.dvb_feparams.frequency); - scansettings.cable_TP_rate = to_string(tmpI->second.feparams.dvb_feparams.u.qam.symbol_rate); - scansettings.cable_TP_fec = tmpI->second.feparams.dvb_feparams.u.qam.fec_inner; - scansettings.cable_TP_mod = tmpI->second.feparams.dvb_feparams.u.qam.modulation; - break; - case FE_OFDM: - scansettings.terr_TP_freq = to_string(tmpI->second.feparams.dvb_feparams.frequency); - break; - case FE_ATSC: - break; + if (CFrontend::isSat(tmpI->second.feparams.delsys)) { + printf("CTPSelectHandler::exec: selected TP: freq %d pol %d SR %d\n", + tmpI->second.feparams.frequency, + tmpI->second.feparams.polarization, + tmpI->second.feparams.symbol_rate); + scansettings.sat_TP_freq = to_string(tmpI->second.feparams.frequency); + scansettings.sat_TP_rate = to_string(tmpI->second.feparams.symbol_rate); + scansettings.sat_TP_fec = tmpI->second.feparams.fec_inner; + scansettings.sat_TP_pol = tmpI->second.feparams.polarization; + } + else if (CFrontend::isCable(tmpI->second.feparams.delsys)) { + printf("CTPSelectHandler::exec: selected TP: freq %d SR %d FEC %d\n", + tmpI->second.feparams.frequency, + tmpI->second.feparams.symbol_rate, + tmpI->second.feparams.fec_inner); + + scansettings.cable_TP_freq = to_string(tmpI->second.feparams.frequency); + scansettings.cable_TP_rate = to_string(tmpI->second.feparams.symbol_rate); + scansettings.cable_TP_fec = tmpI->second.feparams.fec_inner; + scansettings.cable_TP_mod = tmpI->second.feparams.modulation; + } + else if (CFrontend::isTerr(tmpI->second.feparams.delsys)) { + printf("CTPSelectHandler::exec: selected TP: freq %d BW %d CON %d\n", + tmpI->second.feparams.frequency, + tmpI->second.feparams.bandwidth, + tmpI->second.feparams.modulation); + scansettings.terrestrial_TP_freq = to_string(tmpI->second.feparams.frequency); + scansettings.terrestrial_TP_bw = tmpI->second.feparams.bandwidth; + scansettings.terrestrial_TP_constel = tmpI->second.feparams.modulation; + scansettings.terrestrial_TP_hierarchy = tmpI->second.feparams.hierarchy; + scansettings.terrestrial_TP_delsys = tmpI->second.feparams.delsys; + scansettings.terrestrial_TP_transmit_mode = tmpI->second.feparams.transmission_mode; + scansettings.terrestrial_TP_coderate_HP = tmpI->second.feparams.code_rate_HP; + scansettings.terrestrial_TP_coderate_LP = tmpI->second.feparams.code_rate_LP; + //scansettings.terrestrialName = CServiceManager::getInstance()->GetSatelliteName(channel->getSatellitePosition()); + } } diff --git a/src/gui/scan_setup.h b/src/gui/scan_setup.h index a61dd34ea..93c7188e7 100644 --- a/src/gui/scan_setup.h +++ b/src/gui/scan_setup.h @@ -106,6 +106,7 @@ class CScanSetup : public CMenuTarget, public CChangeObserver int showScanMenuSatFind(); void fillSatSelect(CMenuOptionStringChooser *select); void fillCableSelect(CMenuOptionStringChooser *select); + void fillTerrSelect(CMenuOptionStringChooser *select); neutrino_locale_t getModeLocale(int mode); int showScanMenuFrontendSetup(); diff --git a/src/gui/streaminfo2.cpp b/src/gui/streaminfo2.cpp index 8531fd36a..cfd08c1ff 100644 --- a/src/gui/streaminfo2.cpp +++ b/src/gui/streaminfo2.cpp @@ -257,7 +257,7 @@ void CStreamInfo2::paint_signal_fe_box(int _x, int _y, int w, int h) int tuner = 1 + frontend->getNumber(); char tname[255]; - snprintf(tname, sizeof(tname), "%s: %d: %s", g_Locale->getText(LOCALE_STREAMINFO_SIGNAL), tuner, frontend->getInfo()->name); + snprintf(tname, sizeof(tname), "%s: %d: %s", g_Locale->getText(LOCALE_STREAMINFO_SIGNAL), tuner, frontend->getName()); g_Font[font_small]->RenderString(_x, _y+iheight+15, width-_x-10, tname /*tuner_name.c_str()*/, COL_INFOBAR_TEXT); @@ -565,11 +565,11 @@ void CStreamInfo2::paint_techinfo(int xpos, int ypos) //satellite ypos += iheight; - if(t.deltype == FE_QPSK) + if (CFrontend::isSat(t.feparams.delsys)) sprintf (buf, "%s:",g_Locale->getText (LOCALE_SATSETUP_SATELLITE));//swiped locale - else if(t.deltype == FE_QAM) + else if (CFrontend::isCable(t.feparams.delsys)) sprintf (buf, "%s:",g_Locale->getText (LOCALE_CHANNELLIST_PROVS)); - else + else if (CFrontend::isTerr(t.feparams.delsys)) snprintf (buf, sizeof(buf), "%s:",g_Locale->getText (LOCALE_TERRESTRIALSETUP_AREA)); g_Font[font_info]->RenderString(xpos, ypos, box_width, buf, COL_INFOBAR_TEXT); @@ -589,7 +589,7 @@ void CStreamInfo2::paint_techinfo(int xpos, int ypos) ypos += iheight; scaling = 27000; - if (t.deltype == FE_QPSK && t.feparams.dvb_feparams.u.qpsk.fec_inner < FEC_S2_QPSK_1_2) + if (CFrontend::isSat(t.feparams.delsys) && t.feparams.fec_inner < FEC_S2_QPSK_1_2) scaling = 15000; sprintf (buf, "%s",g_Locale->getText (LOCALE_SCANTS_FREQDATA)); diff --git a/src/neutrino.cpp b/src/neutrino.cpp index c760ece20..32204a41b 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -1944,7 +1944,7 @@ TIMER_START(); cpuFreq->SetCpuFreq(g_settings.cpufreq * 1000 * 1000); #if HAVE_COOL_HARDWARE /* only SAT-hd1 before rev 8 has fan */ - g_info.has_fan = (cs_get_revision() < 8 && CFEManager::getInstance()->getFE(0)->getInfo()->type == FE_QPSK); + g_info.has_fan = (cs_get_revision() < 8 && CFEManager::getInstance()->getFE(0)->hasSat()); #endif dprintf(DEBUG_NORMAL, "g_info.has_fan: %d\n", g_info.has_fan); //fan speed diff --git a/src/system/locals.h b/src/system/locals.h index 2dd563ca1..fbe8f1391 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -399,25 +399,11 @@ typedef enum LOCALE_EXTRA_FEC_5_6, LOCALE_EXTRA_FEC_7_8, LOCALE_EXTRA_FEC_AUTO, - LOCALE_EXTRA_FEC_AUTO_S2, - LOCALE_EXTRA_FEC_S2_8PSK_1_2, - LOCALE_EXTRA_FEC_S2_8PSK_2_3, - LOCALE_EXTRA_FEC_S2_8PSK_3_4, - LOCALE_EXTRA_FEC_S2_8PSK_3_5, - LOCALE_EXTRA_FEC_S2_8PSK_4_5, - LOCALE_EXTRA_FEC_S2_8PSK_5_6, - LOCALE_EXTRA_FEC_S2_8PSK_7_8, - LOCALE_EXTRA_FEC_S2_8PSK_8_9, - LOCALE_EXTRA_FEC_S2_8PSK_9_10, - LOCALE_EXTRA_FEC_S2_QPSK_1_2, - LOCALE_EXTRA_FEC_S2_QPSK_2_3, - LOCALE_EXTRA_FEC_S2_QPSK_3_4, - LOCALE_EXTRA_FEC_S2_QPSK_3_5, - LOCALE_EXTRA_FEC_S2_QPSK_4_5, - LOCALE_EXTRA_FEC_S2_QPSK_5_6, - LOCALE_EXTRA_FEC_S2_QPSK_7_8, - LOCALE_EXTRA_FEC_S2_QPSK_8_9, - LOCALE_EXTRA_FEC_S2_QPSK_9_10, + LOCALE_EXTRA_FEC_2_5, + LOCALE_EXTRA_FEC_3_5, + LOCALE_EXTRA_FEC_4_5, + LOCALE_EXTRA_FEC_8_9, + LOCALE_EXTRA_FEC_9_10, LOCALE_EXTRA_KEY_CURRENT_TRANSPONDER, LOCALE_EXTRA_KEY_FORMAT_MODE, LOCALE_EXTRA_KEY_LIST_END, @@ -454,20 +440,76 @@ typedef enum LOCALE_EXTRA_START_TOSTANDBY, LOCALE_EXTRA_TEMP_TIMESHIFT, LOCALE_EXTRA_TIMESHIFT_PAUSE, - LOCALE_EXTRA_TP_POL_V, + LOCALE_EXTRA_TP_BANDWIDTH, + LOCALE_EXTRA_TP_BANDWIDTH_8MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_7MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_6MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_5MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_10MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_1_712MHZ, + LOCALE_EXTRA_TP_BANDWIDTH_AUTO, + LOCALE_EXTRA_TP_CODERATE_HP, + LOCALE_EXTRA_TP_CODERATE_LP, + LOCALE_EXTRA_TP_CONSTELLATION, + LOCALE_EXTRA_TP_DELSYS, + LOCALE_EXTRA_TP_DELSYS_DVBC, + LOCALE_EXTRA_TP_DELSYS_DVBC2, + LOCALE_EXTRA_TP_DELSYS_DVBS, + LOCALE_EXTRA_TP_DELSYS_DVBS2, + LOCALE_EXTRA_TP_DELSYS_DVBT, + LOCALE_EXTRA_TP_DELSYS_DVBT2, + LOCALE_EXTRA_TP_DELSYS_DTMB, + LOCALE_EXTRA_TP_DELSYS_DSS, + LOCALE_EXTRA_TP_DELSYS_TURBO, + LOCALE_EXTRA_TP_DELSYS_ISDBS, + LOCALE_EXTRA_TP_DELSYS_ISDBC, + LOCALE_EXTRA_TP_DELSYS_ISDBT, LOCALE_EXTRA_TP_FEC, LOCALE_EXTRA_TP_FREQ, + LOCALE_EXTRA_TP_GI, + LOCALE_EXTRA_TP_GI_1_32, + LOCALE_EXTRA_TP_GI_1_16, + LOCALE_EXTRA_TP_GI_1_8, + LOCALE_EXTRA_TP_GI_1_4, + LOCALE_EXTRA_TP_GI_1_128, + LOCALE_EXTRA_TP_GI_19_128, + LOCALE_EXTRA_TP_GI_19_256, + LOCALE_EXTRA_TP_GI_PN420, + LOCALE_EXTRA_TP_GI_PN595, + LOCALE_EXTRA_TP_GI_PN945, + LOCALE_EXTRA_TP_GI_AUTO, + LOCALE_EXTRA_TP_HIERARCHY, + LOCALE_EXTRA_TP_HIERARCHY_NONE, + LOCALE_EXTRA_TP_HIERARCHY_1, + LOCALE_EXTRA_TP_HIERARCHY_2, + LOCALE_EXTRA_TP_HIERARCHY_4, + LOCALE_EXTRA_TP_HIERARCHY_AUTO, LOCALE_EXTRA_TP_MOD, - LOCALE_EXTRA_TP_MOD_128, + LOCALE_EXTRA_TP_MOD_4, + LOCALE_EXTRA_TP_MOD_8, LOCALE_EXTRA_TP_MOD_16, - LOCALE_EXTRA_TP_MOD_256, LOCALE_EXTRA_TP_MOD_32, LOCALE_EXTRA_TP_MOD_64, + LOCALE_EXTRA_TP_MOD_128, + LOCALE_EXTRA_TP_MOD_256, + LOCALE_EXTRA_TP_MOD_AUTO, + LOCALE_EXTRA_TP_MOD_4_NR, LOCALE_EXTRA_TP_POL, LOCALE_EXTRA_TP_POL_H, LOCALE_EXTRA_TP_POL_L, LOCALE_EXTRA_TP_POL_R, + LOCALE_EXTRA_TP_POL_V, LOCALE_EXTRA_TP_RATE, + LOCALE_EXTRA_TP_TRANSMIT_MODE, + LOCALE_EXTRA_TP_TRANSMIT_MODE_1K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_2K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_4K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_8K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_16K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_32K, + LOCALE_EXTRA_TP_TRANSMIT_MODE_C1, + LOCALE_EXTRA_TP_TRANSMIT_MODE_C3780, + LOCALE_EXTRA_TP_TRANSMIT_MODE_AUTO, LOCALE_EXTRA_UPDATE_DIR, LOCALE_EXTRA_USE_GOTOXX, LOCALE_EXTRA_VOLUME_DIGITS, @@ -1146,9 +1188,11 @@ typedef enum LOCALE_MENU_HINT_SCAN_AUTOALL, LOCALE_MENU_HINT_SCAN_AUTOALL_SELECT, LOCALE_MENU_HINT_SCAN_BOUQUET, + LOCALE_MENU_HINT_SCAN_BW, LOCALE_MENU_HINT_SCAN_CABLE, LOCALE_MENU_HINT_SCAN_CABLE_SIMPLE, LOCALE_MENU_HINT_SCAN_COMMITED, + LOCALE_MENU_HINT_SCAN_DELSYS, LOCALE_MENU_HINT_SCAN_DISEQC, LOCALE_MENU_HINT_SCAN_DISEQCORDER, LOCALE_MENU_HINT_SCAN_DISEQCREPEAT, @@ -1164,6 +1208,8 @@ typedef enum LOCALE_MENU_HINT_SCAN_FESETUP, LOCALE_MENU_HINT_SCAN_FETIMEOUT, LOCALE_MENU_HINT_SCAN_FREQ, + LOCALE_MENU_HINT_SCAN_GI, + LOCALE_MENU_HINT_SCAN_HIERARCHY, LOCALE_MENU_HINT_SCAN_FTA, LOCALE_MENU_HINT_SCAN_LADIRECTION, LOCALE_MENU_HINT_SCAN_LATITUDE, @@ -1201,6 +1247,7 @@ typedef enum LOCALE_MENU_HINT_SCAN_START, LOCALE_MENU_HINT_SCAN_TEST, LOCALE_MENU_HINT_SCAN_TPSELECT, + LOCALE_MENU_HINT_SCAN_TRANSMIT_MODE, LOCALE_MENU_HINT_SCAN_UNCOMMITED, LOCALE_MENU_HINT_SCAN_USALS, LOCALE_MENU_HINT_SCAN_USALS_REPEAT, @@ -1860,6 +1907,11 @@ typedef enum LOCALE_SATSETUP_FASTSCAN_SD, LOCALE_SATSETUP_FASTSCAN_TYPE, LOCALE_SATSETUP_FASTSCAN_UPDATE, + LOCALE_SATSETUP_FE_DELSYS_MODE, + LOCALE_SATSETUP_FE_DELSYS_MODE_AUTO, + LOCALE_SATSETUP_FE_DELSYS_MODE_CABLE, + LOCALE_SATSETUP_FE_DELSYS_MODE_SAT, + LOCALE_SATSETUP_FE_DELSYS_MODE_TERRESTRIAL, LOCALE_SATSETUP_FE_MODE, LOCALE_SATSETUP_FE_MODE_INDEPENDENT, LOCALE_SATSETUP_FE_MODE_LINK_LOOP, @@ -1900,6 +1952,7 @@ typedef enum LOCALE_SCANTS_ABORT_BODY, LOCALE_SCANTS_ABORT_HEADER, LOCALE_SCANTS_ACTCABLE, + LOCALE_SCANTS_ACTHYBRID, LOCALE_SCANTS_ACTSATELLITE, LOCALE_SCANTS_ACTTERRESTRIAL, LOCALE_SCANTS_BOUQUET, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index d6b783cb8..957a7ece4 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -399,25 +399,11 @@ const char * locale_real_names[] = "extra.fec_5_6", "extra.fec_7_8", "extra.fec_auto", - "extra.fec_auto_s2", - "extra.fec_s2_8psk_1_2", - "extra.fec_s2_8psk_2_3", - "extra.fec_s2_8psk_3_4", - "extra.fec_s2_8psk_3_5", - "extra.fec_s2_8psk_4_5", - "extra.fec_s2_8psk_5_6", - "extra.fec_s2_8psk_7_8", - "extra.fec_s2_8psk_8_9", - "extra.fec_s2_8psk_9_10", - "extra.fec_s2_qpsk_1_2", - "extra.fec_s2_qpsk_2_3", - "extra.fec_s2_qpsk_3_4", - "extra.fec_s2_qpsk_3_5", - "extra.fec_s2_qpsk_4_5", - "extra.fec_s2_qpsk_5_6", - "extra.fec_s2_qpsk_7_8", - "extra.fec_s2_qpsk_8_9", - "extra.fec_s2_qpsk_9_10", + "extra.fec_2_5", + "extra.fec_3_5", + "extra.fec_4_5", + "extra.fec_8_9", + "extra.fec_9_10", "extra.key_current_transponder", "extra.key_format_mode", "extra.key_list_end", @@ -454,20 +440,76 @@ const char * locale_real_names[] = "extra.start_tostandby", "extra.temp_timeshift", "extra.timeshift_pause", - "extra.tp.pol_v", + "extra.tp_bandwidth", + "extra.tp_bandwidth_8mhz", + "extra.tp_bandwidth_7mhz", + "extra.tp_bandwidth_6mhz", + "extra.tp_bandwidth_5mhz", + "extra.tp_bandwidth_10mhz", + "extra.tp_bandwidth_1_712mhz", + "extra.tp_bandwidth_auto", + "extra.tp_coderate_hp", + "extra.tp_coderate_lp", + "extra.tp_constellation", + "extra.tp_delsys", + "extra.tp_delsys_dvbc", + "extra.tp_delsys_dvbc2", + "extra.tp_delsys_dvbs", + "extra.tp_delsys_dvbs2", + "extra.tp_delsys_dvbt", + "extra.tp_delsys_dvbt2", + "extra.tp_delsys_dtmb", + "extra.tp_delsys_dss", + "extra.tp_delsys_turbo", + "extra.tp_delsys_isdbs", + "extra.tp_delsys_isdbc", + "extra.tp_delsys_isdbt", "extra.tp_fec", "extra.tp_freq", + "extra.tp_gi", + "extra.tp_gi_auto", + "extra.tp_gi_1_32", + "extra.tp_gi_1_16", + "extra.tp_gi_1_8", + "extra.tp_gi_1_4", + "extra.tp_gi_1_128", + "extra.tp_gi_19_128", + "extra.tp_gi_19_256", + "extra.tp_gi_pn420", + "extra.tp_gi_pn595", + "extra.tp_gi_pn945", + "extra.tp_hierarchy", + "extra.tp_hierarchy_none", + "extra.tp_hierarchy_1", + "extra.tp_hierarchy_2", + "extra.tp_hierarchy_4", + "extra.tp_hierarchy_auto", "extra.tp_mod", - "extra.tp_mod_128", + "extra.tp_mod_4", + "extra.tp_mod_8", "extra.tp_mod_16", - "extra.tp_mod_256", "extra.tp_mod_32", "extra.tp_mod_64", + "extra.tp_mod_128", + "extra.tp_mod_256", + "extra.tp_mod_auto", + "extra.tp_mod_4_nr", "extra.tp_pol", "extra.tp_pol_h", "extra.tp_pol_l", "extra.tp_pol_r", + "extra.tp_pol_v", "extra.tp_rate", + "extra.tp_transmit_mode", + "extra.tp_transmit_mode_2k", + "extra.tp_transmit_mode_4k", + "extra.tp_transmit_mode_8k", + "extra.tp_transmit_mode_1k", + "extra.tp_transmit_mode_16k", + "extra.tp_transmit_mode_32k", + "extra.tp_transmit_mode_c1", + "extra.tp_transmit_mode_c3780", + "extra.tp_transmit_mode_auto", "extra.update_dir", "extra.use_gotoxx", "extra.volume_digits", @@ -1146,9 +1188,11 @@ const char * locale_real_names[] = "menu.hint_scan_autoall", "menu.hint_scan_autoall_select", "menu.hint_scan_bouquet", + "menu.hint_scan_bw", "menu.hint_scan_cable", "menu.hint_scan_cable_simple", "menu.hint_scan_commited", + "menu.hint_scan_delsys", "menu.hint_scan_diseqc", "menu.hint_scan_diseqcorder", "menu.hint_scan_diseqcrepeat", @@ -1165,6 +1209,8 @@ const char * locale_real_names[] = "menu.hint_scan_fetimeout", "menu.hint_scan_freq", "menu.hint_scan_fta", + "menu.hint_scan_gi", + "menu.hint_scan_hierarchy", "menu.hint_scan_ladirection", "menu.hint_scan_latitude", "menu.hint_scan_lnbconfig", @@ -1201,6 +1247,7 @@ const char * locale_real_names[] = "menu.hint_scan_start", "menu.hint_scan_test", "menu.hint_scan_tpselect", + "menu.hint_scan_transmit_mode", "menu.hint_scan_uncommited", "menu.hint_scan_usals", "menu.hint_scan_usals_repeat", @@ -1860,6 +1907,11 @@ const char * locale_real_names[] = "satsetup.fastscan_sd", "satsetup.fastscan_type", "satsetup.fastscan_update", + "satsetup.fe_delsys_mode", + "satsetup.fe_delsys_mode_auto", + "satsetup.fe_delsys_mode_cable", + "satsetup.fe_delsys_mode_sat", + "satsetup.fe_delsys_mode_terrestrial", "satsetup.fe_mode", "satsetup.fe_mode_independent", "satsetup.fe_mode_link_loop", @@ -1900,6 +1952,7 @@ const char * locale_real_names[] = "scants.abort_body", "scants.abort_header", "scants.actcable", + "scants.acthybrid", "scants.actsatellite", "scants.actterrestrial", "scants.bouquet", diff --git a/src/system/settings.cpp b/src/system/settings.cpp index 5515e72bb..80ea42ef4 100644 --- a/src/system/settings.cpp +++ b/src/system/settings.cpp @@ -141,17 +141,33 @@ bool CScanSettings::loadSettings(const char * const fileName) satName = configfile.getString("satName", satName); sat_TP_fec = configfile.getInt32("sat_TP_fec", 1); sat_TP_pol = configfile.getInt32("sat_TP_pol", 0); - sat_TP_freq = configfile.getString("sat_TP_freq", "10100000"); + sat_TP_freq = configfile.getString("sat_TP_freq", "10700000"); sat_TP_rate = configfile.getString("sat_TP_rate", "27500000"); + sat_TP_mod = configfile.getInt32("sat_TP_mod", QPSK); + sat_TP_delsys = configfile.getInt32("sat_TP_delsys", DVB_S); cableName = configfile.getString("cableName", cableName); - cable_TP_mod = configfile.getInt32("cable_TP_mod", 3); + cable_TP_mod = configfile.getInt32("cable_TP_mod", QAM_64); cable_TP_fec = configfile.getInt32("cable_TP_fec", 1); cable_TP_freq = configfile.getString("cable_TP_freq", "369000"); cable_TP_rate = configfile.getString("cable_TP_rate", "6875000"); + cable_TP_delsys = configfile.getInt32("cable_TP_delsys", DVB_C); + + terrestrialName = configfile.getString("terrestrialName", terrestrialName); + terrestrial_TP_constel = configfile.getInt32("terrestrial_TP_constel", QAM_AUTO); + terrestrial_TP_bw = configfile.getInt32("terrestrial_TP_bw", BANDWIDTH_AUTO); + terrestrial_TP_coderate_HP = configfile.getInt32("terrestrial_TP_coderate_HP", FEC_AUTO); + terrestrial_TP_coderate_LP = configfile.getInt32("terrestrial_TP_coderate_LP", FEC_AUTO); + terrestrial_TP_freq = configfile.getString("terrestrial_TP_freq", "369000"); + terrestrial_TP_guard = configfile.getInt32("terrestrial_TP_guard", GUARD_INTERVAL_AUTO); + terrestrial_TP_hierarchy = configfile.getInt32("terrestrial_TP_hierarchy", HIERARCHY_AUTO); + terrestrial_TP_transmit_mode = configfile.getInt32("terrestrial_TP_transmit_mode", TRANSMISSION_MODE_AUTO); + terrestrial_TP_delsys = configfile.getInt32("terrestrial_TP_delsys", DVB_T); + #if 1 if(sat_TP_fec == 4) sat_TP_fec = 5; #endif + fast_type = configfile.getInt32("fast_type", 2); fast_op = configfile.getInt32("fast_op", 0); fst_version = configfile.getInt32("fst_version", 0); @@ -184,12 +200,26 @@ bool CScanSettings::saveSettings(const char * const fileName) configfile.setInt32("sat_TP_pol", sat_TP_pol); configfile.setString("sat_TP_freq", sat_TP_freq); configfile.setString("sat_TP_rate", sat_TP_rate); + configfile.setInt32("sat_TP_delsys", sat_TP_delsys); + configfile.setInt32("sat_TP_mod", sat_TP_mod); configfile.setString("cableName", cableName); configfile.setInt32("cable_TP_fec", cable_TP_fec); configfile.setInt32("cable_TP_mod", cable_TP_mod); configfile.setString("cable_TP_freq", cable_TP_freq); configfile.setString("cable_TP_rate", cable_TP_rate); + configfile.setInt32("cable_TP_delsys", cable_TP_delsys); + + configfile.setString("terrestrialName", terrestrialName); + configfile.setInt32("terrestrial_TP_constel", terrestrial_TP_constel); + configfile.setInt32("terrestrial_TP_bw", terrestrial_TP_bw); + configfile.setInt32("terrestrial_TP_coderate_HP", terrestrial_TP_coderate_HP); + configfile.setInt32("terrestrial_TP_coderate_LP", terrestrial_TP_coderate_LP); + configfile.setString("terrestrial_TP_freq", terrestrial_TP_freq); + configfile.setInt32("terrestrial_TP_hierarchy", terrestrial_TP_hierarchy); + configfile.setInt32("terrestrial_TP_guard", terrestrial_TP_guard); + configfile.setInt32("terrestrial_TP_transmit_mode", terrestrial_TP_transmit_mode); + configfile.setInt32("terrestrial_TP_delsys", terrestrial_TP_delsys); if(configfile.getModifiedFlag()) configfile.saveConfig(fileName); diff --git a/src/system/settings.h b/src/system/settings.h index 72d09b4f4..8f0e0123a 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -798,15 +798,27 @@ class CScanSettings int sat_TP_pol; std::string sat_TP_freq; std::string sat_TP_rate; + int sat_TP_delsys; + int sat_TP_mod; std::string cableName; int cable_TP_mod; int cable_TP_fec; std::string cable_TP_freq; std::string cable_TP_rate; + int cable_TP_delsys; + + std::string terrestrialName; + std::string terrestrial_TP_freq; + int terrestrial_TP_constel; + int terrestrial_TP_bw; + int terrestrial_TP_coderate_HP; + int terrestrial_TP_coderate_LP; + int terrestrial_TP_guard; + int terrestrial_TP_hierarchy; + int terrestrial_TP_transmit_mode; + int terrestrial_TP_delsys; - std::string terrName; - std::string terr_TP_freq; CScanSettings(); bool loadSettings(const char * const fileName); diff --git a/src/zapit/include/linux/dvb/audio.h b/src/zapit/include/linux/dvb/audio.h index 58956c3bb..d47bccd60 100644 --- a/src/zapit/include/linux/dvb/audio.h +++ b/src/zapit/include/linux/dvb/audio.h @@ -1,9 +1,9 @@ -/* +/* * audio.h * * Copyright (C) 2000 Ralph Metzler * & Marcus Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Lesser Public License @@ -24,62 +24,59 @@ #ifndef _DVBAUDIO_H_ #define _DVBAUDIO_H_ -#ifdef __KERNEL__ #include -#else -#include -#endif - typedef enum { - AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */ - AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */ + AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */ + AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */ } audio_stream_source_t; -typedef enum { - AUDIO_STOPPED, /* Device is stopped */ - AUDIO_PLAYING, /* Device is currently playing */ - AUDIO_PAUSED /* Device is paused */ +typedef enum { + AUDIO_STOPPED, /* Device is stopped */ + AUDIO_PLAYING, /* Device is currently playing */ + AUDIO_PAUSED /* Device is paused */ } audio_play_state_t; typedef enum { - AUDIO_STEREO, - AUDIO_MONO_LEFT, - AUDIO_MONO_RIGHT + AUDIO_STEREO, + AUDIO_MONO_LEFT, + AUDIO_MONO_RIGHT, + AUDIO_MONO, + AUDIO_STEREO_SWAPPED } audio_channel_select_t; -typedef struct audio_mixer { - unsigned int volume_left; - unsigned int volume_right; +typedef struct audio_mixer { + unsigned int volume_left; + unsigned int volume_right; // what else do we need? bass, pass-through, ... } audio_mixer_t; -typedef struct audio_status { - int AV_sync_state; /* sync audio and video? */ - int mute_state; /* audio is muted */ - audio_play_state_t play_state; /* current playback state */ - audio_stream_source_t stream_source; /* current stream source */ - audio_channel_select_t channel_select; /* currently selected channel */ - int bypass_mode; /* pass on audio data to */ +typedef struct audio_status { + int AV_sync_state; /* sync audio and video? */ + int mute_state; /* audio is muted */ + audio_play_state_t play_state; /* current playback state */ + audio_stream_source_t stream_source; /* current stream source */ + audio_channel_select_t channel_select; /* currently selected channel */ + int bypass_mode; /* pass on audio data to */ audio_mixer_t mixer_state; /* current mixer state */ } audio_status_t; /* separate decoder hardware */ typedef -struct audio_karaoke{ /* if Vocal1 or Vocal2 are non-zero, they get mixed */ +struct audio_karaoke { /* if Vocal1 or Vocal2 are non-zero, they get mixed */ int vocal1; /* into left and right t at 70% each */ int vocal2; /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/ int melody; /* mixed into the left channel and */ - /* Vocal2 into the right channel at 100% each. */ - /* if Melody is non-zero, the melody channel gets mixed*/ + /* Vocal2 into the right channel at 100% each. */ + /* if Melody is non-zero, the melody channel gets mixed*/ } audio_karaoke_t; /* into left and right */ -typedef uint16_t audio_attributes_t; +typedef __u16 audio_attributes_t; /* bits: descr. */ /* 15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, */ /* 12 multichannel extension */ @@ -88,7 +85,7 @@ typedef uint16_t audio_attributes_t; /* 7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, */ /* 5- 4 Sample frequency fs (0=48kHz, 1=96kHz) */ /* 2- 0 number of audio channels (n+1 channels) */ - + /* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */ #define AUDIO_CAP_DTS 1 @@ -101,7 +98,7 @@ typedef uint16_t audio_attributes_t; #define AUDIO_CAP_SDDS 128 #define AUDIO_CAP_AC3 256 -#define AUDIO_STOP _IO('o', 1) +#define AUDIO_STOP _IO('o', 1) #define AUDIO_PLAY _IO('o', 2) #define AUDIO_PAUSE _IO('o', 3) #define AUDIO_CONTINUE _IO('o', 4) @@ -121,5 +118,18 @@ typedef uint16_t audio_attributes_t; #define AUDIO_SET_ATTRIBUTES _IOW('o', 17, audio_attributes_t) #define AUDIO_SET_KARAOKE _IOW('o', 18, audio_karaoke_t) -#endif /* _DVBAUDIO_H_ */ +/** + * AUDIO_GET_PTS + * + * Read the 33 bit presentation time stamp as defined + * in ITU T-REC-H.222.0 / ISO/IEC 13818-1. + * + * The PTS should belong to the currently played + * frame if possible, but may also be a value close to it + * like the PTS of the last decoded frame or the last PTS + * extracted by the PES parser. + */ +#define AUDIO_GET_PTS _IOR('o', 19, __u64) +#define AUDIO_BILINGUAL_CHANNEL_SELECT _IO('o', 20) +#endif /* _DVBAUDIO_H_ */ diff --git a/src/zapit/include/linux/dvb/ca.h b/src/zapit/include/linux/dvb/ca.h index 026e5c35c..c18537f3e 100644 --- a/src/zapit/include/linux/dvb/ca.h +++ b/src/zapit/include/linux/dvb/ca.h @@ -1,9 +1,9 @@ -/* +/* * ca.h * * Copyright (C) 2000 Ralph Metzler * & Marcus Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Lesser Public License @@ -27,16 +27,16 @@ /* slot interface types and info */ typedef struct ca_slot_info { - int num; /* slot number */ + int num; /* slot number */ - int type; /* CA interface this slot supports */ + int type; /* CA interface this slot supports */ #define CA_CI 1 /* CI high level interface */ #define CA_CI_LINK 2 /* CI link layer level interface */ #define CA_CI_PHYS 4 /* CI physical layer level interface */ #define CA_DESCR 8 /* built-in descrambler */ #define CA_SC 128 /* simple smart card interface */ - unsigned int flags; + unsigned int flags; #define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */ #define CA_CI_MODULE_READY 2 } ca_slot_info_t; @@ -45,37 +45,37 @@ typedef struct ca_slot_info { /* descrambler types and info */ typedef struct ca_descr_info { - unsigned int num; /* number of available descramblers (keys) */ - unsigned int type; /* type of supported scrambling system */ + unsigned int num; /* number of available descramblers (keys) */ + unsigned int type; /* type of supported scrambling system */ #define CA_ECD 1 #define CA_NDS 2 #define CA_DSS 4 } ca_descr_info_t; typedef struct ca_caps { - unsigned int slot_num; /* total number of CA card and module slots */ - unsigned int slot_type; /* OR of all supported types */ - unsigned int descr_num; /* total number of descrambler slots (keys) */ - unsigned int descr_type; /* OR of all supported types */ + unsigned int slot_num; /* total number of CA card and module slots */ + unsigned int slot_type; /* OR of all supported types */ + unsigned int descr_num; /* total number of descrambler slots (keys) */ + unsigned int descr_type; /* OR of all supported types */ } ca_caps_t; /* a message to/from a CI-CAM */ typedef struct ca_msg { - unsigned int index; - unsigned int type; - unsigned int length; - unsigned char msg[256]; + unsigned int index; + unsigned int type; + unsigned int length; + unsigned char msg[256]; } ca_msg_t; typedef struct ca_descr { - unsigned int index; - unsigned int parity; /* 0 == even, 1 == odd */ - unsigned char cw[8]; + unsigned int index; + unsigned int parity; /* 0 == even, 1 == odd */ + unsigned char cw[8]; } ca_descr_t; typedef struct ca_pid { - unsigned int pid; - int index; /* -1 == disable*/ + unsigned int pid; + int index; /* -1 == disable*/ } ca_pid_t; #define CA_RESET _IO('o', 128) @@ -88,4 +88,3 @@ typedef struct ca_pid { #define CA_SET_PID _IOW('o', 135, ca_pid_t) #endif - diff --git a/src/zapit/include/linux/dvb/dmx.h b/src/zapit/include/linux/dvb/dmx.h index a69b34d25..b4fb650d9 100644 --- a/src/zapit/include/linux/dvb/dmx.h +++ b/src/zapit/include/linux/dvb/dmx.h @@ -1,9 +1,9 @@ -/* +/* * dmx.h * * Copyright (C) 2000 Marcus Metzler * & Ralph Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -21,28 +21,26 @@ * */ -#ifndef _DVBDMX_H_ -#define _DVBDMX_H_ +#ifndef _UAPI_DVBDMX_H_ +#define _UAPI_DVBDMX_H_ -#include -#ifdef __KERNEL__ -#include -#else +#include +#ifndef __KERNEL__ #include #endif -#ifndef DMX_FILTER_SIZE + #define DMX_FILTER_SIZE 16 -#endif typedef enum { DMX_OUT_DECODER, /* Streaming directly to decoder. */ DMX_OUT_TAP, /* Output going to a memory buffer */ - /* (to be retrieved via the read command).*/ - DMX_OUT_TS_TAP /* Output multiplexed into a new TS */ - /* (to be retrieved by reading from the */ - /* logical DVR device). */ + /* (to be retrieved via the read command).*/ + DMX_OUT_TS_TAP, /* Output multiplexed into a new TS */ + /* (to be retrieved by reading from the */ + /* logical DVR device). */ + DMX_OUT_TSDEMUX_TAP /* Like TS_TAP but retrieved from the DMX device */ } dmx_output_t; @@ -53,27 +51,27 @@ typedef enum } dmx_input_t; -typedef enum +typedef enum dmx_ts_pes { - DMX_PES_AUDIO0, + DMX_PES_AUDIO0, DMX_PES_VIDEO0, DMX_PES_TELETEXT0, DMX_PES_SUBTITLE0, DMX_PES_PCR0, - DMX_PES_AUDIO1, + DMX_PES_AUDIO1, DMX_PES_VIDEO1, DMX_PES_TELETEXT1, DMX_PES_SUBTITLE1, DMX_PES_PCR1, - DMX_PES_AUDIO2, + DMX_PES_AUDIO2, DMX_PES_VIDEO2, DMX_PES_TELETEXT2, DMX_PES_SUBTITLE2, DMX_PES_PCR2, - DMX_PES_AUDIO3, + DMX_PES_AUDIO3, DMX_PES_VIDEO3, DMX_PES_TELETEXT3, DMX_PES_SUBTITLE3, @@ -89,20 +87,6 @@ typedef enum #define DMX_PES_PCR DMX_PES_PCR0 -typedef enum -{ - DMX_SCRAMBLING_EV, - DMX_FRONTEND_EV -} dmx_event_t; - - -typedef enum -{ - DMX_SCRAMBLING_OFF, - DMX_SCRAMBLING_ON -} dmx_scrambling_status_t; - - typedef struct dmx_filter { __u8 filter[DMX_FILTER_SIZE]; @@ -113,10 +97,10 @@ typedef struct dmx_filter struct dmx_sct_filter_params { - __u16 pid; + __u16 pid; dmx_filter_t filter; - __u32 timeout; - __u32 flags; + __u32 timeout; + __u32 flags; #define DMX_CHECK_CRC 1 #define DMX_ONESHOT 2 #define DMX_IMMEDIATE_START 4 @@ -126,27 +110,16 @@ struct dmx_sct_filter_params struct dmx_pes_filter_params { - __u16 pid; + __u16 pid; dmx_input_t input; dmx_output_t output; dmx_pes_type_t pes_type; - __u32 flags; -}; - - -struct dmx_event -{ - dmx_event_t event; - time_t timeStamp; - union - { - dmx_scrambling_status_t scrambling; - } u; + __u32 flags; }; typedef struct dmx_caps { __u32 caps; - int num_decoders; + int num_decoders; } dmx_caps_t; typedef enum { @@ -167,16 +140,16 @@ struct dmx_stc { }; -#define DMX_START _IO('o', 41) +#define DMX_START _IO('o', 41) #define DMX_STOP _IO('o', 42) #define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params) #define DMX_SET_PES_FILTER _IOW('o', 44, struct dmx_pes_filter_params) #define DMX_SET_BUFFER_SIZE _IO('o', 45) -#define DMX_GET_EVENT _IOR('o', 46, struct dmx_event) #define DMX_GET_PES_PIDS _IOR('o', 47, __u16[5]) #define DMX_GET_CAPS _IOR('o', 48, dmx_caps_t) #define DMX_SET_SOURCE _IOW('o', 49, dmx_source_t) #define DMX_GET_STC _IOWR('o', 50, struct dmx_stc) +#define DMX_ADD_PID _IOW('o', 51, __u16) +#define DMX_REMOVE_PID _IOW('o', 52, __u16) -#endif /*_DVBDMX_H_*/ - +#endif /* _UAPI_DVBDMX_H_ */ diff --git a/src/zapit/include/linux/dvb/frontend.h b/src/zapit/include/linux/dvb/frontend.h index 8288eecf9..c56d77c49 100644 --- a/src/zapit/include/linux/dvb/frontend.h +++ b/src/zapit/include/linux/dvb/frontend.h @@ -26,8 +26,7 @@ #ifndef _DVBFRONTEND_H_ #define _DVBFRONTEND_H_ -#include - +#include typedef enum fe_type { FE_QPSK, @@ -62,16 +61,19 @@ typedef enum fe_caps { FE_CAN_HIERARCHY_AUTO = 0x100000, FE_CAN_8VSB = 0x200000, FE_CAN_16VSB = 0x400000, - FE_HAS_EXTENDED_CAPS = 0x800000, // We need more bitspace for newer APIs, indicate this. - FE_NEEDS_BENDING = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending) - FE_CAN_RECOVER = 0x40000000, // frontend can recover from a cable unplug automatically - FE_CAN_MUTE_TS = 0x80000000 // frontend can stop spurious TS data output + FE_HAS_EXTENDED_CAPS = 0x800000, /* We need more bitspace for newer APIs, indicate this. */ + FE_CAN_MULTISTREAM = 0x4000000, /* frontend supports multistream filtering */ + FE_CAN_TURBO_FEC = 0x8000000, /* frontend supports "turbo fec modulation" */ + FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ + FE_NEEDS_BENDING = 0x20000000, /* not supported anymore, don't use (frontend requires frequency bending) */ + FE_CAN_RECOVER = 0x40000000, /* frontend can recover from a cable unplug automatically */ + FE_CAN_MUTE_TS = 0x80000000 /* frontend can stop spurious TS data output */ } fe_caps_t; struct dvb_frontend_info { char name[128]; - fe_type_t type; + fe_type_t type; /* DEPRECATED. Use DTV_ENUM_DELSYS instead */ __u32 frequency_min; __u32 frequency_max; __u32 frequency_stepsize; @@ -120,16 +122,27 @@ typedef enum fe_sec_mini_cmd { } fe_sec_mini_cmd_t; +/** + * enum fe_status - enumerates the possible frontend status + * @FE_HAS_SIGNAL: found something above the noise level + * @FE_HAS_CARRIER: found a DVB signal + * @FE_HAS_VITERBI: FEC is stable + * @FE_HAS_SYNC: found sync bytes + * @FE_HAS_LOCK: everything's working + * @FE_TIMEDOUT: no lock within the last ~2 seconds + * @FE_REINIT: frontend was reinitialized, application is recommended + * to reset DiSEqC, tone and parameters + */ + typedef enum fe_status { - FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ - FE_HAS_CARRIER = 0x02, /* found a DVB signal */ - FE_HAS_VITERBI = 0x04, /* FEC is stable */ - FE_HAS_SYNC = 0x08, /* found sync bytes */ - FE_HAS_LOCK = 0x10, /* everything's working... */ - FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ - FE_REINIT = 0x40 /* frontend was reinitialized, */ -} fe_status_t; /* application is recommended to reset */ - /* DiSEqC, tone and parameters */ + FE_HAS_SIGNAL = 0x01, + FE_HAS_CARRIER = 0x02, + FE_HAS_VITERBI = 0x04, + FE_HAS_SYNC = 0x08, + FE_HAS_LOCK = 0x10, + FE_TIMEDOUT = 0x20, + FE_REINIT = 0x40, +} fe_status_t; typedef enum fe_spectral_inversion { INVERSION_OFF, @@ -151,7 +164,7 @@ typedef enum fe_code_rate { FEC_AUTO, FEC_3_5, FEC_9_10, - FEC_MAX = 255 + FEC_2_5, } fe_code_rate_t; @@ -168,29 +181,46 @@ typedef enum fe_modulation { PSK_8, APSK_16, APSK_32, - DQPSK + DQPSK, + QAM_4_NR, } fe_modulation_t; typedef enum fe_transmit_mode { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, - TRANSMISSION_MODE_AUTO + TRANSMISSION_MODE_AUTO, + TRANSMISSION_MODE_4K, + TRANSMISSION_MODE_1K, + TRANSMISSION_MODE_16K, + TRANSMISSION_MODE_32K, + TRANSMISSION_MODE_C1, + TRANSMISSION_MODE_C3780, } fe_transmit_mode_t; +#if defined(__DVB_CORE__) || !defined (__KERNEL__) typedef enum fe_bandwidth { BANDWIDTH_8_MHZ, BANDWIDTH_7_MHZ, BANDWIDTH_6_MHZ, - BANDWIDTH_AUTO + BANDWIDTH_AUTO, + BANDWIDTH_5_MHZ, + BANDWIDTH_10_MHZ, + BANDWIDTH_1_712_MHZ, } fe_bandwidth_t; - +#endif typedef enum fe_guard_interval { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4, - GUARD_INTERVAL_AUTO + GUARD_INTERVAL_AUTO, + GUARD_INTERVAL_1_128, + GUARD_INTERVAL_19_128, + GUARD_INTERVAL_19_256, + GUARD_INTERVAL_PN420, + GUARD_INTERVAL_PN595, + GUARD_INTERVAL_PN945, } fe_guard_interval_t; @@ -202,7 +232,14 @@ typedef enum fe_hierarchy { HIERARCHY_AUTO } fe_hierarchy_t; +enum fe_interleaving { + INTERLEAVING_NONE, + INTERLEAVING_AUTO, + INTERLEAVING_240, + INTERLEAVING_720, +}; +#if defined(__DVB_CORE__) || !defined (__KERNEL__) struct dvb_qpsk_parameters { __u32 symbol_rate; /* symbol rate in Symbols per second */ fe_code_rate_t fec_inner; /* forward error correction (see above) */ @@ -241,11 +278,11 @@ struct dvb_frontend_parameters { } u; }; - struct dvb_frontend_event { fe_status_t status; struct dvb_frontend_parameters parameters; }; +#endif /* S2API Commands */ #define DTV_UNDEFINED 0 @@ -269,63 +306,93 @@ struct dvb_frontend_event { #define DTV_FE_CAPABILITY 16 #define DTV_DELIVERY_SYSTEM 17 -#if 0 -/* ISDB */ -/* maybe a dup of DTV_ISDB_SOUND_BROADCASTING_SUBCHANNEL_ID ??? */ -#define DTV_ISDB_SEGMENT_IDX 18 -/* 1, 3 or 13 ??? */ -#define DTV_ISDB_SEGMENT_WIDTH 19 +/* ISDB-T and ISDB-Tsb */ +#define DTV_ISDBT_PARTIAL_RECEPTION 18 +#define DTV_ISDBT_SOUND_BROADCASTING 19 -/* the central segment can be received independently or 1/3 seg in SB-mode */ -#define DTV_ISDB_PARTIAL_RECEPTION 20 -/* sound broadcasting is used 0 = 13segment, 1 = 1 or 3 see DTV_ISDB_PARTIAL_RECEPTION */ -#define DTV_ISDB_SOUND_BROADCASTING 21 +#define DTV_ISDBT_SB_SUBCHANNEL_ID 20 +#define DTV_ISDBT_SB_SEGMENT_IDX 21 +#define DTV_ISDBT_SB_SEGMENT_COUNT 22 -/* only used in SB */ -/* determines the initial PRBS of the segment (to match with 13seg channel) */ -#define DTV_ISDB_SOUND_BROADCASTING_SUBCHANNEL_ID 22 +#define DTV_ISDBT_LAYERA_FEC 23 +#define DTV_ISDBT_LAYERA_MODULATION 24 +#define DTV_ISDBT_LAYERA_SEGMENT_COUNT 25 +#define DTV_ISDBT_LAYERA_TIME_INTERLEAVING 26 -#define DTV_ISDB_LAYERA_FEC 23 -#define DTV_ISDB_LAYERA_MODULATION 24 -#define DTV_ISDB_LAYERA_SEGMENT_WIDTH 25 -#define DTV_ISDB_LAYERA_TIME_INTERLEAVER 26 +#define DTV_ISDBT_LAYERB_FEC 27 +#define DTV_ISDBT_LAYERB_MODULATION 28 +#define DTV_ISDBT_LAYERB_SEGMENT_COUNT 29 +#define DTV_ISDBT_LAYERB_TIME_INTERLEAVING 30 -#define DTV_ISDB_LAYERB_FEC 27 -#define DTV_ISDB_LAYERB_MODULATION 28 -#define DTV_ISDB_LAYERB_SEGMENT_WIDTH 29 -#define DTV_ISDB_LAYERB_TIME_INTERLEAVING 30 +#define DTV_ISDBT_LAYERC_FEC 31 +#define DTV_ISDBT_LAYERC_MODULATION 32 +#define DTV_ISDBT_LAYERC_SEGMENT_COUNT 33 +#define DTV_ISDBT_LAYERC_TIME_INTERLEAVING 34 -#define DTV_ISDB_LAYERC_FEC 31 -#define DTV_ISDB_LAYERC_MODULATION 32 -#define DTV_ISDB_LAYERC_SEGMENT_WIDTH 33 -#define DTV_ISDB_LAYERC_TIME_INTERLEAVING 34 -#endif -#define DTV_API_VERSION 35 -#define DTV_API_VERSION 35 -#define DTV_CODE_RATE_HP 36 -#define DTV_CODE_RATE_LP 37 -#define DTV_GUARD_INTERVAL 38 -#define DTV_TRANSMISSION_MODE 39 -#define DTV_HIERARCHY 40 +#define DTV_API_VERSION 35 -#define DTV_MAX_COMMAND DTV_HIERARCHY +#define DTV_CODE_RATE_HP 36 +#define DTV_CODE_RATE_LP 37 +#define DTV_GUARD_INTERVAL 38 +#define DTV_TRANSMISSION_MODE 39 +#define DTV_HIERARCHY 40 + +#define DTV_ISDBT_LAYER_ENABLED 41 + +#define DTV_STREAM_ID 42 +#define DTV_ISDBS_TS_ID_LEGACY DTV_STREAM_ID +#define DTV_DVBT2_PLP_ID_LEGACY 43 + +#define DTV_ENUM_DELSYS 44 + +/* ATSC-MH */ +#define DTV_ATSCMH_FIC_VER 45 +#define DTV_ATSCMH_PARADE_ID 46 +#define DTV_ATSCMH_NOG 47 +#define DTV_ATSCMH_TNOG 48 +#define DTV_ATSCMH_SGN 49 +#define DTV_ATSCMH_PRC 50 +#define DTV_ATSCMH_RS_FRAME_MODE 51 +#define DTV_ATSCMH_RS_FRAME_ENSEMBLE 52 +#define DTV_ATSCMH_RS_CODE_MODE_PRI 53 +#define DTV_ATSCMH_RS_CODE_MODE_SEC 54 +#define DTV_ATSCMH_SCCC_BLOCK_MODE 55 +#define DTV_ATSCMH_SCCC_CODE_MODE_A 56 +#define DTV_ATSCMH_SCCC_CODE_MODE_B 57 +#define DTV_ATSCMH_SCCC_CODE_MODE_C 58 +#define DTV_ATSCMH_SCCC_CODE_MODE_D 59 + +#define DTV_INTERLEAVING 60 +#define DTV_LNA 61 + +/* Quality parameters */ +#define DTV_STAT_SIGNAL_STRENGTH 62 +#define DTV_STAT_CNR 63 +#define DTV_STAT_PRE_ERROR_BIT_COUNT 64 +#define DTV_STAT_PRE_TOTAL_BIT_COUNT 65 +#define DTV_STAT_POST_ERROR_BIT_COUNT 66 +#define DTV_STAT_POST_TOTAL_BIT_COUNT 67 +#define DTV_STAT_ERROR_BLOCK_COUNT 68 +#define DTV_STAT_TOTAL_BLOCK_COUNT 69 + +#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT typedef enum fe_pilot { PILOT_ON, PILOT_OFF, - PILOT_AUTO + PILOT_AUTO, } fe_pilot_t; typedef enum fe_rolloff { ROLLOFF_35, /* Implied value in DVB-S, default for DVB-S2 */ ROLLOFF_20, ROLLOFF_25, - ROLLOFF_AUTO + ROLLOFF_AUTO, } fe_rolloff_t; typedef enum fe_delivery_system { SYS_UNDEFINED, - SYS_DVBC_ANNEX_AC, + SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_B, SYS_DVBT, SYS_DSS, @@ -337,11 +404,53 @@ typedef enum fe_delivery_system { SYS_ISDBC, SYS_ATSC, SYS_ATSCMH, - SYS_DMBTH, + SYS_DTMB, SYS_CMMB, - SYS_DAB + SYS_DAB, + SYS_DVBT2, + SYS_TURBO, + SYS_DVBC_ANNEX_C, } fe_delivery_system_t; +/* backward compatibility */ +#define SYS_DVBC_ANNEX_AC SYS_DVBC_ANNEX_A +#define SYS_DMBTH SYS_DTMB /* DMB-TH is legacy name, use DTMB instead */ + +/* ATSC-MH */ + +enum atscmh_sccc_block_mode { + ATSCMH_SCCC_BLK_SEP = 0, + ATSCMH_SCCC_BLK_COMB = 1, + ATSCMH_SCCC_BLK_RES = 2, +}; + +enum atscmh_sccc_code_mode { + ATSCMH_SCCC_CODE_HLF = 0, + ATSCMH_SCCC_CODE_QTR = 1, + ATSCMH_SCCC_CODE_RES = 2, +}; + +enum atscmh_rs_frame_ensemble { + ATSCMH_RSFRAME_ENS_PRI = 0, + ATSCMH_RSFRAME_ENS_SEC = 1, +}; + +enum atscmh_rs_frame_mode { + ATSCMH_RSFRAME_PRI_ONLY = 0, + ATSCMH_RSFRAME_PRI_SEC = 1, + ATSCMH_RSFRAME_RES = 2, +}; + +enum atscmh_rs_code_mode { + ATSCMH_RSCODE_211_187 = 0, + ATSCMH_RSCODE_223_187 = 1, + ATSCMH_RSCODE_235_187 = 2, + ATSCMH_RSCODE_RES = 3, +}; + +#define NO_STREAM_ID_FILTER (~0U) +#define LNA_AUTO (~0U) + struct dtv_cmds_h { char *name; /* A display name for debugging purposes */ @@ -353,11 +462,78 @@ struct dtv_cmds_h { __u32 reserved:30; /* Align */ }; +/** + * Scale types for the quality parameters. + * @FE_SCALE_NOT_AVAILABLE: That QoS measure is not available. That + * could indicate a temporary or a permanent + * condition. + * @FE_SCALE_DECIBEL: The scale is measured in 0.0001 dB steps, typically + * used on signal measures. + * @FE_SCALE_RELATIVE: The scale is a relative percentual measure, + * ranging from 0 (0%) to 0xffff (100%). + * @FE_SCALE_COUNTER: The scale counts the occurrence of an event, like + * bit error, block error, lapsed time. + */ +enum fecap_scale_params { + FE_SCALE_NOT_AVAILABLE = 0, + FE_SCALE_DECIBEL, + FE_SCALE_RELATIVE, + FE_SCALE_COUNTER +}; + +/** + * struct dtv_stats - Used for reading a DTV status property + * + * @value: value of the measure. Should range from 0 to 0xffff; + * @scale: Filled with enum fecap_scale_params - the scale + * in usage for that parameter + * + * For most delivery systems, this will return a single value for each + * parameter. + * It should be noticed, however, that new OFDM delivery systems like + * ISDB can use different modulation types for each group of carriers. + * On such standards, up to 8 groups of statistics can be provided, one + * for each carrier group (called "layer" on ISDB). + * In order to be consistent with other delivery systems, the first + * value refers to the entire set of carriers ("global"). + * dtv_status:scale should use the value FE_SCALE_NOT_AVAILABLE when + * the value for the entire group of carriers or from one specific layer + * is not provided by the hardware. + * st.len should be filled with the latest filled status + 1. + * + * In other words, for ISDB, those values should be filled like: + * u.st.stat.svalue[0] = global statistics; + * u.st.stat.scale[0] = FE_SCALE_DECIBELS; + * u.st.stat.value[1] = layer A statistics; + * u.st.stat.scale[1] = FE_SCALE_NOT_AVAILABLE (if not available); + * u.st.stat.svalue[2] = layer B statistics; + * u.st.stat.scale[2] = FE_SCALE_DECIBELS; + * u.st.stat.svalue[3] = layer C statistics; + * u.st.stat.scale[3] = FE_SCALE_DECIBELS; + * u.st.len = 4; + */ +struct dtv_stats { + __u8 scale; /* enum fecap_scale_params type */ + union { + __u64 uvalue; /* for counters and relative scales */ + __s64 svalue; /* for 0.0001 dB measures */ + }; +} __attribute__ ((packed)); + + +#define MAX_DTV_STATS 4 + +struct dtv_fe_stats { + __u8 len; + struct dtv_stats stat[MAX_DTV_STATS]; +} __attribute__ ((packed)); + struct dtv_property { __u32 cmd; __u32 reserved[3]; union { __u32 data; + struct dtv_fe_stats st; struct { __u8 data[32]; __u32 len; diff --git a/src/zapit/include/linux/dvb/net.h b/src/zapit/include/linux/dvb/net.h index 4b8fa5177..f451e7eb0 100644 --- a/src/zapit/include/linux/dvb/net.h +++ b/src/zapit/include/linux/dvb/net.h @@ -1,9 +1,9 @@ -/* +/* * net.h * * Copyright (C) 2000 Marcus Metzler * & Ralph Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -24,18 +24,29 @@ #ifndef _DVBNET_H_ #define _DVBNET_H_ -#include - +#include struct dvb_net_if { __u16 pid; __u16 if_num; + __u8 feedtype; +#define DVB_NET_FEEDTYPE_MPE 0 /* multi protocol encapsulation */ +#define DVB_NET_FEEDTYPE_ULE 1 /* ultra lightweight encapsulation */ }; -#define NET_ADD_IF _IOWR('o', 52, struct dvb_net_if) -#define NET_REMOVE_IF _IO('o', 53) -#define NET_GET_IF _IOWR('o', 54, struct dvb_net_if) +#define NET_ADD_IF _IOWR('o', 52, struct dvb_net_if) +#define NET_REMOVE_IF _IO('o', 53) +#define NET_GET_IF _IOWR('o', 54, struct dvb_net_if) + + +/* binary compatibility cruft: */ +struct __dvb_net_if_old { + __u16 pid; + __u16 if_num; +}; +#define __NET_ADD_IF_OLD _IOWR('o', 52, struct __dvb_net_if_old) +#define __NET_GET_IF_OLD _IOWR('o', 54, struct __dvb_net_if_old) + #endif /*_DVBNET_H_*/ - diff --git a/src/zapit/include/linux/dvb/osd.h b/src/zapit/include/linux/dvb/osd.h index 0d8143960..880e68435 100644 --- a/src/zapit/include/linux/dvb/osd.h +++ b/src/zapit/include/linux/dvb/osd.h @@ -1,9 +1,9 @@ -/* +/* * osd.h * * Copyright (C) 2001 Ralph Metzler * & Marcus Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Lesser Public License @@ -24,6 +24,8 @@ #ifndef _DVBOSD_H_ #define _DVBOSD_H_ +#include + typedef enum { // All functions return -2 on "not open" OSD_Close=1, // () @@ -91,21 +93,52 @@ typedef enum { // TODO: remove "test" in final version OSD_Text, // (x0,y0,size,color,text) OSD_SetWindow, // (x0) set window with number 0 * & Ralph Metzler - for convergence integrated media GmbH + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -21,38 +21,36 @@ * */ -#ifndef _DVBVIDEO_H_ -#define _DVBVIDEO_H_ +#ifndef _UAPI_DVBVIDEO_H_ +#define _UAPI_DVBVIDEO_H_ -#ifdef __KERNEL__ #include -#else +#ifndef __KERNEL__ #include #include #endif - typedef enum { VIDEO_FORMAT_4_3, /* Select 4:3 format */ - VIDEO_FORMAT_16_9, /* Select 16:9 format. */ + VIDEO_FORMAT_16_9, /* Select 16:9 format. */ VIDEO_FORMAT_221_1 /* 2.21:1 */ } video_format_t; typedef enum { - VIDEO_SYSTEM_PAL, - VIDEO_SYSTEM_NTSC, - VIDEO_SYSTEM_PALN, - VIDEO_SYSTEM_PALNc, - VIDEO_SYSTEM_PALM, - VIDEO_SYSTEM_NTSC60, + VIDEO_SYSTEM_PAL, + VIDEO_SYSTEM_NTSC, + VIDEO_SYSTEM_PALN, + VIDEO_SYSTEM_PALNc, + VIDEO_SYSTEM_PALM, + VIDEO_SYSTEM_NTSC60, VIDEO_SYSTEM_PAL60, VIDEO_SYSTEM_PALM60 } video_system_t; -typedef enum { - VIDEO_PAN_SCAN, /* use pan and scan format */ +typedef enum { + VIDEO_PAN_SCAN, /* use pan and scan format */ VIDEO_LETTER_BOX, /* use letterbox format */ VIDEO_CENTER_CUT_OUT /* use center cut out format */ } video_displayformat_t; @@ -64,62 +62,120 @@ typedef struct { } video_size_t; typedef enum { - VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */ - VIDEO_SOURCE_MEMORY /* If this source is selected, the stream - comes from the user through the write - system call */ + VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */ + VIDEO_SOURCE_MEMORY /* If this source is selected, the stream + comes from the user through the write + system call */ } video_stream_source_t; typedef enum { - VIDEO_STOPPED, /* Video is stopped */ - VIDEO_PLAYING, /* Video is currently playing */ - VIDEO_FREEZED /* Video is freezed */ -} video_play_state_t; + VIDEO_STOPPED, /* Video is stopped */ + VIDEO_PLAYING, /* Video is currently playing */ + VIDEO_FREEZED /* Video is freezed */ +} video_play_state_t; -struct video_event { - int32_t type; -#define VIDEO_EVENT_SIZE_CHANGED 1 - time_t timestamp; +/* Decoder commands */ +#define VIDEO_CMD_PLAY (0) +#define VIDEO_CMD_STOP (1) +#define VIDEO_CMD_FREEZE (2) +#define VIDEO_CMD_CONTINUE (3) + +/* Flags for VIDEO_CMD_FREEZE */ +#define VIDEO_CMD_FREEZE_TO_BLACK (1 << 0) + +/* Flags for VIDEO_CMD_STOP */ +#define VIDEO_CMD_STOP_TO_BLACK (1 << 0) +#define VIDEO_CMD_STOP_IMMEDIATELY (1 << 1) + +/* Play input formats: */ +/* The decoder has no special format requirements */ +#define VIDEO_PLAY_FMT_NONE (0) +/* The decoder requires full GOPs */ +#define VIDEO_PLAY_FMT_GOP (1) + +/* The structure must be zeroed before use by the application + This ensures it can be extended safely in the future. */ +struct video_command { + __u32 cmd; + __u32 flags; union { - video_size_t size; + struct { + __u64 pts; + } stop; + + struct { + /* 0 or 1000 specifies normal speed, + 1 specifies forward single stepping, + -1 specifies backward single stepping, + >1: playback at speed/1000 of the normal speed, + <-1: reverse playback at (-speed/1000) of the normal speed. */ + __s32 speed; + __u32 format; + } play; + + struct { + __u32 data[16]; + } raw; + }; +}; + +/* FIELD_UNKNOWN can be used if the hardware does not know whether + the Vsync is for an odd, even or progressive (i.e. non-interlaced) + field. */ +#define VIDEO_VSYNC_FIELD_UNKNOWN (0) +#define VIDEO_VSYNC_FIELD_ODD (1) +#define VIDEO_VSYNC_FIELD_EVEN (2) +#define VIDEO_VSYNC_FIELD_PROGRESSIVE (3) + +struct video_event { + __s32 type; +#define VIDEO_EVENT_SIZE_CHANGED 1 +#define VIDEO_EVENT_FRAME_RATE_CHANGED 2 +#define VIDEO_EVENT_DECODER_STOPPED 3 +#define VIDEO_EVENT_VSYNC 4 + __kernel_time_t timestamp; + union { + video_size_t size; + unsigned int frame_rate; /* in frames per 1000sec */ + unsigned char vsync_field; /* unknown/odd/even/progressive */ } u; }; -struct video_status { - int video_blank; /* blank video on freeze? */ - video_play_state_t play_state; /* current state of playback */ - video_stream_source_t stream_source; /* current source (demux/memory) */ - video_format_t video_format; /* current aspect ratio of stream*/ - video_displayformat_t display_format;/* selected cropping mode */ +struct video_status { + int video_blank; /* blank video on freeze? */ + video_play_state_t play_state; /* current state of playback */ + video_stream_source_t stream_source; /* current source (demux/memory) */ + video_format_t video_format; /* current aspect ratio of stream*/ + video_displayformat_t display_format;/* selected cropping mode */ }; struct video_still_picture { - char *iFrame; /* pointer to a single iframe in memory */ - int32_t size; + char __user *iFrame; /* pointer to a single iframe in memory */ + __s32 size; }; -typedef +typedef struct video_highlight { int active; /* 1=show highlight, 0=hide highlight */ - uint8_t contrast1; /* 7- 4 Pattern pixel contrast */ - /* 3- 0 Background pixel contrast */ - uint8_t contrast2; /* 7- 4 Emphasis pixel-2 contrast */ - /* 3- 0 Emphasis pixel-1 contrast */ - uint8_t color1; /* 7- 4 Pattern pixel color */ - /* 3- 0 Background pixel color */ - uint8_t color2; /* 7- 4 Emphasis pixel-2 color */ - /* 3- 0 Emphasis pixel-1 color */ - uint32_t ypos; /* 23-22 auto action mode */ - /* 21-12 start y */ - /* 9- 0 end y */ - uint32_t xpos; /* 23-22 button color number */ - /* 21-12 start x */ - /* 9- 0 end x */ + __u8 contrast1; /* 7- 4 Pattern pixel contrast */ + /* 3- 0 Background pixel contrast */ + __u8 contrast2; /* 7- 4 Emphasis pixel-2 contrast */ + /* 3- 0 Emphasis pixel-1 contrast */ + __u8 color1; /* 7- 4 Pattern pixel color */ + /* 3- 0 Background pixel color */ + __u8 color2; /* 7- 4 Emphasis pixel-2 color */ + /* 3- 0 Emphasis pixel-1 color */ + __u32 ypos; /* 23-22 auto action mode */ + /* 21-12 start y */ + /* 9- 0 end y */ + __u32 xpos; /* 23-22 button color number */ + /* 21-12 start x */ + /* 9- 0 end x */ } video_highlight_t; @@ -131,17 +187,17 @@ typedef struct video_spu { typedef struct video_spu_palette { /* SPU Palette information */ int length; - uint8_t *palette; + __u8 __user *palette; } video_spu_palette_t; typedef struct video_navi_pack { int length; /* 0 ... 1024 */ - uint8_t data[1024]; + __u8 data[1024]; } video_navi_pack_t; -typedef uint16_t video_attributes_t; +typedef __u16 video_attributes_t; /* bits: descr. */ /* 15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) */ /* 13-12 TV system (0=525/60, 1=625/50) */ @@ -156,21 +212,21 @@ typedef uint16_t video_attributes_t; /* bit definitions for capabilities: */ /* can the hardware decode MPEG1 and/or MPEG2? */ -#define VIDEO_CAP_MPEG1 1 +#define VIDEO_CAP_MPEG1 1 #define VIDEO_CAP_MPEG2 2 /* can you send a system and/or program stream to video device? - (you still have to open the video and the audio device but only + (you still have to open the video and the audio device but only send the stream to the video device) */ #define VIDEO_CAP_SYS 4 #define VIDEO_CAP_PROG 8 -/* can the driver also handle SPU, NAVI and CSS encoded data? +/* can the driver also handle SPU, NAVI and CSS encoded data? (CSS API is not present yet) */ #define VIDEO_CAP_SPU 16 #define VIDEO_CAP_NAVI 32 #define VIDEO_CAP_CSS 64 -#define VIDEO_STOP _IO('o', 21) +#define VIDEO_STOP _IO('o', 21) #define VIDEO_PLAY _IO('o', 22) #define VIDEO_FREEZE _IO('o', 23) #define VIDEO_CONTINUE _IO('o', 24) @@ -194,6 +250,25 @@ typedef uint16_t video_attributes_t; #define VIDEO_GET_NAVI _IOR('o', 52, video_navi_pack_t) #define VIDEO_SET_ATTRIBUTES _IO('o', 53) #define VIDEO_GET_SIZE _IOR('o', 55, video_size_t) +#define VIDEO_GET_FRAME_RATE _IOR('o', 56, unsigned int) -#endif /*_DVBVIDEO_H_*/ +/** + * VIDEO_GET_PTS + * + * Read the 33 bit presentation time stamp as defined + * in ITU T-REC-H.222.0 / ISO/IEC 13818-1. + * + * The PTS should belong to the currently played + * frame if possible, but may also be a value close to it + * like the PTS of the last decoded frame or the last PTS + * extracted by the PES parser. + */ +#define VIDEO_GET_PTS _IOR('o', 57, __u64) +/* Read the number of displayed frames since the decoder was started */ +#define VIDEO_GET_FRAME_COUNT _IOR('o', 58, __u64) + +#define VIDEO_COMMAND _IOWR('o', 59, struct video_command) +#define VIDEO_TRY_COMMAND _IOWR('o', 60, struct video_command) + +#endif /* _UAPI_DVBVIDEO_H_ */ diff --git a/src/zapit/include/zapit/channel.h b/src/zapit/include/zapit/channel.h index a59ac5251..e3bfb5fe5 100644 --- a/src/zapit/include/zapit/channel.h +++ b/src/zapit/include/zapit/channel.h @@ -189,7 +189,7 @@ class CZapitChannel bool has_bouquet; uint8_t polarization; int flags; - int deltype; + delivery_system_t delsys; /* constructor, desctructor */ CZapitChannel(const std::string & p_name, t_service_id p_sid, t_transport_stream_id p_tsid, t_original_network_id p_onid, unsigned char p_service_type, t_satellite_position p_satellite_position, freq_id_t freq); diff --git a/src/zapit/include/zapit/client/zapittypes.h b/src/zapit/include/zapit/client/zapittypes.h index 3c472f14e..1751450a2 100644 --- a/src/zapit/include/zapit/client/zapittypes.h +++ b/src/zapit/include/zapit/client/zapittypes.h @@ -29,6 +29,7 @@ #include #include #include +#include #include /* diseqc types */ @@ -48,13 +49,6 @@ typedef enum { #endif } diseqc_t; -/* dvb transmission types */ -typedef enum { - DVB_C, - DVB_S, - DVB_T -} delivery_system_t; - /* video display formats (cf. video_displayformat_t in driver/dvb/include/linux/dvb/video.h): */ typedef enum { ZAPIT_VIDEO_PAN_SCAN, /* use pan and scan format */ @@ -89,7 +83,6 @@ typedef enum { typedef struct TP_parameter { uint64_t TP_id; /* diseqc<<24 | feparams->frequency>>8 */ - uint8_t polarization; uint8_t diseqc; int scan_mode; FrontendParameters feparams; diff --git a/src/zapit/include/zapit/frontend_c.h b/src/zapit/include/zapit/frontend_c.h index 5ae39ae59..aca1da92f 100644 --- a/src/zapit/include/zapit/frontend_c.h +++ b/src/zapit/include/zapit/frontend_c.h @@ -58,6 +58,8 @@ #define MAKE_FE_KEY(adapter, number) ((adapter << 8) | (number & 0xFF)) +#define MAX_DELSYS 8 + static inline fe_modulation_t dvbs_get_modulation(fe_code_rate_t fec) { if((fec < FEC_S2_QPSK_1_2) || (fec < FEC_S2_8PSK_1_2)) @@ -135,8 +137,11 @@ class CFrontend int32_t lnbOffsetLow; int32_t lnbOffsetHigh; int32_t lnbSwitch; + /* current Transponderdata */ - TP_params currentTransponder; + transponder currentTransponder; + uint8_t currentDiseqc; + bool slave; fe_work_mode_t femode; bool have_loop; @@ -145,7 +150,12 @@ class CFrontend fe_linkmap_t linkmap; int fenumber; bool standby; - bool buildProperties(const FrontendParameters*, struct dtv_properties &); + + uint32_t deliverySystemMask; + //fe_delivery_system_t deliverySystems[MAX_DELSYS]; + //uint32_t numDeliverySystems; + + bool buildProperties(const FrontendParameters*, struct dtv_properties &); FrontendParameters getFrontend(void) const; void secSetTone(const fe_sec_tone_mode_t mode, const uint32_t ms); @@ -159,7 +169,7 @@ class CFrontend void sendDiseqcZeroByteCommand(const uint8_t frm, const uint8_t addr, const uint8_t cmd, uint32_t ms = 15); void sendToneBurst(const fe_sec_mini_cmd_t burst, const uint32_t ms); int setFrontend(const FrontendParameters *feparams, bool nowait = false); - void setSec(const uint8_t sat_no, const uint8_t pol, const bool high_band); + void setSec(const uint8_t pol, const bool high_band); void reset(void); /* Private constructor */ CFrontend(int Number = 0, int Adapter = 0); @@ -171,15 +181,21 @@ class CFrontend public: ~CFrontend(void); - static fe_code_rate_t getCodeRate(const uint8_t fec_inner, int system = 0); - uint8_t getDiseqcPosition(void) const { return currentTransponder.diseqc; } + static fe_code_rate_t getCodeRate(const uint8_t fec_inner, delivery_system_t delsys); + static fe_hierarchy_t getHierarchy(const uint8_t hierarchy); + static fe_transmit_mode_t getTransmissionMode(const uint8_t transmission_mode); + static fe_bandwidth_t getBandwidth(const uint8_t bandwidth); + static fe_guard_interval_t getGuardInterval(const uint8_t guard_interval); + static fe_modulation_t getConstellation(const uint8_t constellation); + static fe_rolloff_t getRolloff(const uint8_t rolloff); + uint8_t getDiseqcPosition(void) const { return currentDiseqc; } uint8_t getDiseqcRepeats(void) const { return (uint8_t) config.diseqcRepeats; } diseqc_t getDiseqcType(void) const { return (diseqc_t) config.diseqcType; } - uint32_t getFrequency(void) const { return currentTransponder.feparams.dvb_feparams.frequency; } + uint32_t getFrequency(void) const { return currentTransponder.getFrequency(); } bool getHighBand() { return (int) getFrequency() >= lnbSwitch; } static fe_modulation_t getModulation(const uint8_t modulation); uint8_t getPolarization(void) const; - const struct dvb_frontend_info *getInfo(void) const { return &info; }; + bool getRotorSwap() { return config.rotor_swap; } uint32_t getBitErrorRate(void) const; @@ -188,6 +204,7 @@ class CFrontend fe_status_t getStatus(void) const; uint32_t getUncorrectedBlocks(void) const; void getDelSys(int f, int m, char * &fec, char * &sys, char * &mod); + void getFEInfo(void); int32_t getCurrentSatellitePosition() { return currentSatellitePosition; } int32_t getRotorSatellitePosition() { return rotorSatellitePosition; } @@ -209,9 +226,9 @@ class CFrontend frontend_config_t& getConfig() { return config; }; void setConfig(frontend_config_t cfg) { setDiseqcType((diseqc_t) cfg.diseqcType); config = cfg; }; - int setParameters(TP_params *TP, bool nowait = 0); - int tuneFrequency (FrontendParameters * feparams, uint8_t polarization, bool nowait = false); - const TP_params* getParameters(void) const { return ¤tTransponder; }; + int setParameters(transponder *TP, bool nowait = 0); + int tuneFrequency (FrontendParameters * feparams, bool nowait = false); + const transponder* getParameters(void) const { return ¤tTransponder; }; void setCurrentSatellitePosition(int32_t satellitePosition) {currentSatellitePosition = satellitePosition; } void setRotorSatellitePosition(int32_t satellitePosition) {rotorSatellitePosition = satellitePosition; } @@ -222,18 +239,18 @@ class CFrontend bool retuneChannel(void); fe_code_rate_t getCFEC (); - transponder_id_t getTsidOnid() { return currentTransponder.TP_id; } + transponder_id_t getTsidOnid() { return currentTransponder.getTransponderId(); } bool sameTsidOnid(transponder_id_t tpid) { - return (currentTransponder.TP_id == 0) - || (tpid == currentTransponder.TP_id); + return (currentTransponder.getTransponderId() == 0) + || (tpid == currentTransponder.getTransponderId()); } void setTsidOnid(transponder_id_t newid) { if (!usecount) - currentTransponder.TP_id = newid; + currentTransponder.setTransponderId(newid); } - uint32_t getRate (); + uint32_t getRate () const; void Lock(); void Unlock(); @@ -251,7 +268,7 @@ class CFrontend satellite_map_t & getSatellites() { return satellites; } void setSatellites(satellite_map_t satmap) { satellites = satmap; } int getNumber() { return fenumber; }; - static void getDelSys(uint8_t type, int f, int m, char * &fec, char * &sys, char * &mod); + static void getDelSys(delivery_system_t delsys, int f, int m, char * &fec, char * &sys, char * &mod); fe_work_mode_t getMode() { return femode; } void setMode(int mode) {femode = (fe_work_mode_t) mode; } int getMaster() { return masterkey; } @@ -263,9 +280,26 @@ class CFrontend return true; return false; } - bool isCable() { return (info.type == FE_QAM); } - bool isSat() { return (info.type == FE_QPSK); } - bool isTerr() { return (info.type == FE_OFDM); } + + static bool isCable(delivery_system_t delsys); + static bool isSat(delivery_system_t delsys); + static bool isTerr(delivery_system_t delsys); + bool hasCable(void); + bool hasSat(void); + bool hasTerr(void); + bool isHybrid(void); + bool supportsDelivery(delivery_system_t); + delivery_system_t getCurrentDeliverySystem(void); + uint32_t getSupportedDeliverySystems(void) const; + static uint32_t getXMLDeliverySystem(delivery_system_t delsys); + static delivery_system_t getZapitDeliverySystem(uint32_t); + static void getXMLDelsysFEC(fe_code_rate_t xmlfec, delivery_system_t & delsys, fe_code_rate_t & fec); + static fe_delivery_system_t getFEDeliverySystem(delivery_system_t Delsys); + static uint32_t getFEBandwidth(fe_bandwidth_t bandwidth); + const char* getName(void) const { return info.name; } +private: + // DEPRECATED fe_type_t getType() { return info.type; } + const struct dvb_frontend_info *getInfo(void) const { return &info; }; }; #endif /* __zapit_frontend_h__ */ diff --git a/src/zapit/include/zapit/frontend_types.h b/src/zapit/include/zapit/frontend_types.h index 409f981dd..4d9bf9ee7 100644 --- a/src/zapit/include/zapit/frontend_types.h +++ b/src/zapit/include/zapit/frontend_types.h @@ -20,14 +20,87 @@ #ifndef __FRONTEND_TYPES_H__ #define __FRONTEND_TYPES_H__ +#include #include -typedef struct { - struct dvb_frontend_parameters dvb_feparams; - fe_delivery_system_t delsys; - fe_rolloff_t rolloff; -} FrontendParameters; +// Delivery Systems +#define ZAPIT_DS_UNKNOWN 0x00000000 +#define ZAPIT_DS_DVB_S 0x00000001 +#define ZAPIT_DS_DVB_S2 0x00000002 +#define ZAPIT_DS_DVB_C 0x00000004 +#define ZAPIT_DS_DVB_C2 0x00000008 +#define ZAPIT_DS_DVB_T 0x00000010 +#define ZAPIT_DS_DVB_T2 0x00000020 +#define ZAPIT_DS_DTMB 0x00000040 +#define ZAPIT_DS_DSS 0x00000080 +#define ZAPIT_DS_TURBO 0x00000100 +#define ZAPIT_DS_ISDBS 0x00000200 +#define ZAPIT_DS_ISDBC 0x00000400 +#define ZAPIT_DS_ISDBT 0x00000800 +#define ZAPIT_DS_MASK 0x00000FFF // WARNING: update this mask if delivery systems are added. +// Delivery Method +#define ZAPIT_DM_SAT (ZAPIT_DS_DVB_S | \ + ZAPIT_DS_DVB_S2 | \ + ZAPIT_DS_DSS | \ + ZAPIT_DS_TURBO | \ + ZAPIT_DS_ISDBS) +#define ZAPIT_DM_CABLE (ZAPIT_DS_DVB_C | \ + ZAPIT_DS_DVB_C2 | \ + ZAPIT_DS_ISDBC) + +#define ZAPIT_DM_TERR (ZAPIT_DS_DVB_T | \ + ZAPIT_DS_DVB_T2 | \ + ZAPIT_DS_DTMB | \ + ZAPIT_DS_ISDBT) + +#define ZAPIT_DS_IS_SAT(ds) (((ds) & ZAPIT_DM_SAT) != 0) +#define ZAPIT_DS_IS_TERR(ds) (((ds) & ZAPIT_DM_TERR) != 0) +#define ZAPIT_DS_IS_CABLE(ds) (((ds) & ZAPIT_DM_CABLE) != 0) +#define ZAPIT_DS_BIT_MASK(ds) ((1 << (ds)) & ZAPIT_DS_MASK) +/* dvb transmission types */ +typedef enum { + UNKNOWN_DS = ZAPIT_DS_UNKNOWN, + DVB_C = ZAPIT_DS_DVB_C, + DVB_C2 = ZAPIT_DS_DVB_C2, + DVB_S = ZAPIT_DS_DVB_S, + DVB_S2 = ZAPIT_DS_DVB_S2, + DVB_T = ZAPIT_DS_DVB_T, + DVB_T2 = ZAPIT_DS_DVB_T2, + DTMB = ZAPIT_DS_DTMB, + DSS = ZAPIT_DS_DSS, + TURBO = ZAPIT_DS_TURBO, + ISDBS = ZAPIT_DS_ISDBS, + ISDBC = ZAPIT_DS_ISDBC, + ISDBT = ZAPIT_DS_ISDBT, + // + ALL_SAT = ZAPIT_DM_SAT, + ALL_CABLE = ZAPIT_DM_CABLE, + ALL_TERR = ZAPIT_DM_TERR, +} delivery_system_t; + +typedef struct { + delivery_system_t delsys; + uint32_t frequency; + fe_modulation_t modulation; + + fe_spectral_inversion_t inversion; + fe_code_rate_t fec_inner; + fe_transmit_mode_t transmission_mode; + fe_bandwidth_t bandwidth; + fe_guard_interval_t guard_interval; + fe_hierarchy_t hierarchy; + uint32_t symbol_rate; + fe_code_rate_t code_rate_HP; + fe_code_rate_t code_rate_LP; + + fe_pilot_t pilot; + fe_rolloff_t rolloff; + + enum fe_interleaving interleaving; + + uint8_t polarization; +} FrontendParameters; typedef struct frontend_config { int diseqcRepeats; diff --git a/src/zapit/include/zapit/getservices.h b/src/zapit/include/zapit/getservices.h index bfc4e0014..9a21b358b 100644 --- a/src/zapit/include/zapit/getservices.h +++ b/src/zapit/include/zapit/getservices.h @@ -84,18 +84,17 @@ class CServiceManager bool have_numbers; bool dup_numbers; - fe_type_t frontendType; satellite_map_t satellitePositions; sat_transponder_map_t satelliteTransponders; - bool ParseScanXml(fe_type_t delsys); - void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, fe_type_t delsys); - 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, fe_type_t delsys); + bool ParseScanXml(delivery_system_t delsys); + void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, delivery_system_t delsys); + 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, delivery_system_t delsys); void FindTransponder(xmlNodePtr search); - void ParseSatTransponders(fe_type_t frontendType, xmlNodePtr search, t_satellite_position satellitePosition); + void ParseSatTransponders(delivery_system_t delsys, xmlNodePtr search, t_satellite_position satellitePosition); int LoadMotorPositions(void); - bool LoadScanXml(fe_type_t delsys); + bool LoadScanXml(delivery_system_t delsys); void WriteSatHeader(FILE * fd, sat_config_t &config); void WriteCurrentService(FILE * fd, bool &satfound, bool &tpdone, @@ -110,7 +109,7 @@ class CServiceManager static void CopyFile(char * from, char * to); - bool InitSatPosition(t_satellite_position position, char * name = NULL, bool force = false, int deltype = FE_QPSK); + bool InitSatPosition(t_satellite_position position, char * name = NULL, bool force = false, delivery_system_t delsys = DVB_S, uint16_t nid = 0); bool LoadServices(bool only_current); void SaveServices(bool tocopy, bool if_changed = false, bool no_deleted = false); void SaveMotorPositions(); diff --git a/src/zapit/include/zapit/satconfig.h b/src/zapit/include/zapit/satconfig.h index 06abb71d5..fdc0c0be4 100644 --- a/src/zapit/include/zapit/satconfig.h +++ b/src/zapit/include/zapit/satconfig.h @@ -38,7 +38,7 @@ typedef struct sat_config { int input; int configured; int cable_nid; - int deltype; + delivery_system_t delsys; } sat_config_t; typedef enum diseqc_cmd_order { diff --git a/src/zapit/include/zapit/scan.h b/src/zapit/include/zapit/scan.h index 36565cfa9..0a100bd97 100644 --- a/src/zapit/include/zapit/scan.h +++ b/src/zapit/include/zapit/scan.h @@ -67,7 +67,6 @@ class CServiceScan : public OpenThreads::Thread int flags; void * scan_arg; bool satHaveChannels; - fe_type_t frontendType; uint32_t fake_tid, fake_nid; uint32_t found_transponders; @@ -89,7 +88,7 @@ class CServiceScan : public OpenThreads::Thread bool ScanProvider(t_satellite_position satellitePosition); void Cleanup(const bool success); - bool tuneFrequency(FrontendParameters *feparams, uint8_t polarization, t_satellite_position satellitePosition); + bool tuneFrequency(FrontendParameters *feparams, t_satellite_position satellitePosition); void SendTransponderInfo(transponder &t); bool ReadNitSdt(t_satellite_position satellitePosition); bool AddFromNit(); @@ -100,7 +99,7 @@ class CServiceScan : public OpenThreads::Thread bool ScanProviders(); void SaveServices(); void CleanAllMaps(); - bool ReplaceTransponderParams(freq_id_t freq, t_satellite_position satellitePosition, struct dvb_frontend_parameters * feparams, uint8_t polarization); + //bool ReplaceTransponderParams(freq_id_t freq, t_satellite_position satellitePosition, FrontendParameters *feparams); /* fast scan */ std::map fast_services_sat; @@ -118,9 +117,9 @@ class CServiceScan : public OpenThreads::Thread bool ParseFnt(unsigned short pid, unsigned short operator_id); void process_logical_service_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq); void process_service_list_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq); - void process_satellite_delivery_system_descriptor(const unsigned char * const buffer, FrontendParameters * feparams, uint8_t * polarization, t_satellite_position * satellitePosition); + void process_satellite_delivery_system_descriptor(const unsigned char * const buffer, FrontendParameters * feparams, t_satellite_position * satellitePosition); bool ScanFast(); - void ReportFastScan(FrontendParameters &feparams, uint8_t polarization, t_satellite_position satellitePosition); + void ReportFastScan(FrontendParameters &feparams, t_satellite_position satellitePosition); void run(); @@ -135,7 +134,7 @@ class CServiceScan : public OpenThreads::Thread bool Start(scan_type_t mode, void * arg); bool Stop(); - bool AddTransponder(transponder_id_t TsidOnid, FrontendParameters *feparams, uint8_t polarity, bool fromnit = false); + bool AddTransponder(transponder_id_t TsidOnid, FrontendParameters *feparams, bool fromnit = false); void ChannelFound(uint8_t service_type, std::string providerName, std::string serviceName); void AddServiceType(t_channel_id channel_id, uint8_t service_type); diff --git a/src/zapit/include/zapit/scannit.h b/src/zapit/include/zapit/scannit.h index ad0c6f182..18752ce93 100644 --- a/src/zapit/include/zapit/scannit.h +++ b/src/zapit/include/zapit/scannit.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -39,7 +40,6 @@ class CNit : public OpenThreads::Thread { private: int dmxnum; - bool cable; t_satellite_position satellitePosition; t_satellite_position orbitalPosition; @@ -55,6 +55,7 @@ class CNit : public OpenThreads::Thread bool Read(); bool ParseSatelliteDescriptor(SatelliteDeliverySystemDescriptor * sd, TransportStreamInfo * ts); bool ParseCableDescriptor(CableDeliverySystemDescriptor * sd, TransportStreamInfo * ts); + bool ParseTerrestrialDescriptor(TerrestrialDeliverySystemDescriptor * sd, TransportStreamInfo * ts); bool ParseServiceList(ServiceListDescriptor * sd, TransportStreamInfo * ts); bool ParseLogicalChannels(LogicalChannelDescriptor * ld, TransportStreamInfo * ts, bool hd = false); diff --git a/src/zapit/include/zapit/transponder.h b/src/zapit/include/zapit/transponder.h index 3902aa6be..7dd2962e4 100644 --- a/src/zapit/include/zapit/transponder.h +++ b/src/zapit/include/zapit/transponder.h @@ -28,18 +28,17 @@ class transponder { +//private: public: t_transport_stream_id transport_stream_id; t_original_network_id original_network_id; transponder_id_t transponder_id; t_satellite_position satellitePosition; - uint8_t deltype; FrontendParameters feparams; - unsigned char polarization; bool updated; - - transponder(fe_type_t fType, const transponder_id_t t_id, const FrontendParameters p_feparams, const uint8_t p_polarization = 0); +public: + transponder(const transponder_id_t t_id, const FrontendParameters p_feparams); transponder(); bool operator==(const transponder& t) const; @@ -48,7 +47,30 @@ public: void dump(std::string label = "tp"); void ddump(std::string label = "tp"); static char pol(unsigned char pol); - std::string description(); + std::string description(void); + + delivery_system_t getDelSys(void) { return feparams.delsys; } + t_transport_stream_id getTransportStreamId(void) { return transport_stream_id; } + void setTransportStreamId(t_transport_stream_id _transport_stream_id) { transport_stream_id = _transport_stream_id; } + t_original_network_id getOriginalNetworkId(void) { return original_network_id; } + void setOriginalNetworkId(t_original_network_id _original_network_id) { original_network_id = _original_network_id; } + transponder_id_t getTransponderId(void) { return transponder_id; } + void setTransponderId(transponder_id_t _transponder_id) { transponder_id = _transponder_id; } + t_satellite_position getSatellitePosition(void) { return satellitePosition; } + void setSatellitePosition(t_satellite_position SatellitePosition) { satellitePosition = SatellitePosition; } + const FrontendParameters *getFEParams(void) const { return &feparams; } + void setUpdated(bool Updated = true) { updated = Updated; } + bool getUpdated(void) const { return updated; } + uint32_t getFrequency(void) const { return feparams.frequency; } + uint32_t getSymbolRate(void) const { return feparams.symbol_rate; } + fe_bandwidth_t getBandwidth(void) const { return feparams.bandwidth; } + fe_modulation_t getModulation(void) const { return feparams.modulation; } + fe_code_rate_t getCodeRateHP(void) const { return feparams.code_rate_HP; } + fe_code_rate_t getCodeRateLP(void) const { return feparams.code_rate_LP; } + fe_code_rate_t getFecInner(void) const { return feparams.fec_inner; } + fe_hierarchy_t getHierarchy(void) const { return feparams.hierarchy; } + fe_guard_interval_t getGuardInterval(void) const { return feparams.guard_interval; } + uint8_t getPolarization(void) const { return feparams.polarization; } }; typedef std::map transponder_list_t; diff --git a/src/zapit/lib/zapitclient.cpp b/src/zapit/lib/zapitclient.cpp index 5804da1f8..04ca619a0 100644 --- a/src/zapit/lib/zapitclient.cpp +++ b/src/zapit/lib/zapitclient.cpp @@ -595,7 +595,7 @@ delivery_system_t CZapitClient::getDeliverySystem(void) } #endif #if 0 -bool CZapitClient::get_current_TP(TP_params* TP) +bool CZapitClient::get_current_TP(transponder* TP) { TP_params TP_temp; send(CZapitMessages::CMD_GET_CURRENT_TP); diff --git a/src/zapit/src/channel.cpp b/src/zapit/src/channel.cpp index fefb643c3..4f86cce26 100644 --- a/src/zapit/src/channel.cpp +++ b/src/zapit/src/channel.cpp @@ -68,7 +68,7 @@ void CZapitChannel::Init() pip_demux = 2; polarization = 0; flags = 0; - deltype = FE_QPSK; + delsys = DVB_S; bLockCount = 0; } diff --git a/src/zapit/src/fastscan.cpp b/src/zapit/src/fastscan.cpp index e680cbc96..ad4c0a265 100644 --- a/src/zapit/src/fastscan.cpp +++ b/src/zapit/src/fastscan.cpp @@ -57,19 +57,21 @@ extern transponder_list_t transponders; // defined in zapit.cpp typedef struct diseq_test_param { int position; - int frequency; - int symbol_rate; + uint32_t frequency; + uint32_t symbol_rate; fe_code_rate_t fec_inner; int polarization; + fe_modulation_t modulation; + delivery_system_t delsys; } diseq_test_param_t; diseq_test_param_t diseqc_test[] = { // { 192, 12515000, 22000000, FEC_5_6, 0 }, // test TP - { 192, 12552000, 22000000, FEC_5_6, 1 }, - { 235, 12168000, 27500000, FEC_3_4, 1 }, - { 282, 11778000, 27500000, FEC_2_3, 1 }, // FIXME: no such TP on lyngsat ?? - { 130, 11681000, 27500000, FEC_S2_8PSK_3_4, 0 }, - { 90, 12074000, 27500000, FEC_S2_8PSK_3_4, 1 }, + { 192, 12552000, 22000000, FEC_5_6, 1, QPSK , DVB_S }, + { 235, 12168000, 27500000, FEC_3_4, 1, QPSK , DVB_S }, + { 282, 11778000, 27500000, FEC_2_3, 1, QPSK , DVB_S }, // FIXME: no such TP on lyngsat ?? + { 130, 11681000, 27500000, FEC_3_4, 0, PSK_8, DVB_S2 }, + { 90, 12074000, 27500000, FEC_3_4, 1, PSK_8, DVB_S2 }, }; #define diseqc_test_count (sizeof(diseqc_test)/sizeof(diseq_test_param_t)) @@ -97,14 +99,19 @@ bool CServiceScan::TestDiseqcConfig(int num) continue; FrontendParameters feparams; - feparams.dvb_feparams.frequency = diseqc_test[i].frequency; - feparams.dvb_feparams.u.qpsk.symbol_rate = diseqc_test[i].symbol_rate; - feparams.dvb_feparams.u.qpsk.fec_inner = diseqc_test[i].fec_inner; + memset(&feparams, 0, sizeof(feparams)); + + feparams.frequency = diseqc_test[i].frequency; + feparams.symbol_rate = diseqc_test[i].symbol_rate; + feparams.fec_inner = diseqc_test[i].fec_inner; + feparams.delsys = diseqc_test[i].delsys; + feparams.modulation = diseqc_test[i].modulation; + feparams.polarization = diseqc_test[i].polarization; int old_diseqc = satmap[diseqc_test[i].position].diseqc; satmap[diseqc_test[i].position].diseqc = diseqc; - if (tuneFrequency(&feparams, diseqc_test[i].polarization, diseqc_test[i].position)) { + if (tuneFrequency(&feparams, diseqc_test[i].position)) { scanned.insert(diseqc_test[i].position); break; } @@ -142,15 +149,15 @@ void CServiceScan::InitFastscanLnb(int id) SetFrontend(192); } -void CServiceScan::ReportFastScan(FrontendParameters &feparams, uint8_t polarization, t_satellite_position satellitePosition) +void CServiceScan::ReportFastScan(FrontendParameters &feparams, t_satellite_position satellitePosition) { if (quiet_fastscan) return; std::string satname = CServiceManager::getInstance()->GetSatelliteName(satellitePosition); - uint32_t actual_polarisation = ((feparams.dvb_feparams.u.qpsk.symbol_rate/1000) << 16) - | (feparams.dvb_feparams.u.qpsk.fec_inner << 8) | (uint)polarization; - uint32_t actual_freq = feparams.dvb_feparams.frequency; + uint32_t actual_polarisation = ((feparams.symbol_rate/1000) << 16) + | (feparams.fec_inner << 8) | (uint)feparams.polarization; + uint32_t actual_freq = feparams.frequency; CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SATELLITE, satname.c_str(), satname.size() + 1); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCYP, &actual_polarisation,sizeof(actual_polarisation)); @@ -159,10 +166,11 @@ void CServiceScan::ReportFastScan(FrontendParameters &feparams, uint8_t polariza bool CServiceScan::FastscanTune(int id) { - uint8_t polarization; FrontendParameters feparams; bool res = true; + memset(&feparams, 0, sizeof(feparams)); + if (tune_tp_index >= FAST_TUNE_TPS) { printf("[fast scan] no more TPs to try, exiting\n"); return false; @@ -170,12 +178,14 @@ bool CServiceScan::FastscanTune(int id) if (tune_tp_index == 0) { printf("[fast scan] try tuning to main TP\n"); - feparams.dvb_feparams.frequency = 12070000; - feparams.dvb_feparams.u.qpsk.symbol_rate = 27500000; - feparams.dvb_feparams.u.qpsk.fec_inner = FEC_3_4; - polarization = 0; - ReportFastScan(feparams, polarization, 235); - res = tuneFrequency(&feparams, polarization, 235); + feparams.delsys = DVB_S; + feparams.modulation = QPSK; + feparams.frequency = 12070000; + feparams.symbol_rate = 27500000; + feparams.fec_inner = FEC_3_4; + feparams.polarization = 0; + ReportFastScan(feparams, 235); + res = tuneFrequency(&feparams, 235); } // if TP 0 lock failed or TP 0 lock succeeded but no fastscan data arrived @@ -184,18 +194,23 @@ bool CServiceScan::FastscanTune(int id) if (tune_tp_index == 1 || !res) { printf("[fast scan] tune failed, try backup\n"); if (id == HELLO_OPERATOR_ID) { - feparams.dvb_feparams.frequency = 12074000; - feparams.dvb_feparams.u.qpsk.symbol_rate = 27500000; - feparams.dvb_feparams.u.qpsk.fec_inner = FEC_3_4; - polarization = 1; - ReportFastScan(feparams, polarization, 90); - res = tuneFrequency(&feparams, polarization, 90); + feparams.delsys = DVB_S; + feparams.modulation = QPSK; + feparams.frequency = 12074000; + feparams.symbol_rate = 27500000; + feparams.fec_inner = FEC_3_4; + feparams.polarization = 1; + ReportFastScan(feparams, 90); + res = tuneFrequency(&feparams, 90); } else { - feparams.dvb_feparams.frequency = 12515000; - feparams.dvb_feparams.u.qpsk.symbol_rate = 22000000; - feparams.dvb_feparams.u.qpsk.fec_inner = FEC_5_6; - ReportFastScan(feparams, polarization, 192); - res = tuneFrequency(&feparams, polarization, 192); + feparams.delsys = DVB_S; + feparams.modulation = QPSK; + feparams.frequency = 12515000; + feparams.symbol_rate = 22000000; + feparams.fec_inner = FEC_5_6; + feparams.polarization = 0; + ReportFastScan(feparams, 192); + res = tuneFrequency(&feparams, 192); } } @@ -471,7 +486,7 @@ bool CServiceScan::ParseFst(unsigned short pid, fast_scan_operator_t * op) service_type, satellitePosition, freq); - newchannel->deltype = FE_QPSK; + newchannel->delsys = frontend->getCurrentDeliverySystem(); newchannel->flags = CZapitChannel::NEW | CZapitChannel::FASTSCAN; CServiceManager::getInstance()->AddChannel(newchannel); } else { @@ -486,7 +501,7 @@ bool CServiceScan::ParseFst(unsigned short pid, fast_scan_operator_t * op) newchannel->number = num; char pname[100]; - if (frontend->getInfo()->type == FE_QPSK) + if (CFrontend::isSat(frontend->getCurrentDeliverySystem())) snprintf(pname, 100, "[%c%03d.%d] %s", satellitePosition > 0? 'E' : 'W', abs((int)satellitePosition)/10, abs((int)satellitePosition)%10, providerName.c_str()); else snprintf(pname, 100, "%s", providerName.c_str()); @@ -573,8 +588,6 @@ bool CServiceScan::ParseFnt(unsigned short pid, unsigned short operator_id) mask[0] = mask[1] = mask[2] = 0xFF; - frontendType = FE_QPSK; - printf("[FNT] scaning pid %d operator %d\n", pid, operator_id); if (dmx->sectionFilter(pid, filter, mask, 3, 3000) < 0) { delete dmx; @@ -637,7 +650,6 @@ bool CServiceScan::ParseFnt(unsigned short pid, unsigned short operator_id) original_network_id = (buffer[pos + 2] << 8) | buffer[pos + 3]; transport_descriptors_length = ((buffer[pos + 4] & 0x0F) << 8) | buffer[pos + 5]; FrontendParameters feparams; - uint8_t polarization; t_satellite_position satellitePosition = 0; freq_id_t freq = 0; @@ -651,12 +663,12 @@ bool CServiceScan::ParseFnt(unsigned short pid, unsigned short operator_id) transponder_id_t TsidOnid; stiterator stI; - process_satellite_delivery_system_descriptor(buffer + pos2, &feparams, &polarization, &satellitePosition); - freq = feparams.dvb_feparams.frequency / 1000; + process_satellite_delivery_system_descriptor(buffer + pos2, &feparams, &satellitePosition); + freq = feparams.frequency / 1000; TsidOnid = CREATE_TRANSPONDER_ID64(freq, satellitePosition, original_network_id, transport_stream_id); stI = transponders.find(TsidOnid); if(stI == transponders.end()) { - transponder t(frontendType, TsidOnid, feparams, polarization); + transponder t(TsidOnid, feparams); transponders.insert(transponder_pair_t(TsidOnid, t)); } found_transponders++; @@ -728,12 +740,12 @@ void CServiceScan::process_service_list_descriptor(const unsigned char * const b } } -void CServiceScan::process_satellite_delivery_system_descriptor(const unsigned char * const buffer, FrontendParameters * feparams, uint8_t * polarization, t_satellite_position * satellitePosition) +void CServiceScan::process_satellite_delivery_system_descriptor(const unsigned char * const buffer, FrontendParameters * feparams, t_satellite_position * satellitePosition) { stiterator tI; - int modulationSystem, modulationType, /*rollOff,*/ fec_inner; + int modulationSystem, modulationType, rollOff, fec_inner; - feparams->dvb_feparams.frequency = ( + feparams->frequency = ( ((buffer[2] >> 4) * 100000000) + ((buffer[2] & 0x0F) * 10000000) + ((buffer[3] >> 4) * 1000000) + @@ -750,13 +762,13 @@ void CServiceScan::process_satellite_delivery_system_descriptor(const unsigned c ((buffer[7] >> 4) * 10) + ((buffer[7] & 0x0F) * 1) ); - feparams->dvb_feparams.inversion = INVERSION_AUTO; + feparams->inversion = INVERSION_AUTO; - //rollOff = (buffer[8] >> 4) & 0x03; //alpha_0_35, alpha_0_25, alpha_0_20, alpha_auto + rollOff = (buffer[8] >> 4) & 0x03; //alpha_0_35, alpha_0_25, alpha_0_20, alpha_auto modulationSystem = (buffer[8] >> 2) & 0x01; // 1= DVB_S2 modulationType = (buffer[8]) & 0x03; // 1=QPSK, 2=M8PSK - feparams->dvb_feparams.u.qpsk.symbol_rate = ( + feparams->symbol_rate = ( ((buffer[9] >> 4) * 100000000) + ((buffer[9] & 0x0F) * 10000000) + ((buffer[10] >> 4) * 1000000) + @@ -766,23 +778,30 @@ void CServiceScan::process_satellite_delivery_system_descriptor(const unsigned c ((buffer[12] >> 4) * 100) ); - fec_inner = CFrontend::getCodeRate(buffer[12] & 0x0F, modulationSystem); + if (modulationSystem == 0) { + feparams->delsys = DVB_S; + feparams->rolloff = ROLLOFF_35; // default for DVB-S + } else { + feparams->delsys = DVB_S2; + feparams->rolloff = CFrontend::getRolloff(rollOff); + } + + fec_inner = CFrontend::getCodeRate(buffer[12] & 0x0F, feparams->delsys); if(modulationType == 2) fec_inner += 9; - feparams->dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) fec_inner; - - * polarization = (buffer[8] >> 5) & 0x03; + feparams->fec_inner = (fe_code_rate_t) fec_inner; + feparams->polarization = (buffer[8] >> 5) & 0x03; /* workarounds for braindead broadcasters (e.g. on Telstar 12 at 15.0W) */ - if (feparams->dvb_feparams.frequency >= 100000000) - feparams->dvb_feparams.frequency /= 10; - if (feparams->dvb_feparams.u.qpsk.symbol_rate >= 50000000) - feparams->dvb_feparams.u.qpsk.symbol_rate /= 10; + if (feparams->frequency >= 100000000) + feparams->frequency /= 10; + if (feparams->symbol_rate >= 50000000) + feparams->symbol_rate /= 10; - feparams->dvb_feparams.frequency = (int) 1000 * (int) round ((double) feparams->dvb_feparams.frequency / (double) 1000); + feparams->frequency = (int) 1000 * (int) round ((double) feparams->frequency / (double) 1000); #ifdef SCAN_DEBUG - printf("[FNT] new TP: sat %d freq %d SR %d fec %d pol %d\n", *satellitePosition, feparams->dvb_feparams.frequency, feparams->dvb_feparams.u.qpsk.symbol_rate, fec_inner, * polarization); + printf("[FNT] new TP: sat %d freq %d SR %d fec %d pol %d\n", *satellitePosition, feparams->frequency, feparams->symbol_rate, fec_inner, feparams->polarization); #endif } diff --git a/src/zapit/src/femanager.cpp b/src/zapit/src/femanager.cpp index ce51a4643..75979b067 100644 --- a/src/zapit/src/femanager.cpp +++ b/src/zapit/src/femanager.cpp @@ -102,11 +102,11 @@ bool CFEManager::Init() INFO("add fe %d", fe->fenumber); if(livefe == NULL) livefe = fe; - if (fe->getInfo()->type == FE_QPSK) + if (fe->hasSat()) have_sat = true; - else if (fe->getInfo()->type == FE_QAM) + if (fe->hasCable()) have_cable = true; - else if (fe->isTerr()) + if (fe->hasTerr()) have_terr = true; } else delete fe; @@ -249,11 +249,13 @@ bool CFEManager::loadSettings() /* default mode for first / next frontends */ int def_mode = def_modeX; - if (fe->isSat() && fsat) { + + if (fe->hasSat() && fsat) { fsat = false; def_mode = def_mode0; } - if (fe->isCable()) { + + if (fe->hasCable()) { #if 0 if (fcable) { fcable = false; @@ -264,7 +266,8 @@ bool CFEManager::loadSettings() #endif def_mode = CFrontend::FE_MODE_INDEPENDENT; } - if (fe->isTerr()) { + + if (fe->hasTerr()) { if (fterr) { fterr = false; def_mode = def_mode0; @@ -286,7 +289,7 @@ bool CFEManager::loadSettings() satellite_map_t satlist = CServiceManager::getInstance()->SatelliteList(); for(sat_iterator_t sit = satlist.begin(); sit != satlist.end(); ++sit) { - if (fe->getInfo()->type != sit->second.deltype) + if (!fe->supportsDelivery(sit->second.delsys)) continue; t_satellite_position position = sit->first; @@ -491,7 +494,7 @@ CFrontend * CFEManager::getFE(int index) /* compare polarization and band with fe values */ bool CFEManager::loopCanTune(CFrontend * fe, CZapitChannel * channel) { - if(fe->getInfo()->type != FE_QPSK) + if(!fe->hasSat()) return true; if(fe->tuned && (fe->getCurrentSatellitePosition() != channel->getSatellitePosition())) @@ -520,12 +523,12 @@ CFrontend * CFEManager::getFrontend(CZapitChannel * channel) for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * mfe = it->second; - if (mfe->getType() != channel->deltype) + if (!mfe->supportsDelivery(channel->delsys)) continue; if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode())) continue; - if (mfe->getInfo()->type == FE_QPSK) { + if (mfe->hasSat()) { satellite_map_t & satmap = mfe->getSatellites(); sat_iterator_t sit = satmap.find(satellitePosition); if ((sit == satmap.end()) || !sit->second.configured) @@ -684,17 +687,17 @@ CFrontend * CFEManager::getScanFrontend(t_satellite_position satellitePosition) CFrontend * frontend = NULL; for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * mfe = it->second; - if (mfe->isCable()) { - if ((mfe->getMode() != CFrontend::FE_MODE_UNUSED) && SAT_POSITION_CABLE(satellitePosition)) { + if (mfe->hasCable() && SAT_POSITION_CABLE(satellitePosition)) { + if (mfe->getMode() != CFrontend::FE_MODE_UNUSED) { frontend = mfe; break; } - } else if (mfe->isTerr()) { - if ((mfe->getMode() != CFrontend::FE_MODE_UNUSED) && SAT_POSITION_TERR(satellitePosition)) { + } else if (mfe->hasTerr() && SAT_POSITION_TERR(satellitePosition)) { + if (mfe->getMode() != CFrontend::FE_MODE_UNUSED) { frontend = mfe; break; } - } else { + } else if (mfe->hasSat()) { if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode())) continue; satellite_map_t & satmap = mfe->getSatellites(); diff --git a/src/zapit/src/frontend.cpp b/src/zapit/src/frontend.cpp index 0ccb82579..c1fa57d2b 100644 --- a/src/zapit/src/frontend.cpp +++ b/src/zapit/src/frontend.cpp @@ -37,6 +37,7 @@ #include #include #include +#include extern transponder_list_t transponders; extern int zapit_debug; @@ -67,7 +68,6 @@ extern int zapit_debug; #define GUARD_INTERVAL 9 #define HIERARCHY 10 - #define FE_COMMON_PROPS 2 #define FE_DVBS_PROPS 6 #define FE_DVBS2_PROPS 8 @@ -125,7 +125,6 @@ static const struct dtv_property dvbt_cmdargs[] = { { DTV_TUNE, {}, { 0 }, 0}, }; - #define diff(x,y) (max(x,y) - min(x,y)) #define FE_TIMER_INIT() \ @@ -143,6 +142,15 @@ static const struct dtv_property dvbt_cmdargs[] = { printf("[fe%d] %s: %u msec (min %u max %u)\n", \ fenumber, label, timer_msec, tmin, tmax); +#define SETCMD(c, d) { \ + prop[cmdseq.num].cmd = (c); \ + prop[cmdseq.num].u.data = (d); \ + if (cmdseq.num++ > DTV_IOCTL_MAX_MSGS) { \ + printf("ERROR: too many tuning commands on frontend %d/%d", adapter, fenumber);\ + return; \ + } \ +} + // Internal Inner FEC representation typedef enum dvb_fec { fAuto, @@ -160,7 +168,9 @@ typedef enum dvb_fec { #define TIME_STEP 200 #define TIMEOUT_MAX_MS (feTimeout*100) + /*********************************************************************************************************/ + CFrontend::CFrontend(int Number, int Adapter) { printf("[fe%d] New frontend on adapter %d\n", Number, Adapter); @@ -178,12 +188,7 @@ CFrontend::CFrontend(int Number, int Adapter) tuned = false; uncommitedInput = 255; - memset(¤tTransponder, 0, sizeof(currentTransponder)); - currentTransponder.polarization = 1; - currentTransponder.feparams.dvb_feparams.frequency = 0; - currentTransponder.TP_id = 0; - currentTransponder.diseqc = 255; - + currentDiseqc = 255; config.diseqcType = NO_DISEQC; config.diseqcRepeats = 0; config.uni_scr = 0; /* the unicable SCR address 0-7 */ @@ -196,6 +201,8 @@ CFrontend::CFrontend(int Number, int Adapter) currentVoltage = SEC_VOLTAGE_OFF; currentToneMode = SEC_TONE_ON; memset(&info, 0, sizeof(info)); + + deliverySystemMask = UNKNOWN_DS; } CFrontend::~CFrontend(void) @@ -214,27 +221,109 @@ bool CFrontend::Open(bool init) snprintf(filename, sizeof(filename), "/dev/dvb/adapter%d/frontend%d", adapter, fenumber); printf("[fe%d] open %s\n", fenumber, filename); + mutex.lock(); if (fd < 0) { if ((fd = open(filename, O_RDWR | O_NONBLOCK | O_CLOEXEC)) < 0) { ERROR(filename); + mutex.unlock(); return false; } - fop(ioctl, FE_GET_INFO, &info); - printf("[fe%d] frontend fd %d type %d\n", fenumber, fd, info.type); + + getFEInfo(); } - //FIXME if (fenumber > 1) info.type = FE_QAM; + currentTransponder.setTransponderId(0); + standby = false; + + mutex.unlock(); if (init) Init(); - currentTransponder.TP_id = 0; - - standby = false; - return true; } +void CFrontend::getFEInfo(void) +{ + fop(ioctl, FE_GET_INFO, &info); + printf("[fe%d] frontend fd %d type %d\n", fenumber, fd, info.type); + bool legacy = true; + + deliverySystemMask = UNKNOWN_DS; + +#if (DVB_API_VERSION >= 5) && (DVB_API_VERSION_MINOR >= 5) + dtv_property prop[1]; + dtv_properties cmdseq; + + memset(prop, 0, sizeof(prop)); + memset(&cmdseq, 0, sizeof(cmdseq)); + cmdseq.props = prop; + + SETCMD(DTV_ENUM_DELSYS, 0); + int ret = fop(ioctl, FE_GET_PROPERTY, &cmdseq); + if (ret == 0) { + for (uint32_t i = 0; i < prop[0].u.buffer.len; i++) { + if (i >= MAX_DELSYS) { + printf("ERROR: too many delivery systems on frontend %d/%d", adapter, fenumber); + break; + } + + switch ((fe_delivery_system_t)prop[0].u.buffer.data[i]) { + case SYS_DVBC_ANNEX_A: + case SYS_DVBC_ANNEX_B: + case SYS_DVBC_ANNEX_C: + deliverySystemMask |= DVB_C; + break; + case SYS_DVBT: + deliverySystemMask |= DVB_T; + break; + case SYS_DVBT2: + deliverySystemMask |= DVB_T2; + break; + case SYS_DVBS: + deliverySystemMask |= DVB_S; + break; + case SYS_DVBS2: + deliverySystemMask |= DVB_S2; + break; + case SYS_DTMB: + deliverySystemMask |= DTMB; + break; + default: + printf("ERROR: too many delivery systems on frontend %d/%d", adapter, fenumber); + continue; + } + + } + legacy = false; + } else { + printf("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, fenumber); + } +#endif + if (legacy) { + // Legacy mode (DVB-API < 5.5): + switch (info.type) { + case FE_QPSK: + deliverySystemMask |= DVB_S; + if (info.caps & FE_CAN_2G_MODULATION) + deliverySystemMask |= DVB_S2; + break; + case FE_OFDM: + deliverySystemMask |= DVB_T; +#ifdef SYS_DVBT2 + if (info.caps & FE_CAN_2G_MODULATION) + deliverySystemMask |= DVB_T2; +#endif + break; + case FE_QAM: + deliverySystemMask |= DVB_C; + break; + default: + printf("ERROR: unknown frontend type %d on frontend %d/%d", info.type, adapter, fenumber); + } + } +} + void CFrontend::Init(void) { mutex.lock(); @@ -307,63 +396,113 @@ void CFrontend::Unlock() fe_code_rate_t CFrontend::getCFEC() { - if (info.type == FE_QPSK) - return currentTransponder.feparams.dvb_feparams.u.qpsk.fec_inner; + if (isSat(currentTransponder.feparams.delsys) || isCable(currentTransponder.feparams.delsys)) + return currentTransponder.feparams.fec_inner; else - return currentTransponder.feparams.dvb_feparams.u.qam.fec_inner; + return FEC_NONE; } -fe_code_rate_t CFrontend::getCodeRate(const uint8_t fec_inner, int system) +fe_code_rate_t CFrontend::getCodeRate(const uint8_t fec_inner, delivery_system_t delsys) { - dvb_fec_t fec = (dvb_fec_t) fec_inner; + dvb_fec_t f = (dvb_fec_t) fec_inner; + fe_code_rate_t fec; - if (system == 0) { - switch (fec) { + if (delsys == DVB_S || delsys == DVB_C || delsys == DVB_T) { + switch (f) { case fNone: - return FEC_NONE; + fec = FEC_NONE; + break; case f1_2: - return FEC_1_2; + fec = FEC_1_2; + break; case f2_3: - return FEC_2_3; + fec = FEC_2_3; + break; case f3_4: - return FEC_3_4; + fec = FEC_3_4; + break; case f5_6: - return FEC_5_6; + fec = FEC_5_6; + break; case f7_8: - return FEC_7_8; + fec = FEC_7_8; + break; default: if (zapit_debug) - printf("no valid fec for DVB-S set.. assume auto\n"); + printf("no valid fec for DVB-%c set.. assume auto\n", (delsys == DVB_S ? 'S' : (delsys == DVB_C ? 'C' : 'T'))); case fAuto: - return FEC_AUTO; + fec = FEC_AUTO; + break; } } else { - switch (fec) { + switch (f) { case f1_2: - return FEC_S2_QPSK_1_2; + fec = FEC_1_2; + break; case f2_3: - return FEC_S2_QPSK_2_3; + fec = FEC_2_3; + break; case f3_4: - return FEC_S2_QPSK_3_4; + fec = FEC_3_4; + break; case f3_5: - return FEC_S2_QPSK_3_5; + fec = FEC_3_5; + break; case f4_5: - return FEC_S2_QPSK_4_5; + fec = FEC_4_5; + break; case f5_6: - return FEC_S2_QPSK_5_6; + fec = FEC_5_6; + break; case f7_8: - return FEC_S2_QPSK_7_8; + fec = FEC_7_8; + break; case f8_9: - return FEC_S2_QPSK_8_9; + fec = FEC_8_9; + break; case f9_10: - return FEC_S2_QPSK_9_10; + fec = FEC_9_10; + break; default: if (zapit_debug) printf("no valid fec for DVB-S2 set.. !!\n"); case fAuto: - return FEC_AUTO; + fec = FEC_AUTO; + break; } } + + return fec; +} + +fe_hierarchy_t CFrontend::getHierarchy(const uint8_t hierarchy) +{ + switch (hierarchy) { + case 0x00: + return HIERARCHY_NONE; + case 0x01: + return HIERARCHY_1; + case 0x02: + return HIERARCHY_2; + case 0x03: + return HIERARCHY_4; + default: + return HIERARCHY_AUTO; + } +} + +fe_rolloff_t CFrontend::getRolloff(const uint8_t rolloff) +{ + switch (rolloff) { + case 0x00: + return ROLLOFF_35; + case 0x01: + return ROLLOFF_25; + case 0x02: + return ROLLOFF_20; + default: + return ROLLOFF_AUTO; + } } fe_modulation_t CFrontend::getModulation(const uint8_t modulation) @@ -386,17 +525,74 @@ fe_modulation_t CFrontend::getModulation(const uint8_t modulation) } } -uint8_t CFrontend::getPolarization(void) const +fe_bandwidth_t CFrontend::getBandwidth(const uint8_t bandwidth) { - return currentTransponder.polarization; + switch (bandwidth) { + case 0x00: + return BANDWIDTH_8_MHZ; + case 0x01: + return BANDWIDTH_7_MHZ; + case 0x02: + return BANDWIDTH_6_MHZ; + case 0x03: + return BANDWIDTH_5_MHZ; + default: + return BANDWIDTH_AUTO; // AUTO + } } -uint32_t CFrontend::getRate() +fe_guard_interval_t CFrontend::getGuardInterval(const uint8_t guard_interval) { - if (info.type == FE_QPSK) - return currentTransponder.feparams.dvb_feparams.u.qpsk.symbol_rate; - else - return currentTransponder.feparams.dvb_feparams.u.qam.symbol_rate; + switch (guard_interval) { + case 0x00: + return GUARD_INTERVAL_1_32; + case 0x01: + return GUARD_INTERVAL_1_16; + case 0x02: + return GUARD_INTERVAL_1_8; + case 0x03: + return GUARD_INTERVAL_1_4; + default: + return GUARD_INTERVAL_AUTO; + } +} + +fe_modulation_t CFrontend::getConstellation(const uint8_t constellation) +{ + switch (constellation) { + case 0x00: + return QPSK; + case 0x01: + return QAM_16; + case 0x02: + return QAM_64; + default: + return QAM_AUTO; + } +} + +fe_transmit_mode_t CFrontend::getTransmissionMode(const uint8_t transmission_mode) +{ + switch (transmission_mode) { + case 0x00: + return TRANSMISSION_MODE_2K; + case 0x01: + return TRANSMISSION_MODE_8K; + case 0x02: + return TRANSMISSION_MODE_4K; + default: + return TRANSMISSION_MODE_AUTO; + } +} + +uint8_t CFrontend::getPolarization(void) const +{ + return currentTransponder.getPolarization(); +} + +uint32_t CFrontend::getRate() const +{ + return currentTransponder.getSymbolRate(); } fe_status_t CFrontend::getStatus(void) const @@ -519,13 +715,79 @@ struct dvb_frontend_event CFrontend::getEvent(void) void CFrontend::getDelSys(int f, int m, char *&fec, char *&sys, char *&mod) { - return getDelSys(info.type, f, m, fec, sys, mod); + return getDelSys(getCurrentDeliverySystem(), f, m, fec, sys, mod); } -void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, char *&mod) +void CFrontend::getXMLDelsysFEC(fe_code_rate_t xmlfec, delivery_system_t & delsys, fe_code_rate_t & fec) { - switch (type) { - case FE_QPSK: + if ((int)xmlfec < FEC_S2_QPSK_1_2) + delsys = DVB_S; + else if ((int)xmlfec < FEC_S2_8PSK_1_2) + delsys = DVB_S2; + else + delsys = DVB_S2; + + switch ((int)xmlfec) { + case FEC_1_2: + case FEC_S2_QPSK_1_2: + case FEC_S2_8PSK_1_2: + fec = FEC_1_2; + break; + case FEC_2_3: + case FEC_S2_QPSK_2_3: + case FEC_S2_8PSK_2_3: + fec = FEC_2_3; + break; + case FEC_3_4: + case FEC_S2_QPSK_3_4: + case FEC_S2_8PSK_3_4: + fec = FEC_3_4; + break; + case FEC_S2_QPSK_3_5: + case FEC_S2_8PSK_3_5: + fec = FEC_3_5; + break; + case FEC_4_5: + case FEC_S2_QPSK_4_5: + case FEC_S2_8PSK_4_5: + fec = FEC_4_5; + break; + case FEC_5_6: + case FEC_S2_QPSK_5_6: + case FEC_S2_8PSK_5_6: + fec = FEC_5_6; + break; + case FEC_6_7: + fec = FEC_6_7; + break; + case FEC_7_8: + case FEC_S2_QPSK_7_8: + case FEC_S2_8PSK_7_8: + fec = FEC_7_8; + break; + case FEC_8_9: + case FEC_S2_QPSK_8_9: + case FEC_S2_8PSK_8_9: + fec = FEC_8_9; + break; + case FEC_S2_QPSK_9_10: + case FEC_S2_8PSK_9_10: + fec = FEC_9_10; + break; + default: + printf("[frontend] getXMLDelsysFEC: unknown FEC: %d !!!\n", xmlfec); + case FEC_S2_AUTO: + case FEC_AUTO: + fec = FEC_AUTO; + break; + } +} + +void CFrontend::getDelSys(delivery_system_t delsys, int f, int m, char *&fec, char *&sys, char *&mod) +{ + switch (delsys) { + case DVB_S: + case DVB_S2: if (f < FEC_S2_QPSK_1_2) { sys = (char *)"DVB"; mod = (char *)"QPSK"; @@ -537,9 +799,28 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch mod = (char *)"8PSK"; } break; - case FE_QAM: - case FE_OFDM: - sys = (char *)"DVB"; + case DVB_C: + case DVB_T: + case DTMB: + switch(delsys) { + case DVB_C: + sys = (char *)"DVB-C(Annex A)"; + break; + case DVB_T: + sys = (char *)"DVB-T"; + break; + case DVB_T2: + sys = (char *)"DVB-T2"; + break; + case DTMB: + sys = (char *)"DTMB"; + break; + default: + printf("[frontend] unknown delsys %d!\n", delsys); + sys = (char *)"UNKNOWN"; + break; + } + switch (m) { case QAM_16: mod = (char *)"QAM_16"; @@ -556,9 +837,12 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch case QAM_256: mod = (char *)"QAM_256"; break; + case QAM_4_NR: + mod = (char *)"QAM_4_NR"; + break; case QPSK: - if (type == FE_OFDM) { - mod = (char *)"QPSK"; + if (delsys == DVB_T || delsys == DVB_T2 || delsys == DTMB) { + mod = (char *)"QPSK"; // AKA QAM_4 break; } /* fallthrouh for FE_QAM... */ @@ -569,7 +853,7 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch } break; default: - printf("[frontend] unknown type %d!\n", type); + printf("[frontend] unknown delsys %d!\n", delsys); sys = (char *)"UNKNOWN"; mod = (char *)"UNKNOWN"; break; @@ -631,38 +915,140 @@ void CFrontend::getDelSys(uint8_t type, int f, int m, char *&fec, char *&sys, ch } } -bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_properties& cmdseq) +fe_delivery_system_t CFrontend::getFEDeliverySystem(delivery_system_t Delsys) { - fe_delivery_system delsys = SYS_DVBS; - fe_modulation_t modulation = QPSK; - fe_rolloff_t rolloff = ROLLOFF_35; - fe_pilot_t pilot = PILOT_OFF; - int fec; - fe_code_rate_t fec_inner; + fe_delivery_system_t delsys; - /* Decode the needed settings */ - switch (info.type) { - case FE_QPSK: - fec_inner = feparams->dvb_feparams.u.qpsk.fec_inner; - delsys = dvbs_get_delsys(fec_inner); - modulation = dvbs_get_modulation(fec_inner); - rolloff = dvbs_get_rolloff(delsys); + switch (Delsys) { + case DVB_S: + delsys = SYS_DVBS; break; - case FE_QAM: - fec_inner = feparams->dvb_feparams.u.qam.fec_inner; - modulation = feparams->dvb_feparams.u.qam.modulation; - delsys = SYS_DVBC_ANNEX_AC; + case DVB_S2: + delsys = SYS_DVBS2; break; - case FE_OFDM: - fec_inner = FEC_AUTO; /* dummy, for next switch statement */ - modulation = feparams->dvb_feparams.u.ofdm.constellation; + case DVB_T: delsys = SYS_DVBT; break; + case DVB_T2: + delsys = SYS_DVBT2; + break; + case DVB_C: + delsys = SYS_DVBC_ANNEX_A; + break; + //case DVB_C2: // not supported yet + // delsys = SYS_DVBC2; + //break; + case ISDBT: + delsys = SYS_ISDBT; + break; + case ISDBC: + delsys = SYS_ISDBC; + break; + case ISDBS: + delsys = SYS_ISDBS; + break; + case DTMB: + delsys = SYS_DTMB; + break; + case DSS: + delsys = SYS_DSS; + break; + case TURBO: + delsys = SYS_TURBO; + break; default: - printf("frontend: unknown frontend type, exiting\n"); - return 0; + delsys = SYS_UNDEFINED; + break; } + return delsys; +} + +delivery_system_t CFrontend::getZapitDeliverySystem(uint32_t delnr) +{ + return (delivery_system_t)ZAPIT_DS_BIT_MASK(delnr); +} + +uint32_t CFrontend::getXMLDeliverySystem(delivery_system_t delsys) +{ + // WARNING: this nr is directly mapped to the bit mask specified in frontend_types.h + uint32_t delnr = 0; + + switch (delsys) { + case DVB_S: + delnr = 0; + break; + case DVB_S2: + delnr = 1; + break; + case DVB_C: + delnr = 2; + break; + //case DVB_C2: // not supported yet + // delnr = SYS_DVBC2; + //break; + case DVB_T: + delnr = 4; + break; + case DVB_T2: + delnr = 5; + break; + case DTMB: + delnr = 6; + break; + case DSS: + delnr = 7; + break; + case TURBO: + delnr = 8; + break; + case ISDBS: + delnr = 9; + break; + case ISDBC: + delnr = 10; + break; + case ISDBT: + delnr = 11; + break; + default: + printf("%s: unknown delivery system (%d)\n", __FUNCTION__, delsys); + delnr = 0; + break; + } + + return delnr; +} + +uint32_t CFrontend::getFEBandwidth(fe_bandwidth_t bandwidth) +{ + uint32_t bandwidth_hz; + + switch (bandwidth) { + case BANDWIDTH_8_MHZ: + default: + bandwidth_hz = 8000000; + break; + case BANDWIDTH_7_MHZ: + bandwidth_hz = 7000000; + break; + case BANDWIDTH_6_MHZ: + bandwidth_hz = 6000000; + break; + case BANDWIDTH_5_MHZ: + bandwidth_hz = 5000000; + break; + } + + return bandwidth_hz; +} + +bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_properties& cmdseq) +{ + fe_pilot_t pilot = PILOT_OFF; + int fec; + fe_code_rate_t fec_inner = feparams->fec_inner; + /* cast to int is ncesessary because many of the FEC_S2 values are not * properly defined in the enum, thus the compiler complains... :-( */ switch ((int)fec_inner) { @@ -675,20 +1061,20 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p case FEC_S2_QPSK_2_3: case FEC_S2_8PSK_2_3: fec = FEC_2_3; - if (modulation == PSK_8) + if (feparams->delsys == DVB_S2 && feparams->modulation == PSK_8) pilot = PILOT_ON; break; case FEC_3_4: case FEC_S2_QPSK_3_4: case FEC_S2_8PSK_3_4: fec = FEC_3_4; - if (modulation == PSK_8) + if (feparams->delsys == DVB_S2 && feparams->modulation == PSK_8) pilot = PILOT_ON; break; case FEC_S2_QPSK_3_5: case FEC_S2_8PSK_3_5: fec = FEC_3_5; - if (modulation == PSK_8) + if (feparams->delsys == DVB_S2 && feparams->modulation == PSK_8) pilot = PILOT_ON; break; case FEC_4_5: @@ -700,7 +1086,7 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p case FEC_S2_QPSK_5_6: case FEC_S2_8PSK_5_6: fec = FEC_5_6; - if (modulation == PSK_8) + if (feparams->delsys == DVB_S2 && feparams->modulation == PSK_8) pilot = PILOT_ON; break; case FEC_6_7: @@ -730,61 +1116,48 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p int nrOfProps = 0; - switch (info.type) { - case FE_QPSK: - if (delsys == SYS_DVBS2) { + switch (feparams->delsys) { + case DVB_S: + case DVB_S2: + if (feparams->delsys == DVB_S2) { nrOfProps = FE_DVBS2_PROPS; memcpy(cmdseq.props, dvbs2_cmdargs, sizeof(dvbs2_cmdargs)); - cmdseq.props[MODULATION].u.data = modulation; - cmdseq.props[ROLLOFF].u.data = rolloff; + cmdseq.props[MODULATION].u.data = dvbs_get_modulation(feparams->fec_inner); + cmdseq.props[ROLLOFF].u.data = feparams->rolloff; cmdseq.props[PILOTS].u.data = pilot; } else { memcpy(cmdseq.props, dvbs_cmdargs, sizeof(dvbs_cmdargs)); nrOfProps = FE_DVBS_PROPS; } - cmdseq.props[FREQUENCY].u.data = feparams->dvb_feparams.frequency; - cmdseq.props[SYMBOL_RATE].u.data= feparams->dvb_feparams.u.qpsk.symbol_rate; + cmdseq.props[FREQUENCY].u.data = feparams->frequency; + cmdseq.props[SYMBOL_RATE].u.data= feparams->symbol_rate; cmdseq.props[INNER_FEC].u.data = fec; /*_inner*/ ; break; - case FE_QAM: + case DVB_C: memcpy(cmdseq.props, dvbc_cmdargs, sizeof(dvbc_cmdargs)); - cmdseq.props[FREQUENCY].u.data = feparams->dvb_feparams.frequency; - cmdseq.props[MODULATION].u.data = modulation; - cmdseq.props[SYMBOL_RATE].u.data= feparams->dvb_feparams.u.qam.symbol_rate; + cmdseq.props[FREQUENCY].u.data = feparams->frequency; + cmdseq.props[MODULATION].u.data = feparams->modulation; + cmdseq.props[SYMBOL_RATE].u.data= feparams->symbol_rate; cmdseq.props[INNER_FEC].u.data = fec_inner; nrOfProps = FE_DVBC_PROPS; break; - case FE_OFDM: + case DVB_T: + case DVB_T2: + case DTMB: 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; - } + cmdseq.props[FREQUENCY].u.data = feparams->frequency; + cmdseq.props[MODULATION].u.data = feparams->modulation; + cmdseq.props[INVERSION].u.data = feparams->inversion; + cmdseq.props[CODE_RATE_HP].u.data = feparams->code_rate_HP; + cmdseq.props[CODE_RATE_LP].u.data = feparams->code_rate_LP; + cmdseq.props[TRANSMISSION_MODE].u.data = feparams->transmission_mode; + cmdseq.props[GUARD_INTERVAL].u.data = feparams->guard_interval; + cmdseq.props[HIERARCHY].u.data = feparams->hierarchy; + cmdseq.props[DELIVERY_SYSTEM].u.data = getFEDeliverySystem(feparams->delsys); + cmdseq.props[BANDWIDTH].u.data = getFEBandwidth(feparams->bandwidth); break; default: printf("frontend: unknown frontend type, exiting\n"); @@ -793,7 +1166,7 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p if (config.diseqcType == DISEQC_UNICABLE) - cmdseq.props[FREQUENCY].u.data = sendEN50494TuningCommand(feparams->dvb_feparams.frequency, + cmdseq.props[FREQUENCY].u.data = sendEN50494TuningCommand(feparams->frequency, currentToneMode == SEC_TONE_ON, currentVoltage == SEC_VOLTAGE_18, !!config.uni_lnb); @@ -1044,7 +1417,7 @@ bool CFrontend::setInput(CZapitChannel * channel, bool nvod) { transponder_list_t::iterator tpI; transponder_id_t ct = nvod ? (channel->getTransponderId() & 0xFFFFFFFFULL) : channel->getTransponderId(); - transponder_id_t current_id = nvod ? (currentTransponder.TP_id & 0xFFFFFFFFULL) : currentTransponder.TP_id; + transponder_id_t current_id = nvod ? (currentTransponder.getTransponderId() & 0xFFFFFFFFULL) : currentTransponder.getTransponderId(); //printf("CFrontend::setInput tuned %d nvod %d current_id %llx new %llx\n\n", tuned, nvod, current_id, ct); if (tuned && (ct == current_id)) @@ -1063,11 +1436,10 @@ bool CFrontend::setInput(CZapitChannel * channel, bool nvod) return false; } - currentTransponder.TP_id = tpI->first; - currentTransponder.polarization = tpI->second.polarization; + currentTransponder.setTransponderId(tpI->first); currentSatellitePosition = channel->getSatellitePosition(); - setInput(channel->getSatellitePosition(), tpI->second.feparams.dvb_feparams.frequency, tpI->second.polarization); + setInput(channel->getSatellitePosition(), tpI->second.getFrequency(), tpI->second.getPolarization()); return true; } @@ -1093,7 +1465,7 @@ void CFrontend::setInput(t_satellite_position satellitePosition, uint32_t freque sendUncommittedSwitchesCommand(sit->second.uncommited); } else { if (sendUncommittedSwitchesCommand(sit->second.uncommited)) - currentTransponder.diseqc = -1; + currentDiseqc = -1; setDiseqcSimple(sit->second.commited, polarization, frequency); } } @@ -1127,53 +1499,62 @@ uint32_t CFrontend::sendEN50494TuningCommand(const uint32_t frequency, const int } return ret; } + WARN("ooops. t > 1024? (%d) or uni_scr out of range? (%d)", t, config.uni_scr); return 0; } bool CFrontend::tuneChannel(CZapitChannel * /*channel*/, bool /*nvod*/) { - transponder_list_t::iterator transponder = transponders.find(currentTransponder.TP_id); + transponder_list_t::iterator transponder = transponders.find(currentTransponder.getTransponderId()); if (transponder == transponders.end()) return false; - return tuneFrequency(&transponder->second.feparams, transponder->second.polarization, false); + return tuneFrequency(&transponder->second.feparams, false); } + #if 0 bool CFrontend::retuneChannel(void) { mutex.lock(); - setInput(currentSatellitePosition, currentTransponder.feparams.dvb_feparams.frequency, currentTransponder.polarization); + setInput(currentSatellitePosition, currentTransponder.feparams.frequency, currentTransponder.feparams.polarization); transponder_list_t::iterator transponder = transponders.find(currentTransponder.TP_id); if (transponder == transponders.end()) return false; mutex.unlock(); - return tuneFrequency(&transponder->second.feparams, transponder->second.polarization, true); + return tuneFrequency(&transponder->second.feparams, transponder->second.feparams.polarization, true); } #endif -int CFrontend::tuneFrequency(FrontendParameters * feparams, uint8_t polarization, bool nowait) + +int CFrontend::tuneFrequency(FrontendParameters *feparams, bool nowait) { - TP_params TP; + transponder TP; - memmove(¤tTransponder.feparams, feparams, sizeof(struct dvb_frontend_parameters)); - memmove(&TP.feparams, feparams, sizeof(struct dvb_frontend_parameters)); + currentTransponder.feparams = TP.feparams = *feparams; - TP.polarization = polarization; return setParameters(&TP, nowait); } -int CFrontend::setParameters(TP_params *TP, bool nowait) +int CFrontend::setParameters(transponder *TP, bool nowait) { int freq_offset = 0, freq; FrontendParameters feparams; /* Copy the data for local use */ - memcpy(&feparams, &TP->feparams, sizeof(feparams)); - freq = (int) feparams.dvb_feparams.frequency; + feparams = TP->feparams; + + if (!supportsDelivery(feparams.delsys)) { + printf("[fe%d]: does not support delivery system %d\n", fenumber, feparams.delsys); + return 0; + } + + + freq = (int) feparams.frequency; char * f, *s, *m; bool high_band; - switch (info.type) { - case FE_QPSK: + switch (feparams.delsys) { + case DVB_S: + case DVB_S2: if (freq < lnbSwitch) { high_band = false; freq_offset = lnbOffsetLow; @@ -1182,38 +1563,29 @@ int CFrontend::setParameters(TP_params *TP, bool nowait) freq_offset = lnbOffsetHigh; } - 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); + feparams.frequency = abs(freq - freq_offset); + setSec(TP->feparams.polarization, high_band); + getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m); break; - case FE_QAM: + case DVB_C: 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); -#if 0 - switch (TP->feparams.dvb_feparams.inversion) { - case INVERSION_OFF: - TP->feparams.dvb_feparams.inversion = INVERSION_ON; - break; - case INVERSION_ON: - default: - TP->feparams.dvb_feparams.inversion = INVERSION_OFF; - break; - } -#endif + feparams.frequency = freq * 1000; + getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m); break; - case FE_OFDM: + case DVB_T: + case DVB_T2: + case DTMB: 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); + feparams.frequency = freq * 1000; + getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m); break; default: - printf("[fe%d] unknown type %d\n", fenumber, info.type); + printf("[fe%d] unknown delsys %d\n", fenumber, feparams.delsys); break; } printf("[fe%d] tune to %d %s %s %s %s srate %d (tuner %d offset %d timeout %d)\n", fenumber, freq, s, m, f, - TP->polarization & 1 ? "V/R" : "H/L", feparams.dvb_feparams.u.qpsk.symbol_rate, feparams.dvb_feparams.frequency, freq_offset, TIMEOUT_MAX_MS); + feparams.polarization & 1 ? "V/R" : "H/L", feparams.symbol_rate, feparams.frequency, freq_offset, TIMEOUT_MAX_MS); setFrontend(&feparams, nowait); return tuned; @@ -1248,8 +1620,8 @@ bool CFrontend::setDiseqcSimple(int sat_no, const uint8_t pol, const uint32_t fr {0xe0, 0x10, 0x38, 0x00, 0x00, 0x00}, 4 }; - INFO("[fe%d] diseqc input %d -> %d", fenumber, currentTransponder.diseqc, sat_no); - currentTransponder.diseqc = sat_no; + INFO("[fe%d] diseqc input %d -> %d", fenumber, currentDiseqc, sat_no); + currentDiseqc = sat_no; if (slave) return true; if ((sat_no >= 0) /* && (diseqc != sat_no)*/) { @@ -1267,7 +1639,7 @@ bool CFrontend::setDiseqcSimple(int sat_no, const uint8_t pol, const uint32_t fr if (config.diseqcType == MINI_DISEQC) sendToneBurst(b, 15); - currentTransponder.diseqc = sat_no; + currentDiseqc = sat_no; #endif } @@ -1282,8 +1654,8 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc if ((config.diseqcType == NO_DISEQC) || sat_no < 0) return; - printf("[fe%d] diseqc input %d -> %d\n", fenumber, currentTransponder.diseqc, sat_no); - currentTransponder.diseqc = sat_no; + printf("[fe%d] diseqc input %d -> %d\n", fenumber, currentDiseqc, sat_no); + currentDiseqc = sat_no; if (slave) return; @@ -1347,12 +1719,11 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc usleep(25 * 1000); } -void CFrontend::setSec(const uint8_t /*sat_no*/, const uint8_t pol, const bool high_band) +void CFrontend::setSec(const uint8_t pol, const bool high_band) { fe_sec_voltage_t v = (pol & 1) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18; fe_sec_tone_mode_t t = high_band ? SEC_TONE_ON : SEC_TONE_OFF; - currentTransponder.polarization = pol; // set tone off first secSetTone(SEC_TONE_OFF, 20); // set the desired voltage @@ -1719,3 +2090,63 @@ void CFrontend::gotoXX(t_satellite_position pos) //secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15); //FIXME ? } +bool CFrontend::isCable(delivery_system_t delsys) +{ + return ZAPIT_DS_IS_CABLE(delsys); +} + +bool CFrontend::isSat(delivery_system_t delsys) +{ + return ZAPIT_DS_IS_SAT(delsys); +} + +bool CFrontend::isTerr(delivery_system_t delsys) +{ + return ZAPIT_DS_IS_TERR(delsys); +} + +bool CFrontend::hasCable(void) +{ + return ZAPIT_DS_IS_CABLE(deliverySystemMask); +} + +bool CFrontend::hasSat(void) +{ + return ZAPIT_DS_IS_SAT(deliverySystemMask); +} + +bool CFrontend::hasTerr(void) +{ + return ZAPIT_DS_IS_TERR(deliverySystemMask); +} + +bool CFrontend::isHybrid(void) +{ + if (hasSat() && hasCable()) + return true; + if (hasSat() && hasTerr()) + return true; + if (hasCable() && hasTerr()) + return true; + + return false; +} + +bool CFrontend::supportsDelivery(delivery_system_t delsys) +{ + return (deliverySystemMask & delsys) != 0; +} + +delivery_system_t CFrontend::getCurrentDeliverySystem(void) +{ + // FIXME: this should come from demod information + //if (tuned) + return currentTransponder.feparams.delsys; + //else + // return UNKNOWN_DS; +} + +uint32_t CFrontend::getSupportedDeliverySystems(void) const +{ + return deliverySystemMask; +} diff --git a/src/zapit/src/getservices.cpp b/src/zapit/src/getservices.cpp index 30c4a2047..4e4cdf72a 100644 --- a/src/zapit/src/getservices.cpp +++ b/src/zapit/src/getservices.cpp @@ -4,6 +4,7 @@ * (C) 2002, 2003 by Andreas Oberritter * * (C) 2007-2009, 2013 Stefan Seyfried + * (C) 2014 CoolStream International Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -59,27 +60,24 @@ CServiceManager * CServiceManager::getInstance() return manager; } -bool CServiceManager::ParseScanXml(fe_type_t delsys) +bool CServiceManager::ParseScanXml(delivery_system_t delsys) { if(scanInputParser) { delete scanInputParser; scanInputParser = NULL; } - //frontendType = CFEManager::getInstance()->getLiveFE()->getInfo()->type; - switch (delsys) { - 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; + + if (CFrontend::isSat(delsys)) + scanInputParser = parseXmlFile(SATELLITES_XML); + else if (CFrontend::isCable(delsys)) + scanInputParser = parseXmlFile(CABLES_XML); + else if (CFrontend::isTerr(delsys)) + scanInputParser = parseXmlFile(TERRESTRIAL_XML); + else { + WARN("Unknown delivery system %d", delsys); + return false; } + return (scanInputParser != NULL); } #if 0 @@ -253,7 +251,7 @@ CZapitChannel* CServiceManager::FindChannelFuzzy(const t_channel_id channel_id, * to choose from and people are wondering why their ubouquets are no longer * working => because they had the wrong 's="x"' attribute. * TODO: think about mixed-mode (sat/cable/terrestrial) operation */ - if (ret->deltype == FE_QPSK && pos != ret->getSatellitePosition()) + if (CFrontend::isSat(ret->delsys) && pos != ret->getSatellitePosition()) continue; /* match +-2MHz to make old ubouquets work with updated satellites.xml */ if (abs((int)ret->getFreqId() - (int)freq) < 3) @@ -333,47 +331,78 @@ std::string CServiceManager::GetServiceName(t_channel_id channel_id) return ""; } -void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, fe_type_t delsys) +void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, delivery_system_t delsys) { - uint8_t polarization = 0; - /* read all transponders */ while ((node = xmlGetNextOccurence(node, "TS")) != NULL) { FrontendParameters feparams; + memset(&feparams, 0, sizeof(feparams)); + t_transport_stream_id transport_stream_id = xmlGetNumericAttribute(node, "id", 16); t_original_network_id original_network_id = xmlGetNumericAttribute(node, "on", 16); - feparams.dvb_feparams.frequency = xmlGetNumericAttribute(node, "frq", 0); - feparams.dvb_feparams.inversion = (fe_spectral_inversion) xmlGetNumericAttribute(node, "inv", 0); + feparams.frequency = xmlGetNumericAttribute(node, "frq", 0); + feparams.inversion = (fe_spectral_inversion) xmlGetNumericAttribute(node, "inv", 0); - switch (delsys) { - case FE_OFDM: - 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); + const char *system = xmlGetAttribute(node, "sys"); + if (system) { + feparams.delsys = (delivery_system_t)CFrontend::getZapitDeliverySystem(xmlGetNumericAttribute(node, "sys", 0)); + if (CFrontend::isSat(delsys)) + feparams.fec_inner = (fe_code_rate_t)xmlGetNumericAttribute(node, "fec", 0); + } else { + if (CFrontend::isSat(delsys) || CFrontend::isCable(delsys)) { + fe_code_rate_t fec = (fe_code_rate_t)xmlGetNumericAttribute(node, "fec", 0); - if (feparams.dvb_feparams.frequency > 1000*1000) - feparams.dvb_feparams.frequency = feparams.dvb_feparams.frequency/1000; //transponderlist was read from tuxbox - 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); - - polarization = xmlGetNumericAttribute(node, "pol", 0); - - if(feparams.dvb_feparams.u.qpsk.symbol_rate < 50000) - feparams.dvb_feparams.u.qpsk.symbol_rate = feparams.dvb_feparams.u.qpsk.symbol_rate * 1000; - - if(feparams.dvb_feparams.frequency < 20000) - feparams.dvb_feparams.frequency = feparams.dvb_feparams.frequency*1000; - else - feparams.dvb_feparams.frequency = (int) 1000 * (int) round ((double) feparams.dvb_feparams.frequency / (double) 1000); + if (CFrontend::isSat(delsys)) // translate old fec enum to new. + CFrontend::getXMLDelsysFEC(fec, feparams.delsys, feparams.fec_inner); + else if (CFrontend::isCable(delsys)) + feparams.delsys = DVB_C; + + } else if (CFrontend::isTerr(delsys)) { + feparams.delsys = DVB_T; + } } - freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, delsys != FE_QPSK); + + if (CFrontend::isSat(delsys)) { + feparams.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); + feparams.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "mod", 0); + + if (feparams.frequency > 1000*1000) + feparams.frequency = feparams.frequency/1000; //transponderlist was read from tuxbox + } + else if (CFrontend::isTerr(delsys)) { + // + + feparams.bandwidth = (fe_bandwidth_t) xmlGetNumericAttribute(node, "bw", 0); + feparams.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "con", 0); + feparams.transmission_mode = (fe_transmit_mode_t) xmlGetNumericAttribute(node, "tm", 0); + feparams.code_rate_HP = (fe_code_rate_t) xmlGetNumericAttribute(node, "hp", 0); + feparams.code_rate_LP = (fe_code_rate_t) xmlGetNumericAttribute(node, "lp", 0); + feparams.guard_interval = (fe_guard_interval_t) xmlGetNumericAttribute(node, "gi", 0); + feparams.hierarchy = (fe_hierarchy_t) xmlGetNumericAttribute(node, "hi", 0); + + if (feparams.frequency > 1000*1000) + feparams.frequency = feparams.frequency/1000; //transponderlist was read from tuxbox + } + else if (CFrontend::isCable(delsys)) { + feparams.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0); + feparams.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); + feparams.polarization = xmlGetNumericAttribute(node, "pol", 0); + feparams.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "mod", 0); + + if(feparams.symbol_rate < 50000) + feparams.symbol_rate = feparams.symbol_rate * 1000; + + if(feparams.frequency < 20000) + feparams.frequency = feparams.frequency*1000; + else + feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); + } + + freq_id_t freq = CREATE_FREQ_ID(feparams.frequency, !CFrontend::isSat(delsys)); transponder_id_t tid = CREATE_TRANSPONDER_ID64(freq, satellitePosition,original_network_id,transport_stream_id); - transponder t(delsys, tid, feparams, polarization); + transponder t(tid, feparams); pair::iterator,bool> ret; ret = transponders.insert(transponder_pair_t(tid, t)); @@ -381,7 +410,7 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa t.dump("[zapit] duplicate in all transponders:"); /* read channels that belong to the current transponder */ - ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq, polarization, delsys); + ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq, feparams.polarization, delsys); /* hop to next transponder */ node = node->xmlNextNode; @@ -390,7 +419,7 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa return; } -void CServiceManager::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, fe_type_t delsys) +void CServiceManager::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, delivery_system_t delsys) { int dummy = 0; int * have_ptr = &dummy; @@ -439,7 +468,8 @@ void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id CZapitChannel * channel = new CZapitChannel(name, chid, service_type, satellitePosition, freq); - channel->deltype = delsys; + + channel->delsys = delsys; service_number_map_t * channel_numbers = (service_type == ST_DIGITAL_RADIO_SOUND_SERVICE) ? &radio_numbers : &tv_numbers; @@ -489,21 +519,27 @@ void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id void CServiceManager::FindTransponder(xmlNodePtr search) { - while (search) { - fe_type_t delsys = FE_QPSK; + delivery_system_t delsys; - t_satellite_position satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10); - if (!(strcmp(xmlGetName(search), "cable"))) { - delsys = FE_QAM; - char * name = xmlGetAttribute(search, "name"); + while (search) { + t_satellite_position satellitePosition; + std::string delivery_name = xmlGetName(search); + + if (delivery_name == "cable") { + char *name = xmlGetAttribute(search, "name"); satellitePosition = GetSatellitePosition(name); + delsys = ALL_CABLE; } - else if (!strcmp(xmlGetName(search), "terrestrial")) { - delsys = FE_OFDM; - char * name = xmlGetAttribute(search, "name"); + else if (delivery_name == "terrestrial") { + char *name = xmlGetAttribute(search, "name"); satellitePosition = GetSatellitePosition(name); + delsys = ALL_TERR; } - else if ((strcmp(xmlGetName(search), "sat"))) { + else if (delivery_name == "sat") { + satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10); + delsys = ALL_SAT; + } + else { search = search->xmlNextNode; continue; } @@ -519,9 +555,8 @@ void CServiceManager::FindTransponder(xmlNodePtr search) } } -void CServiceManager::ParseSatTransponders(fe_type_t fType, xmlNodePtr search, t_satellite_position satellitePosition) +void CServiceManager::ParseSatTransponders(delivery_system_t delsys, xmlNodePtr search, t_satellite_position satellitePosition) { - uint8_t polarization = 0; FrontendParameters feparams; fake_tid = fake_nid = 0; @@ -532,54 +567,146 @@ void CServiceManager::ParseSatTransponders(fe_type_t fType, xmlNodePtr search, t while ((tps = xmlGetNextOccurence(tps, "transponder")) != NULL) { memset(&feparams, 0x00, sizeof(FrontendParameters)); - feparams.dvb_feparams.frequency = xmlGetNumericAttribute(tps, "frequency", 0); - feparams.dvb_feparams.inversion = INVERSION_AUTO; + feparams.frequency = xmlGetNumericAttribute(tps, "frequency", 0); + feparams.inversion = INVERSION_AUTO; - if (fType == FE_QAM) { - feparams.dvb_feparams.u.qam.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); - feparams.dvb_feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(tps, "fec_inner", 0); - feparams.dvb_feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(tps, "modulation", 0); - if (feparams.dvb_feparams.frequency > 1000*1000) - feparams.dvb_feparams.frequency=feparams.dvb_feparams.frequency/1000; //transponderlist was read from tuxbox + if (CFrontend::isCable(delsys)) { + const char *system = xmlGetAttribute(tps, "system"); + if (system) { + uint32_t s = xmlGetNumericAttribute(tps, "system", 0); + switch (s) { + case 0: + default: + feparams.delsys = DVB_C; + break; + case 1: + feparams.delsys = ISDBC; + break; + // TODO: add more possible cable systems.. + } + } else { + // Set some sane defaults. + feparams.delsys = DVB_C; + } + + feparams.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); + feparams.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(tps, "fec_inner", 0); + feparams.modulation = (fe_modulation_t) xmlGetNumericAttribute(tps, "modulation", 0); + if (feparams.frequency > 1000*1000) + feparams.frequency=feparams.frequency/1000; //transponderlist was read from tuxbox } - else if (fType == FE_QPSK) { - feparams.dvb_feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); - polarization = xmlGetNumericAttribute(tps, "polarization", 0); - uint8_t system = xmlGetNumericAttribute(tps, "system", 0); + else if (CFrontend::isSat(delsys)) { + const char *system = xmlGetAttribute(tps, "system"); + const char *rolloff = xmlGetAttribute(tps, "rolloff"); + + if (system) { + uint32_t s = xmlGetNumericAttribute(tps, "system", 0); + switch (s) { + case 0: + default: + feparams.delsys = DVB_S; + feparams.rolloff = ROLLOFF_35; + break; + case 1: + feparams.delsys = DVB_S2; + if (rolloff) + feparams.rolloff = (fe_rolloff_t)xmlGetNumericAttribute(tps, "rolloff", 0); + else + feparams.rolloff = ROLLOFF_25; + break; + case 2: + feparams.delsys = DSS; + break; + case 3: + feparams.delsys = TURBO; + break; + case 4: + feparams.delsys = ISDBS; + break; + // TODO: add more possible sat systems.. + } + } else { + // Set some sane defaults. + feparams.delsys = DVB_S; + feparams.rolloff = ROLLOFF_35; + } + + feparams.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); + feparams.polarization = xmlGetNumericAttribute(tps, "polarization", 0); + uint8_t modulation = xmlGetNumericAttribute(tps, "modulation", 0); + switch (modulation) { + case 0: // AUTO + feparams.modulation = QAM_AUTO; + break; + case 1: // QPSK + feparams.modulation = QPSK; + break; + case 2: // 8PSK + feparams.modulation = PSK_8; + break; + default: + feparams.modulation = QAM_AUTO; + fprintf(stderr, "[getservices] %s: unknown modulation %d!\n", __func__, modulation); + break; + } + int xml_fec = xmlGetNumericAttribute(tps, "fec_inner", 0); - xml_fec = CFrontend::getCodeRate(xml_fec, system); + xml_fec = CFrontend::getCodeRate(xml_fec, feparams.delsys); if(modulation == 2 && ((fe_code_rate_t) xml_fec != FEC_AUTO)) xml_fec += 9; - 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); + feparams.fec_inner = (fe_code_rate_t) xml_fec; + feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); } - 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) + else if (CFrontend::isTerr(delsys)) { + const char *system = xmlGetAttribute(tps, "system"); + if (system) { + uint32_t s = xmlGetNumericAttribute(tps, "system", 0); + switch (s) { + case 0: + default: + feparams.delsys = DVB_T; + break; + case 1: + feparams.delsys = DVB_T2; + break; + case 2: + feparams.delsys = DTMB; + break; + case 3: + feparams.delsys = ISDBT; + break; + // TODO: add more possible terrestrial systems.. + } + } else { + // Set some sane defaults. + feparams.delsys = DVB_T; + } + + feparams.bandwidth = (fe_bandwidth_t) xmlGetNumericAttribute(tps, "bandwidth", 0); + feparams.modulation = (fe_modulation_t) xmlGetNumericAttribute(tps, "constellation", 0); - feparams.dvb_feparams.u.ofdm.transmission_mode = (fe_transmit_mode_t) + feparams.transmission_mode = (fe_transmit_mode_t) xmlGetNumericAttribute(tps, "transmission_mode", 0); - feparams.dvb_feparams.u.ofdm.code_rate_HP = (fe_code_rate_t) + feparams.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) + feparams.code_rate_LP = (fe_code_rate_t) xmlGetNumericAttribute(tps, "code_rate_LP", 0); - feparams.dvb_feparams.u.ofdm.guard_interval = (fe_guard_interval_t) + feparams.guard_interval = (fe_guard_interval_t) xmlGetNumericAttribute(tps, "guard_interval", 0); - feparams.dvb_feparams.u.ofdm.hierarchy_information = (fe_hierarchy_t) + feparams.hierarchy = (fe_hierarchy_t) xmlGetNumericAttribute(tps, "hierarchy", 0); - if (feparams.dvb_feparams.frequency > 1000*1000) - feparams.dvb_feparams.frequency /= 1000; // old transponder list + if (feparams.frequency > 1000*1000) + 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); + fprintf(stderr, "[getservices] %s: unknown delivery system %d!\n", __func__, delsys); - freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, fType != FE_QPSK); - polarization &= 7; + freq_id_t freq = CREATE_FREQ_ID(feparams.frequency, !CFrontend::isSat(delsys)); + feparams.polarization &= 7; transponder_id_t tid = CREATE_TRANSPONDER_ID64(freq, satellitePosition, fake_nid, fake_tid); - transponder t(fType, tid, feparams, polarization); + transponder t(tid, feparams); satelliteTransponders[satellitePosition].insert(transponder_pair_t(tid, t)); fake_nid ++; fake_tid ++; @@ -650,7 +777,8 @@ void CServiceManager::SaveMotorPositions() fclose(fd); } #endif -bool CServiceManager::InitSatPosition(t_satellite_position position, char * name, bool force, int deltype) + +bool CServiceManager::InitSatPosition(t_satellite_position position, char * name, bool force, delivery_system_t delsys, uint16_t nid) { if(force || (satellitePositions.find(position) == satellitePositions.end())) { satellitePositions[position].position = position; @@ -666,8 +794,8 @@ bool CServiceManager::InitSatPosition(t_satellite_position position, char * name satellitePositions[position].use_usals = 0; satellitePositions[position].input = 0; satellitePositions[position].configured = 0; - satellitePositions[position].cable_nid = 0; - satellitePositions[position].deltype = deltype; + satellitePositions[position].cable_nid = nid; + satellitePositions[position].delsys = delsys; if(name) satellitePositions[position].name = name; return true; @@ -675,7 +803,7 @@ bool CServiceManager::InitSatPosition(t_satellite_position position, char * name return false; } -bool CServiceManager::LoadScanXml(fe_type_t delsys) +bool CServiceManager::LoadScanXml(delivery_system_t delsys) { if (ParseScanXml(delsys)) { /* fake position for non-satellite */ @@ -683,21 +811,23 @@ bool CServiceManager::LoadScanXml(fe_type_t delsys) xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; while (search) { - if (!(strcmp(xmlGetName(search), "sat"))) { + std::string delivery_name = xmlGetName(search); + if (delivery_name == "sat") { position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); - InitSatPosition(position, name, false, delsys); - } else if (!(strcmp(xmlGetName(search), "terrestrial"))) { + InitSatPosition(position, name, false, ALL_SAT); + } else if (delivery_name == "terrestrial") { char * name = xmlGetAttribute(search, "name"); position = fake_pos++; position &= 0x0EFF; - InitSatPosition(position, name, false, delsys); - } else if(!(strcmp(xmlGetName(search), "cable"))) { + InitSatPosition(position, name, false, ALL_TERR); + } else if(delivery_name == "cable") { char * name = xmlGetAttribute(search, "name"); position = fake_pos++; - InitSatPosition(position, name, false, delsys); - satellitePositions[position].cable_nid = xmlGetNumericAttribute(search, "nid", 0); + InitSatPosition(position, name, false, ALL_CABLE, xmlGetNumericAttribute(search, "nid", 0)); + } else { } + ParseSatTransponders(delsys, search, position); search = search->xmlNextNode; } @@ -742,15 +872,17 @@ bool CServiceManager::LoadServices(bool only_current) if (CFEManager::getInstance()->haveSat()) { INFO("Loading satellites..."); - LoadScanXml(FE_QPSK); + LoadScanXml(ALL_SAT); } + if (CFEManager::getInstance()->haveCable()) { INFO("Loading cables..."); - LoadScanXml(FE_QAM); + LoadScanXml(ALL_CABLE); } + if (CFEManager::getInstance()->haveTerr()) { INFO("Loading terrestrial..."); - LoadScanXml(FE_OFDM); + LoadScanXml(ALL_TERR); } parser = parseXmlFile(SERVICES_XML); @@ -759,19 +891,21 @@ bool CServiceManager::LoadServices(bool only_current) while (search) { char * name = xmlGetAttribute(search, "name"); t_satellite_position position; - if (!(strcmp(xmlGetName(search), "sat"))) { + std::string delivery_name = xmlGetName(search); + if (delivery_name == "sat") { position = xmlGetSignedNumericAttribute(search, "position", 10); - InitSatPosition(position, name, false, FE_QPSK); - } else if (!(strcmp(xmlGetName(search), "terrestrial"))) { + InitSatPosition(position, name, false, ALL_SAT); + } else if (delivery_name == "terrestrial") { position = GetSatellitePosition(name); if (!position) position = (0x0EFF & fake_pos++); - InitSatPosition(position, name, false, FE_OFDM); - } else { + InitSatPosition(position, name, false, ALL_TERR); + } else if (delivery_name == "cable") { position = GetSatellitePosition(name); if (!position) position = fake_pos++; - InitSatPosition(position, name, false, FE_QAM); + InitSatPosition(position, name, false, ALL_CABLE); + } else { } search = search->xmlNextNode; @@ -838,30 +972,28 @@ void CServiceManager::CopyFile(char * from, char * to) void CServiceManager::WriteSatHeader(FILE * fd, sat_config_t &config) { + std::string delivery_name; /* FIXME hack */ - if (SAT_POSITION_CABLE(config.position)) - config.deltype = FE_QAM; - else if (SAT_POSITION_TERR(config.position)) - config.deltype = FE_OFDM; - - switch (config.deltype) { - case FE_QPSK: /* satellite */ - fprintf(fd, "\t\n", - config.name.c_str(), config.position, config.diseqc, config.uncommited); - break; - case FE_QAM: /* cable */ - fprintf(fd, "\t\n", config.name.c_str(), config.position); - break; - case FE_OFDM: /* terrestrial */ - fprintf(fd, "\t\n", config.name.c_str(), config.position); - break; - default: - break; + if (SAT_POSITION_CABLE(config.position)) { + config.delsys = ALL_CABLE; + delivery_name = "cable"; + } else if (SAT_POSITION_TERR(config.position)) { + config.delsys = ALL_TERR; + delivery_name = "terrestrial"; } + + if (CFrontend::isSat(config.delsys)) + fprintf(fd, "\t\n", + config.name.c_str(), config.position, config.diseqc, config.uncommited); + else + fprintf(fd, "\t<%s name=\"%s\" position=\"%hd\">\n", + delivery_name.c_str(), + config.name.c_str(), config.position); } void CServiceManager::SaveServices(bool tocopy, bool if_changed, bool no_deleted) { + std::string delivery_name; int processed = 0; if(if_changed && !services_changed) @@ -876,9 +1008,9 @@ void CServiceManager::SaveServices(bool tocopy, bool if_changed, bool no_deleted perror(SERVICES_TMP); return; } - fprintf(fd, "\n\n"); + fprintf(fd, "\n\n"); for (sat_iterator_t spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); ++spos_it) { - bool satdone = 0; + bool satdone = false; #ifdef SAVE_DEBUG printf("Process sat: %s\n", spos_it->second.name.c_str()); printf("processed channels: %d\n", chans_processed.size()); @@ -916,20 +1048,16 @@ void CServiceManager::SaveServices(bool tocopy, bool if_changed, bool no_deleted } if(tpdone) fprintf(fd, "\t\t\n"); } + if(satdone) { - switch (spos_it->second.deltype) { - case FE_QPSK: - fprintf(fd, "\t\n"); - break; - case FE_QAM: - fprintf(fd, "\t\n"); - break; - case FE_OFDM: - fprintf(fd, "\t\n"); - break; - default: - break; - } + if (CFrontend::isSat(spos_it->second.delsys)) + delivery_name = "sat"; + else if (CFrontend::isTerr(spos_it->second.delsys)) + delivery_name = "terrestrial"; + else if (CFrontend::isCable(spos_it->second.delsys)) + delivery_name = "cable"; + + fprintf(fd, "\t\n", delivery_name.c_str()); } } fprintf(fd, "\n"); @@ -1041,22 +1169,19 @@ bool CServiceManager::SaveCurrentServices(transponder_id_t tpid) } const char * footer = ""; - switch (tI->second.deltype) { - case FE_QPSK: /* satellite */ - sprintf(satstr, "\t<%s name=\"%s\" position=\"%hd\">\n", "sat", spos_it->second.name.c_str(), satellitePosition); - footer = ""; - break; - case FE_QAM: /* cable */ - sprintf(satstr, "\t<%s name=\"%s\"\n", "cable", spos_it->second.name.c_str()); - footer = ""; - break; - case FE_OFDM: - sprintf(satstr, "\t<%s name=\"%s\"\n", "terrestrial", spos_it->second.name.c_str()); - footer = ""; - break; - default: - break; + if (CFrontend::isSat(tI->second.feparams.delsys)) { + sprintf(satstr, "\t<%s name=\"%s\" position=\"%hd\">\n", "sat", spos_it->second.name.c_str(), satellitePosition); + footer = ""; } + else if (CFrontend::isCable(tI->second.feparams.delsys)) { + sprintf(satstr, "\t<%s name=\"%s\"\n", "cable", spos_it->second.name.c_str()); + footer = ""; + } + else if (CFrontend::isTerr(tI->second.feparams.delsys)) { + sprintf(satstr, "\t<%s name=\"%s\"\n", "terrestrial", spos_it->second.name.c_str()); + footer = ""; + } + fd1 = fopen(CURRENTSERVICES_XML, "r"); if(!fd1) { fprintf(fd, "\n\n"); diff --git a/src/zapit/src/scan.cpp b/src/zapit/src/scan.cpp index d94cd08eb..1a3b2423e 100644 --- a/src/zapit/src/scan.cpp +++ b/src/zapit/src/scan.cpp @@ -135,9 +135,9 @@ void CServiceScan::CleanAllMaps() service_types.clear(); } -bool CServiceScan::tuneFrequency(FrontendParameters *feparams, uint8_t polarization, t_satellite_position satellitePosition) +bool CServiceScan::tuneFrequency(FrontendParameters *feparams, t_satellite_position satellitePosition) { - frontend->setInput(satellitePosition, feparams->dvb_feparams.frequency, polarization); + frontend->setInput(satellitePosition, feparams->frequency, feparams->polarization); int ret = frontend->driveToSatellitePosition(satellitePosition, false); //true); if(ret > 0) { printf("[scan] waiting %d seconds for motor to turn satellite dish.\n", ret); @@ -148,13 +148,14 @@ bool CServiceScan::tuneFrequency(FrontendParameters *feparams, uint8_t polarizat return false; } } - return frontend->tuneFrequency(feparams, polarization, false); + + return frontend->tuneFrequency(feparams, false); } -bool CServiceScan::AddTransponder(transponder_id_t TsidOnid, FrontendParameters *feparams, uint8_t polarity, bool fromnit) +bool CServiceScan::AddTransponder(transponder_id_t TsidOnid, FrontendParameters *feparams, bool fromnit) { stiterator tI; - transponder t(frontendType, TsidOnid, *feparams, polarity); + transponder t(TsidOnid, *feparams); if (fromnit) { for (tI = nittransponders.begin(); tI != nittransponders.end(); ++tI) { if(t.compare(tI->second)) @@ -207,7 +208,7 @@ bool CServiceScan::AddFromNit() /* common satellites.xml have V/H, update to L/R if found */ stiterator stI = transponders.find(ntI->first); if(stI != transponders.end() && stI->second == ntI->second) { - stI->second.polarization = ntI->second.polarization; + stI->second.feparams.polarization = ntI->second.feparams.polarization; } } nittransponders.clear(); @@ -249,11 +250,11 @@ _repeat: continue; } - transponder t(frontendType, tI->first, tI->second.feparams, tI->second.polarization); + transponder t(tI->first, tI->second.feparams); t.dump("[scan] scanning:"); SendTransponderInfo(tI->second); - if (!tuneFrequency(&(tI->second.feparams), tI->second.polarization, satellitePosition)) { + if (!tuneFrequency(&(tI->second.feparams), satellitePosition)) { failed_transponders++; failedtransponders.insert(transponder_pair_t(t.transponder_id, t)); continue; @@ -268,12 +269,11 @@ _repeat: ttI->second.dump("[scan] similar tp, old"); t.dump("[scan] similar tp, new"); ttI->second.feparams = t.feparams; - ttI->second.polarization = t.polarization; break; } } - freq_id_t freq = CREATE_FREQ_ID(tI->second.feparams.dvb_feparams.frequency, frontendType != FE_QPSK); + freq_id_t freq = CREATE_FREQ_ID(tI->second.feparams.frequency, !CFrontend::isSat(tI->second.feparams.delsys)); CNit nit(satellitePosition, freq, cable_nid); if(flags & SCAN_NIT) @@ -318,7 +318,7 @@ _repeat: stiterator stI = transponders.find(TsidOnid); if(stI == transponders.end()) { - transponder t2(frontendType, TsidOnid, tI->second.feparams, tI->second.polarization); + transponder t2(TsidOnid, tI->second.feparams); transponders.insert(transponder_pair_t(TsidOnid, t2)); } printf("[scan] tpid ready: %" PRIx64 "\n", TsidOnid); @@ -443,7 +443,7 @@ bool CServiceScan::ScanProvider(t_satellite_position satellitePosition) transponder_list_t &select_transponders = CServiceManager::getInstance()->GetSatelliteTransponders(satellitePosition); for (tI = select_transponders.begin(); tI != select_transponders.end(); ++tI) { - AddTransponder(tI->first, &tI->second.feparams, tI->second.polarization); + AddTransponder(tI->first, &tI->second.feparams); } ReadNitSdt(satellitePosition); @@ -482,7 +482,7 @@ bool CServiceScan::SetFrontend(t_satellite_position satellitePosition) frontend = fe; CFEManager::getInstance()->setLiveFE(frontend); - frontendType = frontend->getInfo()->type; + return true; } @@ -590,21 +590,21 @@ bool CServiceScan::ScanTransponder() printf("[scan] scanning sat %s position %d\n", providerName.c_str(), satellitePosition); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SATELLITE, providerName.c_str(), providerName.size()+1); - TP->feparams.dvb_feparams.inversion = INVERSION_AUTO; + TP->feparams.inversion = INVERSION_AUTO; flags = TP->scan_mode; 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, frontendType != FE_QPSK); + freq_id_t freq = CREATE_FREQ_ID(TP->feparams.frequency, !CFrontend::isSat(TP->feparams.delsys)); 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); + transponder t(tid, TP->feparams); t.dump("[scan]"); - AddTransponder(tid, &TP->feparams, TP->polarization); + AddTransponder(tid, &TP->feparams); /* read network information table */ ReadNitSdt(satellitePosition); @@ -612,7 +612,7 @@ bool CServiceScan::ScanTransponder() CServiceManager::getInstance()->UpdateSatTransponders(satellitePosition); #if 0 if (found_channels) - ReplaceTransponderParams(freq, satellitePosition, &TP->feparams, TP->polarization); + ReplaceTransponderParams(freq, satellitePosition, &TP->feparams); #endif printf("[scan] found %d transponders (%d failed) and %d channels\n", found_transponders, failed_transponders, found_channels); if(abort_scan) @@ -635,17 +635,17 @@ bool CServiceScan::ScanTransponder() return (found_channels != 0); } + #if 0 //never used -bool CServiceScan::ReplaceTransponderParams(freq_id_t freq, t_satellite_position satellitePosition, struct dvb_frontend_parameters * feparams, uint8_t polarization) +bool CServiceScan::ReplaceTransponderParams(freq_id_t freq, t_satellite_position satellitePosition, FrontendParameters *feparams) { 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, frontendType != FE_QPSK); + freq_id_t newfreq = CREATE_FREQ_ID(tI->second.feparams.frequency, !frontend->isSat()); if (freq == newfreq) { - memcpy(&tI->second.feparams, feparams, sizeof(struct dvb_frontend_parameters)); - tI->second.polarization = polarization; + memcpy(&tI->second.feparams, feparams, sizeof(FrontendParameters)); printf("[scan] replacing transponder parameters\n"); ret = true; break; @@ -657,8 +657,10 @@ bool CServiceScan::ReplaceTransponderParams(freq_id_t freq, t_satellite_position #endif void CServiceScan::SendTransponderInfo(transponder &t) { - uint32_t actual_freq = t.feparams.dvb_feparams.frequency; - if (frontendType == FE_QAM) + uint32_t actual_freq = t.feparams.frequency; + + if (CFrontend::isCable(t.feparams.delsys) || + CFrontend::isTerr(t.feparams.delsys)) actual_freq /= 1000; CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCY, &actual_freq,sizeof(actual_freq)); @@ -666,8 +668,8 @@ void CServiceScan::SendTransponderInfo(transponder &t) CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_PROVIDER, (void *) " ", 2); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SERVICENAME, (void *) " ", 2); - 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; + if (CFrontend::isSat(t.feparams.delsys)) { + uint32_t actual_polarisation = ((t.feparams.symbol_rate/1000) << 16) | (t.feparams.fec_inner << 8) | (uint)t.feparams.polarization; CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCYP, &actual_polarisation,sizeof(actual_polarisation)); } } diff --git a/src/zapit/src/scanbat.cpp b/src/zapit/src/scanbat.cpp index bf5b2a26e..24112fed8 100644 --- a/src/zapit/src/scanbat.cpp +++ b/src/zapit/src/scanbat.cpp @@ -44,7 +44,6 @@ CBat::CBat(t_satellite_position spos, freq_id_t frq, int dnum) satellitePosition = spos; freq_id = frq; dmxnum = dnum; - cable = (CServiceScan::getInstance()->GetFrontend()->getInfo()->type == FE_QAM); } CBat::~CBat() diff --git a/src/zapit/src/scannit.cpp b/src/zapit/src/scannit.cpp index 2292db284..c4420752c 100644 --- a/src/zapit/src/scannit.cpp +++ b/src/zapit/src/scannit.cpp @@ -40,7 +40,6 @@ CNit::CNit(t_satellite_position spos, freq_id_t frq, unsigned short pnid, int dn freq_id = frq; nid = pnid; dmxnum = dnum; - cable = (CServiceScan::getInstance()->GetFrontend()->getInfo()->type == FE_QAM); orbitalPosition = 0; } @@ -248,6 +247,10 @@ bool CNit::Parse() ParseCableDescriptor((CableDeliverySystemDescriptor *)d, tsinfo); break; + case TERRESTRIAL_DELIVERY_SYSTEM_DESCRIPTOR: + ParseTerrestrialDescriptor((TerrestrialDeliverySystemDescriptor *)d, tsinfo); + break; + case SERVICE_LIST_DESCRIPTOR: ParseServiceList((ServiceListDescriptor *) d, tsinfo); break; @@ -292,7 +295,7 @@ bool CNit::Parse() bool CNit::ParseSatelliteDescriptor(SatelliteDeliverySystemDescriptor * sd, TransportStreamInfo * tsinfo) { - if (cable) + if (!CServiceScan::getInstance()->GetFrontend()->hasSat()) return false; t_satellite_position newSat; @@ -317,89 +320,121 @@ bool CNit::ParseSatelliteDescriptor(SatelliteDeliverySystemDescriptor * sd, Tran return false; } - uint8_t polarization = sd->getPolarization(); - uint8_t modulation = sd->getModulation(); uint8_t modulation_system = sd->getModulationSystem(); + uint8_t modulation = sd->getModulation(); FrontendParameters feparams; + memset(&feparams, 0, sizeof(feparams)); + feparams.polarization = sd->getPolarization(); switch (modulation_system) { case 0: // DVB-S - feparams.delsys = SYS_DVBS; + feparams.delsys = DVB_S; // Hack for APSTAR 138E, 8PSK signalled but delsys set to DVB-S if (modulation == 2) - feparams.delsys = SYS_DVBS2; + feparams.delsys = DVB_S2; break; case 1: // DVB-S2 - feparams.delsys = SYS_DVBS2; + feparams.delsys = DVB_S2; break; default: #ifdef DEBUG_NIT printf("NIT: undefined modulation system %08x\n", modulation_system); #endif - feparams.delsys = SYS_UNDEFINED; + feparams.delsys = UNKNOWN_DS; + break; + } + switch (modulation) { + case 0: // AUTO + feparams.modulation = QAM_AUTO; + break; + case 1: // QPSK + feparams.modulation = QPSK; + break; + case 2: // 8PSK + feparams.modulation = PSK_8; + break; + case 3: // QAM_16 + feparams.modulation = QAM_16; break; } - feparams.dvb_feparams.inversion = INVERSION_AUTO; - feparams.dvb_feparams.frequency = sd->getFrequency() * 10; - feparams.dvb_feparams.u.qpsk.symbol_rate = sd->getSymbolRate() * 100; + feparams.inversion = INVERSION_AUTO; + feparams.frequency = sd->getFrequency() * 10; + feparams.symbol_rate = sd->getSymbolRate() * 100; - int fec_inner = CFrontend::getCodeRate(sd->getFecInner(), sd->getModulationSystem()); - if(sd->getModulation() == 2 && ((fe_code_rate_t) fec_inner != FEC_AUTO)) { - if (sd->getModulationSystem() != 1) - fec_inner = (fec_inner - 1) + FEC_S2_8PSK_BASE; - else - fec_inner += 9; - } - - // Set the roll-off - switch (sd->getRollOff()) { - case 0: - default: + feparams.fec_inner = CFrontend::getCodeRate(sd->getFecInner(), feparams.delsys); + if (feparams.delsys == DVB_S2) + feparams.rolloff = CFrontend::getRolloff(sd->getRollOff()); + else feparams.rolloff = ROLLOFF_35; - break; - case 1: - feparams.rolloff = ROLLOFF_25; - break; - case 2: - feparams.rolloff = ROLLOFF_20; - break; - } - feparams.dvb_feparams.u.qpsk.fec_inner = (fe_code_rate_t) fec_inner; - feparams.dvb_feparams.frequency = (int) 1000 * (int) round ((double) feparams.dvb_feparams.frequency / (double) 1000); + feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); - freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, false); + freq_id_t freq = CREATE_FREQ_ID(feparams.frequency, false); transponder_id_t TsidOnid = CREATE_TRANSPONDER_ID64( freq, satellitePosition, tsinfo->getOriginalNetworkId(), tsinfo->getTransportStreamId()); - CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, polarization, true); + CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, true); return true; } bool CNit::ParseCableDescriptor(CableDeliverySystemDescriptor * sd, TransportStreamInfo * tsinfo) { - if (!cable) + if (!CServiceScan::getInstance()->GetFrontend()->hasCable()) return false; FrontendParameters feparams; - feparams.dvb_feparams.inversion = INVERSION_AUTO; - feparams.dvb_feparams.frequency = sd->getFrequency() * 100; - feparams.dvb_feparams.u.qam.symbol_rate = sd->getSymbolRate() * 100; - feparams.dvb_feparams.u.qam.fec_inner = CFrontend::getCodeRate(sd->getFecInner()); - feparams.dvb_feparams.u.qam.modulation = CFrontend::getModulation(sd->getModulation()); + memset(&feparams, 0, sizeof(feparams)); - if(feparams.dvb_feparams.frequency > 1000*1000) - feparams.dvb_feparams.frequency /= 1000; + // FIXME: how is Annex decided in DVB-C ? Should this be done based on the receiving + // system set in the tuner ? For now we hardcode this to Annex-A. + feparams.delsys = DVB_C; + feparams.inversion = INVERSION_AUTO; + feparams.frequency = sd->getFrequency() * 100; + feparams.symbol_rate = sd->getSymbolRate() * 100; + feparams.fec_inner = CFrontend::getCodeRate(sd->getFecInner(), DVB_C); + feparams.modulation = CFrontend::getModulation(sd->getModulation()); - freq_id_t freq = CREATE_FREQ_ID(feparams.dvb_feparams.frequency, true); + if(feparams.frequency > 1000*1000) + feparams.frequency /= 1000; + + freq_id_t freq = CREATE_FREQ_ID(feparams.frequency, true); transponder_id_t TsidOnid = CREATE_TRANSPONDER_ID64( freq, satellitePosition, tsinfo->getOriginalNetworkId(), tsinfo->getTransportStreamId()); - CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, 0, true); + CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, true); + return true; +} + +bool CNit::ParseTerrestrialDescriptor(TerrestrialDeliverySystemDescriptor * sd, TransportStreamInfo * tsinfo) +{ + if (!CServiceScan::getInstance()->GetFrontend()->hasTerr()) + return false; + + FrontendParameters feparams; + + memset(&feparams, 0, sizeof(feparams)); + + feparams.delsys = DVB_T; + feparams.inversion = INVERSION_AUTO; + feparams.frequency = sd->getCentreFrequency() * 10; + feparams.code_rate_HP = CFrontend::getCodeRate(sd->getCodeRateHpStream(), DVB_T); + feparams.code_rate_LP = CFrontend::getCodeRate(sd->getCodeRateLpStream(), DVB_T); + feparams.modulation = CFrontend::getConstellation(sd->getConstellation()); + feparams.bandwidth = CFrontend::getBandwidth(sd->getBandwidth()); + feparams.hierarchy = CFrontend::getHierarchy(sd->getHierarchyInformation()); + feparams.transmission_mode = CFrontend::getTransmissionMode(sd->getTransmissionMode()); + if(feparams.frequency > 1000*1000) + feparams.frequency /= 1000; + + freq_id_t freq = CREATE_FREQ_ID(feparams.frequency, true); + transponder_id_t TsidOnid = CREATE_TRANSPONDER_ID64( + freq, satellitePosition, tsinfo->getOriginalNetworkId(), tsinfo->getTransportStreamId()); + + CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, true); return true; } diff --git a/src/zapit/src/scansdt.cpp b/src/zapit/src/scansdt.cpp index 737f817d2..fbfd3d985 100644 --- a/src/zapit/src/scansdt.cpp +++ b/src/zapit/src/scansdt.cpp @@ -50,7 +50,7 @@ CSdt::CSdt(t_satellite_position spos, freq_id_t frq, bool curr, int dnum) transport_stream_id = 0; original_network_id = 0; //FIXME sdt update ?? - cable = (CServiceScan::getInstance()->GetFrontend()->getInfo()->type == FE_QAM); + cable = CFEManager::getInstance()->getLiveFE()->getCurrentDeliverySystem() == DVB_C; } CSdt::~CSdt() @@ -278,8 +278,8 @@ bool CSdt::ParseServiceDescriptor(ServiceDescription * service, ServiceDescripto CZapitChannel * channel = new CZapitChannel(serviceName, channel_id, real_type, satellitePosition, freq_id); - channel->deltype = cable ? FE_QAM : FE_QPSK; + channel->delsys = CServiceScan::getInstance()->GetFrontend()->getCurrentDeliverySystem(); CServiceManager::getInstance()->AddCurrentChannel(channel); channel->scrambled = free_ca; @@ -326,7 +326,8 @@ bool CSdt::ParseServiceDescriptor(ServiceDescription * service, ServiceDescripto channel = new CZapitChannel(serviceName, channel_id, real_type, satellitePosition, freq_id); CServiceManager::getInstance()->AddChannel(channel); - channel->deltype = cable ? FE_QAM : FE_QPSK; + + channel->delsys = CServiceScan::getInstance()->GetFrontend()->getCurrentDeliverySystem(); channel->flags = CZapitChannel::UPDATED; /* mark channel as new, if this satellite already have channels */ if (CServiceScan::getInstance()->SatHaveChannels()) diff --git a/src/zapit/src/transponder.cpp b/src/zapit/src/transponder.cpp index a3dd7e311..8c4852805 100644 --- a/src/zapit/src/transponder.cpp +++ b/src/zapit/src/transponder.cpp @@ -24,20 +24,18 @@ #include #include -transponder::transponder(fe_type_t fType, const transponder_id_t t_id, const FrontendParameters p_feparams, const uint8_t p_polarization) +transponder::transponder(const transponder_id_t t_id, const FrontendParameters p_feparams) { transponder_id = t_id; transport_stream_id = GET_TRANSPORT_STREAM_ID_FROM_TRANSPONDER_ID(t_id); original_network_id = GET_ORIGINAL_NETWORK_ID_FROM_TRANSPONDER_ID(t_id); feparams = p_feparams; - polarization = p_polarization; - updated = 0; + updated = false; satellitePosition = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(transponder_id); if (satellitePosition & 0xF000) satellitePosition = -(satellitePosition & 0xFFF); else satellitePosition = satellitePosition & 0xFFF; - deltype = fType; } transponder::transponder() @@ -46,110 +44,133 @@ transponder::transponder() transponder_id = 0; transport_stream_id = 0; original_network_id = 0; - polarization = 0; satellitePosition = 0; - deltype = FE_QPSK; + updated = false; } bool transponder::operator==(const transponder& t) const { - if (deltype != FE_OFDM) + if (!CFrontend::isTerr(feparams.delsys)) 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) + ((getFEParams()->polarization & 1) == (t.getFEParams()->polarization & 1)) && + (abs((int) getFEParams()->frequency - (int)t.getFEParams()->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) + ((getFEParams()->polarization & 1) == (t.getFEParams()->polarization & 1)) && + (abs((int) getFEParams()->frequency - (int)t.getFEParams()->frequency) <= 100) ); } bool transponder::compare(const transponder& t) const { bool ret = false; - const struct dvb_frontend_parameters *dvb_feparams1 = &feparams.dvb_feparams; - const struct dvb_frontend_parameters *dvb_feparams2 = &t.feparams.dvb_feparams; - if (deltype == FE_QAM) { + if (CFrontend::isCable(feparams.delsys)) { ret = ( (t == (*this)) && - (dvb_feparams1->u.qam.symbol_rate == dvb_feparams2->u.qam.symbol_rate) && - (dvb_feparams1->u.qam.fec_inner == dvb_feparams2->u.qam.fec_inner || - dvb_feparams1->u.qam.fec_inner == FEC_AUTO || dvb_feparams2->u.qam.fec_inner == FEC_AUTO) && - (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 if (deltype == 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 (deltype == 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) + (getFEParams()->symbol_rate == t.getFEParams()->symbol_rate) && + (getFEParams()->fec_inner == t.getFEParams()->fec_inner || + getFEParams()->fec_inner == FEC_AUTO || t.getFEParams()->fec_inner == FEC_AUTO) && + (getFEParams()->modulation == t.getFEParams()->modulation || + getFEParams()->modulation == QAM_AUTO || t.getFEParams()->modulation == QAM_AUTO) ); } + else if (CFrontend::isSat(feparams.delsys)) { + ret = ( + (t == (*this)) && + (getFEParams()->symbol_rate == t.getFEParams()->symbol_rate) && + (getFEParams()->fec_inner == t.getFEParams()->fec_inner || + getFEParams()->fec_inner == FEC_AUTO || t.getFEParams()->fec_inner == FEC_AUTO) + ); + } + else if (CFrontend::isTerr(feparams.delsys)) { + ret = ( (t == (*this)) && + (getFEParams()->bandwidth == t.getFEParams()->bandwidth) && + (getFEParams()->code_rate_HP == t.getFEParams()->code_rate_HP || + getFEParams()->code_rate_HP == FEC_AUTO || t.getFEParams()->code_rate_HP == FEC_AUTO) && + (getFEParams()->code_rate_LP == t.getFEParams()->code_rate_LP || + getFEParams()->code_rate_LP == FEC_AUTO || t.getFEParams()->code_rate_LP == FEC_AUTO) && + (getFEParams()->modulation == t.getFEParams()->modulation || + getFEParams()->modulation == QAM_AUTO || t.getFEParams()->modulation == QAM_AUTO) + ); + } + return ret; } void transponder::dumpServiceXml(FILE * fd) { - struct dvb_frontend_parameters *dvb_feparams = &feparams.dvb_feparams; - - if (deltype == FE_QAM) { - fprintf(fd, "\t\t\n", + if (CFrontend::isCable(feparams.delsys)) { + fprintf(fd, "\t\t\n", transport_stream_id, original_network_id, - dvb_feparams->frequency, dvb_feparams->inversion, - dvb_feparams->u.qam.symbol_rate, dvb_feparams->u.qam.fec_inner, - dvb_feparams->u.qam.modulation); - - } else if (deltype == FE_QPSK) { - fprintf(fd, "\t\t\n", + getFEParams()->frequency, + getFEParams()->inversion, + getFEParams()->symbol_rate, + getFEParams()->fec_inner, + getFEParams()->modulation, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); + } else if (CFrontend::isSat(feparams.delsys)) { + fprintf(fd, "\t\t\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 (deltype == FE_OFDM) { - fprintf(fd, "\t\t\n", + getFEParams()->frequency, + getFEParams()->inversion, + getFEParams()->symbol_rate, + getFEParams()->fec_inner, + getFEParams()->polarization, + getFEParams()->modulation, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); + } else if (CFrontend::isTerr(feparams.delsys)) { + fprintf(fd, "\t\t\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); + getFEParams()->frequency, + getFEParams()->inversion, + getFEParams()->bandwidth, + getFEParams()->code_rate_HP, + getFEParams()->code_rate_LP, + getFEParams()->modulation, + getFEParams()->transmission_mode, + getFEParams()->guard_interval, + getFEParams()->hierarchy, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); } } -void transponder::dump(std::string label) +void transponder::dump(std::string label) { - struct dvb_frontend_parameters *dvb_feparams = &feparams.dvb_feparams; - - if (deltype == FE_QAM) - printf("%s tp-id %016" PRIx64 " 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 if (deltype == FE_QPSK) - printf("%s tp-id %016" PRIx64 " 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 (deltype == 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); + if (CFrontend::isCable(feparams.delsys)) { + printf("%s tp-id %016" PRIx64 " freq %d rate %d fec %d mod %d sys %d\n", label.c_str(), + transponder_id, + getFEParams()->frequency, + getFEParams()->symbol_rate, + getFEParams()->fec_inner, + getFEParams()->modulation, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); + } else if (CFrontend::isSat(feparams.delsys)) { + printf("%s tp-id %016" PRIx64 " freq %d rate %d fec %d pol %d sys %d\n", label.c_str(), + transponder_id, + getFEParams()->frequency, + getFEParams()->symbol_rate, + getFEParams()->fec_inner, + getFEParams()->polarization, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); + } else if (CFrontend::isTerr(feparams.delsys)) { + printf("%s tp-id %016llx freq %d bw %d coderate_HP %d coderate_LP %d const %d guard %d %d\n", label.c_str(), + transponder_id, + getFEParams()->frequency, + getFEParams()->bandwidth, + getFEParams()->code_rate_HP, + getFEParams()->code_rate_LP, + getFEParams()->modulation, + getFEParams()->guard_interval, + CFrontend::getXMLDeliverySystem(getFEParams()->delsys)); + } } + #if 0 //never used void transponder::ddump(std::string label) @@ -158,6 +179,7 @@ void transponder::ddump(std::string label) dump(label); } #endif + char transponder::pol(unsigned char p) { if (p == 0) @@ -174,30 +196,18 @@ std::string transponder::description() { char buf[128] = {0}; 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(deltype) { - case FE_QPSK: - CFrontend::getDelSys(deltype, dvb_feparams->u.qpsk.fec_inner, dvbs_get_modulation(dvb_feparams->u.qpsk.fec_inner), f, s, m); - snprintf(buf, sizeof(buf), "%d %c %d %s %s %s ", dvb_feparams->frequency/1000, pol(polarization), dvb_feparams->u.qpsk.symbol_rate/1000, f, s, m); - break; - case FE_QAM: - CFrontend::getDelSys(deltype, dvb_feparams->u.qam.fec_inner, dvb_feparams->u.qam.modulation, f, s, m); - 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(deltype, dvb_feparams->u.ofdm.code_rate_HP, dvb_feparams->u.ofdm.constellation, f, s, m); - CFrontend::getDelSys(deltype, 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; + if (CFrontend::isSat(feparams.delsys)) { + CFrontend::getDelSys(feparams.delsys, getFEParams()->fec_inner, getFEParams()->modulation, f, s, m); + snprintf(buf, sizeof(buf), "%d %c %d %s %s %s ", getFEParams()->frequency/1000, pol(getFEParams()->polarization), getFEParams()->symbol_rate/1000, f, s, m); + } else if (CFrontend::isCable(feparams.delsys)) { + CFrontend::getDelSys(feparams.delsys, getFEParams()->fec_inner, getFEParams()->modulation, f, s, m); + snprintf(buf, sizeof(buf), "%d %d %s %s %s ", getFEParams()->frequency/1000, getFEParams()->symbol_rate/1000, f, s, m); + } else if (CFrontend::isTerr(feparams.delsys)) { + CFrontend::getDelSys(feparams.delsys, getFEParams()->code_rate_HP, getFEParams()->modulation, f, s, m); + CFrontend::getDelSys(feparams.delsys, getFEParams()->code_rate_LP, getFEParams()->modulation, f2, s, m); + snprintf(buf, sizeof(buf), "%d %d %s %s %s ", getFEParams()->frequency, CFrontend::getFEBandwidth(getFEParams()->bandwidth)/1000, f, f2, m); } + return std::string(buf); } diff --git a/src/zapit/src/zapit.cpp b/src/zapit/src/zapit.cpp index 7c0d06c11..36bc60a25 100644 --- a/src/zapit/src/zapit.cpp +++ b/src/zapit/src/zapit.cpp @@ -1150,7 +1150,7 @@ bool CZapit::ParseCommand(CBasicMessage::Header &rmsg, int connfd) } if(!msgCurrentServiceInfo.fec) msgCurrentServiceInfo.fec = (fe_code_rate)3; - if (live_fe->getInfo()->type == FE_QPSK) + if (CFrontend::isSat(live_fe->getCurrentDeliverySystem())) msgCurrentServiceInfo.polarisation = live_fe->getPolarization(); else msgCurrentServiceInfo.polarisation = 2; @@ -1160,21 +1160,7 @@ bool CZapit::ParseCommand(CBasicMessage::Header &rmsg, int connfd) case CZapitMessages::CMD_GET_DELIVERY_SYSTEM: { CZapitMessages::responseDeliverySystem response; - switch (live_fe->getInfo()->type) { - case FE_QAM: - response.system = DVB_C; - break; - case FE_QPSK: - response.system = DVB_S; - break; - case FE_OFDM: - response.system = DVB_T; - break; - default: - WARN("Unknown type %d", live_fe->getInfo()->type); - return false; - - } + response.system = live_fe->getCurrentDeliverySystem(); CBasicServer::send_data(connfd, &response, sizeof(response)); break; } @@ -1309,27 +1295,26 @@ bool CZapit::ParseCommand(CBasicMessage::Header &rmsg, int connfd) case CZapitMessages::CMD_TUNE_TP: { CBasicServer::receive_data(connfd, &TP, sizeof(TP)); sig_delay = 0; - TP.feparams.dvb_feparams.inversion = INVERSION_AUTO; + TP.feparams.inversion = INVERSION_AUTO; const char *name = scanProviders.empty() ? "unknown" : scanProviders.begin()->second.c_str(); - switch (live_fe->getInfo()->type) { - case FE_QPSK: - case FE_OFDM: { + if (CFrontend::isSat(TP.feparams.delsys)) { //FIXME check scanProviders.size() ! t_satellite_position satellitePosition = scanProviders.begin()->first; - printf("[zapit] tune to sat %s freq %d rate %d fec %d pol %d\n", name, TP.feparams.dvb_feparams.frequency, TP.feparams.dvb_feparams.u.qpsk.symbol_rate, TP.feparams.dvb_feparams.u.qpsk.fec_inner, TP.polarization); - live_fe->setInput(satellitePosition, TP.feparams.dvb_feparams.frequency, TP.polarization); + printf("[zapit] tune to sat %s freq %d rate %d fec %d pol %d\n", name, TP.feparams.frequency, TP.feparams.symbol_rate, TP.feparams.fec_inner, TP.feparams.polarization); + live_fe->setInput(satellitePosition, TP.feparams.frequency, TP.feparams.polarization); live_fe->driveToSatellitePosition(satellitePosition); break; - } - case FE_QAM: - printf("[zapit] tune to cable %s freq %d rate %d fec %d\n", name, TP.feparams.dvb_feparams.frequency, TP.feparams.dvb_feparams.u.qam.symbol_rate, TP.feparams.dvb_feparams.u.qam.fec_inner); - break; - default: - WARN("Unknown type %d", live_fe->getInfo()->type); + } else if (CFrontend::isCable(TP.feparams.delsys)) { + printf("[zapit] tune to cable %s freq %d rate %d fec %d\n", name, TP.feparams.frequency, TP.feparams.symbol_rate, TP.feparams.fec_inner); + } else if (CFrontend::isTerr(TP.feparams.delsys)) { + printf("[zapit] tune to terr %s freq %d bw %d fec %d\n", name, TP.feparams.frequency, TP.feparams.bandwidth, TP.feparams.modulation); + } else { + WARN("Unknown type %d", TP.feparams.delsys); return false; } - live_fe->tuneFrequency(&TP.feparams, TP.polarization, true); + + live_fe->tuneFrequency(&TP.feparams, true); } break; case CZapitMessages::CMD_SCAN_TP: { @@ -1763,7 +1748,8 @@ bool CZapit::ParseCommand(CBasicMessage::Header &rmsg, int connfd) satellitePosition, 0 ); - channel->deltype = live_fe->getType(); + + channel->delsys = live_fe->getCurrentDeliverySystem(); CServiceManager::getInstance()->AddNVODChannel(channel); }