Add DiSEqC reset after voltage enable and tune failed... hopefully this fixes problem...
[enigma2.git] / lib / dvb / frontend.cpp
index 8bfe48583ae12642c853bfdade8137b813f7ee18..635de8f55778145b3c5567184189c58d87eb69f7 100644 (file)
@@ -443,7 +443,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_sn(0), m_timeout(0), m_tuneTimer(0)
+       , m_timeout(0), m_tuneTimer(0)
 #if HAVE_DVB_API_VERSION < 3
        ,m_secfd(-1)
 #endif
@@ -455,10 +455,10 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate)
        sprintf(m_filename, "/dev/dvb/adapter%d/frontend%d", adap, fe);
 #endif
 
-       m_timeout = new eTimer(eApp);
+       m_timeout = eTimer::create(eApp);
        CONNECT(m_timeout->timeout, eDVBFrontend::timeout);
 
-       m_tuneTimer = new eTimer(eApp);
+       m_tuneTimer = eTimer::create(eApp);
        CONNECT(m_tuneTimer->timeout, eDVBFrontend::tuneLoop);
 
        for (int i=0; i<eDVBFrontend::NUM_DATA_ENTRIES; ++i)
@@ -555,7 +555,7 @@ int eDVBFrontend::openFrontend()
 
        if (!m_simulate)
        {
-               m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Read, false);
+               m_sn = eSocketNotifier::create(eApp, m_fd, eSocketNotifier::Read, false);
                CONNECT(m_sn->activated, eDVBFrontend::feEvent);
        }
 
@@ -607,7 +607,6 @@ int eDVBFrontend::closeFrontend(bool force)
                        eWarning("couldnt close sec %d", m_dvbid);
        }
 #endif
-       delete m_sn;
        m_sn=0;
        m_state = stateClosed;
 
@@ -618,8 +617,6 @@ eDVBFrontend::~eDVBFrontend()
 {
        m_data[LINKED_PREV_PTR] = m_data[LINKED_NEXT_PTR] = -1;
        closeFrontend();
-       delete m_timeout;
-       delete m_tuneTimer;
 }
 
 void eDVBFrontend::feEvent(int w)
@@ -1276,14 +1273,15 @@ void eDVBFrontend::getTransponderData(ePyObject dest, bool original)
                        case feTerrestrial:
                        {
                                FRONTENDPARAMETERS front;
-                               if (!original)
+                               if (m_fd == -1 && !original)
+                                       original = true;
+                               else if (ioctl(m_fd, FE_GET_FRONTEND, &front)<0)
                                {
-                                       if (!m_simulate && m_fd != -1 && ioctl(m_fd, FE_GET_FRONTEND, &front)<0)
-                                               eDebug("FE_GET_FRONTEND (%m)");
+                                       eDebug("FE_GET_FRONTEND failed (%m)");
+                                       original = true;
                                }
-                               else
                                {
-                                       const FRONTENDPARAMETERS &parm = original ? this->parm : front;
+                                       const FRONTENDPARAMETERS &parm = original || m_simulate ? this->parm : front;
                                        const char *tmp = "INVERSION_AUTO";
                                        switch(parm_inversion)
                                        {
@@ -1417,11 +1415,13 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                tmp = prev->m_frontend->m_data[LINKED_PREV_PTR];
                if (tmp == -1 && sec_fe != this && !prev->m_inuse) {
                        int state = sec_fe->m_state;
+                       // workaround to put the kernel frontend thread into idle state!
                        if (state != eDVBFrontend::stateIdle && state != stateClosed)
                        {
                                sec_fe->closeFrontend(true);
                                state = sec_fe->m_state;
                        }
+                       // sec_fe is closed... we must reopen it here..
                        if (state == eDVBFrontend::stateClosed)
                        {
                                regFE = prev;
@@ -1492,7 +1492,12 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                eDebugNoSimulateNoNewLine("[SEC] sendDiseqc: ");
                                for (int i=0; i < m_sec_sequence.current()->diseqc.len; ++i)
                                    eDebugNoSimulateNoNewLine("%02x", m_sec_sequence.current()->diseqc.data[i]);
-                               eDebugNoSimulate("");
+                               if (!memcmp(m_sec_sequence.current()->diseqc.data, "\xE0\x00\x00", 3))
+                                       eDebugNoSimulate("(DiSEqC reset)");
+                               else if (!memcmp(m_sec_sequence.current()->diseqc.data, "\xE0\x00\x03", 3))
+                                       eDebugNoSimulate("(DiSEqC peripherial power on)");
+                               else
+                                       eDebugNoSimulate("");
                                ++m_sec_sequence.current();
                                break;
                        case eSecCommand::SEND_TONEBURST: