X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/73b8a4b3bde5567fae6b29d4a0161b08475e7908..191cade7c45bee53df2776ff5bb3f26b2cdafc12:/lib/dvb/sec.cpp diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 6cd4f255..f24783c8 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -2,6 +2,8 @@ #include #include +#include + #if HAVE_DVB_API_VERSION < 3 #define FREQUENCY Frequency #else @@ -93,7 +95,7 @@ eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList::iterator sit = lnb_param.m_satellites.find(sat.orbital_position); if ( sit != lnb_param.m_satellites.end()) @@ -136,20 +140,14 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite csw |= band; if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 ) // ROTOR - { - rotor=true; - if ( curRotorPos == sat.orbital_position ) - ret=20; // rotor on correct orbpos = prio 20 - else - ret=10; // rotor must turn to correct orbpos = prio 10 - } - else - ret = 30; // no rotor = prio 30 + rotor = true; + + ret = 1000; } else { csw = band; - ret = 40; // no diseqc = prio 40 + ret = 2000; } if (linked_to != -1) // check for linked tuners.. @@ -219,6 +217,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite } } } + if (ret && satcount) + ret -= (satcount-1); return ret; } @@ -395,7 +395,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA int RotorCmd=-1; bool useGotoXX = false; - if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 ) + if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 + && !sat.no_rotor_command_on_tune ) { if (depend_satpos_mode || linked) // in this both modes we dont really turn the rotor.... but in canTune we need the satpos @@ -501,7 +502,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA ++loops; for ( int i=0; i < di_param.m_repeats; ++i ) - loops *= 2; + loops *= 2; for ( int i = 0; i < loops;) // fill commands... { @@ -519,10 +520,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA diseqc.data[2] = 0x38; diseqc.data[3] = csw; } - else + else // no committed command confed.. so send uncommitted.. { - diseqc.data[2] = 0x00; - diseqc.data[3] = 0x00; + diseqc.data[2] = 0x39; + diseqc.data[3] = ucsw; } sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); @@ -1032,9 +1033,38 @@ RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num) return 0; } -PyObject *eDVBSatelliteEquipmentControl::get_different_satellites(int tu1, int tu2) +struct sat_compare +{ + int orb_pos, lofl, lofh; + sat_compare(int o, int lofl, int lofh) + :orb_pos(o), lofl(lofl), lofh(lofh) + {} + sat_compare(const sat_compare &x) + :orb_pos(x.orb_pos), lofl(x.lofl), lofh(x.lofh) + {} + bool operator < (const sat_compare & cmp) const + { + if (orb_pos == cmp.orb_pos) + { + if ( abs(lofl-cmp.lofl) < 200000 ) + { + if (abs(lofh-cmp.lofh) < 200000) + return false; + return lofhm_frontend->getData(8, tmp2); if ((void*)tmp1 != p2 && (void*)tmp2 != p1) { - // here we know the tuners are not linked and no rotor dependency exist. - // now we check all configured satellites/lnb for difference and at all difference - // to a list of tuples with first value tuner number and second value orbital position - // of satellite - ret = PyList_New(0); - // FIXMEE !! fill list (compare satellites (lofh, lofl, lof threshold, opos)) + std::set tu1sats, tu2sats; + std::list tu1difference, tu2difference; + std::insert_iterator > insert1(tu1difference, tu1difference.begin()), + insert2(tu2difference, tu2difference.begin()); + for (int idx=0; idx <= m_lnbidx; ++idx ) + { + eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx]; + for (std::map::iterator sit(lnb_param.m_satellites.begin()); + sit != lnb_param.m_satellites.end(); ++sit) + { + if ( lnb_param.tuner_mask & tu1_mask ) + tu1sats.insert(sat_compare(sit->first, lnb_param.m_lof_lo, lnb_param.m_lof_hi)); + if ( lnb_param.tuner_mask & tu2_mask ) + tu2sats.insert(sat_compare(sit->first, lnb_param.m_lof_lo, lnb_param.m_lof_hi)); + } + } + std::set_difference(tu1sats.begin(), tu1sats.end(), + tu2sats.begin(), tu2sats.end(), + insert1); + std::set_difference(tu2sats.begin(), tu2sats.end(), + tu1sats.begin(), tu1sats.end(), + insert2); + if (!tu1sats.empty() || !tu2sats.empty()) + { + int idx=0; + ret = PyList_New(2+tu1difference.size()+tu2difference.size()); + + PyList_SET_ITEM(ret, idx++, PyInt_FromLong(tu1difference.size())); + for(std::list::iterator it(tu1difference.begin()); it != tu1difference.end(); ++it) + PyList_SET_ITEM(ret, idx++, PyInt_FromLong(it->orb_pos)); + + PyList_SET_ITEM(ret, idx++, PyInt_FromLong(tu2difference.size())); + for(std::list::iterator it(tu2difference.begin()); it != tu2difference.end(); ++it) + PyList_SET_ITEM(ret, idx++, PyInt_FromLong(it->orb_pos)); + } } } } } if (!ret) { - Py_INCREF(Py_None); - ret = Py_None; + ret = PyList_New(2); + PyList_SET_ITEM(ret, 0, PyInt_FromLong(0)); + PyList_SET_ITEM(ret, 1, PyInt_FromLong(0)); } return ret; }