aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2008-04-28 22:38:57 +0000
committerFelix Domke <tmbinc@elitedvb.net>2008-04-28 22:38:57 +0000
commit4d7c619a4cc127d908c03780b6a6dca68d196ae3 (patch)
tree1ae41b3bc1bc42dc5f492790802892a9451330e3 /lib
parent19197375f0a6f073ef68b4906048c84386651a7a (diff)
downloadenigma2-4d7c619a4cc127d908c03780b6a6dca68d196ae3.tar.gz
enigma2-4d7c619a4cc127d908c03780b6a6dca68d196ae3.zip
make final tune timeout symbolrate depending
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/frontend.cpp48
-rw-r--r--lib/dvb/frontend.h3
-rw-r--r--lib/dvb/idvb.h3
-rw-r--r--lib/dvb/sec.cpp4
-rw-r--r--lib/dvb/sec.h2
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