parsing for /etc/timezone.xml added
[enigma2.git] / lib / dvb / frontend.cpp
index a4ad170da539afd1279abbe75139b0c489d5d1c4..13ae473b89750a7e9ecf4b4aeba5f3b40543456c 100644 (file)
@@ -6,6 +6,10 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 
+#ifndef I2C_SLAVE_FORCE
+#define I2C_SLAVE_FORCE        0x0706
+#endif
+
 #if HAVE_DVB_API_VERSION < 3
 #include <ost/frontend.h>
 #include <ost/sec.h>
@@ -127,21 +131,21 @@ RESULT eDVBFrontendParameters::getDVBT(eDVBFrontendParametersTerrestrial &p) con
        return 0;
 }
 
-RESULT eDVBFrontendParameters::setDVBS(eDVBFrontendParametersSatellite &p)
+RESULT eDVBFrontendParameters::setDVBS(const eDVBFrontendParametersSatellite &p)
 {
        sat = p;
        m_type = iDVBFrontend::feSatellite;
        return 0;
 }
 
-RESULT eDVBFrontendParameters::setDVBC(eDVBFrontendParametersCable &p)
+RESULT eDVBFrontendParameters::setDVBC(const eDVBFrontendParametersCable &p)
 {
        cable = p;
        m_type = iDVBFrontend::feCable;
        return 0;
 }
 
-RESULT eDVBFrontendParameters::setDVBT(eDVBFrontendParametersTerrestrial &p)
+RESULT eDVBFrontendParameters::setDVBT(const eDVBFrontendParametersTerrestrial &p)
 {
        terrestrial = p;
        m_type = iDVBFrontend::feTerrestrial;
@@ -204,7 +208,7 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const
 
 DEFINE_REF(eDVBFrontend);
 
-eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_curVoltage(-1)
+eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_curVoltage(-1)
 {
 #if HAVE_DVB_API_VERSION < 3
        char sec_filename[128];
@@ -337,7 +341,12 @@ void eDVBFrontend::feEvent(int w)
                        if (m_tuning)
                                state = stateTuning;
                        else
-                               state = stateFailed;
+                       {
+                               state = stateLostLock;
+
+                               if (m_state != stateLostLock)
+                                       eDebug("FIXME: we lost lock, so we might have to retune.");
+                       }
                }
                if (m_state != state)
                {
@@ -359,6 +368,7 @@ void eDVBFrontend::timeout()
                        m_state = state;
                        m_stateChanged(this);
                }
+               m_tuning = 0;
        } else
                m_tuning = 0;
 }
@@ -606,8 +616,6 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
 
        m_sec_sequence.clear();
 
-       eDebug("eDVBFrontend::tune. type: %d", m_type);
-
        switch (m_type)
        {
        case feSatellite:
@@ -625,7 +633,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
                        return -ENOENT;
                }
                
-               res = m_sec->prepare(*this, parm, feparm);
+               res = m_sec->prepare(*this, parm, feparm, m_fe ? 1 << m_fe : 1);
                if (res)
                        return res;
 #if HAVE_DVB_API_VERSION < 3
@@ -900,3 +908,16 @@ RESULT eDVBFrontend::setData(int num, int val)
        return -EINVAL;
 }
 
+int eDVBFrontend::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)
+{
+       if (m_type != eDVBFrontend::feSatellite)
+               return 1;
+
+       ASSERT(m_sec);
+
+       eDVBFrontendParametersSatellite sat_parm;
+
+       ASSERT(!feparm->getDVBS(sat_parm));
+
+       return m_sec->canTune(sat_parm, this, m_fe ? 1 << m_fe : 1);
+}