From d58968e5ca43995658257b6e89f092c7572cde0a Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Mon, 4 Aug 2008 10:50:15 +0000 Subject: [PATCH] fix tune failed problems on fast zap when a diseqc swicth is in use --- lib/dvb/frontend.cpp | 15 ++++++++++++++- lib/dvb/frontend.h | 3 +++ lib/dvb/sec.cpp | 14 ++++++++++---- lib/dvb/sec.h | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 0229724..255efd0 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -559,7 +559,6 @@ int eDVBFrontend::closeFrontend(bool force) m_fd=-1; else eWarning("couldnt close frontend %d", m_dvbid); - m_data[CSW] = m_data[UCSW] = m_data[TONEBURST] = -1; } #if HAVE_DVB_API_VERSION < 3 if (m_secfd >= 0) @@ -1519,6 +1518,20 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer else ++m_sec_sequence.current(); break; + case eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS: + eDebug("[SEC] invalidate current switch params"); + sec_fe_data[CSW] = -1; + sec_fe_data[UCSW] = -1; + sec_fe_data[TONEBURST] = -1; + ++m_sec_sequence.current(); + break; + case eSecCommand::UPDATE_CURRENT_SWITCHPARMS: + sec_fe_data[CSW] = sec_fe_data[NEW_CSW]; + sec_fe_data[UCSW] = sec_fe_data[NEW_UCSW]; + sec_fe_data[TONEBURST] = sec_fe_data[NEW_TONEBURST]; + eDebug("[SEC] update current switch params"); + ++m_sec_sequence.current(); + break; case eSecCommand::INVALIDATE_CURRENT_ROTORPARMS: eDebug("[SEC] invalidate current rotorparams"); sec_fe_data[ROTOR_CMD] = -1; diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index 6643db0..49e2da8 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -43,6 +43,9 @@ class eDVBFrontend: public iDVBFrontend, public Object { public: enum { + NEW_CSW, + NEW_UCSW, + NEW_TONEBURST, CSW, // state of the committed switch UCSW, // state of the uncommitted switch TONEBURST, // current state of toneburst switch diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 9e76bb9..3d8084c 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -544,8 +544,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA // check if voltage is disabled compare.voltage = iDVBFrontend::voltageOff; - compare.steps = +4; + compare.steps = +5; sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) ); // voltage is changed... use DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); @@ -793,11 +794,14 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } } else + { + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) ); csw = band; + } - sec_fe->setData(eDVBFrontend::CSW, csw); - sec_fe->setData(eDVBFrontend::UCSW, ucsw); - sec_fe->setData(eDVBFrontend::TONEBURST, di_param.m_toneburst_param); + sec_fe->setData(eDVBFrontend::NEW_CSW, csw); + sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); + sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); if (doSetVoltageToneFrontend) { @@ -813,6 +817,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); } + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) ); + if (doSetFrontend) { sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index 92aff3d..2f30e78 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -19,6 +19,7 @@ public: MEASURE_IDLE_INPUTPOWER, MEASURE_RUNNING_INPUTPOWER, IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, IF_INPUTPOWER_DELTA_GOTO, UPDATE_CURRENT_ROTORPARAMS, INVALIDATE_CURRENT_ROTORPARMS, + UPDATE_CURRENT_SWITCHPARMS, INVALIDATE_CURRENT_SWITCHPARMS, IF_ROTORPOS_VALID_GOTO, IF_TUNER_LOCKED_GOTO, IF_TONE_GOTO, IF_NOT_TONE_GOTO, -- 2.7.4