small fix
[enigma2.git] / lib / dvb / frontend.cpp
index a05963cd2bd892df8fc173edbfb3ba8a39cb73d6..a26f6bd85b36dffacf0246b57c34ba91f40230ac 100644 (file)
@@ -195,8 +195,8 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const
        {
        case iDVBFrontend::feSatellite:
        {
-               hash  = sat.frequency & 0xFFFF;
-               hash |= sat.orbital_position << 16;
+               hash = (sat.orbital_position << 16);
+               hash |= ((sat.frequency/1000)&0xFFFF)|((sat.polarisation&1) << 15);
                return 0;
        }
        case iDVBFrontend::feCable:
@@ -229,9 +229,6 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_c
                ok = 0;
                return;
        }
-       else
-               eDebug("m_secfd is %d", m_secfd);
-
        FrontendInfo fe_info;
        sprintf(filename, "/dev/dvb/card%d/frontend%d", adap, fe);
 #else
@@ -292,6 +289,10 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_c
        for (int i=0; i<entries; ++i)
                m_data[i] = -1;
 
+//     m_data[7] = !m_fe;
+
+//     eDebug("m_data[7] = %d %d", m_data[7], m_fe);
+
        return;
 }
 
@@ -333,7 +334,7 @@ void eDVBFrontend::feEvent(int w)
 #if HAVE_DVB_API_VERSION < 3
                if (event.type == FE_COMPLETION_EV)
 #else
-               eDebug("fe event: status %x, inversion %s", event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off");
+               eDebug("(%d)fe event: status %x, inversion %s", m_fe, event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off");
                if (event.status & FE_HAS_LOCK)
 #endif
                {
@@ -375,39 +376,57 @@ void eDVBFrontend::timeout()
                m_tuning = 0;
 }
 
+int eDVBFrontend::readFrontendData(int type)
+{
+       switch(type)
+       {
+               case bitErrorRate:
+               {
+                       uint32_t ber=0;
+                       if (ioctl(m_fd, FE_READ_BER, &ber) < 0 && errno != ERANGE)
+                               eDebug("FE_READ_BER failed (%m)");
+                       return ber;
+               }
+               case signalPower:
+               {
+                       uint16_t snr=0;
+                       if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE)
+                               eDebug("FE_READ_SNR failed (%m)");
+                       return snr;
+               }
+               case signalQuality:
+               {
+                       uint16_t strength=0;
+                       if (ioctl(m_fd, FE_READ_SIGNAL_STRENGTH, &strength) < 0 && errno != ERANGE)
+                               eDebug("FE_READ_SIGNAL_STRENGTH failed (%m)");
+                       return strength;
+               }
+       }
+       return 0;
+}
+
 #ifndef FP_IOCTL_GET_ID
 #define FP_IOCTL_GET_ID 0
 #endif
 int eDVBFrontend::readInputpower()
 {
-       int power=0;
-//     if ( eSystemInfo::getInstance()->canMeasureLNBCurrent() )
+       int power=m_fe;  // this is needed for read inputpower from the correct tuner !
+
+       // open front prozessor
+       int fp=::open("/dev/dbox/fp0", O_RDWR);
+       if (fp < 0)
        {
-//             switch ( eSystemInfo::getInstance()->getHwType() )
-               {
-//                     case eSystemInfo::DM7000:
-//                     case eSystemInfo::DM7020:
-                       {
-                               // open front prozessor
-                               int fp=::open("/dev/dbox/fp0", O_RDWR);
-                               if (fp < 0)
-                               {
-                                       eDebug("couldn't open fp");
-                                       return -1;
-                               }
-                               static bool old_fp = (::ioctl(fp, FP_IOCTL_GET_ID) < 0);
-                               if ( ioctl( fp, old_fp ? 9 : 0x100, &power ) < 0 )
-                               {
-                                       eDebug("FP_IOCTL_GET_LNB_CURRENT failed (%m)");
-                                       return -1;
-                               }
-                               ::close(fp);
-//                             break;
-                       }
-//                     default:
-//                             eDebug("Inputpower read for platform %d not yet implemented", eSystemInfo::getInstance()->getHwType());
-               }
+               eDebug("couldn't open fp");
+               return -1;
+       }
+       static bool old_fp = (::ioctl(fp, FP_IOCTL_GET_ID) < 0);
+       if ( ioctl( fp, old_fp ? 9 : 0x100, &power ) < 0 )
+       {
+               eDebug("FP_IOCTL_GET_LNB_CURRENT failed (%m)");
+               return -1;
        }
+       ::close(fp);
+
        return power;
 }
 
@@ -503,6 +522,7 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                if (!m_timeoutCount)
                                {
                                        eDebug("[SEC] rotor timout");
+                                       m_sec->setRotorMoving(false);
                                        setSecSequencePos(m_sec_sequence.current()->steps);
                                }
                                else
@@ -510,7 +530,10 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                break;
                        case eSecCommand::SET_POWER_LIMITING_MODE:
                        {
-                               int fd=::open("/dev/i2c/0", O_RDWR);
+                               int fd = m_fe ?
+                                       ::open("/dev/i2c/1", O_RDWR) :
+                                       ::open("/dev/i2c/0", O_RDWR);
+
                                unsigned char data[2];
                                ::ioctl(fd, I2C_SLAVE_FORCE, 0x10 >> 1);
                                if(::read(fd, data, 1) != 1)
@@ -553,6 +576,7 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                        eDebug("[SEC] rotor %s step %d ok", txt, cmd.okcount);
                                        if ( cmd.okcount > 6 )
                                        {
+                                               m_sec->setRotorMoving(cmd.direction);
                                                eDebug("[SEC] rotor is %s", txt);
                                                if (setSecSequencePos(cmd.steps))
                                                        break;
@@ -611,6 +635,8 @@ RESULT eDVBFrontend::getFrontendType(int &t)
 
 RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
 {
+       eDebug("(%d)tune", m_fe);
+
        if (m_type == -1)
                return -ENODEV;