make final tune timeout symbolrate depending
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 28 Apr 2008 22:38:57 +0000 (22:38 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 28 Apr 2008 22:38:57 +0000 (22:38 +0000)
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/dvb/idvb.h
lib/dvb/sec.cpp
lib/dvb/sec.h

index 72250e0b955da0b1ea297d5c069136b5b21bc043..c7a475d2f10a221837cac6c72471b9a3b2ef98d2 100644 (file)
@@ -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) );
index 477ddf6a189c4cb009b86c287e2e7023c710d187..ac681bbe06ef8bc1c8edacf1b153f17329bce7dc 100644 (file)
@@ -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);
index 36f580ca394f9d3b39395a3652dbaa4cbc2cc0ce..3a5ef427823c10fae823a4a841c47fae401be91e 100644 (file)
@@ -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;
 };
index 1e75d113419a2347a777fd221adfc55db2e6a0b2..ddd950b47ee0837a7f12f1617451d956788bfa93 100644 (file)
@@ -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);
index dba5565100fff7c68c871bf4c0ae2aca592df7b0..9522426bd75022617786caa657e29d5a6ccb2767 100644 (file)
@@ -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