From cb22e9b244a2f9e54dba44b818395216585190bc Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 30 Mar 2006 10:43:55 +0000 Subject: [PATCH] in automatic scan do no more scan satellites twice when not needed (for advanced sat configurations) --- lib/dvb/sec.cpp | 79 +++++++++++++++++++++++++++++---- lib/dvb/sec.h | 2 +- lib/python/Screens/ScanSetup.py | 25 +++++++++-- 3 files changed, 92 insertions(+), 14 deletions(-) diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 6cd4f255..b995b806 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 @@ -1032,9 +1034,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; } diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index ab1f1ac3..ab6ab395 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -290,7 +290,7 @@ public: RESULT setTunerLinked(int from, int to); RESULT setTunerDepends(int from, int to); - PyObject *get_different_satellites(int tu1, int tu2); + PyObject *get_exclusive_satellites(int tu1, int tu2); void setRotorMoving(bool); // called from the frontend's bool isRotorMoving(); }; diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index 0229d5e8..8f02ab3a 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -376,15 +376,32 @@ class ScanSimple(Screen): def keyGo(self): scanList = [] + if nimmanager.getNimType(0) == nimmanager.nimType["DVB-S"] and nimmanager.getNimType(0) == nimmanager.getNimType(1): + sec = eDVBSatelliteEquipmentControl.getInstance() + if sec is not None: + exclusive_satellites = sec.get_exclusive_satellites(0,1) + else: + exclusive_satellites = [0,0] + else: + exclusive_satellites = [0,0] + print "exclusive satellites", exclusive_satellites for x in self.list: slotid = x[1].parent.configPath - print "configpath:", x[1].parent.configPath, "-", currentConfigSelectionElement(x[1].parent) + print "Scan Tuner", slotid, "-", currentConfigSelectionElement(x[1].parent) if currentConfigSelectionElement(x[1].parent) == "yes": tlist = [ ] if nimmanager.getNimType(x[1].parent.configPath) == nimmanager.nimType["DVB-S"]: + if slotid > 0: + idx = exclusive_satellites[0]+1 + else: + idx = 0 + exclusive_nim_sats = exclusive_satellites[idx+1:idx+1+exclusive_satellites[idx]] + print "exclusive_nim_sats", exclusive_nim_sats SatList = nimmanager.getSatListForNim(slotid) for sat in SatList: - getInitialTransponderList(tlist, sat[1]) + if sat[1] in exclusive_nim_sats or slotid == 0: + print sat + getInitialTransponderList(tlist, sat[1]) elif nimmanager.getNimType(x[1].parent.configPath) == nimmanager.nimType["DVB-C"]: getInitialCableTransponderList(tlist, nimmanager.getCableDescription(slotid)) scanList.append({"transponders": tlist, "feid": slotid, "flags": eComponentScan.scanNetworkSearch}) @@ -416,8 +433,8 @@ class ScanSimple(Screen): return False sec = eDVBSatelliteEquipmentControl.getInstance() if sec is not None: - different_satellites = sec.get_different_satellites(0,1) - if different_satellites is None:# or not len(different_satellites): + exclusive_satellites = sec.get_exclusive_satellites(0,1) + if len(exclusive_satellites) == 0: return False return True -- 2.30.2