enable/disable higher lnb voltage is now working
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Sun, 1 Jan 2006 14:00:05 +0000 (14:00 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Sun, 1 Jan 2006 14:00:05 +0000 (14:00 +0000)
lib/dvb/frontend.cpp
lib/dvb/idvb.h
lib/dvb/sec.cpp

index 0cb910fbde37228ad7e78ab844f1e477c7b010cd..a081a37ff81a647c67507c1ed5dc102c556aa76c 100644 (file)
@@ -614,7 +614,7 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                break;
                        case eSecCommand::IF_INPUTPOWER_DELTA_GOTO:
                        {
-                               int idleInputpower = m_idleInputpower[m_curVoltage == iDVBFrontend::voltage13 ? 0 : 1];
+                               int idleInputpower = m_idleInputpower[ (m_curVoltage&1) ? 0 : 1];
                                eSecCommand::rotor &cmd = m_sec_sequence.current()->measure;
                                const char *txt = cmd.direction ? "running" : "stopped";
                                eDebug("[SEC] waiting for rotor %s %d, idle %d, delta %d",
@@ -965,9 +965,9 @@ RESULT eDVBFrontend::setVoltage(int voltage)
 #if HAVE_DVB_API_VERSION < 3
        secVoltage vlt;
 #else
+       bool increased=false;
        fe_sec_voltage_t vlt;
 #endif
-
        m_curVoltage=voltage;
        switch (voltage)
        {
@@ -976,9 +976,23 @@ RESULT eDVBFrontend::setVoltage(int voltage)
                        m_data[i]=-1;
                vlt = SEC_VOLTAGE_OFF;
                break;
+       case voltage13_5:
+#if HAVE_DVB_API_VERSION < 3
+               vlt = SEC_VOLTAGE_13_5;
+               break;
+#else
+               increased = true;
+#endif
        case voltage13:
                vlt = SEC_VOLTAGE_13;
                break;
+       case voltage18_5:
+#if HAVE_DVB_API_VERSION < 3
+               vlt = SEC_VOLTAGE_18_5;
+               break;
+#else
+               increased = true;
+#endif
        case voltage18:
                vlt = SEC_VOLTAGE_18;
                break;
@@ -988,6 +1002,8 @@ RESULT eDVBFrontend::setVoltage(int voltage)
 #if HAVE_DVB_API_VERSION < 3
        return ::ioctl(m_secfd, SEC_SET_VOLTAGE, vlt);
 #else
+       if (::ioctl(m_fd, FE_ENABLE_HIGH_LNB_VOLTAGE, increased) < 0)
+               perror("FE_ENABLE_HIGH_LNB_VOLTAGE");
        return ::ioctl(m_fd, FE_SET_VOLTAGE, vlt);
 #endif
 }
index c1c0377f6e584f7c2c3d558551300c4b249796a9..399abaa57404d7e7ecc155f4683e0976ac5d0c57 100644 (file)
@@ -343,7 +343,7 @@ public:
        };
        virtual RESULT setTone(int tone)=0;
        enum {
-               voltageOff, voltage13, voltage18
+               voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
        };
        virtual RESULT setVoltage(int voltage)=0;
        virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
index 459e0c4fb5dd746de8e693d8714521364f9e3345..0c1d79ab29d8195b49fc9875d04bf045f3e86b71 100644 (file)
@@ -194,6 +194,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        return ret;
 }
 
+#define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x)
+
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)
 {
        bool linked=false;
@@ -297,12 +299,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V
                                || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Vertical
                                        && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
-                               voltage = iDVBFrontend::voltage13;
+                               voltage = VOLTAGE(13);
                        else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V
                                || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal
                                        && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
-                               voltage = iDVBFrontend::voltage18;
-
+                               voltage = VOLTAGE(18);
                        if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON)
                                || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) )
                                tone = iDVBFrontend::toneOn;
@@ -525,7 +526,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                if ( send_mask )
                                                {
                                                        // override first voltage change
-                                                       *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13);
+                                                       *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13));
                                                        // wait 1 second after first switch diseqc command
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) );
                                                }
@@ -537,7 +538,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        compare.voltage = voltage;
                                                        compare.steps = +3;
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) );
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
                                                }
 
@@ -565,10 +566,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_IDLE_INPUTPOWER_AVAIL_GOTO, +8) ); // already measured?
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 100) );  // wait 100msec before measure
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); // back to lower voltage
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); // back to lower voltage
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
 ////////////////////////////
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
@@ -583,12 +584,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        cmd.steps=+3;
                                                        cmd.okcount=0;
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );  // check if rotor has started
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +10 ) );  // timeout .. we assume now the rotor is already at the correct position
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +9 ) );  // timeout .. we assume now the rotor is already at the correct position
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // goto loop start
 ////////////////////
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 2400) );  // 2 minutes running timeout
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
 // rotor running loop
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
@@ -599,6 +599,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // running loop start
 /////////////////////
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
                                                        if ( linked )
                                                        {
                                                                frontend.setData(5, RotorCmd);