X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/48628a7498995fc142c7e1369c21b5234703b6f6..13b86c205e12d0237a8134e25b2d5e145ac01730:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index eed9d35c..25567ce8 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -61,14 +61,14 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite 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, - satpos_depends_ptr=-1, rotor_pos=-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, satpos_depends_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) @@ -80,7 +80,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); } - fe->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + 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) @@ -123,10 +123,11 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite { bool diseqc=false; long band=0, - 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; + toneburst = di_param.m_toneburst_param, + rotor_pos = fe_rotor_pos; eSecDebugNoSimulate("sat %d found", sat.orbital_position); @@ -169,15 +170,13 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite eSecDebugNoSimulate("ret2 %d", ret); if (ret) // special case when this tuner is linked to a satpos dependent tuner { - long satpos_depends_ptr=-1; fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); if (satpos_depends_ptr != -1) { eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; - long satpos_depends_rotor_pos; - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos); - if (satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */ - || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position? + 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; } @@ -193,17 +192,16 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite { if (satpos_depends_to_fe->m_inuse) // if the dependent frontend is in use? { - if (rotor_pos != sat.orbital_position) // new orbital position not equal to current orbital pos? + if (!rotor || rotor_pos != sat.orbital_position) // new orbital position not equal to current orbital pos? ret=0; } } else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!) { // get current orb pos of the tuner with rotor connection - long satpos_depends_rotor_pos; - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos); - if (satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */ - || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position? + 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; } @@ -312,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, @@ -920,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;