fix tune failed problems on fast zap when a diseqc swicth is in use
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 4 Aug 2008 10:50:15 +0000 (10:50 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 4 Aug 2008 10:50:15 +0000 (10:50 +0000)
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/dvb/sec.cpp
lib/dvb/sec.h

index 02297243160044ce6d29855f0b422b4ab8bf18ce..255efd08c8edb3b6f82fa9878ef60f263d601129 100644 (file)
@@ -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;
index 6643db03edc9705899fff1f23efdee16f1769c32..49e2da89ffce2b8e54a1cb41324ecc6d7b24fade 100644 (file)
@@ -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
index 9e76bb907606b715a75f17a6731764e14a6edf8c..3d8084c84d2f0d3a0bf8624fa326393560bc421b 100644 (file)
@@ -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) );
index 92aff3dc1dc4002eef5e0d00f78310d2b586b00c..2f30e7817f3e2df4df770d675718a436c63f6701 100644 (file)
@@ -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,