X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsec.cpp;h=335c8b1b80bc0ad9f70c519fda756b9c4f1757ce;hp=08976ef5f36acbffb577e95dccbc6ba70fc6fdce;hb=d8e08fe0a7304ed06b3de0b9ad6d4265ec8063b8;hpb=7b7a80a1f979b0bd9c68aa33af968db25bf63f81 diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 08976ef..335c8b1 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -2,15 +2,8 @@ #include #include #include - -#include - -#if HAVE_DVB_API_VERSION < 3 -#define FREQUENCY Frequency -#else -#define FREQUENCY frequency -#endif #include +#include //#define SEC_DEBUG @@ -49,18 +42,13 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrListis_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::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;