Add possibility to set Pilot also for DVB-S2 non 8PSK Transponders (i.e. the new...
[enigma2.git] / lib / dvb / frontend.cpp
index bfb82a9246c8e29f236fe6fdd3b89fe258cbd70c..b0e92d39ea1f0a078d9717eff484f40b27969983 100644 (file)
                if (!m_simulate) \
                        eDebug(x); \
        } while(0)
-//             else \
-//             { \
-//                     eDebugNoNewLine("SIMULATE:"); \
-//                     eDebug(x); \
-//             } \
+#if 0
+               else \
+               { \
+                       eDebugNoNewLine("SIMULATE:"); \
+                       eDebug(x); \
+               }
+#endif
 
 #define eDebugNoSimulateNoNewLine(x...) \
        do { \
                if (!m_simulate) \
                        eDebugNoNewLine(x); \
        } while(0)
-//             else \
-//             { \
-//                     eDebugNoNewLine("SIMULATE:"); \
-//                     eDebugNoNewLine(x); \
-//             } \
+#if 0
+               else \
+               { \
+                       eDebugNoNewLine("SIMULATE:"); \
+                       eDebugNoNewLine(x); \
+               }
+#endif
 
 void eDVBDiseqcCommand::setCommandString(const char *str)
 {
@@ -443,7 +447,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 +459,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 +559,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 +611,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 +621,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)
@@ -728,34 +729,58 @@ int eDVBFrontend::readFrontendData(int type)
                        if (!strcmp(m_description, "BCM4501 (internal)"))
                        {
                                unsigned int SDS_SNRE = snr << 16;
+                               float snr_in_db;
 
-                               static float SNR_COEFF[6] = {
-                                       100.0 / 4194304.0,
-                                       -7136.0 / 4194304.0,
-                                       197418.0 / 4194304.0,
-                                       -2602183.0 / 4194304.0,
-                                       20377212.0 / 4194304.0,
-                                       -37791203.0 / 4194304.0,
-                               };
-
-                               float fval1, fval2, snr_in_db;
-                               int i;
-                               fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0));
-                               fval2 = pow(10.0, fval1)-1;
-                               fval1 = 10.0 * log10(fval2);
-
-                               if (fval1 < 10.0)
+                               if (parm_u_qpsk_fec_inner <= FEC_AUTO) // DVB-S1 / QPSK
                                {
-                                       fval2 = SNR_COEFF[0];
-                                       for (i=0; i<6; ++i)
+                                       static float SNR_COEFF[6] = {
+                                               100.0 / 4194304.0,
+                                               -7136.0 / 4194304.0,
+                                               197418.0 / 4194304.0,
+                                               -2602183.0 / 4194304.0,
+                                               20377212.0 / 4194304.0,
+                                               -37791203.0 / 4194304.0,
+                                       };
+                                       float fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0)),
+                                         fval2 = pow(10.0, fval1)-1;
+                                       fval1 = 10.0 * log10(fval2);
+
+                                       if (fval1 < 10.0)
                                        {
-                                               fval2 *= fval1;
-                                               fval2 += SNR_COEFF[i];
+                                               fval2 = SNR_COEFF[0];
+                                               for (int i=0; i<6; ++i)
+                                               {
+                                                       fval2 *= fval1;
+                                                       fval2 += SNR_COEFF[i];
+                                               }
+                                               fval1 = fval2;
                                        }
-                                       fval1 = fval2;
+                                       snr_in_db = fval1;
                                }
-                               snr_in_db = fval1;
+#if HAVE_DVB_API_VERSION >= 3
+                               else
+                               {
+                                       float fval1 = SDS_SNRE / 268435456.0,
+                                                 fval2, fval3, fval4;
 
+                                       if (parm_u_qpsk_fec_inner <= FEC_S2_QPSK_9_10) // DVB-S2 QPSK
+                                       {
+                                               fval2 = 6.76;
+                                               fval3 = 4.35;
+                                       }
+                                       else // 8PSK
+                                       {
+                                               fval1 *= 0.5;
+                                               fval2 = 8.06;
+                                               fval3 = 6.18;
+                                       }
+                                       fval4 = -10.0 * log10(fval1);
+                                       fval1 = fval4;
+                                       for (int i=0; i < 5; ++i)
+                                               fval1 = fval4 - fval2 * log10(1.0+pow(10.0, (fval3-fval1)/fval2));
+                                       snr_in_db = fval1;
+                               }
+#endif
                                return (int)(snr_in_db * 100.0);
                        }
                        else if (strstr(m_description, "Alps BSBE1 C01A") ||
@@ -784,7 +809,6 @@ int eDVBFrontend::readFrontendData(int type)
                                                i;
                                        if(INRANGE(CN_lookup[Imin][REGVAL],regval,CN_lookup[Imax][REGVAL]))
                                        {
-                                               long val;
                                                while((Imax-Imin)>1)
                                                {
                                                        i=(Imax+Imin)/2;
@@ -990,22 +1014,19 @@ void fillDictWithSatelliteData(ePyObject dict, const FRONTENDPARAMETERS &parm, e
                        break;
                }
                PutToDict(dict, "rolloff", tmp);
-               if (parm_u_qpsk_fec_inner > FEC_S2_QPSK_9_10)
+               switch(parm_inversion & 0x30)
                {
-                       switch(parm_inversion & 0x30)
-                       {
-                       case 0: // pilot off
-                               tmp = "PILOT_OFF";
-                               break;
-                       case 0x10: // pilot on
-                               tmp = "PILOT_ON";
-                               break;
-                       case 0x20: // pilot auto
-                               tmp = "PILOT_AUTO";
-                               break;
-                       }
-                       PutToDict(dict, "pilot", tmp);
+               case 0: // pilot off
+                       tmp = "PILOT_OFF";
+                       break;
+               case 0x10: // pilot on
+                       tmp = "PILOT_ON";
+                       break;
+               case 0x20: // pilot auto
+                       tmp = "PILOT_AUTO";
+                       break;
                }
+               PutToDict(dict, "pilot", tmp);
                tmp = "DVB-S2";
        }
        else
@@ -1286,7 +1307,7 @@ void eDVBFrontend::getTransponderData(ePyObject dest, bool original)
                                {
                                        const FRONTENDPARAMETERS &parm = original || m_simulate ? this->parm : front;
                                        const char *tmp = "INVERSION_AUTO";
-                                       switch(parm_inversion)
+                                       switch(parm_inversion & 3)
                                        {
                                                case INVERSION_ON:
                                                        tmp = "INVERSION_ON";
@@ -1418,11 +1439,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;
@@ -1493,7 +1516,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:
@@ -1885,10 +1913,10 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
                                        return -EINVAL;
                        }
                        parm_inversion |= (feparm.rolloff << 2); // Hack.. we use bit 2..3 of inversion param for rolloff
+                       parm_inversion |= (feparm.pilot << 4); // Hack.. we use bit 4..5 of inversion param for pilot
                        if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation::M8PSK) {
                                parm_u_qpsk_fec_inner = (fe_code_rate_t)((int)parm_u_qpsk_fec_inner+9);
                                // 8PSK fec driver values are decimal 9 bigger
-                               parm_inversion |= (feparm.pilot << 4); // Hack.. we use bit 4..5 of inversion param for pilot
                        }
                }
 #endif