From 67b8794397ca2ac4e05c59fc417456f4d4cac8f0 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Fri, 7 Nov 2008 18:41:14 +0100 Subject: add ResourceManager for handling resources in inter plugin communication --- lib/python/Components/Makefile.am | 2 +- lib/python/Components/ResourceManager.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 lib/python/Components/ResourceManager.py (limited to 'lib/python') diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index fda58bf3..9c04701b 100644 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -18,4 +18,4 @@ install_PYTHON = \ MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \ - Task.py language_cache.py Console.py + Task.py language_cache.py Console.py ResourceManager.py diff --git a/lib/python/Components/ResourceManager.py b/lib/python/Components/ResourceManager.py new file mode 100644 index 00000000..fb6be4a8 --- /dev/null +++ b/lib/python/Components/ResourceManager.py @@ -0,0 +1,23 @@ +class ResourceManager: + def __init__(self): + self.resourceList = {} + + def addResource(self, name, resource): + print "adding Resource", name + self.resourceList[name] = resource + print "resources:", self.resourceList + + + def getResource(self, name): + if not self.hasResource(name): + return None + return self.resourceList[name] + + def hasResource(self, name): + return self.resourceList.has_key(name) + + def removeResource(self, name): + if self.hasResource(name): + del self.resourceList[name] + +resourcemanager = ResourceManager() \ No newline at end of file -- cgit v1.2.3 From 216dbbfd18a36835b8a48d2f2e1e1ce2c65c8f14 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Mon, 24 Nov 2008 22:42:42 +0100 Subject: catch up DiseqcTest development --- configure.ac | 1 + lib/dvb/db.cpp | 73 ++++--- lib/python/Components/Makefile.am | 2 +- lib/python/Components/Sources/Progress.py | 7 + lib/python/Components/TuneTest.py | 189 ++++++++++++++++ .../Plugins/SystemPlugins/DiseqcTester/Makefile.am | 5 + .../Plugins/SystemPlugins/DiseqcTester/__init__.py | 0 .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 239 +++++++++++++++++++++ lib/python/Plugins/SystemPlugins/Makefile.am | 2 +- .../Plugins/SystemPlugins/Satfinder/plugin.py | 27 +-- lib/python/Screens/Satconfig.py | 88 ++++---- 11 files changed, 533 insertions(+), 100 deletions(-) create mode 100644 lib/python/Components/TuneTest.py create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py (limited to 'lib/python') diff --git a/configure.ac b/configure.ac index 7aebe25f..719baa11 100644 --- a/configure.ac +++ b/configure.ac @@ -120,6 +120,7 @@ lib/python/Plugins/SystemPlugins/SkinSelector/Makefile lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/Makefile lib/python/Plugins/SystemPlugins/Videomode/Makefile lib/python/Plugins/SystemPlugins/VideoTune/Makefile +lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile lib/python/Plugins/DemoPlugins/Makefile lib/python/Plugins/DemoPlugins/TestPlugin/Makefile lib/python/Plugins/Extensions/Makefile diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 44191586..6f30253a 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -786,7 +786,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje return Py_False; } int tmp, *dest = NULL, - modulation, system, freq, sr, pol, fec, inv, pilot, rolloff; + modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid; char *end_ptr; const Attribute *at; std::string name; @@ -851,6 +851,9 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje inv = 2; // AUTO default pilot = 2; // AUTO default rolloff = 0; // alpha 0.35 + tsid = -1; + onid = -1; + for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { // eDebug("\t\tattr: %s", at->name().c_str()); @@ -865,6 +868,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje else if (name == "inversion") dest = &inv; else if (name == "rolloff") dest = &rolloff; else if (name == "pilot") dest = &pilot; + else if (name == "tsid") dest = &tsid; + else if (name == "onid") dest = &onid; if (dest) { tmp = strtol(at->value().c_str(), &end_ptr, 10); @@ -874,7 +879,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje } if (freq && sr && pol != -1) { - tuple = PyTuple_New(10); + tuple = PyTuple_New(12); PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0)); PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq)); PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr)); @@ -885,6 +890,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv)); PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff)); PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot)); + PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid)); + PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid)); PyList_Append(tplist, tuple); Py_DECREF(tuple); } @@ -1497,7 +1504,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ { ePtr a_service, b_service; int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName; - + if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider)) { if (a.name.empty() && m_db->getService(a, a_service)) @@ -1505,7 +1512,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ if (b.name.empty() && m_db->getService(b, b_service)) return 1; } - + switch (sortmode) { case eDVBChannelQuery::tName: @@ -1747,10 +1754,10 @@ static int decodeType(const std::string &type) RESULT parseExpression(ePtr &res, std::list::const_iterator begin, std::list::const_iterator end) { std::list::const_iterator end_of_exp; - + if (begin == end) return 0; - + if (*begin == "(") { end_of_exp = begin; @@ -1759,36 +1766,36 @@ RESULT parseExpression(ePtr &res, std::list::cons break; else ++end_of_exp; - + if (end_of_exp == end) { eDebug("expression parse: end of expression while searching for closing brace"); return -1; } - + ++begin; // begin..end_of_exp int r = parseExpression(res, begin, end_of_exp); if (r) return r; ++end_of_exp; - + /* we had only one sub expression */ if (end_of_exp == end) { // eDebug("only one sub expression"); return 0; } - + /* otherwise we have an operator here.. */ - + ePtr r2 = res; res = new eDVBChannelQuery(); res->m_sort = 0; res->m_p1 = r2; res->m_inverse = 0; r2 = 0; - + if (*end_of_exp == "||") res->m_type = eDVBChannelQuery::tOR; else if (*end_of_exp == "&&") @@ -1799,18 +1806,18 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + ++end_of_exp; - + return parseExpression(res->m_p2, end_of_exp, end); } - + // "begin" "end" std::string type, op, val; - + res = new eDVBChannelQuery(); res->m_sort = 0; - + int cnt = 0; while (begin != end) { @@ -1832,23 +1839,23 @@ RESULT parseExpression(ePtr &res, std::list::cons ++begin; ++cnt; } - + if (cnt != 3) { eDebug("malformed query: missing stuff"); res = 0; return 1; } - + res->m_type = decodeType(type); - + if (res->m_type == -1) { eDebug("malformed query: invalid type %s", type.c_str()); res = 0; return 1; } - + if (op == "==") res->m_inverse = 0; else if (op == "!=") @@ -1859,7 +1866,7 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + res->m_string = val; if (res->m_type == eDVBChannelQuery::tChannelID) @@ -1879,7 +1886,7 @@ RESULT parseExpression(ePtr &res, std::list::cons RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { std::list tokens; - + std::string current_token; std::string bouquet_name; @@ -1891,34 +1898,34 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { int c = (i < query.size()) ? query[i] : ' '; ++i; - + int issplit = !!strchr(splitchars, c); int isaln = isalnum(c); int iswhite = c == ' '; int isquot = c == '\"'; - + if (quotemode) { iswhite = issplit = 0; isaln = lastalnum; } - + if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln)) { if (current_token.size()) tokens.push_back(current_token); current_token.clear(); } - + if (!(iswhite || isquot)) current_token += c; - + if (isquot) quotemode = !quotemode; lastsplit = issplit; lastalnum = isaln; } - + // for (std::list::const_iterator a(tokens.begin()); a != tokens.end(); ++a) // { // printf("%s\n", a->c_str()); @@ -1970,12 +1977,12 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res = 0; return -1; } - + // eDebug("sort by %d", sort); - + /* now we recursivly parse that. */ int r = parseExpression(res, tokens.begin(), tokens.end()); - + /* we have an empty (but valid!) expression */ if (!r && !res) { @@ -1983,7 +1990,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res->m_inverse = 0; res->m_type = eDVBChannelQuery::tAny; } - + if (res) { res->m_sort = sort; diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index 9c04701b..67cec18d 100644 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -18,4 +18,4 @@ install_PYTHON = \ MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \ - Task.py language_cache.py Console.py ResourceManager.py + Task.py language_cache.py Console.py ResourceManager.py TuneTest.py diff --git a/lib/python/Components/Sources/Progress.py b/lib/python/Components/Sources/Progress.py index b96065b3..d57a6179 100644 --- a/lib/python/Components/Sources/Progress.py +++ b/lib/python/Components/Sources/Progress.py @@ -12,5 +12,12 @@ class Progress(Source): def setValue(self, value): self.__value = value self.changed((self.CHANGED_ALL,)) + + def setRange(self, range = 100): + self.range = range + self.changed((self.CHANGED_ALL,)) + + def getRange(self): + return self.range value = property(getValue, setValue) diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py new file mode 100644 index 00000000..7b087b98 --- /dev/null +++ b/lib/python/Components/TuneTest.py @@ -0,0 +1,189 @@ +from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVBResourceManager, eTimer + +class Tuner: + def __init__(self, frontend): + self.frontend = frontend + + # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation) + # 0 1 2 3 4 5 6 7 + def tune(self, transponder): + if self.frontend: + print "tuning to transponder with data", transponder + parm = eDVBFrontendParametersSatellite() + parm.frequency = transponder[0] * 1000 + parm.symbol_rate = transponder[1] * 1000 + parm.polarisation = transponder[2] + parm.fec = transponder[3] + parm.inversion = transponder[4] + parm.orbital_position = transponder[5] + parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2) + parm.modulation = 1 # FIXMEE !! HARDCODED QPSK + feparm = eDVBFrontendParameters() + feparm.setDVBS(parm) + self.lastparm = feparm + self.frontend.tune(feparm) + + def retune(self): + if self.frontend: + self.frontend.tune(self.lastparm) + +# tunes a list of transponders and checks, if they lock and optionally checks the onid/tsid combination +# 1) add transponders with addTransponder() +# 2) call run() +# 3) finishedChecking() is called, when the run is finished +class TuneTest: + def __init__(self, feid, stopOnSuccess = False, stopOnError = False): + self.stopOnSuccess = stopOnSuccess + self.stopOnError = stopOnError + self.feid = feid + self.transponderlist = [] + self.currTuned = None + print "TuneTest for feid %d" % self.feid + if not self.openFrontend(): + self.oldref = self.session.nav.getCurrentlyPlayingServiceReference() + self.session.nav.stopService() # try to disable foreground service + if not self.openFrontend(): + if self.session.pipshown: # try to disable pip + self.session.pipshown = False + del self.session.pip + if not self.openFrontend(): + self.frontend = None # in normal case this should not happen + self.tuner = Tuner(self.frontend) + self.timer = eTimer() + self.timer.callback.append(self.updateStatus) + + def updateStatus(self): + dict = {} + self.frontend.getFrontendStatus(dict) + print "status:", dict + + stop = False + + if dict["tuner_state"] == "TUNING": + self.timer.start(100, True) + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) + elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: + if dict["tuner_state"] == "LOCKED": + print "acquiring TSID/ONID" + # TODO start getting TSID/ONID + self.pidStatus = self.INTERNAL_PID_STATUS_WAITING + else: + self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_WAITING: + print "waiting for pids" + else: + if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED": + self.tuningtransponder = self.nextTransponder() + self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"]) + if self.stopOnError == True: + stop = True + elif dict["tuner_state"] == "LOCKED": + pidsFailed = False + if self.checkPIDs: + tsid = 0 # TODO read values + onid = 0 # TODO read values + if tsid != self.currTuned[8] or onid != self.currTuned[9]: + self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) + pidsFailes = True + elif not self.checkPIDs or (self.checkPids and not pidsFailed): + self.successfullyTune.append([self.currTuned, self.oldTuned]) + if self.stopOnSuccess == True: + stop = True + self.tuningtransponder = self.nextTransponder() + else: + print "************* tuner_state:", dict["tuner_state"] + + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) + + if not stop: + self.tune() + if self.tuningtransponder < len(self.transponderlist) and not stop: + self.timer.start(100, True) + print "restart timer" + else: + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) + print "finishedChecking" + self.finishedChecking() + + def firstTransponder(self): + print "firstTransponder:" + index = 0 + if self.checkPIDs: + print "checkPIDs-loop" + # check for tsid != -1 and onid != -1 + print "index:", index + print "len(self.transponderlist):", len(self.transponderlist) + while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)): + index += 1 + print "FirstTransponder final index:", index + return index + + def nextTransponder(self): + index = self.tuningtransponder + 1 + if self.checkPIDs: + # check for tsid != -1 and onid != -1 + while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1): + index += 1 + + return index + + def finishedChecking(self): + print "finished testing" + print "successfull:", self.successfullyTune + print "failed:", self.failedTune + + def openFrontend(self): + res_mgr = eDVBResourceManager.getInstance() + if res_mgr: + self.raw_channel = res_mgr.allocateRawChannel(self.feid) + if self.raw_channel: + self.frontend = self.raw_channel.getFrontend() + if self.frontend: + return True + else: + print "getFrontend failed" + else: + print "getRawChannel failed" + else: + print "getResourceManager instance failed" + return False + + def tune(self): + print "tuning to", self.tuningtransponder + if self.tuningtransponder < len(self.transponderlist): + self.pidStatus = self.INTERNAL_PID_STATUS_NOOP + self.oldTuned = self.currTuned + self.currTuned = self.transponderlist[self.tuningtransponder] + self.tuner.tune(self.transponderlist[self.tuningtransponder]) + + INTERNAL_PID_STATUS_NOOP = 0 + INTERNAL_PID_STATUS_WAITING = 1 + INTERNAL_PID_STATUS_SUCCESSFUL = 2 + INTERNAL_PID_STATUS_FAILED = 3 + + def run(self, checkPIDs = False): + self.checkPIDs = checkPIDs + self.pidStatus = self.INTERNAL_PID_STATUS_NOOP + self.failedTune = [] + self.successfullyTune = [] + self.tuningtransponder = self.firstTransponder() + self.tune() + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned)) + self.timer.start(100, True) + + # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, , , , ) + # 0 1 2 3 4 5 6 7 8 9 + def addTransponder(self, transponder): + self.transponderlist.append(transponder) + + def clearTransponder(self): + self.transponderlist = [] + + STATUS_START = 0 + STATUS_TUNING = 1 + STATUS_DONE = 2 + STATUS_NOOP = 3 + # can be overwritten + # progress = (range, value, status, transponder) + def progressCallback(self, progress): + pass \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am b/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am new file mode 100644 index 00000000..cd72696a --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/DiseqcTester + +install_PYTHON = \ + __init__.py \ + plugin.py \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py new file mode 100644 index 00000000..57340368 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -0,0 +1,239 @@ +from Screens.Satconfig import NimSelection +from Screens.Screen import Screen + +from Plugins.Plugin import PluginDescriptor + +from Components.ActionMap import NumberActionMap +from Components.NimManager import nimmanager +from Components.ResourceManager import resourcemanager +from Components.Sources.FrontendStatus import FrontendStatus +from Components.TuneTest import TuneTest +from Components.Sources.Progress import Progress +from Components.Sources.StaticText import StaticText + +class DiseqcTester(Screen, TuneTest): + skin = """ + + + + SNRdB + + + + SNR + + + SNR + + + + AGC + + + AGC + + + + BER + + + BER + + + + LOCK + + + + LOCK + Invert + + + + + + + + + + + + """ + + TEST_TYPE_QUICK = 0 + TEST_TYPE_RANDOM = 1 + TEST_TYPE_COMPLETE = 2 + def __init__(self, session, feid, test_type = TEST_TYPE_QUICK): + Screen.__init__(self, session) + self.feid = feid + self.test_type = test_type + + self["actions"] = NumberActionMap(["SetupActions"], + { + "ok": self.keyGo, + "cancel": self.keyCancel, + }, -2) + + TuneTest.__init__(self, feid, stopOnSuccess = True) + self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) + self["overall_progress"] = Progress() + self["sub_progress"] = Progress() + self["failed_counter"] = StaticText("10") + self["succeeded_counter"] = StaticText("10") + + self.indexlist = {} + self.readTransponderList() + + def readTransponderList(self): + for sat in nimmanager.getSatListForNim(self.feid): + for transponder in nimmanager.getTransponders(sat[0]): + #print transponder + mytransponder = (transponder[1] / 1000, transponder[2] / 1000, transponder[3], transponder[4], transponder[5], sat[0], None, None, transponder[10], transponder[11]) + self.analyseTransponder(mytransponder) + + def getIndexForTransponder(self, transponder): + if transponder[0] < 11700: + band = 1 # low + else: + band = 0 # high + + polarisation = transponder[2] + + sat = transponder[5] + + index = (band, polarisation, sat) + return index + + # sort the transponder into self.transponderlist + def analyseTransponder(self, transponder): + index = self.getIndexForTransponder(transponder) + if index not in self.indexlist: + self.indexlist[index] = [] + self.indexlist[index].append(transponder) + #print "self.indexlist:", self.indexlist + + # returns a string for the user representing a human readable output for index + def getTextualIndexRepresentation(self, index): + print "getTextualIndexRepresentation:", index + text = "" + + # TODO better sat representation + text += "%s, " % index[2] + + if index[0] == 1: + text += "Low Band, " + else: + text += "High Band, " + + if index[1] == 0: + text += "H" + else: + text += "V" + return text + + def fillTransponderList(self): + self.clearTransponder() + print "----------- fillTransponderList" + print "index:", self.currentlyTestedIndex + keys = self.indexlist.keys() + if self.getContinueScanning(): + print "index:", self.getTextualIndexRepresentation(self.currentlyTestedIndex) + for transponder in self.indexlist[self.currentlyTestedIndex]: + self.addTransponder(transponder) + print "transponderList:", self.transponderlist + return True + else: + return False + + def progressCallback(self, progress): + if progress[0] != self["sub_progress"].getRange(): + self["sub_progress"].setRange(progress[0]) + self["sub_progress"].setValue(progress[1]) + + # logic for scanning order of transponders + # on go getFirstIndex is called + def getFirstIndex(self): + # TODO use other function to scan more randomly + if self.test_type == self.TEST_TYPE_QUICK: + self.myindex = 0 + keys = self.indexlist.keys() + self["overall_progress"].setRange(len(keys)) + self["overall_progress"].setValue(self.myindex) + return keys[0] + + # after each index is finished, getNextIndex is called to get the next index to scan + def getNextIndex(self): + # TODO use other function to scan more randomly + if self.test_type == self.TEST_TYPE_QUICK: + self.myindex += 1 + keys = self.indexlist.keys() + + self["overall_progress"].setValue(self.myindex) + if self.myindex < len(keys): + return keys[self.myindex] + else: + return None + + # after each index is finished and the next index is returned by getNextIndex + # the algorithm checks, if we should continue scanning + def getContinueScanning(self): + if self.test_type == self.TEST_TYPE_QUICK: + return (self.myindex < len(self.indexlist.keys())) + + def finishedChecking(self): + print "finishedChecking" + TuneTest.finishedChecking(self) + self.currentlyTestedIndex = self.getNextIndex() + if self.fillTransponderList(): + self.run(checkPIDs = True) + + def keyGo(self): + self.currentlyTestedIndex = self.getFirstIndex() + if self.fillTransponderList(): + self.run(True) + + def keyCancel(self): + self.close() + +class DiseqcTesterNimSelection(NimSelection): + skin = """ + + + + {"template": [ + MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, + MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, + ], + "fonts": [gFont("Regular", 20), gFont("Regular", 15)], + "itemHeight": 70 + } + + + """ + + def __init__(self, session, args = None): + NimSelection.__init__(self, session) + + def setResultClass(self): + self.resultclass = DiseqcTester + + def showNim(self, nim): + nimConfig = nimmanager.getNimConfig(nim.slot) + if nim.isCompatible("DVB-S"): + if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends", "nothing"]: + return False + if nimConfig.configMode.value == "simple": + if nimConfig.diseqcMode.value == "positioner": + return False + return True + return False + +def DiseqcTesterMain(session, **kwargs): + session.open(DiseqcTesterNimSelection) + +def autostart(reason, **kwargs): + resourcemanager.addResource("DiseqcTester", DiseqcTesterMain) + +def Plugins(**kwargs): + return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain), + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)] \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/Makefile.am b/lib/python/Plugins/SystemPlugins/Makefile.am index 36b4bde5..4491eafc 100644 --- a/lib/python/Plugins/SystemPlugins/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Makefile.am @@ -1 +1 @@ -SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash +SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash DiseqcTester diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py index d61c1503..72982483 100644 --- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py @@ -12,33 +12,8 @@ from Components.ActionMap import ActionMap from Components.NimManager import nimmanager, getConfigSatlist from Components.MenuList import MenuList from Components.config import ConfigSelection, getConfigListEntry +from Components.TuneTest import Tuner -class Tuner: - def __init__(self, frontend): - self.frontend = frontend - - def tune(self, transponder): - if self.frontend: - print "tuning to transponder with data", transponder - parm = eDVBFrontendParametersSatellite() - parm.frequency = transponder[0] * 1000 - parm.symbol_rate = transponder[1] * 1000 - parm.polarisation = transponder[2] - parm.fec = transponder[3] - parm.inversion = transponder[4] - parm.orbital_position = transponder[5] - parm.system = transponder[6] - parm.modulation = transponder[7] - parm.rolloff = transponder[8] - parm.pilot = transponder[9] - feparm = eDVBFrontendParameters() - feparm.setDVBS(parm, True) - self.lastparm = feparm - self.frontend.tune(feparm) - - def retune(self): - if self.frontend: - self.frontend.tune(self.lastparm) class Satfinder(ScanSetup): def openFrontend(self): diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 5628926f..320bea84 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -384,18 +384,26 @@ class NimSelection(Screen): self.list = [None] * nimmanager.getSlotCount() self["nimlist"] = List(self.list) self.updateList() + + self.setResultClass() self["actions"] = ActionMap(["OkCancelActions"], { "ok": self.okbuttonClick , "cancel": self.close }, -2) + + def setResultClass(self): + self.resultclass = NimSetup def okbuttonClick(self): nim = self["nimlist"].getCurrent() nim = nim and nim[3] if nim is not None and not nim.empty: - self.session.openWithCallback(self.updateList, NimSetup, nim.slot) + self.session.openWithCallback(self.updateList, self.resultclass, nim.slot) + + def showNim(self, nim): + return True def updateList(self): self.list = [ ] @@ -403,42 +411,44 @@ class NimSelection(Screen): slotid = x.slot nimConfig = nimmanager.getNimConfig(x.slot) text = nimConfig.configMode.value - if x.isCompatible("DVB-S"): - if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]: - text = { "loopthrough": _("loopthrough to"), - "equal": _("equal to"), - "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value] - text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)] - elif nimConfig.configMode.value == "nothing": - text = _("nothing connected") - elif nimConfig.configMode.value == "simple": - if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - text = _("Sats") + ": " - if nimConfig.diseqcA.orbital_position != 3601: - text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) - if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - if nimConfig.diseqcB.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) - if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": - if nimConfig.diseqcC.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) - if nimConfig.diseqcD.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) - elif nimConfig.diseqcMode.value == "positioner": - text = _("Positioner") + ":" - if nimConfig.positionerMode.value == "usals": - text += _("USALS") - elif nimConfig.positionerMode.value == "manual": - text += _("manual") - else: - text = _("simple") - elif nimConfig.configMode.value == "advanced": - text = _("advanced") - elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"): - if nimConfig.configMode.value == "nothing": - text = _("nothing connected") - elif nimConfig.configMode.value == "enabled": - text = _("enabled") - - self.list.append((slotid, x.friendly_full_description, text, x)) + if self.showNim(x): + if x.isCompatible("DVB-S"): + if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]: + text = { "loopthrough": _("loopthrough to"), + "equal": _("equal to"), + "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value] + text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)] + elif nimConfig.configMode.value == "nothing": + text = _("nothing connected") + elif nimConfig.configMode.value == "simple": + if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: + text = _("Sats") + ": " + if nimConfig.diseqcA.orbital_position != 3601: + text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) + if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: + if nimConfig.diseqcB.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) + if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": + if nimConfig.diseqcC.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) + if nimConfig.diseqcD.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) + elif nimConfig.diseqcMode.value == "positioner": + text = _("Positioner") + ":" + if nimConfig.positionerMode.value == "usals": + text += _("USALS") + elif nimConfig.positionerMode.value == "manual": + text += _("manual") + else: + text = _("simple") + elif nimConfig.configMode.value == "advanced": + text = _("advanced") + elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"): + if nimConfig.configMode.value == "nothing": + text = _("nothing connected") + elif nimConfig.configMode.value == "enabled": + text = _("enabled") + + self.list.append((slotid, x.friendly_full_description, text, x)) + self["nimlist"].setList(self.list) self["nimlist"].updateList(self.list) \ No newline at end of file -- cgit v1.2.3 From 1d07f28ae2ebe4fd075f24f601cd37770435eb52 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Mon, 24 Nov 2008 23:52:26 +0100 Subject: add onid/tsid polling --- lib/dvb/dvb.cpp | 110 +++++++++++++++++++------------------- lib/python/Components/TuneTest.py | 28 +++++++--- 2 files changed, 75 insertions(+), 63 deletions(-) (limited to 'lib/python') diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index eac4554d..24609438 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -70,19 +70,19 @@ eDVBResourceManager::eDVBResourceManager() if (!instance) instance = this; - + /* search available adapters... */ // add linux devices - + int num_adapter = 0; while (eDVBAdapterLinux::exist(num_adapter)) { addAdapter(new eDVBAdapterLinux(num_adapter)); num_adapter++; } - - eDebug("found %d adapter, %d frontends(%d sim) and %d demux", + + eDebug("found %d adapter, %d frontends(%d sim) and %d demux", m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size()); eDVBCAService::registerChannelCallback(this); @@ -104,7 +104,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) { // scan frontends int num_fe = 0; - + eDebug("scanning for frontends.."); while (1) { @@ -133,7 +133,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) } ++num_fe; } - + // scan demux int num_demux = 0; while (1) @@ -148,10 +148,10 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) if (stat(filename, &s)) break; ePtr demux; - + demux = new eDVBDemux(m_nr, num_demux); m_demux.push_back(demux); - + ++num_demux; } } @@ -169,12 +169,12 @@ RESULT eDVBAdapterLinux::getDemux(ePtr &demux, int nr) --nr; ++i; } - + if (i != m_demux.end()) demux = *i; else return -1; - + return 0; } @@ -191,12 +191,12 @@ RESULT eDVBAdapterLinux::getFrontend(ePtr &fe, int nr, bool simula --nr; ++i; } - + if (i != m_frontend.end()) fe = *i; else return -1; - + return 0; } @@ -224,9 +224,9 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter) { int num_fe = adapter->getNumFrontends(); int num_demux = adapter->getNumDemux(); - + m_adapter.push_back(adapter); - + int i; for (i=0; i unused; - + if (m_demux.size() < 5) { /* FIXME: hardware demux policy */ @@ -444,14 +444,14 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrm_demux->getRefCount() != 2) : i->m_inuse; - + if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter))) { if ((cap & iDVBChannel::capDecode) && !is_decode) continue; - unused = i; + unused = i; break; } } @@ -467,7 +467,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrm_adapter == fe->m_adapter && + else if (i->m_adapter == fe->m_adapter && i->m_demux->getSource() == fe->m_frontend->getDVBID()) { demux = new eDVBAllocatedDemux(i); @@ -573,7 +573,7 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse } /* allocate a frontend. */ - + ePtr fe; int err = allocateFrontend(fe, feparm, simulate); @@ -999,7 +999,7 @@ int eDVBChannelFilePush::filterRecordData(const unsigned char *_data, int len, s if (m_iframe_state == 1) { - /* we are allowing data, and stop allowing data on the next frame. + /* we are allowing data, and stop allowing data on the next frame. we now found a frame. so stop here. */ memset(data + offset, 0, 188 - (offset%188)); /* zero out rest of TS packet */ current_span_remaining = 0; @@ -1064,9 +1064,9 @@ eDVBChannel::eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *fronte m_frontend = frontend; m_pvr_thread = 0; - + m_skipmode_n = m_skipmode_m = 0; - + if (m_frontend) m_frontend->get().connectStateChange(slot(*this, &eDVBChannel::frontendStateChanged), m_conn_frontendStateChanged); } @@ -1082,14 +1082,14 @@ eDVBChannel::~eDVBChannel() void eDVBChannel::frontendStateChanged(iDVBFrontend*fe) { int state, ourstate = 0; - + /* if we are already in shutdown, don't change state. */ if (m_state == state_release) return; - + if (fe->getState(state)) return; - + if (state == iDVBFrontend::stateLock) { eDebug("OURSTATE: ok"); @@ -1118,7 +1118,7 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe) ourstate = state_failed; } else eFatal("state unknown"); - + if (ourstate != m_state) { m_state = ourstate; @@ -1235,7 +1235,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off const int blocksize = 188; unsigned int max = align(10*1024*1024, blocksize); current_offset = align(current_offset, blocksize); - + if (!m_cue) { eDebug("no cue sheet. forcing normal play"); @@ -1306,7 +1306,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off continue; } } - + if (relative == 1) /* pts relative */ { pts += now; @@ -1317,7 +1317,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off if (relative != 2) if (pts < 0) pts = 0; - + if (relative == 2) /* AP relative */ { eDebug("AP relative seeking: %lld, at %lld", pts, now); @@ -1332,7 +1332,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off pts = nextap; } } - + off_t offset = 0; if (m_tstools.getOffset(offset, pts)) { @@ -1350,7 +1350,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off { long long aligned_start = align(i->first, blocksize); long long aligned_end = align(i->second, blocksize); - + if ((current_offset >= aligned_start) && (current_offset < aligned_end)) { start = current_offset; @@ -1449,7 +1449,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtrremoveChannel(this); - + if (!channelid) return 0; @@ -1458,7 +1458,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtraddChannel(channelid, this); m_state = state_tuning; @@ -1466,14 +1466,14 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtrget().tune(*feparm); m_current_frontend_parameters = feparm; - + if (res) { m_state = state_release; m_stateChanged(this); return res; } - + return 0; } @@ -1558,21 +1558,21 @@ RESULT eDVBChannel::requestTsidOnid(ePyObject callback) RESULT eDVBChannel::getDemux(ePtr &demux, int cap) { ePtr &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux; - + if (!our_demux) { demux = 0; - + if (m_mgr->allocateDemux(m_frontend ? (eDVBRegisteredFrontend*)*m_frontend : (eDVBRegisteredFrontend*)0, our_demux, cap)) return -1; } - + demux = *our_demux; /* don't hold a reference to the decoding demux, we don't need it. */ - + /* FIXME: by dropping the 'allocated demux' in favour of the 'iDVBDemux', - the refcount is lost. thus, decoding demuxes are never allocated. - + the refcount is lost. thus, decoding demuxes are never allocated. + this poses a big problem for PiP. */ if (cap & capDecode) our_demux = 0; @@ -1605,12 +1605,12 @@ RESULT eDVBChannel::playFile(const char *file) delete m_pvr_thread; m_pvr_thread = 0; } - + m_tstools.openFile(file); - + /* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST, THEN DO A REAL FIX HERE! */ - + /* (this codepath needs to be improved anyway.) */ #if HAVE_DVB_API_VERSION < 3 m_pvr_fd_dst = open("/dev/pvr", O_WRONLY); @@ -1671,11 +1671,11 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in { if (!decoding_demux) return -1; - + pts_t now; - + int r; - + if (mode == 0) /* demux */ { r = decoding_demux->getSTC(now, 0); @@ -1686,7 +1686,7 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in } } else now = pos; /* fixup supplied */ - + off_t off = 0; /* TODO: fixme */ r = m_tstools.fixupPTS(off, now); if (r) @@ -1694,9 +1694,9 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in eDebug("fixup PTS failed"); return -1; } - + pos = now; - + return 0; } @@ -1707,7 +1707,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux) a.) the filepush's internal buffer b.) the PVR buffer (before demux) c.) the ratebuffer (after demux) - + it's important to clear them in the correct order, otherwise the ratebuffer (for example) would immediately refill from the not-yet-flushed PVR buffer. @@ -1718,7 +1718,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux) m_pvr_thread->flush(); /* HACK: flush PVR buffer */ ::ioctl(m_pvr_fd_dst, 0); - + /* flush ratebuffers (video, audio) */ if (decoding_demux) decoding_demux->flush(); @@ -1742,7 +1742,7 @@ void eCueSheet::seekTo(int relative, const pts_t &pts) m_lock.Unlock(); m_event(evtSeek); } - + void eCueSheet::clear() { m_lock.WrLock(); diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index 7b087b98..2d448e8f 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -51,21 +51,32 @@ class TuneTest: self.tuner = Tuner(self.frontend) self.timer = eTimer() self.timer.callback.append(self.updateStatus) + + def gotTsidOnid(self, tsid, onid): + print "******** got tsid, onid:", tsid, onid + self.tsid = tsid + self.onid = onid + if tsid is not None and onid is not None: + self.pidStatus = self.INTERNAL_PID_STATUS_SUCCESSFUL + else: + self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + self.timer.start(100, True) def updateStatus(self): dict = {} self.frontend.getFrontendStatus(dict) - print "status:", dict - stop = False + print "status:", dict if dict["tuner_state"] == "TUNING": + print "TUNING" self.timer.start(100, True) self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: + print "2nd choice" if dict["tuner_state"] == "LOCKED": print "acquiring TSID/ONID" - # TODO start getting TSID/ONID + self.raw_channel.requestTsidOnid(self.gotTsidOnid) self.pidStatus = self.INTERNAL_PID_STATUS_WAITING else: self.pidStatus = self.INTERNAL_PID_STATUS_FAILED @@ -80,9 +91,7 @@ class TuneTest: elif dict["tuner_state"] == "LOCKED": pidsFailed = False if self.checkPIDs: - tsid = 0 # TODO read values - onid = 0 # TODO read values - if tsid != self.currTuned[8] or onid != self.currTuned[9]: + if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) pidsFailes = True elif not self.checkPIDs or (self.checkPids and not pidsFailed): @@ -98,8 +107,11 @@ class TuneTest: if not stop: self.tune() if self.tuningtransponder < len(self.transponderlist) and not stop: - self.timer.start(100, True) - print "restart timer" + if self.pidStatus != self.INTERNAL_PID_STATUS_WAITING: + self.timer.start(100, True) + print "restart timer" + else: + print "not restarting timers (waiting for pids)" else: self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) print "finishedChecking" -- cgit v1.2.3 From f95be11f0517eac56013b0ccb14825be97fc1540 Mon Sep 17 00:00:00 2001 From: stefan Date: Tue, 16 Dec 2008 10:33:19 +0000 Subject: finish and polish diseqc tester plugin --- data/skin_default.xml | 5 + lib/dvb/db.cpp | 2 +- lib/python/Components/TuneTest.py | 54 +++- .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 283 +++++++++++++++++++-- lib/python/Screens/Makefile.am | 3 +- lib/python/Screens/TextBox.py | 26 ++ 6 files changed, 340 insertions(+), 33 deletions(-) mode change 100755 => 100644 data/skin_default.xml mode change 100755 => 100644 lib/python/Screens/Makefile.am create mode 100644 lib/python/Screens/TextBox.py (limited to 'lib/python') diff --git a/data/skin_default.xml b/data/skin_default.xml old mode 100755 new mode 100644 index 5946097d..d60933eb --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -940,6 +940,11 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) + + + + + diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 6f30253a..e5a94392 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -856,7 +856,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { -// eDebug("\t\tattr: %s", at->name().c_str()); + //eDebug("\t\tattr: %s", at->name().c_str()); at = *it; name = at->name(); if (name == "modulation") dest = &modulation; diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index 2d448e8f..422036cd 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -32,7 +32,7 @@ class Tuner: # 2) call run() # 3) finishedChecking() is called, when the run is finished class TuneTest: - def __init__(self, feid, stopOnSuccess = False, stopOnError = False): + def __init__(self, feid, stopOnSuccess = -1, stopOnError = -1): self.stopOnSuccess = stopOnSuccess self.stopOnError = stopOnError self.feid = feid @@ -54,12 +54,14 @@ class TuneTest: def gotTsidOnid(self, tsid, onid): print "******** got tsid, onid:", tsid, onid - self.tsid = tsid - self.onid = onid if tsid is not None and onid is not None: self.pidStatus = self.INTERNAL_PID_STATUS_SUCCESSFUL + self.tsid = tsid + self.onid = onid else: self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + self.tsid = -1 + self.onid = -1 self.timer.start(100, True) def updateStatus(self): @@ -71,7 +73,7 @@ class TuneTest: if dict["tuner_state"] == "TUNING": print "TUNING" self.timer.start(100, True) - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: print "2nd choice" if dict["tuner_state"] == "LOCKED": @@ -86,23 +88,28 @@ class TuneTest: if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED": self.tuningtransponder = self.nextTransponder() self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"]) - if self.stopOnError == True: + if self.stopOnError != -1 and self.stopOnError <= len(self.failedTune): stop = True elif dict["tuner_state"] == "LOCKED": pidsFailed = False if self.checkPIDs: - if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: - self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) - pidsFailes = True + if self.currTuned is not None: + if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: + self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed", {"real": (self.tsid, self.onid), "expected": (self.currTuned[8], self.currTuned[9])}]) + pidsFailed = True + else: + self.successfullyTune.append([self.currTuned, self.oldTuned]) + if self.stopOnSuccess != -1 and self.stopOnSuccess <= len(self.successfullyTune): + stop = True elif not self.checkPIDs or (self.checkPids and not pidsFailed): self.successfullyTune.append([self.currTuned, self.oldTuned]) - if self.stopOnSuccess == True: - stop = True + if self.stopOnSuccess != -1 and self.stopOnSuccess <= len(self.successfullyTune): + stop = True self.tuningtransponder = self.nextTransponder() else: print "************* tuner_state:", dict["tuner_state"] - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) if not stop: self.tune() @@ -113,7 +120,7 @@ class TuneTest: else: print "not restarting timers (waiting for pids)" else: - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) + self.progressCallback((self.getProgressLength(), len(self.transponderlist), self.STATUS_DONE, self.currTuned)) print "finishedChecking" self.finishedChecking() @@ -131,12 +138,17 @@ class TuneTest: return index def nextTransponder(self): + print "getting next transponder", self.tuningtransponder index = self.tuningtransponder + 1 if self.checkPIDs: + print "checkPIDs-loop" # check for tsid != -1 and onid != -1 - while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1): + print "index:", index + print "len(self.transponderlist):", len(self.transponderlist) + while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)): index += 1 + print "next transponder index:", index return index def finishedChecking(self): @@ -180,7 +192,7 @@ class TuneTest: self.successfullyTune = [] self.tuningtransponder = self.firstTransponder() self.tune() - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_START, self.currTuned)) self.timer.start(100, True) # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, , , , ) @@ -191,6 +203,20 @@ class TuneTest: def clearTransponder(self): self.transponderlist = [] + def getProgressLength(self): + count = 0 + if self.stopOnError == -1: + count = len(self.transponderlist) + else: + if count < self.stopOnError: + count = self.stopOnError + if self.stopOnSuccess == -1: + count = len(self.transponderlist) + else: + if count < self.stopOnSuccess: + count = self.stopOnSuccess + return count + STATUS_START = 0 STATUS_TUNING = 1 STATUS_DONE = 2 diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py index 57340368..f997acd1 100644 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -1,20 +1,81 @@ from Screens.Satconfig import NimSelection from Screens.Screen import Screen +from Screens.TextBox import TextBox from Plugins.Plugin import PluginDescriptor -from Components.ActionMap import NumberActionMap +from Components.ActionMap import ActionMap, NumberActionMap from Components.NimManager import nimmanager from Components.ResourceManager import resourcemanager from Components.Sources.FrontendStatus import FrontendStatus from Components.TuneTest import TuneTest +from Components.Sources.List import List from Components.Sources.Progress import Progress from Components.Sources.StaticText import StaticText +from Components.ConfigList import ConfigListScreen +from Components.config import getConfigListEntry, ConfigSelection -class DiseqcTester(Screen, TuneTest): +# always use: +# setResultType(type) +# setResultParameter(parameter) +# getTextualResult() +class ResultParser: + def __init__(self): + pass + + TYPE_BYORBPOS = 0 + TYPE_BYINDEX = 1 + TYPE_ALL = 2 + def setResultType(self, type): + self.type = type + + def setResultParameter(self, parameter): + if self.type == self.TYPE_BYORBPOS: + self.orbpos = parameter + elif self.type == self.TYPE_BYINDEX: + self.index = parameter + + def getTextualResultForIndex(self, index): + text = "" + text += "%s:\n" % self.getTextualIndexRepresentation(index) + + failed, successful = self.results[index]["failed"], self.results[index]["successful"] + countfailed = len(failed) + countsuccessful = len(successful) + countall = countfailed + countsuccessful + percentfailed = round(countfailed / float(countall + 0.0001) * 100) + percentsuccessful = round(countsuccessful / float(countall + 0.0001) * 100) + text += "Tested %d transponders\n%d (%d %%) transponders succeeded\n%d (%d %%) transponders failed\n" % (countall, countsuccessful, percentsuccessful, countfailed, percentfailed) + reasons = {} + if countfailed > 0: + for transponder in failed: + reasons[transponder[2]] = reasons.get(transponder[2], []) + reasons[transponder[2]].append(transponder) + if transponder[2] == "pids_failed": + print transponder[2], "-", transponder[3] + + text += "The %d unsuccessful tuning attempts failed for the following reasons:\n" % countfailed + + for reason in reasons.keys(): + text += "%s: %d transponders failed\n" % (reason, len(reasons[reason])) + return text + + def getTextualResult(self): + text = "" + if self.type == self.TYPE_BYINDEX: + text += self.getTextualResultForIndex(self.index) + elif self.type == self.TYPE_BYORBPOS: + for index in self.results.keys(): + if index[2] == self.orbpos: + text += self.getTextualResultForIndex(index) + text += "\n-----------------------------------------------------\n" + + return text + +class DiseqcTester(Screen, TuneTest, ResultParser): skin = """ - + + + + {"template": [ + MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name, + MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status, + ], + "fonts": [gFont("Regular", 20)], + "itemHeight": 25 + } + @@ -54,35 +126,93 @@ class DiseqcTester(Screen, TuneTest): - + - + + + + + + + + + """ TEST_TYPE_QUICK = 0 TEST_TYPE_RANDOM = 1 TEST_TYPE_COMPLETE = 2 - def __init__(self, session, feid, test_type = TEST_TYPE_QUICK): + def __init__(self, session, feid, test_type = TEST_TYPE_QUICK, loopsfailed = 3, loopssuccessful = 1): Screen.__init__(self, session) self.feid = feid self.test_type = test_type + self.loopsfailed = loopsfailed + self.loopssuccessful = loopssuccessful self["actions"] = NumberActionMap(["SetupActions"], { - "ok": self.keyGo, + "ok": self.select, "cancel": self.keyCancel, }, -2) - TuneTest.__init__(self, feid, stopOnSuccess = True) - self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) + TuneTest.__init__(self, feid, stopOnSuccess = self.loopssuccessful, stopOnError = self.loopsfailed) + #self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) self["overall_progress"] = Progress() self["sub_progress"] = Progress() - self["failed_counter"] = StaticText("10") - self["succeeded_counter"] = StaticText("10") + + self["failed_counter"] = StaticText("0") + self["succeeded_counter"] = StaticText("0") + self["witherrors_counter"] = StaticText("0") + self["untestable_counter"] = StaticText("0") + + self.list = [] + self["progress_list"] = List(self.list) + self["progress_list"].onSelectionChanged.append(self.selectionChanged) + + self["CmdText"] = StaticText(_("Please wait while scanning is in progress...")) self.indexlist = {} self.readTransponderList() + + self.running = False + + self.results = {} + self.resultsstatus = {} + + self.onLayoutFinish.append(self.go) + + def getProgressListComponent(self, index, status): + return (index, self.getTextualIndexRepresentation(index), status) + + def clearProgressList(self): + self.list = [] + self["progress_list"].list = self.list + + def addProgressListItem(self, index): + if index in self.indexlist: + for entry in self.list: + if entry[0] == index: + self.changeProgressListStatus(index, "working") + return + self.list.append(self.getProgressListComponent(index, _("working"))) + self["progress_list"].list = self.list + self["progress_list"].setIndex(len(self.list) - 1) + + def changeProgressListStatus(self, index, status): + self.newlist = [] + count = 0 + indexpos = 0 + for entry in self.list: + if entry[0] == index: + self.newlist.append(self.getProgressListComponent(index, status)) + indexpos = count + else: + self.newlist.append(entry) + count += 1 + self.list = self.newlist + self["progress_list"].list = self.list + self["progress_list"].setIndex(indexpos) def readTransponderList(self): for sat in nimmanager.getSatListForNim(self.feid): @@ -92,11 +222,12 @@ class DiseqcTester(Screen, TuneTest): self.analyseTransponder(mytransponder) def getIndexForTransponder(self, transponder): + if transponder[0] < 11700: band = 1 # low else: band = 0 # high - + polarisation = transponder[2] sat = transponder[5] @@ -117,8 +248,7 @@ class DiseqcTester(Screen, TuneTest): print "getTextualIndexRepresentation:", index text = "" - # TODO better sat representation - text += "%s, " % index[2] + text += nimmanager.getSatDescription(index[2]) + ", " if index[0] == 1: text += "Low Band, " @@ -157,6 +287,7 @@ class DiseqcTester(Screen, TuneTest): if self.test_type == self.TEST_TYPE_QUICK: self.myindex = 0 keys = self.indexlist.keys() + keys.sort(key = lambda a: a[2]) # sort by orbpos self["overall_progress"].setRange(len(keys)) self["overall_progress"].setValue(self.myindex) return keys[0] @@ -167,6 +298,7 @@ class DiseqcTester(Screen, TuneTest): if self.test_type == self.TEST_TYPE_QUICK: self.myindex += 1 keys = self.indexlist.keys() + keys.sort(key = lambda a: a[2]) # sort by orbpos self["overall_progress"].setValue(self.myindex) if self.myindex < len(keys): @@ -179,21 +311,137 @@ class DiseqcTester(Screen, TuneTest): def getContinueScanning(self): if self.test_type == self.TEST_TYPE_QUICK: return (self.myindex < len(self.indexlist.keys())) + + def addResult(self, index, status, failedTune, successfullyTune): + self.results[index] = self.results.get(index, {"failed": [], "successful": [], "status": None}) + self.resultsstatus[status] = self.resultsstatus.get(status, []) + + self.results[index]["status"] = status + self.results[index]["failed"] = failedTune + self.results[index]["successful"] = successfullyTune + + self.resultsstatus[status].append(index) def finishedChecking(self): print "finishedChecking" TuneTest.finishedChecking(self) + + if not self.results.has_key(self.currentlyTestedIndex): + self.results[self.currentlyTestedIndex] = {"failed": [], "successful": [], "status": None} + + if len(self.failedTune) > 0 and len(self.successfullyTune) > 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "with errors") + self["witherrors_counter"].setText(str(int(self["witherrors_counter"].getText()) + 1)) + self.addResult(self.currentlyTestedIndex, "with_errors", self.failedTune, self.successfullyTune) + elif len(self.failedTune) == 0 and len(self.successfullyTune) == 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "not tested") + self["untestable_counter"].setText(str(int(self["untestable_counter"].getText()) + 1)) + self.addResult(self.currentlyTestedIndex, "untestable", self.failedTune, self.successfullyTune) + elif len(self.failedTune) > 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "failed") + self["failed_counter"].setText(str(int(self["failed_counter"].getText()) + len(self.failedTune))) + self.addResult(self.currentlyTestedIndex, "failed", self.failedTune, self.successfullyTune) + else: + self.changeProgressListStatus(self.currentlyTestedIndex, "successful") + self["succeeded_counter"].setText(str(int(self["succeeded_counter"].getText()) + len(self.successfullyTune))) + self.addResult(self.currentlyTestedIndex, "successful", self.failedTune, self.successfullyTune) + + + #self["failed_counter"].setText(str(int(self["failed_counter"].getText()) + len(self.failedTune))) + #self["succeeded_counter"].setText(str(int(self["succeeded_counter"].getText()) + len(self.successfullyTune))) + #if len(self.failedTune) == 0 and len(self.successfullyTune) == 0: + #self["untestable_counter"].setText(str(int(self["untestable_counter"].getText()) + 1)) + self.currentlyTestedIndex = self.getNextIndex() + self.addProgressListItem(self.currentlyTestedIndex) + if self.fillTransponderList(): self.run(checkPIDs = True) + else: + self.running = False + self["progress_list"].setIndex(0) + print "results:", self.results + print "resultsstatus:", self.resultsstatus - def keyGo(self): + def go(self): + self.running = True + self["failed_counter"].setText("0") + self["succeeded_counter"].setText("0") + self["untestable_counter"].setText("0") self.currentlyTestedIndex = self.getFirstIndex() + + self.clearProgressList() + self.addProgressListItem(self.currentlyTestedIndex) + if self.fillTransponderList(): self.run(True) def keyCancel(self): self.close() + + def select(self): + print "selectedIndex:", self["progress_list"].getCurrent()[0] + if not self.running: + index = self["progress_list"].getCurrent()[0] + #self.setResultType(ResultParser.TYPE_BYORBPOS) + #self.setResultParameter(index[2]) + self.setResultType(ResultParser.TYPE_BYINDEX) + self.setResultParameter(index) + self.session.open(TextBox, self.getTextualResult()) + + def selectionChanged(self): + print "selection changed" + if len(self.list) > 0 and not self.running: + self["CmdText"].setText(_("Press OK to get further details for %s") % str(self["progress_list"].getCurrent()[1])) + +class DiseqcTesterTestTypeSelection(Screen, ConfigListScreen): + skin = """ + + + """ + def __init__(self, session, feid): + Screen.__init__(self, session) + self.feid = feid + + self.list = [] + ConfigListScreen.__init__(self, self.list) + + self["actions"] = ActionMap(["SetupActions"], + { + "cancel": self.keyCancel + }, -2) + + self.createSetup() + + def createSetup(self): + self.testtype = ConfigSelection(choices={"quick": _("Quick")}, default = "quick") + self.testtypeEntry = getConfigListEntry(_("Test Type"), self.testtype) + self.list.append(self.testtypeEntry) + + self.loopsfailed = ConfigSelection(choices={"-1": "Every known", "1": "1", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7", "8": "8"}, default = "3") + self.loopsfailedEntry = getConfigListEntry(_("Stop testing plane after # failed transponders"), self.loopsfailed) + self.list.append(self.loopsfailedEntry) + + self.loopssuccessful = ConfigSelection(choices={"-1": "Every known", "1": "1", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7", "8": "8"}, default = "1") + self.loopssuccessfulEntry = getConfigListEntry(_("Stop testing plane after # successful transponders"), self.loopssuccessful) + self.list.append(self.loopssuccessfulEntry) + + self["config"].list = self.list + self["config"].l.setList(self.list) + + def keyOK(self): + print self.testtype.getValue() + testtype = DiseqcTester.TEST_TYPE_QUICK + if self.testtype.getValue() == "quick": + testtype = DiseqcTester.TEST_TYPE_QUICK + elif self.testtype.getValue() == "random": + testtype = DiseqcTester.TEST_TYPE_RANDOM + elif self.testtype.getValue() == "complete": + testtype = DiseqcTester.TEST_TYPE_COMPLETE + self.session.open(DiseqcTester, feid = self.feid, test_type = testtype, loopsfailed = int(self.loopsfailed.value), loopssuccessful = int(self.loopssuccessful.value)) + + def keyCancel(self): + self.close() class DiseqcTesterNimSelection(NimSelection): skin = """ @@ -215,7 +463,8 @@ class DiseqcTesterNimSelection(NimSelection): NimSelection.__init__(self, session) def setResultClass(self): - self.resultclass = DiseqcTester + #self.resultclass = DiseqcTester + self.resultclass = DiseqcTesterTestTypeSelection def showNim(self, nim): nimConfig = nimmanager.getNimConfig(nim.slot) @@ -224,7 +473,7 @@ class DiseqcTesterNimSelection(NimSelection): return False if nimConfig.configMode.value == "simple": if nimConfig.diseqcMode.value == "positioner": - return False + return True return True return False diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am old mode 100755 new mode 100644 index a3cf70bb..cde2d6c3 --- a/lib/python/Screens/Makefile.am +++ b/lib/python/Screens/Makefile.am @@ -13,5 +13,6 @@ install_PYTHON = \ TimerSelection.py PictureInPicture.py TimeDateInput.py \ SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \ SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \ - SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py + SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \ + TextBox.py diff --git a/lib/python/Screens/TextBox.py b/lib/python/Screens/TextBox.py new file mode 100644 index 00000000..117c5c72 --- /dev/null +++ b/lib/python/Screens/TextBox.py @@ -0,0 +1,26 @@ +from Screens.Screen import Screen + +from Components.ActionMap import ActionMap +from Components.Sources.StaticText import StaticText +from Components.ScrollLabel import ScrollLabel + +class TextBox(Screen): + def __init__(self, session, text = ""): + Screen.__init__(self, session) + + self.text = text + self["text"] = ScrollLabel(self.text) + + self["actions"] = ActionMap(["OkCancelActions", "DirectionActions"], + { + "cancel": self.cancel, + "ok": self.ok, + "up": self["text"].pageUp, + "down": self["text"].pageDown, + }, -1) + + def ok(self): + self.close() + + def cancel(self): + self.close() \ No newline at end of file -- cgit v1.2.3 From 3d3fb340f73559bde24e757f292632bb5208b009 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 16 Dec 2008 11:34:45 +0100 Subject: finish and polish diseqc tester plugin --- data/skin_default.xml | 0 lib/python/Screens/Makefile.am | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 data/skin_default.xml mode change 100644 => 100755 lib/python/Screens/Makefile.am (limited to 'lib/python') diff --git a/data/skin_default.xml b/data/skin_default.xml old mode 100644 new mode 100755 diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am old mode 100644 new mode 100755 -- cgit v1.2.3 From c58fda6723e55fb47af610a17377279247d2f0b6 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 16 Dec 2008 19:34:25 +0100 Subject: show transponders in diseqc tester results --- .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py index f997acd1..5779b3b0 100644 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -58,6 +58,27 @@ class ResultParser: for reason in reasons.keys(): text += "%s: %d transponders failed\n" % (reason, len(reasons[reason])) + + for reason in reasons.keys(): + text += "\n" + text += "%s previous planes:\n" % reason + for transponder in reasons[reason]: + if transponder[1] is not None: + text += self.getTextualIndexRepresentation(self.getIndexForTransponder(transponder[1])) + else: + text += "No transponder tuned" + text += " ==> " + self.getTextualIndexRepresentation(self.getIndexForTransponder(transponder[0])) + text += "\n" + if countsuccessful > 0: + text += "\n" + text += "Successfully tuned transponders' previous planes:\n" + for transponder in successful: + if transponder[1] is not None: + text += self.getTextualIndexRepresentation(self.getIndexForTransponder(transponder[1])) + else: + text += "No transponder tuned" + text += " ==> " + self.getTextualIndexRepresentation(self.getIndexForTransponder(transponder[0])) + text += "\n" return text def getTextualResult(self): -- cgit v1.2.3 From ab6ca9d52c8431d66c3d785e6810470eafd5e35a Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 16 Dec 2008 20:20:28 +0100 Subject: add diseqc tester test type "random" --- .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 24 +++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py index 5779b3b0..f55ba766 100644 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -15,6 +15,8 @@ from Components.Sources.StaticText import StaticText from Components.ConfigList import ConfigListScreen from Components.config import getConfigListEntry, ConfigSelection +import random + # always use: # setResultType(type) # setResultParameter(parameter) @@ -312,6 +314,13 @@ class DiseqcTester(Screen, TuneTest, ResultParser): self["overall_progress"].setRange(len(keys)) self["overall_progress"].setValue(self.myindex) return keys[0] + elif self.test_type == self.TEST_TYPE_RANDOM: + self.randomkeys = self.indexlist.keys() + random.shuffle(self.randomkeys) + self.myindex = 0 + self["overall_progress"].setRange(len(self.randomkeys)) + self["overall_progress"].setValue(self.myindex) + return self.randomkeys[0] # after each index is finished, getNextIndex is called to get the next index to scan def getNextIndex(self): @@ -326,11 +335,20 @@ class DiseqcTester(Screen, TuneTest, ResultParser): return keys[self.myindex] else: return None - + elif self.test_type == self.TEST_TYPE_RANDOM: + self.myindex += 1 + keys = self.randomkeys + + self["overall_progress"].setValue(self.myindex) + if self.myindex < len(keys): + return keys[self.myindex] + else: + return None + # after each index is finished and the next index is returned by getNextIndex # the algorithm checks, if we should continue scanning def getContinueScanning(self): - if self.test_type == self.TEST_TYPE_QUICK: + if self.test_type == self.TEST_TYPE_QUICK or self.test_type == self.TEST_TYPE_RANDOM: return (self.myindex < len(self.indexlist.keys())) def addResult(self, index, status, failedTune, successfullyTune): @@ -435,7 +453,7 @@ class DiseqcTesterTestTypeSelection(Screen, ConfigListScreen): self.createSetup() def createSetup(self): - self.testtype = ConfigSelection(choices={"quick": _("Quick")}, default = "quick") + self.testtype = ConfigSelection(choices={"quick": _("Quick"), "random": _("Random")}, default = "quick") self.testtypeEntry = getConfigListEntry(_("Test Type"), self.testtype) self.list.append(self.testtypeEntry) -- cgit v1.2.3 From b10857da7a1853f816adcb2c0464e9c759190c26 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 16 Dec 2008 20:22:17 +0100 Subject: add newlines at end of file --- lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py | 2 +- lib/python/Screens/TextBox.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py index f55ba766..2c8c5c38 100644 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -524,4 +524,4 @@ def autostart(reason, **kwargs): def Plugins(**kwargs): return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain), - PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)] \ No newline at end of file + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)] diff --git a/lib/python/Screens/TextBox.py b/lib/python/Screens/TextBox.py index 117c5c72..44b8a3cf 100644 --- a/lib/python/Screens/TextBox.py +++ b/lib/python/Screens/TextBox.py @@ -23,4 +23,4 @@ class TextBox(Screen): self.close() def cancel(self): - self.close() \ No newline at end of file + self.close() -- cgit v1.2.3