show "in timer" icon also in multiepg
[enigma2.git] / lib / dvb / frontend.cpp
index 5d991a474d60cc4671d04189c42c6354ea9e4fb1..6896110cb8ccb1a6b96d04e99a156e60f19b5372 100644 (file)
@@ -57,10 +57,40 @@ void eDVBDiseqcCommand::setCommandString(const char *str)
 {
        if (!str)
                return;
-       len = strlen(str);
-       if (len > MAX_DISEQC_LENGTH)
-               len = MAX_DISEQC_LENGTH;
-       memcpy(data, str, len);
+       len=0;
+       int slen = strlen(str);
+       if (slen % 2)
+       {
+               eDebug("invalid diseqc command string length (not 2 byte aligned)");
+               return;
+       }
+       if (slen > MAX_DISEQC_LENGTH*2)
+       {
+               eDebug("invalid diseqc command string length (string is to long)");
+               return;
+       }
+       unsigned char val=0;
+       for (int i=0; i < slen; ++i)
+       {
+               unsigned char c = str[i];
+               switch(c)
+               {
+                       case '0' ... '9': c-=48; break;
+                       case 'a' ... 'f': c-=87; break;
+                       case 'A' ... 'F': c-=55; break;
+                       default:
+                               eDebug("invalid character in hex string..ignore complete diseqc command !");
+                               return;
+               }
+               if ( i % 2 )
+               {
+                       val |= c;
+                       data[i/2] = val;
+               }
+               else
+                       val = c << 4;
+       }
+       len = slen/2;
 }
 
 void eDVBFrontendParametersSatellite::set(const SatelliteDeliverySystemDescriptor &descriptor)
@@ -167,9 +197,10 @@ RESULT eDVBFrontendParameters::getDVBT(eDVBFrontendParametersTerrestrial &p) con
        return 0;
 }
 
-RESULT eDVBFrontendParameters::setDVBS(const eDVBFrontendParametersSatellite &p)
+RESULT eDVBFrontendParameters::setDVBS(const eDVBFrontendParametersSatellite &p, bool no_rotor_command_on_tune)
 {
        sat = p;
+       sat.no_rotor_command_on_tune = no_rotor_command_on_tune;
        m_type = iDVBFrontend::feSatellite;
        return 0;
 }
@@ -371,7 +402,6 @@ int eDVBFrontend::openFrontend()
 
        m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Read);
        CONNECT(m_sn->activated, eDVBFrontend::feEvent);
-       m_sn->start();
 
        return 0;
 }
@@ -392,8 +422,11 @@ int eDVBFrontend::closeFrontend()
        if (m_fd >= 0)
        {
                eDebug("close frontend %d", m_fe);
+               m_tuneTimer->stop();
                setTone(iDVBFrontend::toneOff);
                setVoltage(iDVBFrontend::voltageOff);
+               if (m_sec)
+                       m_sec->setRotorMoving(false);
                ::close(m_fd);
                m_fd=-1;
                m_data[0] = m_data[1] = m_data[2] = -1;
@@ -1175,6 +1208,8 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
 void eDVBFrontend::setFrontend()
 {
        eDebug("setting frontend %d", m_fe);
+       m_sn->start();
+       feEvent(-1);
        if (ioctl(m_fd, FE_SET_FRONTEND, &parm) == -1)
        {
                perror("FE_SET_FRONTEND failed");
@@ -1461,8 +1496,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
        if (m_type == -1)
                return -ENODEV;
 
-       feEvent(-1);
-
+       m_sn->stop();
        m_sec_sequence.clear();
 
        switch (m_type)
@@ -1476,6 +1510,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
                        return -EINVAL;
                }
                res=prepare_sat(feparm);
+               m_sec->setRotorMoving(false);
                break;
        }
        case feCable: