X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c0b2f8915fe21e99215dc97b4483f3e8a993a7ff..7b285223f46c6642ecd9bf09039cdd6ce789bac8:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 6f64cf56..25567ce8 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -60,6 +60,44 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite 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, + fe_satpos_depends_ptr=-1, fe_rotor_pos=-1; + bool linked_in_use = false; + + eSecDebugNoSimulate("direct_connected %d", !!direct_connected); + + fe->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); + fe->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr); + fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, fe_satpos_depends_ptr); + + // first we search the linkage base frontend and check if any tuner in prev direction is used + while (linked_prev_ptr != -1) + { + eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr; + if (linked_fe->m_inuse) + linked_in_use = true; + fe = linked_fe->m_frontend; + linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); + } + + fe->getData(eDVBFrontend::ROTOR_POS, fe_rotor_pos); + + // now check also the linked tuners is in use + while (!linked_in_use && linked_next_ptr != -1) + { + eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_next_ptr; + if (linked_fe->m_inuse) + linked_in_use = true; + linked_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, (long&)linked_next_ptr); + } + + // 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); + } if (highest_score_lnb) *highest_score_lnb = -1; @@ -85,21 +123,17 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite { bool diseqc=false; long band=0, - linked_prev_ptr=-1, - linked_next_ptr=-1, - satpos_depends_ptr=-1, + satpos_depends_ptr=fe_satpos_depends_ptr, csw = di_param.m_committed_cmd, ucsw = di_param.m_uncommitted_cmd, toneburst = di_param.m_toneburst_param, - curRotorPos; + rotor_pos = fe_rotor_pos; eSecDebugNoSimulate("sat %d found", sat.orbital_position); - fe->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); - fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); if ( sat.frequency > lnb_param.m_lof_threshold ) band |= 1; - if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) + if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical)) band |= 2; if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) @@ -124,99 +158,61 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite eSecDebugNoSimulate("ret1 %d", ret); - if (direct_connected) // frontend with direct connection? + if (linked_in_use) { - long ocsw = -1, - oucsw = -1, - oToneburst = -1; - eSecDebugNoSimulate("direct"); - fe->getData(eDVBFrontend::ROTOR_POS, curRotorPos); - fe->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr); - fe->getData(eDVBFrontend::CSW, ocsw); - fe->getData(eDVBFrontend::UCSW, oucsw); - fe->getData(eDVBFrontend::TONEBURST, oToneburst); - while (ret && linked_prev_ptr != -1) // check for linked tuners.. + // compare tuner data + if ( (csw != linked_csw) || + ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) || + ( rotor && rotor_pos != sat.orbital_position ) ) { - eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr; - if (linked_fe->m_inuse) - { - if ( (csw != ocsw) || - ( diseqc && (ucsw != oucsw || toneburst != oToneburst) ) || - ( rotor && curRotorPos != sat.orbital_position ) ) - { - ret=0; - } - } - linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); + ret=0; } eSecDebugNoSimulate("ret2 %d", ret); - while (ret && linked_next_ptr != -1) // check for linked tuners.. + if (ret) // special case when this tuner is linked to a satpos dependent tuner { - eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_next_ptr; - if (linked_fe->m_inuse) + fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); + if (satpos_depends_ptr != -1) { - if ( (csw != ocsw) || - ( diseqc && (ucsw != oucsw || toneburst != oToneburst) ) || - ( rotor && curRotorPos != sat.orbital_position ) ) + eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; + satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */ + || rotor_pos != sat.orbital_position ) // not the same orbital position? { - ret=0; + ret = 0; } } - linked_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, (long&)linked_next_ptr); } eSecDebugNoSimulate("ret3 %d", ret); } - else // linked frontend.. + else if (satpos_depends_ptr != -1) { - long ocsw = -1, - oucsw = -1, - oToneburst = -1; - while (linked_prev_ptr != -1) + eSecDebugNoSimulate("satpos depends"); + eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; + if (direct_connected) // current fe is direct connected.. (can turn the rotor) { - eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr; - linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); - if (linked_prev_ptr == -1) + if (satpos_depends_to_fe->m_inuse) // if the dependent frontend is in use? { - iDVBFrontend *sec_fe = linked_fe->m_frontend; - sec_fe->getData(eDVBFrontend::ROTOR_POS, curRotorPos); - if (linked_fe->m_inuse) - { - sec_fe->getData(eDVBFrontend::CSW, ocsw); - sec_fe->getData(eDVBFrontend::UCSW, oucsw); - sec_fe->getData(eDVBFrontend::TONEBURST, oToneburst); - eSecDebug("(%ld != %ld) || \n(%d && (%ld != %ld || %ld != %ld) ) ||\n( %d && %ld != %d ) )", - csw, ocsw, diseqc, ucsw, oucsw, toneburst, oToneburst, rotor, curRotorPos, sat.orbital_position); - if ( (csw != ocsw) || - ( diseqc && (ucsw != oucsw || toneburst != oToneburst) ) || - ( rotor && curRotorPos != sat.orbital_position ) ) - { - ret=0; - } - } + if (!rotor || rotor_pos != sat.orbital_position) // new orbital position not equal to current orbital pos? + ret=0; } } - eSecDebugNoSimulate("ret4 %d", ret); - } - - if (ret) - if (satpos_depends_ptr != -1) + else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!) { - eSecDebugNoSimulate("satpos depends"); - eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; - if ( satpos_depends_to_fe->m_inuse ) + // get current orb pos of the tuner with rotor connection + satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */ + || rotor_pos != sat.orbital_position ) // not the same orbital position? { - if (!direct_connected) - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, curRotorPos); - if (!rotor || curRotorPos != sat.orbital_position) - ret=0; + ret = 0; } - eSecDebugNoSimulate("ret5 %d", ret); } + eSecDebugNoSimulate("ret4 %d", ret); + } - if (ret && rotor && curRotorPos != -1) - ret -= abs(curRotorPos-sat.orbital_position); + if (ret && rotor && rotor_pos != -1) + ret -= abs(rotor_pos-sat.orbital_position); - eSecDebugNoSimulate("ret6 %d", ret); + eSecDebugNoSimulate("ret5 %d", ret); if (ret) { @@ -314,7 +310,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDVBSatelliteSwitchParameters &sw_param = sit->second; bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; - bool forceStaticMode = true; bool forceChanged = false; bool needDiSEqCReset = false; long band=0, @@ -373,7 +368,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( sat.frequency > lnb_param.m_lof_threshold ) band |= 1; - if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) + if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical)) band |= 2; int lof = (band&1)?lnb_param.m_lof_hi:lnb_param.m_lof_lo; @@ -390,11 +385,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY); if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V - || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical + || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(13); else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V - || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) + || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical) && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(18); if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) @@ -563,7 +558,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA compare.tone = iDVBFrontend::toneOff; sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); if (diseqc13V) vlt = iDVBFrontend::voltage13; @@ -705,7 +700,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA compare.tone = iDVBFrontend::toneOff; sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); compare.voltage = iDVBFrontend::voltageOff; compare.steps = +4; @@ -839,7 +834,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA compare.tone = tone; sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); cmd.direction=1; // check for running rotor @@ -884,7 +879,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA compare.tone = tone; sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); } sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) ); @@ -897,11 +892,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA compare.voltage = iDVBFrontend::voltageOff; sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS] ) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); // wait 20 ms after voltage change eDVBDiseqcCommand diseqc; memset(diseqc.data, 0, MAX_DISEQC_LENGTH); @@ -922,12 +917,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); } - - if (forceStaticMode) - { - sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); - } + + sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 500) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + frontend.setSecSequence(sec_sequence); return 0; @@ -936,12 +930,12 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDebugNoSimulate("found no useable satellite configuration for %s freq %d%s %s on orbital position (%d)", sat.system ? "DVB-S2" : "DVB-S", sat.frequency, - sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal ? "H" : - eDVBFrontendParametersSatellite::Polarisation::Vertical ? "V" : - eDVBFrontendParametersSatellite::Polarisation::CircularLeft ? "CL" : "CR", - sat.modulation == eDVBFrontendParametersSatellite::Modulation::Auto ? "AUTO" : - eDVBFrontendParametersSatellite::Modulation::QPSK ? "QPSK" : - eDVBFrontendParametersSatellite::Modulation::M8PSK ? "8PSK" : "QAM16", + sat.polarisation == eDVBFrontendParametersSatellite::Polarisation_Horizontal ? "H" : + eDVBFrontendParametersSatellite::Polarisation_Vertical ? "V" : + eDVBFrontendParametersSatellite::Polarisation_CircularLeft ? "CL" : "CR", + sat.modulation == eDVBFrontendParametersSatellite::Modulation_Auto ? "AUTO" : + eDVBFrontendParametersSatellite::Modulation_QPSK ? "QPSK" : + eDVBFrontendParametersSatellite::Modulation_8PSK ? "8PSK" : "QAM16", sat.orbital_position ); return -1; }