diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2008-04-28 22:38:57 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2008-04-28 22:38:57 +0000 |
| commit | 4d7c619a4cc127d908c03780b6a6dca68d196ae3 (patch) | |
| tree | 1ae41b3bc1bc42dc5f492790802892a9451330e3 /lib | |
| parent | 19197375f0a6f073ef68b4906048c84386651a7a (diff) | |
| download | enigma2-4d7c619a4cc127d908c03780b6a6dca68d196ae3.tar.gz enigma2-4d7c619a4cc127d908c03780b6a6dca68d196ae3.zip | |
make final tune timeout symbolrate depending
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dvb/frontend.cpp | 48 | ||||
| -rw-r--r-- | lib/dvb/frontend.h | 3 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 3 | ||||
| -rw-r--r-- | lib/dvb/sec.cpp | 4 | ||||
| -rw-r--r-- | lib/dvb/sec.h | 2 |
5 files changed, 49 insertions, 11 deletions
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 72250e0b..c7a475d2 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -380,6 +380,37 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const } } +RESULT eDVBFrontendParameters::calcLockTimeout(unsigned int &timeout) const +{ + switch (m_type) + { + case iDVBFrontend::feSatellite: + { + /* high symbol rate transponders tune faster, due to + requiring less zigzag and giving more symbols faster. + + 5s are definitely not enough on really low SR when + zigzag has to find the exact frequency first. + */ + if (sat.symbol_rate > 20000000) + timeout = 5000; + else if (sat.symbol_rate > 10000000) + timeout = 10000; + else + timeout = 20000; + return 0; + } + case iDVBFrontend::feCable: + timeout = 5000; + return 0; + case iDVBFrontend::feTerrestrial: + timeout = 5000; + return 0; + default: + return -1; + } +} + DEFINE_REF(eDVBFrontend); int eDVBFrontend::PriorityOrder=0; @@ -1317,9 +1348,11 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer ++m_sec_sequence.current(); break; case eSecCommand::START_TUNE_TIMEOUT: - m_timeout->start(5000, 1); // 5 sec timeout. TODO: symbolrate dependent + { + m_timeout->start(m_sec_sequence.current()->timeout, 1); ++m_sec_sequence.current(); break; + } case eSecCommand::SET_TIMEOUT: m_timeoutCount = m_sec_sequence.current()++->val; eDebug("[SEC] set timeout %d", m_timeoutCount); @@ -1522,7 +1555,7 @@ RESULT eDVBFrontend::getFrontendType(int &t) return 0; } -RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm) +RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm, unsigned int tunetimeout) { int res; if (!m_sec) @@ -1530,7 +1563,7 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm) eWarning("no SEC module active!"); return -ENOENT; } - res = m_sec->prepare(*this, parm, feparm, 1 << m_slotid); + res = m_sec->prepare(*this, parm, feparm, 1 << m_slotid, tunetimeout); if (!res) { eDebug("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d", @@ -1861,6 +1894,7 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) { + unsigned int timeout = 5000; eDebug("(%d)tune", m_dvbid); m_timeout->stop(); @@ -1883,6 +1917,8 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) m_sn->stop(); m_sec_sequence.clear(); + where.calcLockTimeout(timeout); + switch (m_type) { case feSatellite: @@ -1895,7 +1931,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) goto tune_error; } m_sec->setRotorMoving(false); - res=prepare_sat(feparm); + res=prepare_sat(feparm, timeout); if (res) goto tune_error; @@ -1913,7 +1949,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) if (res) goto tune_error; - m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); + m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, timeout) ); m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); break; } @@ -1933,7 +1969,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) std::string enable_5V; char configStr[255]; snprintf(configStr, 255, "config.Nims.%d.terrestrial_5V", m_slotid); - m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); + m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, timeout) ); ePythonConfigQuery::getConfigValue(configStr, enable_5V); if (enable_5V == "True") m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index 477ddf6a..ac681bbe 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -31,6 +31,7 @@ public: RESULT calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const; RESULT getHash(unsigned long &) const; + RESULT calcLockTimeout(unsigned int &) const; }; #ifndef SWIG @@ -104,7 +105,7 @@ public: RESULT getFrontendType(int &type); RESULT tune(const iDVBFrontendParameters &where); - RESULT prepare_sat(const eDVBFrontendParametersSatellite &); + RESULT prepare_sat(const eDVBFrontendParametersSatellite &, unsigned int timeout); RESULT prepare_cable(const eDVBFrontendParametersCable &); RESULT prepare_terrestrial(const eDVBFrontendParametersTerrestrial &); RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection); diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 36f580ca..3a5ef427 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -408,6 +408,7 @@ public: virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0; virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0; + virtual RESULT calcLockTimeout(unsigned int &) const = 0; }; SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontendParameters>, iDVBFrontendParametersPtr); @@ -482,7 +483,7 @@ SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontend>, iDVBFrontendPtr); class iDVBSatelliteEquipmentControl: public iObject { public: - virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id)=0; + virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int timeout)=0; virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0; virtual void setRotorMoving(bool)=0; }; diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 1e75d113..ddd950b4 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -280,7 +280,7 @@ bool need_turn_fast(int turn_speed) #define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x) -RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id) +RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id, unsigned int tunetimeout) { for (int idx=0; idx <= m_lnbidx; ++idx ) { @@ -788,7 +788,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (doSetFrontend) { - sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); + sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); } frontend.setSecSequence(sec_sequence); diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index dba55651..9522426b 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -280,7 +280,7 @@ public: #ifndef SWIG eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends); DECLARE_REF(eDVBSatelliteEquipmentControl); - RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id); + RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int tunetimeout); int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *, int frontend_id); bool currentLNBValid() { return m_lnbidx > -1 && m_lnbidx < (int)(sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters)); } #endif |
