X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c650b2ace739188d451031e19d116a4669a61326..f990151461bd800976ffc1382b674a537b8f1a3a:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 25eb9766..d8be8494 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -290,6 +290,8 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters diff = 1<<28; else if (exact && sat.fec != osat.fec && sat.fec != eDVBFrontendParametersSatellite::FEC::fAuto && osat.fec != eDVBFrontendParametersSatellite::FEC::fAuto) diff = 1<<27; + else if (exact && sat.modulation != osat.modulation && sat.modulation != eDVBFrontendParametersSatellite::Modulation::Auto && osat.modulation != eDVBFrontendParametersSatellite::Modulation::Auto) + diff = 1<<27; else { diff = abs(sat.frequency - osat.frequency); @@ -658,9 +660,9 @@ int eDVBFrontend::readFrontendData(int type) return 0; } -void PutToDict(PyObject *dict, const char*key, long value) +void PutToDict(ePyObject &dict, const char*key, long value) { - PyObject *item = PyInt_FromLong(value); + ePyObject item = PyInt_FromLong(value); if (item) { if (PyDict_SetItemString(dict, key, item)) @@ -671,9 +673,9 @@ void PutToDict(PyObject *dict, const char*key, long value) eDebug("could not create PyObject for %s", key); } -void PutToDict(PyObject *dict, const char*key, const char *value) +void PutToDict(ePyObject &dict, const char*key, const char *value) { - PyObject *item = PyString_FromString(value); + ePyObject item = PyString_FromString(value); if (item) { if (PyDict_SetItemString(dict, key, item)) @@ -684,7 +686,7 @@ void PutToDict(PyObject *dict, const char*key, const char *value) eDebug("could not create PyObject for %s", key); } -void fillDictWithSatelliteData(PyObject *dict, const FRONTENDPARAMETERS &parm, eDVBFrontend *fe) +void fillDictWithSatelliteData(ePyObject dict, const FRONTENDPARAMETERS &parm, eDVBFrontend *fe) { int freq_offset=0; int csw=0; @@ -768,7 +770,7 @@ void fillDictWithSatelliteData(PyObject *dict, const FRONTENDPARAMETERS &parm, e PutToDict(dict, "system", tmp); } -void fillDictWithCableData(PyObject *dict, const FRONTENDPARAMETERS &parm) +void fillDictWithCableData(ePyObject dict, const FRONTENDPARAMETERS &parm) { const char *tmp=0; PutToDict(dict, "frequency", parm_frequency/1000); @@ -829,7 +831,7 @@ void fillDictWithCableData(PyObject *dict, const FRONTENDPARAMETERS &parm) PutToDict(dict, "modulation", tmp); } -void fillDictWithTerrestrialData(PyObject *dict, const FRONTENDPARAMETERS &parm) +void fillDictWithTerrestrialData(ePyObject dict, const FRONTENDPARAMETERS &parm) { const char *tmp=0; PutToDict(dict, "frequency", parm_frequency); @@ -971,7 +973,7 @@ void fillDictWithTerrestrialData(PyObject *dict, const FRONTENDPARAMETERS &parm) PyObject *eDVBFrontend::readTransponderData(bool original) { - PyObject *ret=PyDict_New(); + ePyObject ret=PyDict_New(); if (ret) { @@ -1145,7 +1147,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer case eSecCommand::IF_VOLTAGE_GOTO: { eSecCommand::pair &compare = m_sec_sequence.current()->compare; - if ( compare.voltage == m_curVoltage && setSecSequencePos(compare.steps) ) + if ( compare.voltage == m_data[CUR_VOLTAGE] && setSecSequencePos(compare.steps) ) break; ++m_sec_sequence.current(); break; @@ -1153,7 +1155,23 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer case eSecCommand::IF_NOT_VOLTAGE_GOTO: { eSecCommand::pair &compare = m_sec_sequence.current()->compare; - if ( compare.voltage != m_curVoltage && setSecSequencePos(compare.steps) ) + if ( compare.voltage != m_data[CUR_VOLTAGE] && setSecSequencePos(compare.steps) ) + break; + ++m_sec_sequence.current(); + break; + } + case eSecCommand::IF_TONE_GOTO: + { + eSecCommand::pair &compare = m_sec_sequence.current()->compare; + if ( compare.tone == m_data[CUR_TONE] && setSecSequencePos(compare.steps) ) + break; + ++m_sec_sequence.current(); + break; + } + case eSecCommand::IF_NOT_TONE_GOTO: + { + eSecCommand::pair &compare = m_sec_sequence.current()->compare; + if ( compare.tone != m_data[CUR_TONE] && setSecSequencePos(compare.steps) ) break; ++m_sec_sequence.current(); break; @@ -1212,7 +1230,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer case eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO: { eSecCommand::pair &compare = m_sec_sequence.current()->compare; - int idx = compare.voltage; + int idx = compare.val; if ( idx == 0 || idx == 1 ) { int idle = readInputpower(); @@ -1259,7 +1277,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; case eSecCommand::IF_INPUTPOWER_DELTA_GOTO: { - int idleInputpower = m_idleInputpower[ (m_curVoltage&1) ? 0 : 1]; + int idleInputpower = m_idleInputpower[ (m_data[CUR_VOLTAGE]&1) ? 0 : 1]; eSecCommand::rotor &cmd = m_sec_sequence.current()->measure; const char *txt = cmd.direction ? "running" : "stopped"; eDebug("[SEC] waiting for rotor %s %d, idle %d, delta %d", @@ -1348,8 +1366,9 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; } default: + eDebug("[SEC] unhandled sec command %d", + ++m_sec_sequence.current()->cmd); ++m_sec_sequence.current(); - eDebug("[SEC] unhandled sec command"); } m_tuneTimer->start(delay,true); } @@ -1386,13 +1405,14 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm) res = m_sec->prepare(*this, parm, feparm, 1 << m_fe); if (!res) { - eDebug("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d", + eDebug("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d", feparm.system, feparm.frequency, feparm.polarisation, feparm.symbol_rate, feparm.inversion, - feparm.fec); + feparm.fec, + feparm.orbital_position); parm_u_qpsk_symbol_rate = feparm.symbol_rate; switch (feparm.inversion) { @@ -1555,6 +1575,12 @@ RESULT eDVBFrontend::prepare_cable(const eDVBFrontendParametersCable &feparm) parm_u_qam_fec_inner = FEC_AUTO; break; } + eDebug("tuning to %d khz, sr %d, fec %d, modulation %d, inversion %d", + parm_frequency/1000, + parm_u_qam_symbol_rate, + parm_u_qam_fec_inner, + parm_u_qam_modulation, + parm_inversion); return 0; } @@ -1716,11 +1742,15 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) if (!m_sn) { eDebug("no frontend device opened... do not try to tune !!!"); - return -ENODEV; + res = -ENODEV; + goto tune_error; } if (m_type == -1) - return -ENODEV; + { + res = -ENODEV; + goto tune_error; + } m_sn->stop(); m_sec_sequence.clear(); @@ -1733,23 +1763,30 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) if (where.getDVBS(feparm)) { eDebug("no dvbs data!"); - return -EINVAL; + res = -EINVAL; + goto tune_error; } - res=prepare_sat(feparm); m_sec->setRotorMoving(false); + res=prepare_sat(feparm); + if (res) + goto tune_error; + break; } case feCable: { eDVBFrontendParametersCable feparm; if (where.getDVBC(feparm)) - return -EINVAL; - res=prepare_cable(feparm); - if (!res) { - m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); - m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); + res = -EINVAL; + goto tune_error; } + res=prepare_cable(feparm); + if (res) + goto tune_error; + + m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); + m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); break; } case feTerrestrial: @@ -1758,40 +1795,43 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) if (where.getDVBT(feparm)) { eDebug("no -T data"); - return -EINVAL; + res = -EINVAL; + goto tune_error; } res=prepare_terrestrial(feparm); - if (!res) - { - std::string enable_5V; - char configStr[255]; - snprintf(configStr, 255, "config.Nim%c.terrestrial_5V", 'A'+m_fe); - m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); - ePythonConfigQuery::getConfigValue(configStr, enable_5V); - if (enable_5V == "on") - m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); - else - m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltageOff) ); - m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - } + if (res) + goto tune_error; + + std::string enable_5V; + char configStr[255]; + snprintf(configStr, 255, "config.Nims.%d.terrestrial_5V", m_fe); + m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); + ePythonConfigQuery::getConfigValue(configStr, enable_5V); + if (enable_5V == "True") + m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + else + m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltageOff) ); + m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); + break; } } - if (!res) // prepare ok - { - m_tuneTimer->start(0,true); - m_sec_sequence.current() = m_sec_sequence.begin(); + m_tuneTimer->start(0,true); + m_sec_sequence.current() = m_sec_sequence.begin(); - if (m_state != stateTuning) - { - m_tuning = 1; - m_state = stateTuning; - m_stateChanged(this); - } + if (m_state != stateTuning) + { + m_tuning = 1; + m_state = stateTuning; + m_stateChanged(this); } return res; + +tune_error: + m_tuneTimer->stop(); + return res; } RESULT eDVBFrontend::connectStateChange(const Slot1 &stateChange, ePtr &connection) @@ -1810,7 +1850,7 @@ RESULT eDVBFrontend::setVoltage(int voltage) bool increased=false; fe_sec_voltage_t vlt; #endif - m_curVoltage=voltage; + m_data[CUR_VOLTAGE]=voltage; switch (voltage) { case voltageOff: @@ -1865,7 +1905,7 @@ RESULT eDVBFrontend::setTone(int t) #else fe_sec_tone_mode_t tone; #endif - + m_data[CUR_TONE]=t; switch (t) { case toneOn: @@ -1978,5 +2018,7 @@ int eDVBFrontend::isCompatibleWith(ePtr &feparm) ASSERT(!feparm->getDVBS(sat_parm)); return m_sec->canTune(sat_parm, this, 1 << m_fe); } + else if (m_type == eDVBFrontend::feCable) + return 2; // more prio for cable frontends return 1; }