X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/eb54fc4bae2e856bf5bf2fefc8a9fa5d0046b3a5..baa574e9f08994953da1110eb16fe7aad63c280f:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 802dbaa9..da2439f9 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -36,102 +36,54 @@ void eDVBSatelliteEquipmentControl::setParam(int param, int value) m_params[param]=value; } -eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList &avail_frontends) - :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_rotorMoving(false) +eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList &avail_frontends, eSmartPtrList &avail_simulate_frontends) + :m_lnbidx((sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters))-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_avail_simulate_frontends(avail_simulate_frontends), m_rotorMoving(false) { if (!instance) instance = this; - clear(); - -// ASTRA - addLNB(); - setLNBSlotMask(3); - setLNBLOFL(9750000); - setLNBThreshold(11700000); - setLNBLOFH(10607000); - setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_0); - setToneburst(eDVBSatelliteDiseqcParameters::NO); - setRepeats(0); - setCommittedCommand(eDVBSatelliteDiseqcParameters::BB); - setCommandOrder(0); // committed, toneburst - setFastDiSEqC(true); - setSeqRepeat(false); - addSatellite(192); - setVoltageMode(eDVBSatelliteSwitchParameters::HV); - setToneMode(eDVBSatelliteSwitchParameters::HILO); - -// Hotbird - addLNB(); - setLNBSlotMask(3); - setLNBLOFL(9750000); - setLNBThreshold(11700000); - setLNBLOFH(10600000); - setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_0); - setToneburst(eDVBSatelliteDiseqcParameters::NO); - setRepeats(0); - setCommittedCommand(eDVBSatelliteDiseqcParameters::AB); - setCommandOrder(0); // committed, toneburst - setFastDiSEqC(true); - setSeqRepeat(false); - addSatellite(130); - setVoltageMode(eDVBSatelliteSwitchParameters::HV); - setToneMode(eDVBSatelliteSwitchParameters::HILO); - -// Rotor - addLNB(); - setLNBSlotMask(3); - setLNBLOFL(9750000); - setLNBThreshold(11700000); - setLNBLOFH(10600000); - setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_2); - setToneburst(eDVBSatelliteDiseqcParameters::NO); - setRepeats(0); - setCommittedCommand(eDVBSatelliteDiseqcParameters::AA); - setCommandOrder(0); // committed, toneburst - setFastDiSEqC(true); - setSeqRepeat(false); - setLaDirection(eDVBSatelliteRotorParameters::NORTH); - setLoDirection(eDVBSatelliteRotorParameters::EAST); - setLatitude(51.017); - setLongitude(8.683); - setUseInputpower(true); - setInputpowerDelta(50); - - addSatellite(235); - setVoltageMode(eDVBSatelliteSwitchParameters::HV); - setToneMode(eDVBSatelliteSwitchParameters::HILO); - setRotorPosNum(0); - - addSatellite(284); - setVoltageMode(eDVBSatelliteSwitchParameters::HV); - setToneMode(eDVBSatelliteSwitchParameters::HILO); - setRotorPosNum(0); - - addSatellite(420); - setVoltageMode(eDVBSatelliteSwitchParameters::HV); - setToneMode(eDVBSatelliteSwitchParameters::HILO); - setRotorPosNum(1); // stored pos 1 } -int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id ) +#define eSecDebugNoSimulate(x...) \ + do { \ + if (!simulate) \ + eSecDebug(x); \ + } while(0) +// else \ +// { \ +// eDebugNoNewLine("SIMULATE:"); \ +// eDebug(x); \ +// } \ + +int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id, int *highest_score_lnb) { - int ret=0, satcount=0; + bool simulate = ((eDVBFrontend*)fe)->is_simulate(); + bool direct_connected = m_not_linked_slot_mask & slot_id; + int score=0, satcount=0; + + if (highest_score_lnb) + *highest_score_lnb = -1; + + eSecDebugNoSimulate("canTune %d", slot_id); for (int idx=0; idx <= m_lnbidx; ++idx ) { bool rotor=false; eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx]; - if ( lnb_param.slot_mask & slot_id ) // lnb for correct tuner? + if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner? { + int ret = 0; eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters; + eSecDebugNoSimulate("lnb %d found", idx); + satcount += lnb_param.m_satellites.size(); std::map::iterator sit = lnb_param.m_satellites.find(sat.orbital_position); if ( sit != lnb_param.m_satellites.end()) { + bool diseqc=false; long band=0, linked_prev_ptr=-1, linked_next_ptr=-1, @@ -141,6 +93,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite toneburst = di_param.m_toneburst_param, curRotorPos; + 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); @@ -149,8 +102,6 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) band |= 2; - bool diseqc=false; - if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) { diseqc=true; @@ -171,11 +122,14 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite ret = 15000; } - if (m_not_linked_slot_mask & slot_id) // frontend with direct connection? + eSecDebugNoSimulate("ret1 %d", ret); + + if (direct_connected) // frontend with direct connection? { 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); @@ -195,6 +149,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite } linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); } + eSecDebugNoSimulate("ret2 %d", ret); while (ret && linked_next_ptr != -1) // check for linked tuners.. { eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_next_ptr; @@ -209,6 +164,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite } linked_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, (long&)linked_next_ptr); } + eSecDebugNoSimulate("ret3 %d", ret); } else // linked frontend.. { @@ -228,6 +184,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite 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 ) ) @@ -237,22 +195,29 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite } } } + eSecDebugNoSimulate("ret4 %d", ret); } - if (ret && rotor && curRotorPos != -1) - ret -= abs(curRotorPos-sat.orbital_position); - if (ret) if (satpos_depends_ptr != -1) { + eSecDebugNoSimulate("satpos depends"); eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; if ( satpos_depends_to_fe->m_inuse ) { + if (!direct_connected) + satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, curRotorPos); if (!rotor || curRotorPos != sat.orbital_position) ret=0; } + eSecDebugNoSimulate("ret5 %d", ret); } + if (ret && rotor && curRotorPos != -1) + ret -= abs(curRotorPos-sat.orbital_position); + + eSecDebugNoSimulate("ret6 %d", ret); + if (ret) { int lof = sat.frequency > lnb_param.m_lof_threshold ? @@ -261,14 +226,32 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if (tuner_freq < 900000 || tuner_freq > 2200000) ret=0; } + + if (ret && lnb_param.m_prio != -1) + ret = lnb_param.m_prio; + + eSecDebugNoSimulate("ret %d, score old %d", ret, score); + if (ret > score) + { + score = ret; + if (highest_score_lnb) + *highest_score_lnb = idx; + } + eSecDebugNoSimulate("score new %d", score); } } } - if (ret && satcount) - ret -= (satcount-1); - if (ret && m_not_linked_slot_mask & slot_id) - ret += 5; // increase score for tuners with direct sat connection - return ret; + if (score && satcount) + { + if (score > (satcount-1)) + score -= (satcount-1); + else + score = 1; // min score + } + if (score && direct_connected) + score += 5; // increase score for tuners with direct sat connection + eSecDebugNoSimulate("final score %d", score); + return score; } bool need_turn_fast(int turn_speed) @@ -297,13 +280,24 @@ bool need_turn_fast(int turn_speed) #define VOLTAGE(x) (lnb_param.m_increased_voltage ? iDVBFrontend::voltage##x##_5 : iDVBFrontend::voltage##x) +#define eDebugNoSimulate(x...) \ + do { \ + if (!simulate) \ + eDebug(x); \ + } while(0) +// else \ +// { \ +// eDebugNoNewLine("SIMULATE:"); \ +// eDebug(x); \ +// } \ + RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id, unsigned int tunetimeout) { - for (int idx=0; idx <= m_lnbidx; ++idx ) + bool simulate = ((eDVBFrontend*)&frontend)->is_simulate(); + int lnb_idx = -1; + if (canTune(sat, &frontend, slot_id, &lnb_idx)) { - eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx]; - if (!(lnb_param.slot_mask & slot_id)) // lnb for correct tuner? - continue; + eDVBSatelliteLNBParameters &lnb_param = m_lnbs[lnb_idx]; eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters; eDVBSatelliteRotorParameters &rotor_param = lnb_param.m_rotor_parameters; @@ -314,7 +308,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDVBSatelliteSwitchParameters &sw_param = sit->second; bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; - bool allowDiseqc1_2 = true; + bool sendDiSEqC = false; + bool forceChanged = false; + bool needDiSEqCReset = false; long band=0, voltage = iDVBFrontend::voltageOff, tone = iDVBFrontend::toneOff, @@ -328,6 +324,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA curRotorPos = -1, satposDependPtr = -1; iDVBFrontend *sec_fe=&frontend; + eDVBRegisteredFrontend *linked_fe = 0; + eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode; + eDVBSatelliteSwitchParameters::t_voltage_mode voltage_mode = sw_param.m_voltage_mode; + bool diseqc13V = voltage_mode == eDVBSatelliteSwitchParameters::HV_13; + + if (diseqc13V) + voltage_mode = eDVBSatelliteSwitchParameters::HV; frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr); @@ -337,12 +340,20 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); while (linked_prev_ptr != -1) { - eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr; + linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr; sec_fe = linked_fe->m_frontend; sec_fe->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); } - if (satposDependPtr != -1) - allowDiseqc1_2 = false; + if (satposDependPtr != -1) // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb + diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0; + else { + // in eDVBFrontend::tuneLoop we call closeFrontend and ->inc_use() in this this condition (to put the kernel frontend thread into idle state) + // so we must resend all diseqc stuff (voltage is disabled when the frontend is closed) + int state; + sec_fe->getState(state); + if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle) + forceChanged = true; + } } sec_fe->getData(eDVBFrontend::CSW, lastcsw); @@ -351,6 +362,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_fe->getData(eDVBFrontend::ROTOR_CMD, lastRotorCmd); sec_fe->getData(eDVBFrontend::ROTOR_POS, curRotorPos); + if (lastcsw == lastucsw && lastToneburst == lastucsw && lastucsw == -1) + needDiSEqCReset = true; + if ( sat.frequency > lnb_param.m_lof_threshold ) band |= 1; @@ -366,13 +380,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) band |= 2; - if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V + if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(13); - else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V + else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(18); if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) @@ -383,7 +397,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eSecCommandList sec_sequence; - if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) + if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) { if ( di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO ) csw = 0xF0 | (csw << 2); @@ -393,15 +407,15 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA bool send_csw = (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO); - bool changed_csw = send_csw && csw != lastcsw; + bool changed_csw = send_csw && (forceChanged || csw != lastcsw); bool send_ucsw = - (di_param.m_uncommitted_cmd && di_param.m_diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0); - bool changed_ucsw = send_ucsw && ucsw != lastucsw; + (di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0); + bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw); bool send_burst = (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO); - bool changed_burst = send_burst && toneburst != lastToneburst; + bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); int send_mask = 0; /* 1 must send csw @@ -435,7 +449,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA && di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO && (lastcsw & 0xF0) && ((csw / 4) == (lastcsw / 4)) ) - eDebug("dont send committed cmd (fast diseqc)"); + eDebugNoSimulate("dont send committed cmd (fast diseqc)"); else { send_mask |= 1; @@ -459,15 +473,14 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA { int RotorCmd=-1; bool useGotoXX = false; - if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 - && !sat.no_rotor_command_on_tune - && allowDiseqc1_2 ) + if ( diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 + && !sat.no_rotor_command_on_tune ) { if (sw_param.m_rotorPosNum) // we have stored rotor pos? RotorCmd=sw_param.m_rotorPosNum; else // we must calc gotoxx cmd { - eDebug("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 ); + eDebugNoSimulate("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 ); useGotoXX = true; double SatLon = abs(sat.orbital_position)/10.00, @@ -480,10 +493,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( rotor_param.m_gotoxx_parameters.m_lo_direction == eDVBSatelliteRotorParameters::WEST ) SiteLon = 360 - SiteLon; - eDebug("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon ); + eDebugNoSimulate("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon ); double satHourAngle = calcSatHourangle( SatLon, SiteLat, SiteLon ); - eDebug("PolarmountHourAngle=%lf", satHourAngle ); + eDebugNoSimulate("PolarmountHourAngle=%lf", satHourAngle ); static int gotoXTable[10] = { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E }; @@ -513,7 +526,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA RotorCmd |= 0xE000; } } - eDebug("RotorCmd = %04x", RotorCmd); + eDebugNoSimulate("RotorCmd = %04x", RotorCmd); } } @@ -527,7 +540,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); - if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) + if (diseqc13V) + vlt = iDVBFrontend::voltage13; + else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { if (rotor_param.m_inputpower_parameters.m_use) vlt = VOLTAGE(18); // in input power mode set 18V for measure input power @@ -557,6 +572,23 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) ); sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) ); + if (needDiSEqCReset) + { + eDVBDiseqcCommand diseqc; + memset(diseqc.data, 0, MAX_DISEQC_LENGTH); + diseqc.len = 3; + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0; + diseqc.data[2] = 0; + // diseqc reset + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_RESET_CMD]) ); + diseqc.data[2] = 3; + // diseqc peripherial powersupply on + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD]) ); + } + for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat) { if ( send_mask & 4 ) @@ -632,10 +664,14 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) ); } + + if (di_param.m_seq_repeat && seq_repeat == 0) + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) ); } + sendDiSEqC = true; } - eDebug("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd); + eDebugNoSimulate("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd); if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { eSecCommand::pair compare; @@ -699,23 +735,27 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed); eSecCommand::rotor cmd; eSecCommand::pair compare; - compare.voltage = VOLTAGE(18); + if (turn_fast) + compare.voltage = VOLTAGE(18); + else + compare.voltage = VOLTAGE(13); compare.steps = +3; sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); // measure idle power values - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); - compare.val = 1; compare.steps = -2; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + if (turn_fast) { + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); + compare.val = 1; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + } sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) ); compare.val = 0; sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); //////////////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); @@ -747,7 +787,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start ///////////////////// sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); } else @@ -762,7 +801,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); 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::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); @@ -789,14 +827,14 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -5) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); } sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); + sendDiSEqC = true; } } } @@ -806,6 +844,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA csw = band; } +// if (sendDiSEqC) + sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); + sec_fe->setData(eDVBFrontend::NEW_CSW, csw); sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); @@ -831,13 +872,26 @@ 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 (sendDiSEqC) + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + frontend.setSecSequence(sec_sequence); return 0; } } - - eDebug("found no useable satellite configuration for orbital position (%d)", sat.orbital_position ); + 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.orbital_position ); return -1; } @@ -847,7 +901,8 @@ RESULT eDVBSatelliteEquipmentControl::clear() for (int i=0; i <= m_lnbidx; ++i) { m_lnbs[i].m_satellites.clear(); - m_lnbs[i].slot_mask = 0; + m_lnbs[i].m_slot_mask = 0; + m_lnbs[i].m_prio = -1; // auto } m_lnbidx=-1; @@ -875,6 +930,15 @@ RESULT eDVBSatelliteEquipmentControl::clear() it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1); } + for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) + { + it->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, -1); + it->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, -1); + it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1); + it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1); + it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1); + } + return 0; } @@ -896,7 +960,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask) { eSecDebug("eDVBSatelliteEquipmentControl::setLNBSlotMask(%d)", slotmask); if ( currentLNBValid() ) - m_lnbs[m_lnbidx].slot_mask = slotmask; + m_lnbs[m_lnbidx].m_slot_mask = slotmask; else return -ENOENT; return 0; @@ -942,6 +1006,17 @@ RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff) return 0; } +RESULT eDVBSatelliteEquipmentControl::setLNBPrio(int prio) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBPrio(%d)", prio); + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].m_prio = prio; + else + return -ENOENT; + return 0; +} + + /* DiSEqC Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode) { @@ -1216,6 +1291,20 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) fclose(f); } } + } + + p1=p2=NULL; + for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) + { + if (it->m_frontend->getSlotID() == tu1) + p1 = *it; + else if (it->m_frontend->getSlotID() == tu2) + p2 = *it; + } + if (p1 && p2) + { + p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2); + p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1); return 0; } } @@ -1238,11 +1327,26 @@ RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2) p2 = *it; } if (p1 && p2) + { + p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p2); + p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p1); + } + + p1=p2=NULL; + for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) + { + if (it->m_frontend->getSlotID() == tu1) + p1 = *it; + else if (it->m_frontend->getSlotID() == tu2) + p2 = *it; + } + if (p1 && p2) { p1->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p2); p2->m_frontend->setData(eDVBFrontend::SATPOS_DEPENDS_PTR, (long)p1); return 0; } + return -1; }