Merge commit 'origin/bug_449_fix_wlan_usbstick_recognition'
[enigma2.git] / lib / dvb / frontend.cpp
index b91c0ca7aaedba63caefb050d9391362f4bfa606..f85a37fe33580ab507d2c2f94c799a524c4fe76f 100644 (file)
@@ -455,7 +455,7 @@ int eDVBFrontend::PriorityOrder=0;
 
 eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate)
        :m_simulate(simulate), m_enabled(false), m_type(-1), m_dvbid(fe), m_slotid(fe)
-       ,m_fd(-1), m_need_rotor_workaround(false), m_can_handle_dvbs2(false)
+       ,m_fd(-1), m_rotor_mode(false), m_need_rotor_workaround(false), m_can_handle_dvbs2(false)
        ,m_state(stateClosed), m_timeout(0), m_tuneTimer(0)
 #if HAVE_DVB_API_VERSION < 3
        ,m_secfd(-1)
@@ -604,7 +604,7 @@ int eDVBFrontend::closeFrontend(bool force)
                setVoltage(iDVBFrontend::voltageOff);
                m_tuneTimer->stop();
                if (m_sec && !m_simulate)
-                       m_sec->setRotorMoving(false);
+                       m_sec->setRotorMoving(m_slotid, false);
                if (!::close(m_fd))
                        m_fd=-1;
                else
@@ -666,20 +666,34 @@ void eDVBFrontend::feEvent(int w)
 #if HAVE_DVB_API_VERSION < 3
                if (event.type == FE_COMPLETION_EV)
 #else
-               eDebug("(%d)fe event: status %x, inversion %s", m_dvbid, event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off");
+               eDebug("(%d)fe event: status %x, inversion %s, m_tuning %d", m_dvbid, event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off", m_tuning);
                if (event.status & FE_HAS_LOCK)
 #endif
                {
                        state = stateLock;
                } else
                {
-                       if (m_tuning)
+                       if (m_tuning) {
                                state = stateTuning;
+#if HAVE_DVB_API_VERSION >= 3
+                               if (event.status & FE_TIMEDOUT) {
+                                       eDebug("FE_TIMEDOUT! ..abort");
+                                       m_tuneTimer->stop();
+                                       timeout();
+                                       return;
+                               }
+                               ++m_tuning;
+#else
+                               m_tuneTimer->stop();
+                               timeout();
+#endif
+                       }
                        else
                        {
                                eDebug("stateLostLock");
                                state = stateLostLock;
-                               sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc
+                               if (!m_rotor_mode)
+                                       sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc
                        }
                }
                if (m_state != state)
@@ -737,7 +751,7 @@ int eDVBFrontend::readFrontendData(int type)
                                float SDS_SNRE = snr << 16;
                                float snr_in_db;
 
-                               if (parm_u_qpsk_fec_inner <= FEC_AUTO) // DVB-S1 / QPSK
+                               if (oparm.sat.system == eDVBFrontendParametersSatellite::System_DVB_S) // DVB-S1 / QPSK
                                {
                                        static float SNR_COEFF[6] = {
                                                100.0 / 4194304.0,
@@ -791,7 +805,7 @@ int eDVBFrontend::readFrontendData(int type)
                                ret = (int)(snr_in_db * 100);
                        }
                        else if (strstr(m_description, "Alps BSBE1 C01A") ||
-                               !strcmp(m_description, "Alps -S(STV0288)"))
+                               strstr(m_description, "Alps -S(STV0288)"))
                        {
                                if (snr == 0)
                                        ret = 0;
@@ -860,7 +874,7 @@ int eDVBFrontend::readFrontendData(int type)
                                if (snr != 0)
                                        ret = 10 * (int)(-100 * (log10(snr) - log10(255)));
                        }
-                       else if (!strcmp(m_description, "BCM4506"))
+                       else if (strstr(m_description, "BCM4506") || strstr(m_description, "BCM4505"))
                                ret = (snr * 100) >> 8;
 
                        if (type == signalQuality)
@@ -1681,12 +1695,12 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                break;
                        case eSecCommand::SET_ROTOR_MOVING:
                                if (!m_simulate)
-                                       m_sec->setRotorMoving(true);
+                                       m_sec->setRotorMoving(m_slotid, true);
                                ++m_sec_sequence.current();
                                break;
                        case eSecCommand::SET_ROTOR_STOPPED:
                                if (!m_simulate)
-                                       m_sec->setRotorMoving(false);
+                                       m_sec->setRotorMoving(m_slotid, false);
                                ++m_sec_sequence.current();
                                break;
                        case eSecCommand::IF_INPUTPOWER_DELTA_GOTO:
@@ -1845,7 +1859,6 @@ void eDVBFrontend::setFrontend(bool recvEvents)
                if (recvEvents)
                        m_sn->start();
                feEvent(-1); // flush events
-               if (ioctl(m_fd, FE_SET_FRONTEND, &parm) == -1)
 #if HAVE_DVB_API_VERSION >= 5
                if (m_type == iDVBFrontend::feSatellite)
                {
@@ -1881,12 +1894,12 @@ void eDVBFrontend::setFrontend(bool recvEvents)
                        cmdseq.props = p;
                        p[0].cmd = DTV_CLEAR;
                        p[1].cmd = DTV_DELIVERY_SYSTEM, p[1].u.data = system;
-                       p[2].cmd = DTV_FREQUENCY,       p[1].u.data = parm_frequency;
+                       p[2].cmd = DTV_FREQUENCY,       p[2].u.data = parm_frequency;
                        p[3].cmd = DTV_MODULATION,      p[3].u.data = modulation;
                        p[4].cmd = DTV_SYMBOL_RATE,     p[4].u.data = parm_u_qpsk_symbol_rate;
                        p[5].cmd = DTV_INNER_FEC,       p[5].u.data = parm_u_qpsk_fec_inner;
                        p[6].cmd = DTV_INVERSION,       p[6].u.data = parm_inversion;
-                       if (system = SYS_DVBS2)
+                       if (system == SYS_DVBS2)
                        {
                                p[7].cmd = DTV_ROLLOFF,         p[7].u.data = rolloff;
                                p[8].cmd = DTV_PILOT,           p[8].u.data = pilot;
@@ -2331,8 +2344,22 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
                        res = -EINVAL;
                        goto tune_error;
                }
+               if (m_rotor_mode != feparm.no_rotor_command_on_tune && !feparm.no_rotor_command_on_tune)
+               {
+                       eDVBFrontend *sec_fe = this;
+                       long tmp = m_data[LINKED_PREV_PTR];
+                       while (tmp != -1)
+                       {
+                               eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*)tmp;
+                               sec_fe = linked_fe->m_frontend;
+                               sec_fe->getData(LINKED_NEXT_PTR, tmp);
+                       }
+                       eDebug("(fe%d) reset diseqc after leave rotor mode!", m_dvbid);
+                       sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = sec_fe->m_data[ROTOR_CMD] = sec_fe->m_data[ROTOR_POS] = -1; // reset diseqc
+               }
+               m_rotor_mode = feparm.no_rotor_command_on_tune;
                if (!m_simulate)
-                       m_sec->setRotorMoving(false);
+                       m_sec->setRotorMoving(m_slotid, false);
                res=prepare_sat(feparm, timeout);
                if (res)
                        goto tune_error;
@@ -2388,9 +2415,9 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
        if (!m_simulate)
        {
                m_tuneTimer->start(0,true);
+               m_tuning = 1;
                if (m_state != stateTuning)
                {
-                       m_tuning = 1;
                        m_state = stateTuning;
                        m_stateChanged(this);
                }