fix deprecated conversion from string constant to char* by using const char* instead...
[enigma2.git] / lib / dvb / sec.cpp
index 7f45f576ff21ff77174bbabaadeffce0c4ed2358..655f64fca0be73995c08d06c89fec0953e6544dd 100644 (file)
@@ -1,6 +1,7 @@
 #include <lib/dvb/dvb.h>
 #include <lib/dvb/sec.h>
 #include <lib/dvb/rotor_calc.h>
+#include <lib/dvb/dvbtime.h>
 
 #include <set>
 
@@ -113,12 +114,12 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBR
        setRotorPosNum(1); // stored pos 1
 }
 
-static void checkLinkedParams(int direction, int &linked_ptr, int &ret, const eDVBFrontendParametersSatellite &sat, int csw, int ucsw, int toneburst, bool diseqc, bool rotor, int RotorPos)
+static void checkLinkedParams(int direction, long &linked_ptr, int &ret, const eDVBFrontendParametersSatellite &sat, int csw, int ucsw, int toneburst, bool diseqc, bool rotor, int RotorPos)
 {
        eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_ptr;
        if (linked_fe->m_inuse)
        {
-               int ocsw = -1,
+               long ocsw = -1,
                        oucsw = -1,
                        oToneburst = -1;
                linked_fe->m_frontend->getData(eDVBFrontend::CSW, ocsw);
@@ -144,7 +145,7 @@ static void checkLinkedParams(int direction, int &linked_ptr, int &ret, const eD
 //             else
 //                     eDebug("OK .. can tune this transponder with linked tuner in use :)");
        }
-       linked_fe->m_frontend->getData(direction, linked_ptr);
+       linked_fe->m_frontend->getData(direction, (long&)linked_ptr);
 }
 
 int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id )
@@ -165,7 +166,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                lnb_param.m_satellites.find(sat.orbital_position);
                        if ( sit != lnb_param.m_satellites.end())
                        {
-                               int band=0,
+                               long band=0,
                                        linked_prev_ptr=-1,
                                        linked_next_ptr=-1,
                                        satpos_depends_ptr=-1,
@@ -253,6 +254,30 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        return ret;
 }
 
+bool need_turn_fast(int turn_speed)
+{
+       if (turn_speed == eDVBSatelliteRotorParameters::FAST)
+               return true;
+       else if (turn_speed != eDVBSatelliteRotorParameters::SLOW)
+       {
+               int begin = turn_speed >> 16; // high word is start time
+               int end = turn_speed&0xFFFF; // low word is end time
+               time_t now_time = eDVBLocalTimeHandler::getInstance()->nowTime();
+               tm nowTime;
+               localtime_r(&now_time, &nowTime);
+               int now = (nowTime.tm_hour + 1) * 60 + nowTime.tm_min + 1;
+               bool neg = end <= begin;
+               if (neg) {
+                       int tmp = begin;
+                       begin = end;
+                       end = tmp;
+               }
+               if ((now >= begin && now < end) ^ neg)
+                       return true;
+       }
+       return false;
+}
+
 #define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x)
 
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id)
@@ -273,7 +298,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        bool doSetFrontend = true;
                        bool doSetVoltageToneFrontend = m_not_linked_slot_mask & slot_id;
                        bool allowDiseqc1_2 = true;
-                       int band=0,
+                       long band=0,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
                                csw = di_param.m_committed_cmd,
@@ -582,7 +607,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                }
                                        }
 
-                                       eDebug("RotorCmd %02x, lastRotorCmd %02x", RotorCmd, lastRotorCmd);
+                                       eDebug("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd);
                                        if ( RotorCmd != -1 && RotorCmd != lastRotorCmd )
                                        {
                                                eSecCommand::pair compare;
@@ -678,7 +703,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, +9 ) );  // timeout .. we assume now the rotor is already at the correct position
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) );  // goto loop start
 ////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
+                                                       if (need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed))
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) );  // 2 minutes running timeout
 // rotor running loop
                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
@@ -788,6 +814,18 @@ RESULT eDVBSatelliteEquipmentControl::clear()
        //reset some tuner configuration
        for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it)
        {
+               long tmp;
+               if (!strcmp(it->m_frontend->getDescription(), "BCM4501 (internal)") && !it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp) && tmp != -1)
+               {
+                       FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w");
+                       if (!f || fwrite("B", 1, 1, f) != 1)
+                               eDebug("set /proc/stb/tsmux/lnb_b_input to B failed!! (%m)");
+                       else
+                       {
+                               eDebug("set /proc/stb/tsmux/lnb_b_input to B OK");
+                               fclose(f);
+                       }
+               }
                it->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, -1);
                it->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, -1);
                it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1);
@@ -1072,6 +1110,16 @@ RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num)
        return 0;
 }
 
+RESULT eDVBSatelliteEquipmentControl::setRotorTurningSpeed(int speed)
+{
+       eSecDebug("eDVBSatelliteEquipmentControl::setRotorTurningSpeed(%d)", speed);
+       if ( currentLNBValid() )
+               m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_turning_speed = speed;
+       else
+               return -ENOENT;
+       return 0;
+}
+
 struct sat_compare
 {
        int orb_pos, lofl, lofh;
@@ -1119,7 +1167,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        do 
                        {
-                               int tmp;
+                               long tmp;
                                p1->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp);
                                if (tmp != -1)
                                        p1 = (eDVBRegisteredFrontend*)tmp;
@@ -1130,7 +1178,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        do 
                        {
-                               int tmp;
+                               long tmp;
                                p2->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp);
                                if (tmp != -1)
                                        p2 = (eDVBRegisteredFrontend*)tmp;
@@ -1141,8 +1189,8 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t
 
                        if (p1 != p2)
                        {
-                               int tmp1=-1;
-                               int tmp2=-1;
+                               long tmp1=-1;
+                               long tmp2=-1;
                                // check for rotor dependency
                                p1->m_frontend->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, tmp1);
                                if (tmp1 != -1)
@@ -1219,8 +1267,19 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
                }
                if (p1 && p2)
                {
-                       p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (int)p2);
-                       p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (int)p1);
+                       p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2);
+                       p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1);
+                       if (!strcmp(p1->m_frontend->getDescription(), p2->m_frontend->getDescription()) && !strcmp(p1->m_frontend->getDescription(), "BCM4501 (internal)"))
+                       {
+                               FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w");
+                               if (!f || fwrite("A", 1, 1, f) != 1)
+                                       eDebug("set /proc/stb/tsmux/lnb_b_input to A failed!! (%m)");
+                               else
+                               {
+                                       eDebug("set /proc/stb/tsmux/lnb_b_input to A OK");
+                                       fclose(f);
+                               }
+                       }
                        return 0;
                }
        }
@@ -1245,8 +1304,8 @@ RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2)
        }
        if (p1 && p2)
        {
-               p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (int)p2);
-               p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (int)p1);
+               p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p2);
+               p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p1);
                return 0;
        }
        return -1;