X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/f9723e7fbf7669f063151eaf53bb1ee9f4189289..a20655498030829cd4186f6788179f6250b5c87d:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 690824db..00886ee4 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -9,6 +9,16 @@ #if HAVE_DVB_API_VERSION < 3 #include #include +#define QAM_AUTO (Modulation)6 +#define TRANSMISSION_MODE_AUTO (TransmitMode)2 +#define BANDWIDTH_AUTO (BandWidth)3 +#define GUARD_INTERVAL_AUTO (GuardInterval)4 +#define HIERARCHY_AUTO (Hierarchy)4 +#define constellation Constellation +#define guard_interval guardInterval +#define hierarchy_information HierarchyInformation +#define code_rate_HP HP_CodeRate +#define code_rate_LP LP_CodeRate #else #include #endif @@ -261,7 +271,7 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1) ok = 0; return; } - eDebug("detected %s frontend", "satellite\0cable\0 terrestrial"+feSatellite*9); + eDebug("detected %s frontend", "satellite\0cable\0 terrestrial"+fe_info.type*9); ok = 1; m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Read); @@ -365,6 +375,8 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) feEvent(-1); + eDebug("eDVBFrontend::tune. type: %d", m_type); + switch (m_type) { case feSatellite: @@ -403,11 +415,113 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) { eDVBFrontendParametersTerrestrial feparm; if (where.getDVBT(feparm)) + { + eDebug("no -T data"); + return -EINVAL; + } +#if HAVE_DVB_API_VERSION < 3 + parm.Frequency = feparm.frequency; +#else + parm.frequency = feparm.frequency; +#endif + + switch (feparm.bandwidth) + { + case eDVBFrontendParametersTerrestrial::Bandwidth::Bw8MHz: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.bandWidth = +#else + parm.u.ofdm.bandwidth = +#endif + BANDWIDTH_8_MHZ; + break; + case eDVBFrontendParametersTerrestrial::Bandwidth::Bw7MHz: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.bandWidth = +#else + parm.u.ofdm.bandwidth = +#endif + BANDWIDTH_7_MHZ; + break; + case eDVBFrontendParametersTerrestrial::Bandwidth::Bw6MHz: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.bandWidth = +#else + parm.u.ofdm.bandwidth = +#endif + BANDWIDTH_6_MHZ; + break; + case eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.bandWidth = +#else + parm.u.ofdm.bandwidth = +#endif + BANDWIDTH_AUTO; + break; + default: + eWarning("invalid OFDM bandwith"); return -EINVAL; - eFatal("terrestrial tuning nyi"); + } + + parm.u.ofdm.code_rate_HP = FEC_AUTO; + parm.u.ofdm.code_rate_LP = FEC_AUTO; + + switch (feparm.modulation) + { + case eDVBFrontendParametersTerrestrial::Modulation::QPSK: + parm.u.ofdm.constellation = QPSK; + break; + case eDVBFrontendParametersTerrestrial::Modulation::QAM16: + parm.u.ofdm.constellation = QAM_16; + break; + case eDVBFrontendParametersTerrestrial::Modulation::Auto: + parm.u.ofdm.constellation = QAM_AUTO; + break; + } + + switch (feparm.transmission_mode) + { + case eDVBFrontendParametersTerrestrial::TransmissionMode::TM2k: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.TransmissionMode = +#else + parm.u.ofdm.transmission_mode = +#endif + TRANSMISSION_MODE_2K; + break; + case eDVBFrontendParametersTerrestrial::TransmissionMode::TM8k: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.TransmissionMode = +#else + parm.u.ofdm.transmission_mode = +#endif + TRANSMISSION_MODE_8K; + break; + case eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto: +#if HAVE_DVB_API_VERSION < 3 + parm.u.ofdm.TransmissionMode = +#else + parm.u.ofdm.transmission_mode = +#endif + TRANSMISSION_MODE_AUTO; + break; + } + + parm.u.ofdm.guard_interval = GUARD_INTERVAL_AUTO; + parm.u.ofdm.hierarchy_information = HIERARCHY_AUTO; +#if HAVE_DVB_API_VERSION < 3 + parm.Inversion = +#else + parm.inversion = +#endif + INVERSION_AUTO; + break; } } + eDebug("setting frontend..\n"); + if (ioctl(m_fd, FE_SET_FRONTEND, &parm) == -1) { perror("FE_SET_FRONTEND failed"); @@ -514,13 +628,23 @@ RESULT eDVBFrontend::sendDiseqc(const eDVBDiseqcCommand &diseqc) eDebugNoNewLine("%02x ", diseqc.data[3+i]); eDebug(""); - seq.continuousTone = SEC_TONE_OFF; - seq.voltage = SEC_VOLTAGE_13; + seq.continuousTone = diseqc.tone == toneOn ? SEC_TONE_ON : SEC_TONE_OFF; + switch ( diseqc.voltage ) + { + case voltageOff: + seq.voltage = SEC_VOLTAGE_OFF; + break; + case voltage13: + seq.voltage = SEC_VOLTAGE_13; + break; + case voltage18: + seq.voltage = SEC_VOLTAGE_18; + break; + } seq.miniCommand = SEC_MINI_NONE; seq.commands=&cmd; seq.numCommands=1; - if ( ioctl(m_secfd, SEC_SEND_SEQUENCE, &seq) < 0 ) { eDebug("SEC_SEND_SEQUENCE failed ( %m )");