X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsec.cpp;h=d1567bafbd55b83aacfe0af374b0fe0ce97dcf74;hp=851e9b1d9c4df565fa8b4b3bfa6040e4e7aefd53;hb=afa141eedd597d0468d33b97a79f738a9ebfd11f;hpb=2339ec3c8dcf249e2255aff2d364e1855fde4a25 diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 851e9b1..d1567ba 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -49,11 +49,6 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList> 8; - diseqc.data[4] = lnb_param.UnicableTuningWord; + + long oldSatcr, oldPin, oldDiction; + frontend.getData(eDVBFrontend::SATCR, oldSatcr); + frontend.getData(eDVBFrontend::PIN, oldPin); + frontend.getData(eDVBFrontend::DICTION, oldDiction); + + if((oldSatcr != -1) && (oldSatcr != lnb_param.SatCR_idx)) + { + switch (oldDiction) + { + case 1: + if(oldPin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = oldPin; + } + diseqc.data[1] = oldSatcr << 3; + diseqc.data[2] = 0x00; + diseqc.data[3] = 0x00; + break; + case 0: + default: + if(oldPin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = oldPin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = oldSatcr << 5; + diseqc.data[4] = 0x00; + break; + } + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); + frontend.setData(eDVBFrontend::SATCR, -1); + } + + frontend.setData(eDVBFrontend::DICTION, lnb_param.SatCR_format); +//TODO frontend.setData(eDVBFrontend::PIN, lnb_param.SatCR_pin); + + long pin = 0; // hack + + switch(lnb_param.SatCR_format) + { + case 1: //JESS + if(pin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + diseqc.data[1] = lnb_param.UnicableTuningWord >> 16; + diseqc.data[2] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[3] = lnb_param.UnicableTuningWord; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = pin; + } + diseqc.data[1] = lnb_param.UnicableTuningWord >> 16; + diseqc.data[2] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[3] = lnb_param.UnicableTuningWord; + break; + case 0: //DiSEqC + default: + if(pin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = pin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[4] = lnb_param.UnicableTuningWord; + } + frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); @@ -954,8 +1063,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA return -1; } -void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr) +void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend) { + long satcr, diction, pin; eSecCommandList sec_sequence; // check if voltage is disabled @@ -973,12 +1083,48 @@ void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, eDVBDiseqcCommand diseqc; memset(diseqc.data, 0, MAX_DISEQC_LENGTH); - diseqc.len = 5; - diseqc.data[0] = 0xE0; - diseqc.data[1] = 0x10; - diseqc.data[2] = 0x5A; - diseqc.data[3] = satcr << 5; - diseqc.data[4] = 0x00; + frontend.getData(eDVBFrontend::SATCR, satcr); + frontend.getData(eDVBFrontend::DICTION, diction); + frontend.getData(eDVBFrontend::PIN, pin); + + switch (diction) + { + case 1: + if(pin < 1) + { + diseqc.len = 4; + diseqc.data[0] = 0x70; + } + else + { + diseqc.len = 5; + diseqc.data[0] = 0x71; + diseqc.data[4] = pin; + } + diseqc.data[1] = satcr << 3; + diseqc.data[2] = 0x00; + diseqc.data[3] = 0x00; + break; + case 0: + default: + if(pin < 1) + { + diseqc.len = 5; + diseqc.data[2] = 0x5A; + } + else + { + diseqc.len = 6; + diseqc.data[2] = 0x5C; + diseqc.data[5] = pin; + } + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[3] = satcr << 5; + diseqc.data[4] = 0x00; + break; + } + frontend.setData(eDVBFrontend::SATCR, -1); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); @@ -1010,6 +1156,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) @@ -1254,6 +1407,18 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta) } /* Unicable Specific Parameters */ +RESULT eDVBSatelliteEquipmentControl::setLNBSatCRformat(int SatCR_format) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRformat(%d)", SatCR_format); + if(!((SatCR_format >-1) && (SatCR_format < 2))) + return -EPERM; + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].SatCR_format = SatCR_format; + else + return -ENOENT; + return 0; +} + RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx) { eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx); @@ -1299,6 +1464,13 @@ RESULT eDVBSatelliteEquipmentControl::getLNBSatCRpositions() return -ENOENT; } +RESULT eDVBSatelliteEquipmentControl::getLNBSatCRformat() +{ + if ( currentLNBValid() ) + return m_lnbs[m_lnbidx].SatCR_format; + return -ENOENT; +} + RESULT eDVBSatelliteEquipmentControl::getLNBSatCR() { if ( currentLNBValid() ) @@ -1435,6 +1607,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;