Remove check legacy dvbapi version.
[vuplus_dvbapp] / lib / dvb / sec.cpp
index 08976ef..335c8b1 100644 (file)
@@ -2,15 +2,8 @@
 #include <lib/dvb/sec.h>
 #include <lib/dvb/rotor_calc.h>
 #include <lib/dvb/dvbtime.h>
-
-#include <set>
-
-#if HAVE_DVB_API_VERSION < 3
-#define FREQUENCY Frequency
-#else
-#define FREQUENCY frequency
-#endif
 #include <lib/base/eerror.h>
+#include <set>
 
 //#define SEC_DEBUG
 
@@ -49,18 +42,13 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBR
                if (!simulate) \
                        eSecDebug(x); \
        } while(0)
-//             else \
-//             { \
-//                     eDebugNoNewLine("SIMULATE:"); \
-//                     eDebug(x); \
-//             } \
 
 int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id, int *highest_score_lnb)
 {
        bool simulate = ((eDVBFrontend*)fe)->is_simulate();
        bool direct_connected = m_not_linked_slot_mask & slot_id;
        int score=0, satcount=0;
-       long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1,
+       long linked_prev_ptr=-1, linked_next_ptr=-1, linkable_csw=-1, linkable_ucsw=-1, linkable_toneburst=-1,
                fe_satpos_depends_ptr=-1, fe_rotor_pos=-1;
        bool linked_in_use = false;
 
@@ -94,9 +82,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        // when a linked in use tuner is found we get the tuner data...
        if (linked_in_use)
        {
-               fe->getData(eDVBFrontend::CSW, linked_csw);
-               fe->getData(eDVBFrontend::UCSW, linked_ucsw);
-               fe->getData(eDVBFrontend::TONEBURST, linked_toneburst);
+               fe->getData(eDVBFrontend::LINKABLE_CSW, linkable_csw);
+               fe->getData(eDVBFrontend::LINKABLE_UCSW, linkable_ucsw);
+               fe->getData(eDVBFrontend::LINKABLE_TONEBURST, linkable_toneburst);
        }
 
        if (highest_score_lnb)
@@ -169,8 +157,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                if (linked_in_use && !is_unicable)
                                {
                                        // compare tuner data
-                                       if ( (csw != linked_csw) ||
-                                               ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) ||
+                                       if ( (csw != linkable_csw) ||
+                                               ( diseqc && (ucsw != linkable_ucsw || toneburst != linkable_toneburst) ) ||
                                                ( rotor && rotor_pos != sat.orbital_position ) )
                                        {
                                                ret = 0;
@@ -279,11 +267,6 @@ bool need_turn_fast(int turn_speed)
                if (!simulate) \
                        eDebug(x); \
        } while(0)
-//             else \
-//             { \
-//                     eDebugNoNewLine("SIMULATE:"); \
-//                     eDebug(x); \
-//             } \
 
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id, unsigned int tunetimeout)
 {
@@ -328,6 +311,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        int RotorCmd=-1;
                        int send_mask = 0;
 
+                       bool direct_connected = m_not_linked_slot_mask & slot_id;
+
                        lnb_param.guard_offset = 0; //HACK
 
 
@@ -336,7 +321,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                        frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
 
-                       if (!(m_not_linked_slot_mask & slot_id))  // frontend with direct connection?
+                       if (!direct_connected)  // frontend with direct connection?
                        {
                                long linked_prev_ptr;
                                frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
@@ -348,6 +333,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                }
                                if (satposDependPtr != -1)  // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb
                                        diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+#if 0 // Since following code causes lock fail for linked tuners in certain conditions, it does not apply.
                                else {
                                        // in eDVBFrontend::tuneLoop we call closeFrontend and ->inc_use() in this this condition (to put the kernel frontend thread into idle state)
                                        // so we must resend all diseqc stuff (voltage is disabled when the frontend is closed)
@@ -356,6 +342,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                        if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle)
                                                forceChanged = true;
                                }
+#endif
                        }
 
                        sec_fe->getData(eDVBFrontend::CSW, lastcsw);
@@ -379,8 +366,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                // calc Frequency
                                int local= abs(sat.frequency
                                        - lof);
-                               parm.FREQUENCY = ((((local * 2) / 125) + 1) / 2) * 125;
-                               frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
+                               parm.frequency = ((((local * 2) / 125) + 1) / 2) * 125;
+                               frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.frequency);
 
                                if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
                                        || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical
@@ -409,8 +396,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                                -lof)
                                                                - 100000;
                                                        volatile unsigned int tmp2 = (1000 + 2 * tmp1) / (2 *1000); //round to multiple of 1000
-                                                       parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2));
-                                                       frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.FREQUENCY));
+                                                       parm.frequency = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2));
+                                                       frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.frequency));
 
                                                        lnb_param.UnicableTuningWord =
                                                                  (band & 0x3)                                          //Bit0:HighLow  Bit1:VertHor
@@ -432,7 +419,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                                + lnb_param.guard_offset;
                                                        volatile unsigned int tmp2 = (4000 + 2 * tmp1) / (2 *4000); //round to multiple of 4000
 
-                                                       parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset;
+                                                       parm.frequency = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset;
                                                        lnb_param.UnicableTuningWord = tmp2
                                                                | ((band & 1) ? 0x400 : 0)                      //HighLow
                                                                | ((band & 2) ? 0x800 : 0)                      //VertHor
@@ -458,15 +445,22 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                                bool send_csw =
                                        (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
-                               bool changed_csw = send_csw && (forceChanged || csw != lastcsw);
 
                                bool send_ucsw =
                                        (di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0);
-                               bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
 
                                bool send_burst =
                                        (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
-                               bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
+
+                               bool changed_csw = false;
+                               bool changed_ucsw = false;
+                               bool changed_burst = false;
+                               if (direct_connected || (linked_fe && (!linked_fe->m_frontend->isLoopTimerActive() || !linked_fe->m_frontend->isScheduledSendDiseqc())))
+                               {
+                                       changed_csw = send_csw && (forceChanged || csw != lastcsw);
+                                       changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
+                                       changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
+                               }
 
                                /* send_mask
                                        1 must send csw
@@ -727,6 +721,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        sec_fe->setData(eDVBFrontend::NEW_CSW, csw);
                        sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw);
                        sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param);
+                       sec_fe->setData(eDVBFrontend::LINKABLE_CSW, csw);
+                       sec_fe->setData(eDVBFrontend::LINKABLE_UCSW, ucsw);
+                       sec_fe->setData(eDVBFrontend::LINKABLE_TONEBURST, di_param.m_toneburst_param);
 
                        if(is_unicable)
                        {
@@ -1166,6 +1163,13 @@ RESULT eDVBSatelliteEquipmentControl::clear()
                it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1);
                it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1);
                it->m_frontend->setData(eDVBFrontend::SATCR, -1);
+
+               if (it->m_frontend->is_FBCTuner())
+               {
+                       eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance();
+                       if (fbcmng)
+                               fbcmng->setDefaultFBCID(*it);
+               }
        }
 
        for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it)
@@ -1610,6 +1614,12 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
                        char c;
                        p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2);
                        p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1);
+
+                       eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance();
+                       if (p1->m_frontend->is_FBCTuner() && fbcmng)
+                       {
+                               fbcmng->updateFBCID(p1, p2);
+                       }
                }
 
                p1=p2=NULL;