X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/39862e4439df37f150796d3d99352b8859de0736..462ec6f4ad2051551cb91c75ba614d3b7b17c543:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 7bceaf58..9d4061e6 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -218,10 +218,11 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok) #endif { #if HAVE_DVB_API_VERSION < 3 + sprintf(m_filename, "/dev/dvb/card%d/frontend%d", adap, fe); sprintf(m_sec_filename, "/dev/dvb/card%d/sec%d", adap, fe); -#endif +#else sprintf(m_filename, "/dev/dvb/adapter%d/frontend%d", adap, fe); - +#endif m_timeout = new eTimer(eApp); CONNECT(m_timeout->timeout, eDVBFrontend::timeout); @@ -331,9 +332,11 @@ int eDVBFrontend::closeFrontend() return -1; } } - eDebug("close frontend %d", m_fe); if (m_fd >= 0) { + eDebug("close frontend %d", m_fe); + setTone(iDVBFrontend::toneOff); + setVoltage(iDVBFrontend::voltageOff); ::close(m_fd); m_fd=-1; } @@ -347,8 +350,6 @@ int eDVBFrontend::closeFrontend() delete m_sn; m_sn=0; - setTone(iDVBFrontend::toneOff); - setVoltage(iDVBFrontend::voltageOff); return 0; } @@ -399,9 +400,7 @@ void eDVBFrontend::feEvent(int w) else { state = stateLostLock; - - if (m_state != stateLostLock) - eDebug("FIXME: we lost lock, so we might have to retune."); + m_data[0] = m_data[1] = m_data[2] = -1; // reset diseqc } } if (m_state != state) @@ -519,10 +518,12 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer ++m_sec_sequence.current(); break; case eSecCommand::SET_VOLTAGE: + { int voltage = m_sec_sequence.current()++->voltage; eDebug("[SEC] setVoltage %d", voltage); setVoltage(voltage); break; + } case eSecCommand::SET_TONE: eDebug("[SEC] setTone %d", m_sec_sequence.current()->tone); setTone(m_sec_sequence.current()++->tone); @@ -593,12 +594,12 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer eDebug("[SEC] error read lnbp (%m)"); if ( m_sec_sequence.current()->mode == eSecCommand::modeStatic ) { - data[0] |= 0x90; // enable static current limiting + data[0] |= 0x80; // enable static current limiting eDebug("[SEC] set static current limiting"); } else { - data[0] &= ~0x90; // enable dynamic current limiting + data[0] &= ~0x80; // enable dynamic current limiting eDebug("[SEC] set dynamic current limiting"); } if(::write(fd, data, 1) != 1) @@ -614,7 +615,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; case eSecCommand::IF_INPUTPOWER_DELTA_GOTO: { - int idleInputpower = m_idleInputpower[m_curVoltage == iDVBFrontend::voltage13 ? 0 : 1]; + int idleInputpower = m_idleInputpower[ (m_curVoltage&1) ? 0 : 1]; eSecCommand::rotor &cmd = m_sec_sequence.current()->measure; const char *txt = cmd.direction ? "running" : "stopped"; eDebug("[SEC] waiting for rotor %s %d, idle %d, delta %d", @@ -668,13 +669,6 @@ void eDVBFrontend::setFrontend() perror("FE_SET_FRONTEND failed"); return; } - - if (m_state != stateTuning) - { - m_tuning = 1; - m_state = stateTuning; - m_stateChanged(this); - } m_timeout->start(5000, 1); // 5 sec timeout. TODO: symbolrate dependent } @@ -949,6 +943,13 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) m_tuneTimer->start(0,true); m_sec_sequence.current() = m_sec_sequence.begin(); + if (m_state != stateTuning) + { + m_tuning = 1; + m_state = stateTuning; + m_stateChanged(this); + } + return 0; } @@ -965,9 +966,9 @@ RESULT eDVBFrontend::setVoltage(int voltage) #if HAVE_DVB_API_VERSION < 3 secVoltage vlt; #else + bool increased=false; fe_sec_voltage_t vlt; #endif - m_curVoltage=voltage; switch (voltage) { @@ -976,9 +977,23 @@ RESULT eDVBFrontend::setVoltage(int voltage) m_data[i]=-1; vlt = SEC_VOLTAGE_OFF; break; + case voltage13_5: +#if HAVE_DVB_API_VERSION < 3 + vlt = SEC_VOLTAGE_13_5; + break; +#else + increased = true; +#endif case voltage13: vlt = SEC_VOLTAGE_13; break; + case voltage18_5: +#if HAVE_DVB_API_VERSION < 3 + vlt = SEC_VOLTAGE_18_5; + break; +#else + increased = true; +#endif case voltage18: vlt = SEC_VOLTAGE_18; break; @@ -988,6 +1003,8 @@ RESULT eDVBFrontend::setVoltage(int voltage) #if HAVE_DVB_API_VERSION < 3 return ::ioctl(m_secfd, SEC_SET_VOLTAGE, vlt); #else + if (::ioctl(m_fd, FE_ENABLE_HIGH_LNB_VOLTAGE, increased) < 0) + perror("FE_ENABLE_HIGH_LNB_VOLTAGE"); return ::ioctl(m_fd, FE_SET_VOLTAGE, vlt); #endif }