add DVB-T2 support, enable 5V supply

Origin commit data
------------------
Commit: e4bdd4700d
Author: TangoCash <eric@loxat.de>
Date: 2017-11-27 (Mon, 27 Nov 2017)
This commit is contained in:
TangoCash
2017-11-27 08:47:13 +01:00
committed by Jacek Jendrzej
parent 23d92f85b0
commit 230d8a2c0f
13 changed files with 215 additions and 9 deletions

View File

@@ -2400,6 +2400,11 @@ timing.numericzap Umschalten mit Zifferntasten
timing.popup_messages Popup Meldungen timing.popup_messages Popup Meldungen
timing.static_messages Interaktive Meldungen timing.static_messages Interaktive Meldungen
timing.volumebar Lautstärkeanzeige timing.volumebar Lautstärkeanzeige
tunersetup.cable Kabel (DVB-C)
tunersetup.hybrid Hybrid (DVB-C/T/T2)
tunersetup.mode Betriebsmodus
tunersetup.power 5V Versorgung bei DVB-T/T2 Kanälen
tunersetup.terr Terrestrisch (DVB-T/T2)
tmdb.api_key TMDb API Schlüssel tmdb.api_key TMDb API Schlüssel
tmdb.enabled TMDb-Unterstützung tmdb.enabled TMDb-Unterstützung
tmdb.read_data Suche TMDb-Daten ... tmdb.read_data Suche TMDb-Daten ...

View File

@@ -2400,6 +2400,11 @@ timing.numericzap Numeric Zap
timing.popup_messages Popup messages timing.popup_messages Popup messages
timing.static_messages Interactive messages timing.static_messages Interactive messages
timing.volumebar Volume bar timing.volumebar Volume bar
tunersetup.cable Cable (DVB-C)
tunersetup.hybrid Hybrid (DVB-C/T/T2)
tunersetup.mode Operation Mode
tunersetup.power 5V Supply on DVB-T/T2 Channels
tunersetup.terr Terrestrial (DVB-T/T2)
tmdb.api_key TMDb API key tmdb.api_key TMDb API key
tmdb.enabled TMDb support tmdb.enabled TMDb support
tmdb.read_data Search TMDb data ... tmdb.read_data Search TMDb data ...

View File

@@ -341,6 +341,14 @@ const CMenuOptionChooser::keyval SATSETUP_FRONTEND_MODE[SATSETUP_FRONTEND_MODE_C
{ CFrontend::FE_MODE_LINK_TWIN, LOCALE_SATSETUP_FE_MODE_LINK_TWIN }, { CFrontend::FE_MODE_LINK_TWIN, LOCALE_SATSETUP_FE_MODE_LINK_TWIN },
}; };
#define FRONTEND_FORCE_MODE_COUNT 3
const CMenuOptionChooser::keyval FRONTEND_FORCE_MODE[FRONTEND_FORCE_MODE_COUNT] =
{
{ 0, LOCALE_TUNERSETUP_HYBRID },
{ 1, LOCALE_TUNERSETUP_CABLE },
{ 2, LOCALE_TUNERSETUP_TERR }
};
CScanSetup::CScanSetup(int wizard_mode) CScanSetup::CScanSetup(int wizard_mode)
{ {
width = 40; width = 40;
@@ -359,6 +367,7 @@ CScanSetup::CScanSetup(int wizard_mode)
linkfe = NULL; linkfe = NULL;
in_menu = false; in_menu = false;
allow_start = true; allow_start = true;
tsp = NULL;
if (CFEManager::getInstance()->haveCable()) if (CFEManager::getInstance()->haveCable())
nid = new CIntInput(LOCALE_SATSETUP_CABLE_NID, (int*) &scansettings.cable_nid, 5, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); nid = new CIntInput(LOCALE_SATSETUP_CABLE_NID, (int*) &scansettings.cable_nid, 5, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE);
} }
@@ -952,6 +961,19 @@ int CScanSetup::showFrontendSetup(int number)
setupMenu->addItem(mc); setupMenu->addItem(mc);
msettings.Clear(); msettings.Clear();
if (fe->hasCable() && fe->hasTerr()) {
mc = new CMenuOptionChooser(LOCALE_TUNERSETUP_MODE, (int *)&fe_config.force_mode, FRONTEND_FORCE_MODE, FRONTEND_FORCE_MODE_COUNT, true, this);
mc->setHint("", LOCALE_MENU_HINT_SCAN_FEMODE);
setupMenu->addItem(mc);
}
if (fe->hasTerr()) {
tsp = new CMenuOptionChooser(LOCALE_TUNERSETUP_POWER, (int *)&fe_config.powered, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, fe_config.force_mode != 1, this);
tsp->setHint("", LOCALE_MENU_HINT_SCAN_FEMODE);
setupMenu->addItem(tsp);
}
if (fe->hasSat()) { if (fe->hasSat()) {
/* disable all but mode option for linked frontends */ /* disable all but mode option for linked frontends */
bool allow_moptions = !CFrontend::linked(femode) && femode != CFrontend::FE_MODE_UNUSED; bool allow_moptions = !CFrontend::linked(femode) && femode != CFrontend::FE_MODE_UNUSED;
@@ -1890,6 +1912,16 @@ bool CScanSetup::changeNotify(const neutrino_locale_t OptionName, void * /*data*
printf("[neutrino] CScanSetup::%s: logical numbers %d\n", __FUNCTION__, scansettings.scan_logical_numbers); printf("[neutrino] CScanSetup::%s: logical numbers %d\n", __FUNCTION__, scansettings.scan_logical_numbers);
lcnhd->setActive(scansettings.scan_logical_numbers); lcnhd->setActive(scansettings.scan_logical_numbers);
} }
else if(ARE_LOCALES_EQUAL(OptionName, LOCALE_TUNERSETUP_MODE)) {
CFrontend * fe = CFEManager::getInstance()->getFE(fenumber);
frontend_config_t & fe_config = fe->getConfig();
if (fe->hasCable() && fe->hasTerr())
fe->forceDelSys(fe_config.force_mode);
if (fe_config.force_mode == 1)
fe_config.powered = 0;
tsp->setActive(fe_config.force_mode != 1);
ret = menu_return::RETURN_EXIT_REPAINT;
}
return ret; return ret;
} }

View File

@@ -57,6 +57,7 @@ class CScanSetup : public CMenuTarget, public CChangeObserver
CMenuForwarder *fsatSelect; CMenuForwarder *fsatSelect;
CMenuOptionChooser * dtype; CMenuOptionChooser * dtype;
CMenuOptionChooser * dorder; CMenuOptionChooser * dorder;
CMenuOptionChooser * tsp;
CMenuForwarder *uniSetup; CMenuForwarder *uniSetup;
CMenuOptionNumberChooser * ojDiseqcRepeats; CMenuOptionNumberChooser * ojDiseqcRepeats;
CIntInput * nid; CIntInput * nid;

View File

@@ -2427,6 +2427,11 @@ typedef enum
LOCALE_TIMING_POPUP_MESSAGES, LOCALE_TIMING_POPUP_MESSAGES,
LOCALE_TIMING_STATIC_MESSAGES, LOCALE_TIMING_STATIC_MESSAGES,
LOCALE_TIMING_VOLUMEBAR, LOCALE_TIMING_VOLUMEBAR,
LOCALE_TUNERSETUP_CABLE,
LOCALE_TUNERSETUP_HYBRID,
LOCALE_TUNERSETUP_MODE,
LOCALE_TUNERSETUP_POWER,
LOCALE_TUNERSETUP_TERR,
LOCALE_TMDB_API_KEY, LOCALE_TMDB_API_KEY,
LOCALE_TMDB_ENABLED, LOCALE_TMDB_ENABLED,
LOCALE_TMDB_READ_DATA, LOCALE_TMDB_READ_DATA,

View File

@@ -2427,6 +2427,11 @@ const char * locale_real_names[] =
"timing.popup_messages", "timing.popup_messages",
"timing.static_messages", "timing.static_messages",
"timing.volumebar", "timing.volumebar",
"tunersetup.cable",
"tunersetup.hybrid",
"tunersetup.mode",
"tunersetup.power",
"tunersetup.terr",
"tmdb.api_key", "tmdb.api_key",
"tmdb.enabled", "tmdb.enabled",
"tmdb.read_data", "tmdb.read_data",

View File

@@ -153,6 +153,7 @@ class CFrontend
bool standby; bool standby;
uint32_t deliverySystemMask; uint32_t deliverySystemMask;
uint32_t forcedSystemMask;
//fe_delivery_system_t deliverySystems[MAX_DELSYS]; //fe_delivery_system_t deliverySystems[MAX_DELSYS];
//uint32_t numDeliverySystems; //uint32_t numDeliverySystems;
@@ -209,6 +210,7 @@ class CFrontend
fe_status_t getStatus(void) const; fe_status_t getStatus(void) const;
uint32_t getUncorrectedBlocks(void) const; uint32_t getUncorrectedBlocks(void) const;
void getDelSys(int f, int m, const char * &fec, const char * &sys, const char * &mod); void getDelSys(int f, int m, const char * &fec, const char * &sys, const char * &mod);
void forceDelSys(int i);
void getFEInfo(void); void getFEInfo(void);
int32_t getCurrentSatellitePosition() { return currentSatellitePosition; } int32_t getCurrentSatellitePosition() { return currentSatellitePosition; }
@@ -294,6 +296,7 @@ class CFrontend
bool hasTerr(void); bool hasTerr(void);
bool isHybrid(void); bool isHybrid(void);
bool supportsDelivery(delivery_system_t); bool supportsDelivery(delivery_system_t);
bool forcedDelivery(delivery_system_t);
delivery_system_t getCurrentDeliverySystem(void); delivery_system_t getCurrentDeliverySystem(void);
uint32_t getSupportedDeliverySystems(void) const; uint32_t getSupportedDeliverySystems(void) const;
static uint32_t getXMLDeliverySystem(delivery_system_t delsys); static uint32_t getXMLDeliverySystem(delivery_system_t delsys);

View File

@@ -127,6 +127,7 @@ typedef struct {
enum fe_interleaving interleaving; enum fe_interleaving interleaving;
#endif #endif
uint8_t polarization; uint8_t polarization;
uint8_t plp_id;
} FrontendParameters; } FrontendParameters;
typedef struct frontend_config { typedef struct frontend_config {
@@ -141,6 +142,8 @@ typedef struct frontend_config {
int diseqc_order; int diseqc_order;
int use_usals; int use_usals;
int rotor_swap; int rotor_swap;
int force_mode;
int powered;
} frontend_config_t; } frontend_config_t;
#endif // __FRONTEND_TYPES_H__ #endif // __FRONTEND_TYPES_H__

View File

@@ -29,6 +29,7 @@
#include <dvbsi++/satellite_delivery_system_descriptor.h> #include <dvbsi++/satellite_delivery_system_descriptor.h>
#include <dvbsi++/cable_delivery_system_descriptor.h> #include <dvbsi++/cable_delivery_system_descriptor.h>
#include <dvbsi++/terrestrial_delivery_system_descriptor.h> #include <dvbsi++/terrestrial_delivery_system_descriptor.h>
#include <dvbsi++/t2_delivery_system_descriptor.h>
#include <dvbsi++/service_list_descriptor.h> #include <dvbsi++/service_list_descriptor.h>
#include <dvbsi++/logical_channel_descriptor.h> #include <dvbsi++/logical_channel_descriptor.h>
@@ -56,6 +57,7 @@ class CNit : public OpenThreads::Thread
bool ParseSatelliteDescriptor(SatelliteDeliverySystemDescriptor * sd, TransportStreamInfo * ts); bool ParseSatelliteDescriptor(SatelliteDeliverySystemDescriptor * sd, TransportStreamInfo * ts);
bool ParseCableDescriptor(CableDeliverySystemDescriptor * sd, TransportStreamInfo * ts); bool ParseCableDescriptor(CableDeliverySystemDescriptor * sd, TransportStreamInfo * ts);
bool ParseTerrestrialDescriptor(TerrestrialDeliverySystemDescriptor * sd, TransportStreamInfo * ts); bool ParseTerrestrialDescriptor(TerrestrialDeliverySystemDescriptor * sd, TransportStreamInfo * ts);
bool ParseTerrestrial2Descriptor(T2DeliverySystemDescriptor * sd, TransportStreamInfo * ts);
bool ParseServiceList(ServiceListDescriptor * sd, TransportStreamInfo * ts); bool ParseServiceList(ServiceListDescriptor * sd, TransportStreamInfo * ts);
bool ParseLogicalChannels(LogicalChannelDescriptor * ld, TransportStreamInfo * ts, bool hd = false); bool ParseLogicalChannels(LogicalChannelDescriptor * ld, TransportStreamInfo * ts, bool hd = false);

View File

@@ -253,12 +253,17 @@ bool CFEManager::loadSettings()
fe_config.diseqc_order = getConfigValue(fe, "diseqc_order", UNCOMMITED_FIRST); fe_config.diseqc_order = getConfigValue(fe, "diseqc_order", UNCOMMITED_FIRST);
fe_config.use_usals = getConfigValue(fe, "use_usals", 0); fe_config.use_usals = getConfigValue(fe, "use_usals", 0);
fe_config.rotor_swap = getConfigValue(fe, "rotor_swap", 0); fe_config.rotor_swap = getConfigValue(fe, "rotor_swap", 0);
fe_config.force_mode = getConfigValue(fe, "force_mode", 0);
fe_config.powered = getConfigValue(fe, "powered", 0);
fe->setRotorSatellitePosition(getConfigValue(fe, "lastSatellitePosition", 0)); fe->setRotorSatellitePosition(getConfigValue(fe, "lastSatellitePosition", 0));
/* default mode for first / next frontends */ /* default mode for first / next frontends */
int def_mode = def_modeX; int def_mode = def_modeX;
if (fe->hasCable() && fe->hasTerr())
fe->forceDelSys(fe_config.force_mode);
if (fe->hasSat() && fsat) { if (fe->hasSat() && fsat) {
fsat = false; fsat = false;
def_mode = def_mode0; def_mode = def_mode0;
@@ -356,6 +361,8 @@ void CFEManager::saveSettings(bool write)
setConfigValue(fe, "lastSatellitePosition", fe->getRotorSatellitePosition()); setConfigValue(fe, "lastSatellitePosition", fe->getRotorSatellitePosition());
setConfigValue(fe, "mode", fe->getMode()); setConfigValue(fe, "mode", fe->getMode());
setConfigValue(fe, "master", fe->getMaster()); setConfigValue(fe, "master", fe->getMaster());
setConfigValue(fe, "force_mode", fe_config.force_mode);
setConfigValue(fe, "powered", fe_config.powered);
std::vector<int> satList; std::vector<int> satList;
satellite_map_t satellites = fe->getSatellites(); satellite_map_t satellites = fe->getSatellites();
@@ -555,6 +562,8 @@ CFrontend * CFEManager::getFrontend(CZapitChannel * channel)
if (!mfe->supportsDelivery(channel->delsys)) if (!mfe->supportsDelivery(channel->delsys))
continue; continue;
if (mfe->forcedDelivery(channel->delsys))
continue;
if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode())) if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode()))
continue; continue;

View File

@@ -40,6 +40,7 @@
#include <zapit/frontend_c.h> #include <zapit/frontend_c.h>
#include <zapit/satconfig.h> #include <zapit/satconfig.h>
#include <driver/abstime.h> #include <driver/abstime.h>
#include <linux/dvb/frontend.h>
#include <linux/dvb/version.h> #include <linux/dvb/version.h>
#include <hardware_caps.h> #include <hardware_caps.h>
@@ -72,12 +73,15 @@ extern int zapit_debug;
#define TRANSMISSION_MODE 8 #define TRANSMISSION_MODE 8
#define GUARD_INTERVAL 9 #define GUARD_INTERVAL 9
#define HIERARCHY 10 #define HIERARCHY 10
// DVB-T2 specific
#define PLP_ID 11
#define FE_COMMON_PROPS 2 #define FE_COMMON_PROPS 2
#define FE_DVBS_PROPS 6 #define FE_DVBS_PROPS 6
#define FE_DVBS2_PROPS 8 #define FE_DVBS2_PROPS 8
#define FE_DVBC_PROPS 6 #define FE_DVBC_PROPS 6
#define FE_DVBT_PROPS 10 #define FE_DVBT_PROPS 10
#define FE_DVBT2_PROPS 11
/* stolen from dvb.c from vlc */ /* stolen from dvb.c from vlc */
static const struct dtv_property dvbs_cmdargs[] = { static const struct dtv_property dvbs_cmdargs[] = {
@@ -130,6 +134,26 @@ static const struct dtv_property dvbt_cmdargs[] = {
{ DTV_TUNE, {}, { 0 }, 0}, { DTV_TUNE, {}, { 0 }, 0},
}; };
static const struct dtv_property dvbt2_cmdargs[] = {
{ DTV_CLEAR, {0,0,0}, { 0 } ,0},
{ DTV_FREQUENCY, {}, { 0 } ,0},
{ DTV_MODULATION, {}, { QAM_AUTO } ,0},
{ DTV_INVERSION, {}, { INVERSION_AUTO } ,0},
{ DTV_BANDWIDTH_HZ, {}, { 8000000 } ,0},
{ DTV_DELIVERY_SYSTEM, {}, { SYS_DVBT2 } ,0},
{ DTV_CODE_RATE_HP, {}, { FEC_AUTO } ,0},
{ DTV_CODE_RATE_LP, {}, { FEC_AUTO } ,0},
{ DTV_TRANSMISSION_MODE,{}, { TRANSMISSION_MODE_AUTO}, 0},
{ DTV_GUARD_INTERVAL, {}, { GUARD_INTERVAL_AUTO}, 0},
{ DTV_HIERARCHY, {}, { HIERARCHY_AUTO }, 0},
#if defined DTV_STREAM_ID
{ DTV_STREAM_ID, {}, { 0 } ,0},
#elif defined DTV_DVBT2_PLP_ID
{ DTV_DVBT2_PLP_ID, {}, { 0 } ,0},
#endif
{ DTV_TUNE, {}, { 0 }, 0}
};
#define diff(x,y) (max(x,y) - min(x,y)) #define diff(x,y) (max(x,y) - min(x,y))
#define FE_TIMER_INIT() \ #define FE_TIMER_INIT() \
@@ -302,6 +326,7 @@ void CFrontend::getFEInfo(void)
#endif // HAVE_ARM_HARDWARE #endif // HAVE_ARM_HARDWARE
deliverySystemMask = UNKNOWN_DS; deliverySystemMask = UNKNOWN_DS;
forcedSystemMask = UNKNOWN_DS;
#if (DVB_API_VERSION >= 5) && (DVB_API_VERSION_MINOR >= 5) #if (DVB_API_VERSION >= 5) && (DVB_API_VERSION_MINOR >= 5)
dtv_property prop[1]; dtv_property prop[1];
@@ -461,7 +486,7 @@ fe_code_rate_t CFrontend::getCodeRate(const uint8_t fec_inner, delivery_system_t
dvb_fec_t f = (dvb_fec_t) fec_inner; dvb_fec_t f = (dvb_fec_t) fec_inner;
fe_code_rate_t fec; fe_code_rate_t fec;
if (delsys == DVB_S || delsys == DVB_C || delsys == DVB_T) { if (delsys == DVB_S || delsys == DVB_C || delsys == DVB_T || delsys == DVB_T2) {
switch (f) { switch (f) {
case fNone: case fNone:
fec = FEC_NONE; fec = FEC_NONE;
@@ -483,7 +508,7 @@ fe_code_rate_t CFrontend::getCodeRate(const uint8_t fec_inner, delivery_system_t
break; break;
default: default:
if (zapit_debug) if (zapit_debug)
printf("no valid fec for DVB-%c set.. assume auto\n", (delsys == DVB_S ? 'S' : (delsys == DVB_C ? 'C' : 'T'))); printf("no valid fec for DVB-%c set.. assume auto\n", (delsys == DVB_S ? 'S' : (delsys == DVB_C ? 'C' : 'T/T2')));
/* fall through */ /* fall through */
case fAuto: case fAuto:
fec = FEC_AUTO; fec = FEC_AUTO;
@@ -610,6 +635,14 @@ fe_guard_interval_t CFrontend::getGuardInterval(const uint8_t guard_interval)
return GUARD_INTERVAL_1_8; return GUARD_INTERVAL_1_8;
case 0x03: case 0x03:
return GUARD_INTERVAL_1_4; return GUARD_INTERVAL_1_4;
#if defined GUARD_INTERVAL_1_128
case 0x05:
return GUARD_INTERVAL_1_128;
case 0x06:
return GUARD_INTERVAL_19_128;
case 0x07:
return GUARD_INTERVAL_19_256;
#endif
default: default:
return GUARD_INTERVAL_AUTO; return GUARD_INTERVAL_AUTO;
} }
@@ -624,6 +657,10 @@ fe_modulation_t CFrontend::getConstellation(const uint8_t constellation)
return QAM_16; return QAM_16;
case 0x02: case 0x02:
return QAM_64; return QAM_64;
case 0x04:
return QAM_128;
case 0x05:
return QAM_256;
default: default:
return QAM_AUTO; return QAM_AUTO;
} }
@@ -638,6 +675,14 @@ fe_transmit_mode_t CFrontend::getTransmissionMode(const uint8_t transmission_mod
return TRANSMISSION_MODE_8K; return TRANSMISSION_MODE_8K;
case 0x02: case 0x02:
return TRANSMISSION_MODE_4K; return TRANSMISSION_MODE_4K;
#if defined TRANSMISSION_MODE_1K
case 0x04:
return TRANSMISSION_MODE_1K;
case 0x05:
return TRANSMISSION_MODE_16K;
case 0x06:
return TRANSMISSION_MODE_32K;
#endif
default: default:
return TRANSMISSION_MODE_AUTO; return TRANSMISSION_MODE_AUTO;
} }
@@ -782,6 +827,21 @@ void CFrontend::getDelSys(int f, int m, const char *&fec, const char *&sys, cons
return getDelSys(getCurrentDeliverySystem(), f, m, fec, sys, mod); return getDelSys(getCurrentDeliverySystem(), f, m, fec, sys, mod);
} }
void CFrontend::forceDelSys(int i)
{
switch (i) {
case 1:
forcedSystemMask = ALL_TERR;
break;
case 2:
forcedSystemMask = ALL_CABLE;
break;
default:
forcedSystemMask = UNKNOWN_DS;
break;
}
}
void CFrontend::getXMLDelsysFEC(fe_code_rate_t xmlfec, delivery_system_t & delsys, fe_modulation_t &mod, fe_code_rate_t & fec) void CFrontend::getXMLDelsysFEC(fe_code_rate_t xmlfec, delivery_system_t & delsys, fe_modulation_t &mod, fe_code_rate_t & fec)
{ {
if ((int)xmlfec < FEC_S2_QPSK_1_2) { if ((int)xmlfec < FEC_S2_QPSK_1_2) {
@@ -970,11 +1030,14 @@ void CFrontend::getDelSys(delivery_system_t delsys, int f, int m, const char *&f
case FEC_2_5: case FEC_2_5:
fec = "2/5"; fec = "2/5";
break; break;
default: case FEC_NONE:
INFO("[frontend] getDelSys: unknown FEC: %d !!!\n", f); fec = "0";
break;
case FEC_AUTO: case FEC_AUTO:
fec = "AUTO"; fec = "AUTO";
break; break;
default:
INFO("[frontend] getDelSys: unknown FEC: %d !!!\n", f);
} }
} }
@@ -1105,6 +1168,14 @@ uint32_t CFrontend::getFEBandwidth(fe_bandwidth_t bandwidth)
case BANDWIDTH_5_MHZ: case BANDWIDTH_5_MHZ:
bandwidth_hz = 5000000; bandwidth_hz = 5000000;
break; break;
case BANDWIDTH_1_712_MHZ:
bandwidth_hz = 1712000;
break;
case BANDWIDTH_10_MHZ:
bandwidth_hz = 10000000;
break;
case BANDWIDTH_AUTO:
bandwidth_hz = 0;
} }
return bandwidth_hz; return bandwidth_hz;
@@ -1160,11 +1231,14 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
case FEC_2_5: case FEC_2_5:
fec = FEC_2_5; fec = FEC_2_5;
break; break;
default: case FEC_NONE:
INFO("[fe%d] DEMOD: unknown FEC: %d\n", fenumber, fec_inner); fec = FEC_NONE;
break;
case FEC_AUTO: case FEC_AUTO:
fec = FEC_AUTO; fec = FEC_AUTO;
break; break;
default:
INFO("[fe%d] DEMOD: unknown FEC: %d\n", fenumber, fec_inner);
} }
switch(feparams->pilot) { switch(feparams->pilot) {
case ZPILOT_ON: case ZPILOT_ON:
@@ -1211,7 +1285,6 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
nrOfProps = FE_DVBC_PROPS; nrOfProps = FE_DVBC_PROPS;
break; break;
case DVB_T: case DVB_T:
case DVB_T2:
case DTMB: case DTMB:
memcpy(cmdseq.props, dvbt_cmdargs, sizeof(dvbt_cmdargs)); memcpy(cmdseq.props, dvbt_cmdargs, sizeof(dvbt_cmdargs));
nrOfProps = FE_DVBT_PROPS; nrOfProps = FE_DVBT_PROPS;
@@ -1226,6 +1299,21 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
cmdseq.props[DELIVERY_SYSTEM].u.data = getFEDeliverySystem(feparams->delsys); cmdseq.props[DELIVERY_SYSTEM].u.data = getFEDeliverySystem(feparams->delsys);
cmdseq.props[BANDWIDTH].u.data = getFEBandwidth(feparams->bandwidth); cmdseq.props[BANDWIDTH].u.data = getFEBandwidth(feparams->bandwidth);
break; break;
case DVB_T2:
memcpy(cmdseq.props, dvbt2_cmdargs, sizeof(dvbt2_cmdargs));
nrOfProps = FE_DVBT2_PROPS;
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);
cmdseq.props[PLP_ID].u.data = feparams->plp_id;
break;
default: default:
INFO("unknown frontend type, exiting"); INFO("unknown frontend type, exiting");
return false; return false;
@@ -1251,7 +1339,7 @@ bool CFrontend::buildProperties(const FrontendParameters *feparams, struct dtv_p
int CFrontend::setFrontend(const FrontendParameters *feparams, bool nowait) int CFrontend::setFrontend(const FrontendParameters *feparams, bool nowait)
{ {
struct dtv_property cmdargs[FE_COMMON_PROPS + FE_DVBT_PROPS]; // WARNING: increase when needed more space struct dtv_property cmdargs[FE_COMMON_PROPS + FE_DVBT2_PROPS]; // WARNING: increase when needed more space
struct dtv_properties cmdseq; struct dtv_properties cmdseq;
#ifdef PEDANTIC_VALGRIND_SETUP #ifdef PEDANTIC_VALGRIND_SETUP
memset(&cmdargs, 0, sizeof(cmdargs)); memset(&cmdargs, 0, sizeof(cmdargs));
@@ -1332,7 +1420,7 @@ void CFrontend::secSetTone(const fe_sec_tone_mode_t toneMode, const uint32_t ms)
void CFrontend::secSetVoltage(const fe_sec_voltage_t voltage, const uint32_t ms) void CFrontend::secSetVoltage(const fe_sec_voltage_t voltage, const uint32_t ms)
{ {
if (slave || info.type != FE_QPSK) if (slave || ((info.type != FE_QPSK) && (info.type != FE_OFDM)))
return; return;
if (currentVoltage == voltage) if (currentVoltage == voltage)
@@ -1697,6 +1785,7 @@ int CFrontend::setParameters(transponder *TP, bool nowait)
if (freq < 1000*1000) if (freq < 1000*1000)
feparams.frequency = freq * 1000; feparams.frequency = freq * 1000;
getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m); getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m);
secSetVoltage(SEC_VOLTAGE_OFF, 100);
break; break;
case DVB_T: case DVB_T:
case DVB_T2: case DVB_T2:
@@ -1704,6 +1793,7 @@ int CFrontend::setParameters(transponder *TP, bool nowait)
if (freq < 1000*1000) if (freq < 1000*1000)
feparams.frequency = freq * 1000; feparams.frequency = freq * 1000;
getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m); getDelSys(feparams.delsys, feparams.fec_inner, feparams.modulation, f, s, m);
secSetVoltage(config.powered ? SEC_VOLTAGE_13 : SEC_VOLTAGE_OFF, 100);
break; break;
default: default:
printf("[fe%d] unknown delsys %d\n", fenumber, feparams.delsys); printf("[fe%d] unknown delsys %d\n", fenumber, feparams.delsys);
@@ -2290,6 +2380,11 @@ bool CFrontend::supportsDelivery(delivery_system_t delsys)
return (deliverySystemMask & delsys) != 0; return (deliverySystemMask & delsys) != 0;
} }
bool CFrontend::forcedDelivery(delivery_system_t delsys)
{
return (forcedSystemMask & delsys) != 0;
}
delivery_system_t CFrontend::getCurrentDeliverySystem(void) delivery_system_t CFrontend::getCurrentDeliverySystem(void)
{ {
// FIXME: this should come from demod information // FIXME: this should come from demod information

View File

@@ -610,6 +610,8 @@ void CServiceManager::ParseSatTransponders(delivery_system_t delsys, xmlNodePtr
memset(&feparams, 0x00, sizeof(FrontendParameters)); memset(&feparams, 0x00, sizeof(FrontendParameters));
feparams.frequency = xmlGetNumericAttribute(tps, "frequency", 0); feparams.frequency = xmlGetNumericAttribute(tps, "frequency", 0);
if (feparams.frequency == 0)
feparams.frequency = xmlGetNumericAttribute(tps, "centre_frequency", 0);
feparams.inversion = INVERSION_AUTO; feparams.inversion = INVERSION_AUTO;
if (CFrontend::isCable(delsys)) { if (CFrontend::isCable(delsys)) {
@@ -742,6 +744,8 @@ void CServiceManager::ParseSatTransponders(delivery_system_t delsys, xmlNodePtr
xmlGetNumericAttribute(tps, "guard_interval", 0); xmlGetNumericAttribute(tps, "guard_interval", 0);
feparams.hierarchy = (fe_hierarchy_t) feparams.hierarchy = (fe_hierarchy_t)
xmlGetNumericAttribute(tps, "hierarchy", 0); xmlGetNumericAttribute(tps, "hierarchy", 0);
feparams.plp_id = (uint8_t)
xmlGetNumericAttribute(tps, "plp_id", 0);
if (feparams.frequency > 1000*1000) if (feparams.frequency > 1000*1000)
feparams.frequency /= 1000; // old transponder list feparams.frequency /= 1000; // old transponder list
} }

View File

@@ -253,6 +253,10 @@ bool CNit::Parse()
ParseTerrestrialDescriptor((TerrestrialDeliverySystemDescriptor *)d, tsinfo); ParseTerrestrialDescriptor((TerrestrialDeliverySystemDescriptor *)d, tsinfo);
break; break;
case EXTENSION_DESCRIPTOR:
ParseTerrestrial2Descriptor((T2DeliverySystemDescriptor *)d, tsinfo);
break;
case SERVICE_LIST_DESCRIPTOR: case SERVICE_LIST_DESCRIPTOR:
ParseServiceList((ServiceListDescriptor *) d, tsinfo); ParseServiceList((ServiceListDescriptor *) d, tsinfo);
break; break;
@@ -440,6 +444,39 @@ bool CNit::ParseTerrestrialDescriptor(TerrestrialDeliverySystemDescriptor * sd,
CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, true); CServiceScan::getInstance()->AddTransponder(TsidOnid, &feparams, true);
return true; return true;
} }
bool CNit::ParseTerrestrial2Descriptor(T2DeliverySystemDescriptor * sd, TransportStreamInfo * tsinfo)
{
if (!CServiceScan::getInstance()->GetFrontend()->hasTerr())
return false;
FrontendParameters feparams;
memset(&feparams, 0, sizeof(feparams));
feparams.delsys = DVB_T2;
feparams.inversion = INVERSION_AUTO;
feparams.plp_id = sd->getPlpId();
feparams.code_rate_HP = CFrontend::getCodeRate(FEC_AUTO, DVB_T2);
feparams.code_rate_LP = CFrontend::getCodeRate(FEC_AUTO, DVB_T2);
feparams.modulation = CFrontend::getConstellation(QAM_AUTO);
feparams.bandwidth = CFrontend::getBandwidth(sd->getBandwidth());
feparams.hierarchy = CFrontend::getHierarchy(HIERARCHY_AUTO);
feparams.transmission_mode = CFrontend::getTransmissionMode(sd->getTransmissionMode());
for (T2CellConstIterator cell = sd->getCells()->begin(); cell != sd->getCells()->end(); ++cell)
{
for (T2FrequencyConstIterator T2freq = (*cell)->getCentreFrequencies()->begin(); T2freq != (*cell)->getCentreFrequencies()->end(); ++T2freq)
{
feparams.frequency = (*T2freq) * 10;
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;
}
bool CNit::ParseServiceList(ServiceListDescriptor * sd, TransportStreamInfo * tsinfo) bool CNit::ParseServiceList(ServiceListDescriptor * sd, TransportStreamInfo * tsinfo)
{ {