X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c942b1c829bf49d77dcdb2bfda776e6288c99828..c5fd2f27b90414ea8d6f6227c2ad34dda70c40e7:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 8b7b25db..0c1d79ab 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -21,14 +21,13 @@ DEFINE_REF(eDVBSatelliteEquipmentControl); eDVBSatelliteEquipmentControl *eDVBSatelliteEquipmentControl::instance; eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList &avail_frontends) - :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends) + :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_rotorMoving(false) { if (!instance) instance = this; clear(); -#if 0 // ASTRA addLNB(); setLNBTunerMask(3); @@ -62,7 +61,6 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList::iterator it(m_avail_frontends.begin()); - for (; it != m_avail_frontends.end(); ++it) - if ( !linked_to ) - { - found=true; - break; - } - else - --linked_to; - - if (found && it->m_inuse) + eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_to; + if (linked_fe->m_inuse) { int ocsw = -1, oucsw = -1, oToneburst = -1, oRotorPos = -1; - it->m_frontend->getData(0, ocsw); - it->m_frontend->getData(1, oucsw); - it->m_frontend->getData(2, oToneburst); - it->m_frontend->getData(6, oRotorPos); - + linked_fe->m_frontend->getData(0, ocsw); + linked_fe->m_frontend->getData(1, oucsw); + linked_fe->m_frontend->getData(2, oToneburst); + linked_fe->m_frontend->getData(6, oRotorPos); +#if 0 eDebug("compare csw %02x == lcsw %02x", csw, ocsw); if ( diseqc ) @@ -192,16 +176,16 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if ( rotor ) eDebug("compare pos %d == current pos %d", sat.orbital_position, oRotorPos); - +#endif if ( (csw != ocsw) || ( diseqc && (ucsw != oucsw || toneburst != oToneburst) ) || ( rotor && oRotorPos != sat.orbital_position ) ) { - eDebug("can not tune this transponder with linked tuner in use!!"); +// eDebug("can not tune this transponder with linked tuner in use!!"); ret=0; } - else - eDebug("OK .. can tune this transponder with linked tuner in use :)"); +// else +// eDebug("OK .. can tune this transponder with linked tuner in use :)"); } } } @@ -210,6 +194,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite return ret; } +#define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x) + RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id) { bool linked=false; @@ -250,19 +236,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (linked_to != -1) { - bool found=false; - eSmartPtrList::iterator it(m_avail_frontends.begin()); - for (; it != m_avail_frontends.end(); ++it) - if ( !linked_to ) - { - found=true; - break; - } - else - --linked_to; - if (found && it->m_inuse) + eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_to; + if (linked_fe->m_inuse) { - eDebug("[SEC] frontend is linked with another one and the other is in use.. so we dont do SEC!!"); + eDebug("[SEC] frontend is linked with another and the other one is in use.. so we dont do SEC!!"); linked=true; } } @@ -278,7 +255,19 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal) band |= 2; - parm.INVERSION = (!sat.inversion) ? INVERSION_ON : INVERSION_OFF; + switch (sat.inversion) + { + case eDVBFrontendParametersCable::Inversion::On: + parm.INVERSION = INVERSION_ON; + break; + case eDVBFrontendParametersCable::Inversion::Off: + parm.INVERSION = INVERSION_OFF; + break; + default: + case eDVBFrontendParametersCable::Inversion::Unknown: + parm.INVERSION = INVERSION_AUTO; + break; + } switch (sat.fec) { @@ -310,12 +299,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Vertical && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) - voltage = iDVBFrontend::voltage13; + voltage = VOLTAGE(13); else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) - voltage = iDVBFrontend::voltage18; - + voltage = VOLTAGE(18); if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) tone = iDVBFrontend::toneOn; @@ -328,10 +316,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) { if ( di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO ) - { csw = 0xF0 | (csw << 2); - csw |= band; - } + + csw |= band; bool send_csw = (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO); @@ -345,20 +332,57 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO); bool changed_burst = send_burst && toneburst != lastToneburst; - bool send_diseqc = changed_ucsw; - if (!send_diseqc) - send_diseqc = changed_burst && (send_ucsw || send_csw); - if (!send_diseqc) + int send_mask = 0; /* + 1 must send csw + 2 must send ucsw + 4 send toneburst first + 8 send toneburst at end */ + if (changed_burst) // toneburst first and toneburst changed { - send_diseqc = changed_csw; - if ( send_diseqc && di_param.m_use_fast && (csw & 0xF0) && (lastcsw & 0xF0) && ((csw / 4) == (lastcsw / 4)) ) + if (di_param.m_command_order&1) { - frontend.setData(0, csw); // needed for linked tuner handling - send_diseqc = false; + send_mask |= 4; + if ( send_csw ) + send_mask |= 1; + if ( send_ucsw ) + send_mask |= 2; + } + else + send_mask |= 8; + } + if (changed_ucsw) + { + send_mask |= 2; + if ((di_param.m_command_order&4) && send_csw) + send_mask |= 1; + if (di_param.m_command_order==4 && send_burst) + send_mask |= 8; + } + if (changed_csw) + { + if ( di_param.m_use_fast && (lastcsw & 0xF0) && ((csw / 4) == (lastcsw / 4)) ) + eDebug("dont send committed cmd (fast diseqc)"); + else + { + send_mask |= 1; + if (!(di_param.m_command_order&4) && send_ucsw) + send_mask |= 2; + if (!(di_param.m_command_order&1) && send_burst) + send_mask |= 8; } } - if ( send_diseqc || changed_burst ) +#if 0 + eDebugNoNewLine("sendmask: "); + for (int i=3; i >= 0; --i) + if ( send_mask & (1<::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it) + int cnt=0; + for (eSmartPtrList::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it, ++cnt) { - if ( !tmp1 ) - p1 = it->m_frontend; - else - --tmp1; - if (!tmp2) - p2 = it->m_frontend; - else - --tmp2; + if (cnt == tu1) + p1 = *it; + else if (cnt == tu2) + p2 = *it; } if (p1 && p2) { - p1->setData(7, tu2); - p1->setTone(iDVBFrontend::toneOff); - p1->setVoltage(iDVBFrontend::voltageOff); - - p2->setData(7, tu1); + p1->m_frontend->setData(7, (int)p2); // this is evil.. + p2->m_frontend->setData(7, (int)p1); return 0; } return -1; @@ -938,5 +941,10 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) bool eDVBSatelliteEquipmentControl::isRotorMoving() { - return false; + return m_rotorMoving; +} + +void eDVBSatelliteEquipmentControl::setRotorMoving(bool b) +{ + m_rotorMoving=b; }