X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/49fbebfa0877a8c794163b5b0fcb89fd38141c1b..1c21fe13bb453d0f11c8a40461b3bfe7dba5cef1:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index ec2de848..ff3f9bd0 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include @@ -11,6 +12,14 @@ #endif #include +//#define SEC_DEBUG + +#ifdef SEC_DEBUG +#define eSecDebug(arg...) eDebug(arg) +#else +#define eSecDebug(arg...) +#endif + DEFINE_REF(eDVBSatelliteEquipmentControl); eDVBSatelliteEquipmentControl *eDVBSatelliteEquipmentControl::instance; @@ -245,6 +254,30 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite return ret; } +bool need_turn_fast(int turn_speed) +{ + if (turn_speed == eDVBSatelliteRotorParameters::FAST) + return true; + else if (turn_speed != eDVBSatelliteRotorParameters::SLOW) + { + int begin = turn_speed >> 16; // high word is start time + int end = turn_speed&0xFFFF; // low word is end time + time_t now_time = eDVBLocalTimeHandler::getInstance()->nowTime(); + tm nowTime; + localtime_r(&now_time, &nowTime); + int now = (nowTime.tm_hour + 1) * 60 + nowTime.tm_min + 1; + bool neg = end <= begin; + if (neg) { + int tmp = begin; + begin = end; + end = tmp; + } + if ((now >= begin && now < end) ^ neg) + return true; + } + return false; +} + #define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x) RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id) @@ -460,31 +493,41 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( send_mask ) { + int vlt = iDVBFrontend::voltageOff; eSecCommand::pair compare; compare.steps = +3; 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]) ); - compare.voltage = iDVBFrontend::voltageOff; - compare.steps = +3; - // the next is a check if voltage is switched off.. then we first set a voltage :) - // else we set voltage after all diseqc stuff.. - sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { if (rotor_param.m_inputpower_parameters.m_use) - compare.voltage = VOLTAGE(18); // in input power mode set 18V for measure input power + vlt = VOLTAGE(18); // in input power mode set 18V for measure input power else - compare.voltage = VOLTAGE(13); // in normal mode start turning with 13V + vlt = VOLTAGE(13); // in normal mode start turning with 13V } else - compare.voltage = voltage; + vlt = voltage; - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); + // check if voltage is already correct.. + compare.voltage = vlt; + compare.steps = +7; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); - // voltage was disabled..so we wait a longer time .. for normal switches 250ms should be enough + // check if voltage is disabled + compare.voltage = iDVBFrontend::voltageOff; + compare.steps = +4; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + + // voltage is changed... use DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); + + // voltage was disabled.. use DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) ); for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat) @@ -657,11 +700,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start - sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, +10 ) ); // timeout .. we assume now the rotor is already at the correct position + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, +9 ) ); // timeout .. we assume now the rotor is already at the correct position sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start //////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + if (need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed)) + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout // rotor running loop sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec @@ -669,11 +712,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA cmd.direction=0; // check for stopped rotor cmd.steps=+4; sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +4 ) ); // timeout ? this should never happen + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); // timeout ? this should never happen sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start ///////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); } else { // use normal turning mode @@ -758,6 +801,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA RESULT eDVBSatelliteEquipmentControl::clear() { + eSecDebug("eDVBSatelliteEquipmentControl::clear()"); for (int i=0; i <= m_lnbidx; ++i) { m_lnbs[i].m_satellites.clear(); @@ -790,11 +834,13 @@ RESULT eDVBSatelliteEquipmentControl::addLNB() eDebug("no more LNB free... cnt is %d", m_lnbidx); return -ENOSPC; } + eSecDebug("eDVBSatelliteEquipmentControl::addLNB(%d)", m_lnbidx-1); return 0; } RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask) { + eSecDebug("eDVBSatelliteEquipmentControl::setLNBSlotMask(%d)", slotmask); if ( currentLNBValid() ) m_lnbs[m_lnbidx].slot_mask = slotmask; else @@ -804,6 +850,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask) RESULT eDVBSatelliteEquipmentControl::setLNBLOFL(int lofl) { + eSecDebug("eDVBSatelliteEquipmentControl::setLNBLOFL(%d)", lofl); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_lof_lo = lofl; else @@ -813,6 +860,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBLOFL(int lofl) RESULT eDVBSatelliteEquipmentControl::setLNBLOFH(int lofh) { + eSecDebug("eDVBSatelliteEquipmentControl::setLNBLOFH(%d)", lofh); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_lof_hi = lofh; else @@ -822,6 +870,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBLOFH(int lofh) RESULT eDVBSatelliteEquipmentControl::setLNBThreshold(int threshold) { + eSecDebug("eDVBSatelliteEquipmentControl::setLNBThreshold(%d)", threshold); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_lof_threshold = threshold; else @@ -831,6 +880,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBThreshold(int threshold) RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff) { + eSecDebug("eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(%d)", onoff); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_increased_voltage = onoff; else @@ -841,6 +891,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff) /* DiSEqC Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode) { + eSecDebug("eDVBSatelliteEquipmentControl::setDiSEqcMode(%d)", diseqcmode); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_diseqc_mode = (eDVBSatelliteDiseqcParameters::t_diseqc_mode)diseqcmode; else @@ -850,6 +901,7 @@ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode) RESULT eDVBSatelliteEquipmentControl::setToneburst(int toneburst) { + eSecDebug("eDVBSatelliteEquipmentControl::setToneburst(%d)", toneburst); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_toneburst_param = (eDVBSatelliteDiseqcParameters::t_toneburst_param)toneburst; else @@ -859,6 +911,7 @@ RESULT eDVBSatelliteEquipmentControl::setToneburst(int toneburst) RESULT eDVBSatelliteEquipmentControl::setRepeats(int repeats) { + eSecDebug("eDVBSatelliteEquipmentControl::setRepeats(%d)", repeats); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_repeats=repeats; else @@ -868,6 +921,7 @@ RESULT eDVBSatelliteEquipmentControl::setRepeats(int repeats) RESULT eDVBSatelliteEquipmentControl::setCommittedCommand(int command) { + eSecDebug("eDVBSatelliteEquipmentControl::setCommittedCommand(%d)", command); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_committed_cmd=command; else @@ -877,6 +931,7 @@ RESULT eDVBSatelliteEquipmentControl::setCommittedCommand(int command) RESULT eDVBSatelliteEquipmentControl::setUncommittedCommand(int command) { + eSecDebug("eDVBSatelliteEquipmentControl::setUncommittedCommand(%d)", command); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_uncommitted_cmd = command; else @@ -886,6 +941,7 @@ RESULT eDVBSatelliteEquipmentControl::setUncommittedCommand(int command) RESULT eDVBSatelliteEquipmentControl::setCommandOrder(int order) { + eSecDebug("eDVBSatelliteEquipmentControl::setCommandOrder(%d)", order); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_command_order=order; else @@ -895,6 +951,7 @@ RESULT eDVBSatelliteEquipmentControl::setCommandOrder(int order) RESULT eDVBSatelliteEquipmentControl::setFastDiSEqC(bool onoff) { + eSecDebug("eDVBSatelliteEquipmentControl::setFastDiSEqc(%d)", onoff); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_use_fast=onoff; else @@ -904,6 +961,7 @@ RESULT eDVBSatelliteEquipmentControl::setFastDiSEqC(bool onoff) RESULT eDVBSatelliteEquipmentControl::setSeqRepeat(bool onoff) { + eSecDebug("eDVBSatelliteEquipmentControl::setSeqRepeat(%d)", onoff); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_diseqc_parameters.m_seq_repeat = onoff; else @@ -914,6 +972,7 @@ RESULT eDVBSatelliteEquipmentControl::setSeqRepeat(bool onoff) /* Rotor Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::setLongitude(float longitude) { + eSecDebug("eDVBSatelliteEquipmentControl::setLongitude(%f)", longitude); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_longitude=longitude; else @@ -923,6 +982,7 @@ RESULT eDVBSatelliteEquipmentControl::setLongitude(float longitude) RESULT eDVBSatelliteEquipmentControl::setLatitude(float latitude) { + eSecDebug("eDVBSatelliteEquipmentControl::setLatitude(%f)", latitude); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_latitude=latitude; else @@ -932,6 +992,7 @@ RESULT eDVBSatelliteEquipmentControl::setLatitude(float latitude) RESULT eDVBSatelliteEquipmentControl::setLoDirection(int direction) { + eSecDebug("eDVBSatelliteEquipmentControl::setLoDirection(%d)", direction); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_lo_direction=direction; else @@ -941,6 +1002,7 @@ RESULT eDVBSatelliteEquipmentControl::setLoDirection(int direction) RESULT eDVBSatelliteEquipmentControl::setLaDirection(int direction) { + eSecDebug("eDVBSatelliteEquipmentControl::setLaDirection(%d)", direction); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_gotoxx_parameters.m_la_direction=direction; else @@ -950,6 +1012,7 @@ RESULT eDVBSatelliteEquipmentControl::setLaDirection(int direction) RESULT eDVBSatelliteEquipmentControl::setUseInputpower(bool onoff) { + eSecDebug("eDVBSatelliteEquipmentControl::setUseInputpower(%d)", onoff); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_use=onoff; else @@ -959,6 +1022,7 @@ RESULT eDVBSatelliteEquipmentControl::setUseInputpower(bool onoff) RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta) { + eSecDebug("eDVBSatelliteEquipmentControl::setInputpowerDelta(%d)", delta); if ( currentLNBValid() ) m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_delta=delta; else @@ -969,6 +1033,7 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta) /* Satellite Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position) { + eSecDebug("eDVBSatelliteEquipmentControl::addSatellite(%d)", orbital_position); if ( currentLNBValid() ) { std::map::iterator it = @@ -994,6 +1059,7 @@ RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position) RESULT eDVBSatelliteEquipmentControl::setVoltageMode(int mode) { + eSecDebug("eDVBSatelliteEquipmentControl::setVoltageMode(%d)", mode); if ( currentLNBValid() && m_curSat != m_lnbs[m_lnbidx].m_satellites.end() ) m_curSat->second.m_voltage_mode = (eDVBSatelliteSwitchParameters::t_voltage_mode)mode; else @@ -1004,6 +1070,7 @@ RESULT eDVBSatelliteEquipmentControl::setVoltageMode(int mode) RESULT eDVBSatelliteEquipmentControl::setToneMode(int mode) { + eSecDebug("eDVBSatelliteEquipmentControl::setToneMode(%d)", mode); if ( currentLNBValid() ) { if ( m_curSat != m_lnbs[m_lnbidx].m_satellites.end() ) @@ -1018,6 +1085,7 @@ RESULT eDVBSatelliteEquipmentControl::setToneMode(int mode) RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num) { + eSecDebug("eDVBSatelliteEquipmentControl::setRotorPosNum(%d)", rotor_pos_num); if ( currentLNBValid() ) { if ( m_curSat != m_lnbs[m_lnbidx].m_satellites.end() ) @@ -1030,6 +1098,16 @@ RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num) return 0; } +RESULT eDVBSatelliteEquipmentControl::setRotorTurningSpeed(int speed) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setRotorTurningSpeed(%d)", speed); + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].m_rotor_parameters.m_inputpower_parameters.m_turning_speed = speed; + else + return -ENOENT; + return 0; +} + struct sat_compare { int orb_pos, lofl, lofh; @@ -1162,6 +1240,7 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) { + eSecDebug("eDVBSatelliteEquipmentControl::setTunerLinked(%d, %d)", tu1, tu2); if (tu1 != tu2) { eDVBRegisteredFrontend *p1=NULL, *p2=NULL; @@ -1186,6 +1265,7 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2) { + eSecDebug("eDVBSatelliteEquipmentControl::setTunerDepends(%d, %d)", tu1, tu2); if (tu1 == tu2) return -1; @@ -1210,6 +1290,7 @@ RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2) void eDVBSatelliteEquipmentControl::setSlotNotLinked(int slot_no) { + eSecDebug("eDVBSatelliteEquipmentControl::setSlotNotLinked(%d)", slot_no); m_not_linked_slot_mask |= (1 << slot_no); }