aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Plugins/SystemPlugins
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2009-02-11 12:52:48 +0100
committerFelix Domke <tmbinc@elitedvb.net>2009-02-11 12:52:48 +0100
commitbbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b (patch)
treec5945c791698c14723e989449e6b4bfcc275c05d /lib/python/Plugins/SystemPlugins
parent4f7990ff2a55874b9eb65e3c9cd47dacb9f76deb (diff)
parent5e6f814d005a01caa437a532e61f4b338617ff67 (diff)
downloadenigma2-bbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b.tar.gz
enigma2-bbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b.zip
Merge branch 'master' of /home/tmbinc/enigma2-git into tmbinc/FixTimingBugs
Conflicts: lib/dvb/decoder.cpp
Diffstat (limited to 'lib/python/Plugins/SystemPlugins')
-rw-r--r--lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am5
-rw-r--r--lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py0
-rw-r--r--lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py642
-rw-r--r--lib/python/Plugins/SystemPlugins/Hotplug/plugin.py15
-rw-r--r--lib/python/Plugins/SystemPlugins/Makefile.am2
-rw-r--r--lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py115
-rw-r--r--lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py10
-rw-r--r--lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py200
-rw-r--r--lib/python/Plugins/SystemPlugins/Satfinder/plugin.py181
-rw-r--r--lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py81
-rw-r--r--lib/python/Plugins/SystemPlugins/Videomode/plugin.py1
11 files changed, 954 insertions, 298 deletions
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
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py
new file mode 100644
index 00000000..07861954
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py
@@ -0,0 +1,642 @@
+from Screens.Satconfig import NimSelection
+from Screens.Screen import Screen
+from Screens.TextBox import TextBox
+from Screens.MessageBox import MessageBox
+
+from Plugins.Plugin import PluginDescriptor
+
+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, ConfigYesNo
+from Components.Harddisk import harddiskmanager
+
+import random
+
+# 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, logfulltransponders = False):
+ 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]))
+
+ 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 logfulltransponders:
+ text += str(transponder[1])
+ text += " ==> "
+ text += str(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):
+ 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"
+ elif self.type == self.TYPE_ALL:
+ orderedResults = {}
+ for index in self.results.keys():
+ orbpos = index[2]
+ orderedResults[orbpos] = orderedResults.get(orbpos, [])
+ orderedResults[orbpos].append(index)
+ ordered_orbpos = orderedResults.keys()
+ ordered_orbpos.sort()
+ for orbpos in ordered_orbpos:
+ text += "\n*****************************************\n"
+ text += "Orbital position %s:" % str(orbpos)
+ text += "\n*****************************************\n"
+ for index in orderedResults[orbpos]:
+ text += self.getTextualResultForIndex(index, logfulltransponders = True)
+ text += "\n-----------------------------------------------------\n"
+
+
+ return text
+
+class DiseqcTester(Screen, TuneTest, ResultParser):
+ skin = """
+ <screen position="90,100" size="520,400" title="DiSEqC Tester" >
+ <!--ePixmap pixmap="skin_default/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
+ <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
+ <convert type="FrontendInfo">SNRdB</convert>
+ </widget>
+ <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
+ <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
+ <convert type="FrontendInfo">SNR</convert>
+ </widget>
+ <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
+ <convert type="FrontendInfo">SNR</convert>
+ </widget>
+ <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
+ <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
+ <convert type="FrontendInfo">AGC</convert>
+ </widget>
+ <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
+ <convert type="FrontendInfo">AGC</convert>
+ </widget>
+ <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
+ <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="skin_default/bar_ber.png" borderWidth="2" borderColor="#cccccc">
+ <convert type="FrontendInfo">BER</convert>
+ </widget>
+ <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
+ <convert type="FrontendInfo">BER</convert>
+ </widget>
+ <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
+ <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
+ <convert type="FrontendInfo">LOCK</convert>
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
+ <convert type="FrontendInfo">LOCK</convert>
+ <convert type="ConditionalShowHide">Invert</convert>
+ </widget-->
+ <widget source="progress_list" render="Listbox" position="0,0" size="510,150" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent">
+ {"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
+ }
+ </convert>
+ </widget>
+ <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" />
+ <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
+ <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" />
+ <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
+
+ <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" />
+ <widget source="failed_counter" render="Label" position="160,282" size="100,20" font="Regular;21" />
+
+ <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" />
+ <widget source="succeeded_counter" render="Label" position="160,312" size="100,20" font="Regular;21" />
+
+ <eLabel name="" text="With errors:" position="20,342" size="140,22" font="Regular;21" halign="left" transparent="1" />
+ <widget source="witherrors_counter" render="Label" position="160,342" size="100,20" font="Regular;21" />
+
+ <eLabel name="" text="Not tested:" position="20,372" size="140,22" font="Regular;21" halign="left" transparent="1" />
+ <widget source="untestable_counter" render="Label" position="160,372" size="100,20" font="Regular;21" />
+
+ <widget source="CmdText" render="Label" position="300,282" size="180,200" font="Regular;21" />
+ </screen>"""
+
+ TEST_TYPE_QUICK = 0
+ TEST_TYPE_RANDOM = 1
+ TEST_TYPE_COMPLETE = 2
+ def __init__(self, session, feid, test_type = TEST_TYPE_QUICK, loopsfailed = 3, loopssuccessful = 1, log = False):
+ Screen.__init__(self, session)
+ self.feid = feid
+ self.test_type = test_type
+ self.loopsfailed = loopsfailed
+ self.loopssuccessful = loopssuccessful
+ self.log = log
+
+ self["actions"] = NumberActionMap(["SetupActions"],
+ {
+ "ok": self.select,
+ "cancel": self.keyCancel,
+ }, -2)
+
+ 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("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):
+ 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 = ""
+
+ text += nimmanager.getSatDescription(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()
+ 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]
+ 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]
+ elif self.test_type == self.TEST_TYPE_COMPLETE:
+ keys = self.indexlist.keys()
+ print "keys:", keys
+ successorindex = {}
+ for index in keys:
+ successorindex[index] = []
+ for otherindex in keys:
+ if otherindex != index:
+ successorindex[index].append(otherindex)
+ random.shuffle(successorindex[index])
+ self.keylist = []
+ stop = False
+ currindex = None
+ while not stop:
+ if currindex is None or len(successorindex[currindex]) == 0:
+ oldindex = currindex
+ for index in successorindex.keys():
+ if len(successorindex[index]) > 0:
+ currindex = index
+ self.keylist.append(currindex)
+ break
+ if currindex == oldindex:
+ stop = True
+ else:
+ currindex = successorindex[currindex].pop()
+ self.keylist.append(currindex)
+ print "self.keylist:", self.keylist
+ self.myindex = 0
+ self["overall_progress"].setRange(len(self.keylist))
+ self["overall_progress"].setValue(self.myindex)
+ return self.keylist[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()
+ keys.sort(key = lambda a: a[2]) # sort by orbpos
+
+ self["overall_progress"].setValue(self.myindex)
+ if self.myindex < len(keys):
+ 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
+ elif self.test_type == self.TEST_TYPE_COMPLETE:
+ self.myindex += 1
+ keys = self.keylist
+
+ 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 or self.test_type == self.TEST_TYPE_RANDOM:
+ return (self.myindex < len(self.indexlist.keys()))
+ elif self.test_type == self.TEST_TYPE_COMPLETE:
+ return (self.myindex < len(self.keylist))
+
+ def addResult(self, index, status, failedTune, successfullyTune):
+ self.results[index] = self.results.get(index, {"failed": [], "successful": [], "status": None, "internalstatus": None})
+ self.resultsstatus[status] = self.resultsstatus.get(status, [])
+
+ oldstatus = self.results[index]["internalstatus"]
+ if oldstatus is None:
+ self.results[index]["status"] = status
+ elif oldstatus == "successful":
+ if status == "failed":
+ self.results[index]["status"] = "with_errors"
+ elif status == "successful":
+ self.results[index]["status"] = oldstatus
+ elif status == "with_errors":
+ self.results[index]["status"] = "with_errors"
+ elif status == "not_tested":
+ self.results[index]["status"] = oldstatus
+ elif oldstatus == "failed":
+ if status == "failed":
+ self.results[index]["status"] = oldstatus
+ elif status == "successful":
+ self.results[index]["status"] = "with_errors"
+ elif status == "with_errors":
+ self.results[index]["status"] = "with_errors"
+ elif status == "not_tested":
+ self.results[index]["status"] = oldstatus
+ elif oldstatus == "with_errors":
+ if status == "failed":
+ self.results[index]["status"] = oldstatus
+ elif status == "successful":
+ self.results[index]["status"] = oldstatus
+ elif status == "with_errors":
+ self.results[index]["status"] = oldstatus
+ elif status == "not_tested":
+ self.results[index]["status"] = oldstatus
+ elif oldstatus == "not_tested":
+ self.results[index]["status"] = status
+
+ if self.results[index]["status"] != "working":
+ self.results[index]["internalstatus"] = self.results[index]["status"]
+ self.results[index]["failed"] = failedTune + self.results[index]["failed"]
+ self.results[index]["successful"] = successfullyTune + self.results[index]["successful"]
+
+ 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, "internalstatus": 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["failed_counter"].setText(str(int(self["failed_counter"].getText()) + 1))
+ 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["succeeded_counter"].setText(str(int(self["succeeded_counter"].getText()) + 1))
+ 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
+ if self.log:
+ file = open("/media/hdd/diseqctester.log", "w")
+ self.setResultType(ResultParser.TYPE_ALL)
+ file.write(self.getTextualResult())
+ file.close()
+ self.session.open(MessageBox, text=_("The results have been written to %s.") % "/media/hdd/diseqctester.log", type = MessageBox.TYPE_INFO)
+
+ 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.setResultType(ResultParser.TYPE_ALL)
+ 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 = """<screen position="80,95" size="560,412" title="DiSEqC Tester Test Settings">
+ <widget name="config" position="10,10" size="540,402" scrollbarMode="showOnDemand" />
+ </screen>
+ """
+ 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"), "random": _("Random"), "complete": _("Complete")}, 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.log = ConfigYesNo(False)
+ if harddiskmanager.HDDCount() > 0:
+ self.logEntry = getConfigListEntry(_("Log results to harddisk"), self.log)
+ self.list.append(self.logEntry)
+
+ 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), log = self.log.value)
+
+ def keyCancel(self):
+ self.close()
+
+class DiseqcTesterNimSelection(NimSelection):
+ skin = """
+ <screen position="160,123" size="400,330" title="Choose Tuner">
+ <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent">
+ {"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
+ }
+ </convert>
+ </widget>
+ </screen>"""
+
+ def __init__(self, session, args = None):
+ NimSelection.__init__(self, session)
+
+ def setResultClass(self):
+ #self.resultclass = DiseqcTester
+ self.resultclass = DiseqcTesterTestTypeSelection
+
+ 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 True
+ 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)]
diff --git a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py
index 97ddf4a1..b19007c9 100644
--- a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py
@@ -3,17 +3,9 @@ from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
from Components.Harddisk import harddiskmanager
-DEVICEDB = \
- { "/devices/pci0000:00/0000:00:14.2/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0": "CF Slot",
- "/devices/pci0000:00/0000:00:14.2/usb1/1-1/1-1:1.0/host0/target1:0:0/0:0:0:0": "SD Slot"
- }
-
hotplugNotifier = [ ]
class Hotplug(Protocol):
- def getUserfriendlyDeviceName(self, phys):
- return DEVICEDB.get(phys, "USB Storage")
-
def connectionMade(self):
self.received = ""
@@ -40,20 +32,19 @@ class Hotplug(Protocol):
dev = device.split('/')[-1]
if action is not None and action == "add":
- print "Medium found in", self.getUserfriendlyDeviceName(dev)
- harddiskmanager.addHotplugPartition(dev, self.getUserfriendlyDeviceName(physdevpath))
+ harddiskmanager.addHotplugPartition(dev, physdevpath)
elif action is not None and action == "remove":
harddiskmanager.removeHotplugPartition(dev)
elif media_state is not None:
if media_state == '1':
harddiskmanager.removeHotplugPartition(dev)
- harddiskmanager.addHotplugPartition(dev, self.getUserfriendlyDeviceName(physdevpath))
+ harddiskmanager.addHotplugPartition(dev, physdevpath)
elif media_state == '0':
harddiskmanager.removeHotplugPartition(dev)
for callback in hotplugNotifier:
try:
- callback(dev, media_state)
+ callback(dev, action or media_state)
except AttributeError:
hotplugNotifier.remove(callback)
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/NFIFlash/downloader.py b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py
index c2046af7..c91c8588 100644
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
from Components.MenuList import MenuList
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
@@ -18,6 +19,7 @@ import urllib
from twisted.web import client
from twisted.internet import reactor, defer
from twisted.python import failure
+from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
class UserRequestedCancel(Exception):
pass
@@ -119,10 +121,10 @@ class NFIDownload(Screen):
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
- <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
<widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" />
<widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" />
@@ -169,6 +171,7 @@ class NFIDownload(Screen):
self.box = HardwareInfo().get_device_name()
self.feed_base = "http://www.dreamboxupdate.com/opendreambox/1.5/%s/images/" % self.box
self.nfi_filter = "" # "release" # only show NFIs containing this string, or all if ""
+ self.wizard_mode = False
self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "EPGSelectActions"],
{
@@ -205,7 +208,7 @@ class NFIDownload(Screen):
self["key_yellow"].text = (_("Change dir."))
else:
self["key_yellow"].text = (_("Select image"))
- self["key_blue"].text = (_("Fix USB stick"))
+ self["key_blue"].text = (_("USB stick wizard"))
def switchList(self,to_where=None):
if self.download or not self["feedlist"].isValid():
@@ -335,7 +338,7 @@ class NFIDownload(Screen):
self.download = self.nfo_download
self.downloading(True)
client.getPage(nfourl).addCallback(self.nfo_finished).addErrback(self.nfo_failed)
- self["statusbar"].text = _("Downloading image description...")
+ self["statusbar"].text = ("Downloading image description...")
def nfo_failed(self, failure_instance):
print "[nfo_failed] " + str(failure_instance)
@@ -399,8 +402,8 @@ class NFIDownload(Screen):
print "couldn't save nfo file " + self.nfofilename
pos = self.nfo.find("MD5:")
- if pos > 0 and len(self.nfo) >= pos+5+32:
- self["statusbar"].text = _("Please wait for md5 signature verification...")
+ if pos > 0 and len(self.nfo) >= pos+5+32:
+ self["statusbar"].text = ("Please wait for md5 signature verification...")
cmd = "md5sum -c -"
md5 = self.nfo[pos+5:pos+5+32] + " " + self.nfilocal
print cmd, md5
@@ -415,6 +418,8 @@ class NFIDownload(Screen):
else:
self["statusbar"].text = "Download completed."
self.downloading(False)
+ if self.wizard_mode:
+ self.configBackup()
def md5ready(self, retval):
self.download_container.sendEOF()
@@ -423,9 +428,12 @@ class NFIDownload(Screen):
print "[md5finished]: " + str(retval)
self.download_container.appClosed.remove(self.md5finished)
if retval==0:
- self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!")
- self.switchList(self.LIST_SOURCE)
self.downloading(False)
+ if self.wizard_mode:
+ self.configBackup()
+ else:
+ self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!")
+ self.switchList(self.LIST_SOURCE)
else:
self.session.openWithCallback(self.nfi_remove, MessageBox, (_("The md5sum validation failed, the file may be downloaded incompletely or be corrupted!") + "\n" + _("Remove the broken .NFI file?")), MessageBox.TYPE_YESNO)
@@ -489,33 +497,22 @@ class NFIDownload(Screen):
def umount_finished(self, retval):
self.container.appClosed.remove(self.umount_finished)
- self.session.openWithCallback(self.dmesg_clear, MessageBox, _("To make sure you intend to do this, please remove the target USB stick now and stick it back in upon prompt. Press OK when you have taken the stick out."), MessageBox.TYPE_INFO)
-
- def dmesg_clear(self, answer):
self.container.appClosed.append(self.dmesg_cleared)
self.taskstring = ""
self.cmd = "dmesg -c"
print "executing " + self.cmd
self.container.execute(self.cmd)
- def dmesg_cleared(self, retval):
+ def dmesg_cleared(self, answer):
self.container.appClosed.remove(self.dmesg_cleared)
- self.session.openWithCallback(self.stick_back_in, MessageBox, (_("Now please insert the USB stick (minimum size is 64 MB) that you want to format and use as .NFI image flasher. Press OK after you've put the stick back in.")), MessageBox.TYPE_INFO)
-
- def stick_back_in(self, answer):
- self["statusbar"].text = _("Waiting for USB stick to settle...")
- self.delayTimer = eTimer()
- self.delayTimer.callback.append(self.waiting_for_stick)
- self.delayCount = -1
- self.delayTimer.start(1000)
-
- def waiting_for_stick(self):
- self.delayCount += 1
- self["job_progressbar"].range = 6
- self["job_progressbar"].value = self.delayCount
- self["job_progresslabel"].text = "-%d s" % (6-self.delayCount)
- if self.delayCount > 5:
- self.delayTimer.stop()
+ self.msgbox = self.session.open(MessageBox, _("Please disconnect all USB devices from your Dreambox and (re-)attach the target USB stick (minimum size is 64 MB) now!"), MessageBox.TYPE_INFO)
+ hotplugNotifier.append(self.hotplugCB)
+
+ def hotplugCB(self, dev, action):
+ print "[hotplugCB]", dev, action
+ if dev.startswith("sd") and action == "add":
+ self.msgbox.close()
+ hotplugNotifier.remove(self.hotplugCB)
self.container.appClosed.append(self.dmesg_scanned)
self.taskstring = ""
self.cmd = "dmesg"
@@ -539,8 +536,8 @@ class NFIDownload(Screen):
self.session.openWithCallback(self.fdisk_query, MessageBox, (_("The following device was found:\n\n%s\n\nDo you want to write the USB flasher to this stick?") % self.devicetext), MessageBox.TYPE_YESNO)
def fdisk_query(self, answer):
- if answer == True:
- self["statusbar"].text = _("Partitioning USB stick...")
+ if answer == True and self.stickdevice:
+ self["statusbar"].text = ("Partitioning USB stick...")
self["job_progressbar"].range = 1000
self["job_progressbar"].value = 100
self["job_progresslabel"].text = "5.00%"
@@ -562,7 +559,7 @@ class NFIDownload(Screen):
self.tar_finished(0)
self["job_progressbar"].value = 700
else:
- self["statusbar"].text = _("Decompressing USB stick flasher boot image...")
+ self["statusbar"].text = ("Decompressing USB stick flasher boot image...")
self.taskstring = ""
self.container.appClosed.append(self.tar_finished)
self.container.setCWD("/tmp")
@@ -588,7 +585,7 @@ class NFIDownload(Screen):
self.container.appClosed.remove(self.tar_finished)
if retval == 0:
self.imagefilename = "/tmp/nfiflash_" + self.box + ".img"
- self["statusbar"].text = _("Copying USB flasher boot image to stick...")
+ self["statusbar"].text = ("Copying USB flasher boot image to stick...")
self.taskstring = ""
self.container.appClosed.append(self.dd_finished)
self.cmd = "dd if=%s of=%s" % (self.imagefilename,self.stickdevice+"/part1")
@@ -607,7 +604,7 @@ class NFIDownload(Screen):
if retval == 0:
self["job_progressbar"].value = 950
self["job_progresslabel"].text = "95.00%"
- self["statusbar"].text = _("Remounting stick partition...")
+ self["statusbar"].text = ("Remounting stick partition...")
self.taskstring = ""
self.container.appClosed.append(self.mount_finished)
self.cmd = "mount %s /mnt/usb -o rw,sync" % (self.stickdevice+"/part1")
@@ -622,11 +619,12 @@ class NFIDownload(Screen):
if retval == 0:
self["job_progressbar"].value = 1000
self["job_progresslabel"].text = "100.00%"
- self["statusbar"].text = _(".NFI Flasher bootable USB stick successfully created.")
- self.session.openWithCallback(self.remove_img, MessageBox, _("The .NFI Image flasher USB stick is now ready to use. Please download an .NFI image file from the feed server and save it on the stick. Then reboot and hold the 'Down' key on the front panel to boot the .NFI flasher from the stick!"), MessageBox.TYPE_INFO)
+ self["statusbar"].text = (".NFI Flasher bootable USB stick successfully created.")
+ self.session.openWithCallback(self.flasherFinishedCB, MessageBox, _("The USB stick is now bootable. Do you want to download the latest image from the feed server and save it on the stick?"), type = MessageBox.TYPE_YESNO)
self["destlist"].changeDir("/mnt/usb")
else:
- self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR)
+ self.session.openWithCallback(self.flasherFinishedCB, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR)
+ self.remove_img(True)
def remove_img(self, answer):
if fileExists("/tmp/nfiflasher_image.tar.bz2"):
@@ -636,6 +634,43 @@ class NFIDownload(Screen):
self.downloading(False)
self.switchList(self.LIST_SOURCE)
+ def flasherFinishedCB(self, answer):
+ if answer == True:
+ self.wizard_mode = True
+ self["feedlist"].moveSelection(0)
+ self["path_bottom"].text = str(self["destlist"].getCurrentDirectory())
+ self.nfo_download()
+ self.nfi_download()
+
+ def configBackup(self):
+ self.session.openWithCallback(self.runBackup, MessageBox, _("The wizard can backup your current settings. Do you want to do a backup now?"))
+
+ def runBackup(self, result=None):
+ from Tools.Directories import createDir, isMount, pathExists
+ from time import localtime
+ from datetime import date
+ from Screens.Console import Console
+ if result:
+ if isMount("/mnt/usb/"):
+ if (pathExists("/mnt/usb/backup") == False):
+ createDir("/mnt/usb/backup", True)
+ d = localtime()
+ dt = date(d.tm_year, d.tm_mon, d.tm_mday)
+ self.backup_file = "backup/" + str(dt) + "_settings_backup.tar.gz"
+ self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + "/mnt/usb/" + self.backup_file + " /etc/enigma2/ /etc/network/interfaces /etc/wpa_supplicant.conf"], finishedCallback = self.backup_finished, closeOnSuccess = True)
+ else:
+ self.backup_file = None
+ self.backup_finished(skipped=True)
+
+ def backup_finished(self, skipped=False):
+ if not skipped:
+ wizardfd = open("/mnt/usb/wizard.nfo", "w")
+ if wizardfd:
+ wizardfd.write("image: "+self["feedlist"].getNFIname()+'\n')
+ wizardfd.write("configuration: "+self.backup_file+'\n')
+ wizardfd.close()
+ self.session.open(MessageBox, _("To update your Dreambox firmware, please follow these steps:\n1) Turn off your box with the rear power switch and plug in the bootable USB stick.\n2) Turn mains back on and hold the DOWN button on the front panel pressed for 10 seconds.\n3) Wait for bootup and follow instructions of the wizard."), type = MessageBox.TYPE_INFO)
+
def closeCB(self):
if self.download:
self.download.stop()
@@ -659,8 +694,8 @@ def filescan(**kwargs):
Scanner(mimetypes = ["application/x-dream-image"],
paths_to_scan =
[
- ScanPath(path = "", with_subdirs = False),
+ ScanPath(path = "", with_subdirs = False),
],
name = "NFI",
- description = (_("Download .NFI-Files for USB-Flasher")+"..."),
+ description = (_("Download .NFI-Files for USB-Flasher")+"..."),
openfnc = filescan_open, )
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
index 6a982c58..860efc02 100644
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
@@ -17,7 +17,7 @@ import re
class writeNAND(Task):
def __init__(self,job,param,box):
- Task.__init__(self,job, _("Writing image file to NAND Flash"))
+ Task.__init__(self,job, ("Writing image file to NAND Flash"))
self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/mywritenand")
if box == "dm7025":
self.end = 256
@@ -26,7 +26,7 @@ class writeNAND(Task):
if box == "dm8000":
self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/dm8000_writenand")
self.args += param
- self.weighting = 1
+ self.weighting = 1
def processOutput(self, data):
print "[writeNand] " + data
@@ -174,8 +174,8 @@ class NFIFlash(Screen):
print sign
if sign.find("NFI1" + self.box + "\0") == 0:
if self.md5sum != "":
- self["statusbar"].text = _("Please wait for md5 signature verification...")
- self.session.summary.setText(_("Please wait for md5 signature verification..."))
+ self["statusbar"].text = ("Please wait for md5 signature verification...")
+ self.session.summary.setText(("Please wait for md5 signature verification..."))
self.container = eConsoleAppContainer()
self.container.setCWD(self["filelist"].getCurrentDirectory())
self.container.appClosed.append(self.md5finished)
@@ -252,7 +252,7 @@ class NFIFlash(Screen):
def reboot(self):
if self.job.status == self.job.FINISHED:
- self["statusbar"].text = _("rebooting...")
+ self["statusbar"].text = ("rebooting...")
TryQuitMainloop(self.session,2)
def createSummary(self):
diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
index d67a97cb..6d2ddce3 100644
--- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
@@ -14,6 +14,8 @@ from Components.ActionMap import ActionMap
from Components.NimManager import nimmanager
from Components.MenuList import MenuList
from Components.config import ConfigSatlist, ConfigNothing, ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, getConfigListEntry
+from Components.TuneTest import Tuner
+from Tools.Transponder import ConvertToHumanReadable
from time import sleep
@@ -26,22 +28,20 @@ class PositionerSetup(Screen):
<widget name="green" position="140,155" size="140,80" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
<widget name="yellow" position="280,155" size="140,80" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
<widget name="blue" position="420,155" size="140,80" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
-
- <widget name="snr" text="SNR:" position="0,245" size="60,22" font="Regular;21" />
- <widget name="agc" text="AGC:" position="0,270" size="60,22" font="Regular;21" />
- <widget name="ber" text="BER:" position="0,295" size="60,22" font="Regular;21" />
- <widget name="lock" text="Lock:" position="0,320" size="60,22" font="Regular;21" />
- <widget name="snr_percentage" position="220,245" size="60,22" font="Regular;21" />
- <widget name="agc_percentage" position="220,270" size="60,22" font="Regular;21" />
+
+ <widget name="snr_db" position="60,245" size="150,22" halign="center" valign="center" font="Regular;21" />
+ <eLabel text="SNR:" position="0,270" size="60,22" font="Regular;21" />
+ <eLabel text="BER:" position="0,295" size="60,22" font="Regular;21" />
+ <eLabel text="Lock:" position="0,320" size="60,22" font="Regular;21" />
+ <widget name="snr_percentage" position="220,270" size="60,22" font="Regular;21" />
<widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
<widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
- <widget name="snr_bar" position="60,245" size="150,22" />
- <widget name="agc_bar" position="60,270" size="150,22" />
+ <widget name="snr_bar" position="60,270" size="150,22" />
<widget name="ber_bar" position="60,295" size="150,22" />
- <widget name="frequency" text="Frequency:" position="300,245" size="120,22" font="Regular;21" />
- <widget name="symbolrate" text="Symbolrate:" position="300,270" size="120,22" font="Regular;21" />
- <widget name="fec" text="FEC:" position="300,295" size="120,22" font="Regular;21" />
+ <eLabel text="Frequency:" position="300,245" size="120,22" font="Regular;21" />
+ <eLabel text="Symbolrate:" position="300,270" size="120,22" font="Regular;21" />
+ <eLabel text="FEC:" position="300,295" size="120,22" font="Regular;21" />
<widget name="frequency_value" position="420,245" size="120,22" font="Regular;21" />
<widget name="symbolrate_value" position="420,270" size="120,22" font="Regular;21" />
<widget name="fec_value" position="420,295" size="120,22" font="Regular;21" />
@@ -51,23 +51,46 @@ class PositionerSetup(Screen):
Screen.__init__(self, session)
self.feid = feid
self.oldref = None
-
+
+ cur = { }
if not self.openFrontend():
self.oldref = session.nav.getCurrentlyPlayingServiceReference()
+ service = session.nav.getCurrentService()
+ feInfo = service and service.frontendInfo()
+ if feInfo:
+ cur = feInfo.getTransponderData(True)
+ del feInfo
+ del service
session.nav.stopService() # try to disable foreground service
if not self.openFrontend():
if session.pipshown: # try to disable pip
+ service = self.session.pip.pipservice
+ feInfo = service and service.frontendInfo()
+ if feInfo:
+ cur = feInfo.getTransponderData()
+ del feInfo
+ del service
session.pipshown = False
del session.pip
if not self.openFrontend():
self.frontend = None # in normal case this should not happen
-
+
self.frontendStatus = { }
-
self.diseqc = Diseqc(self.frontend)
self.tuner = Tuner(self.frontend)
- self.tuner.tune((0,0,0,0,0,0))
-
+
+ tp = ( cur.get("frequency", 0) / 1000,
+ cur.get("symbol_rate", 0) / 1000,
+ cur.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal),
+ cur.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto),
+ cur.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown),
+ cur.get("orbital_position", 0),
+ cur.get("system", eDVBFrontendParametersSatellite.System_DVB_S),
+ cur.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK),
+ cur.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35),
+ cur.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown))
+
+ self.tuner.tune(tp)
self.createConfig()
self.isMoving = False
@@ -81,27 +104,18 @@ class PositionerSetup(Screen):
self["yellow"] = self.yellow
self.blue = Label("")
self["blue"] = self.blue
-
+
self.list = []
self["list"] = ConfigList(self.list)
self.createSetup()
-
- self["snr"] = Label()
- self["agc"] = Label()
- self["ber"] = Label()
- self["lock"] = Label()
+
+ self["snr_db"] = TunerInfo(TunerInfo.SNR_DB, statusDict = self.frontendStatus)
self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, statusDict = self.frontendStatus)
- self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, statusDict = self.frontendStatus)
self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, statusDict = self.frontendStatus)
self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, statusDict = self.frontendStatus)
- self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, statusDict = self.frontendStatus)
self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, statusDict = self.frontendStatus)
self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, statusDict = self.frontendStatus)
- self["frequency"] = Label()
- self["symbolrate"] = Label()
- self["fec"] = Label()
-
self["frequency_value"] = Label("")
self["symbolrate_value"] = Label("")
self["fec_value"] = Label("")
@@ -260,7 +274,12 @@ class PositionerSetup(Screen):
elif entry == "limits":
self.diseqccommand("limitOff")
elif entry == "tune":
- self.session.openWithCallback(self.tune, TunerScreen, self.feid)
+ fe_data = { }
+ self.frontend.getFrontendData(fe_data)
+ self.frontend.getTransponderData(fe_data, True)
+ feparm = self.tuner.lastparm.getDVBS()
+ fe_data["orbital_position"] = feparm.orbital_position
+ self.session.openWithCallback(self.tune, TunerScreen, self.feid, fe_data)
elif entry == "goto0":
print "move to position 0"
self.diseqccommand("moveTo", 0)
@@ -283,6 +302,7 @@ class PositionerSetup(Screen):
elif entry == "storage":
print "store at position", int(self.positioner_storage.value)
self.diseqccommand("store", int(self.positioner_storage.value))
+
elif entry == "limits":
self.diseqccommand("limitWest")
@@ -329,14 +349,13 @@ class PositionerSetup(Screen):
def updateStatus(self):
if self.frontend:
self.frontend.getFrontendStatus(self.frontendStatus)
+ self["snr_db"].update()
self["snr_percentage"].update()
- self["agc_percentage"].update()
self["ber_value"].update()
self["snr_bar"].update()
- self["agc_bar"].update()
self["ber_bar"].update()
self["lock_state"].update()
- transponderdata = self.tuner.getTransponderData()
+ transponderdata = ConvertToHumanReadable(self.tuner.getTransponderData())
self["frequency_value"].setText(str(transponderdata.get("frequency")))
self["symbolrate_value"].setText(str(transponderdata.get("symbol_rate")))
self["fec_value"].setText(str(transponderdata.get("fec_inner")))
@@ -387,37 +406,6 @@ class Diseqc:
sleep(0.05)
self.frontend.sendDiseqc(cmd) # send 2nd time
-class Tuner:
- def __init__(self, frontend):
- self.frontend = frontend
-
- def tune(self, transponder):
- 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, True)
- self.lastparm = feparm
- if self.frontend:
- self.frontend.tune(feparm)
-
- def retune(self):
- if self.frontend:
- self.frontend.tune(self.lastparm)
-
- def getTransponderData(self):
- ret = { }
- if self.frontend:
- self.frontend.getTransponderData(ret, True)
- return ret
-
tuning = None
class TunerScreen(ScanSetup):
@@ -427,8 +415,9 @@ class TunerScreen(ScanSetup):
<widget name="introduction" position="20,360" size="350,30" font="Regular;23" />
</screen>"""
- def __init__(self, session, feid):
+ def __init__(self, session, feid, fe_data):
self.feid = feid
+ self.fe_data = fe_data
ScanSetup.__init__(self, session)
self["introduction"].setText("")
@@ -440,21 +429,35 @@ class TunerScreen(ScanSetup):
self.list.append(self.typeOfTuningEntry)
self.satEntry = getConfigListEntry(_('Satellite'), tuning.sat)
self.list.append(self.satEntry)
+ nim = nimmanager.nim_slots[self.feid]
+ self.systemEntry = None
+
if tuning.type.value == "manual_transponder":
+ if nim.isCompatible("DVB-S2"):
+ self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
+ self.list.append(self.systemEntry)
+ else:
+ # downgrade to dvb-s, in case a -s2 config was active
+ self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S
self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
- self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
+ if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
+ self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
+ elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
+ self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
+ self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
+ self.list.append(self.modulationEntry)
+ self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff))
+ self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
elif tuning.type.value == "predefined_transponder":
self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder))
self["config"].list = self.list
self["config"].l.setList(self.list)
def newConfig(self):
- if self["config"].getCurrent() == self.typeOfTuningEntry:
- self.createSetup()
- elif self["config"].getCurrent() == self.satEntry:
+ if self["config"].getCurrent() in (self.typeOfTuningEntry, self.satEntry, self.systemEntry):
self.createSetup()
def createConfig(self, foo):
@@ -468,8 +471,14 @@ class TunerScreen(ScanSetup):
tuning.sat = ConfigSatlist(list=nimmanager.getRotorSatListForNim(self.feid))
tuning.sat.addNotifier(self.tuningSatChanged)
self.updateTransponders()
- TunerScreenConfigCreated = True
- ScanSetup.createConfig(self, None)
+ orb_pos = self.fe_data.get("orbital_position", None)
+ if orb_pos is not None:
+ for x in nimmanager.getRotorSatListForNim(self.feid):
+ opos = str(orb_pos)
+ if x[0] == orb_pos and tuning.sat.value != opos:
+ tuning.sat.value = opos
+ del self.fe_data["orbital_position"]
+ ScanSetup.createConfig(self, self.fe_data)
def tuningSatChanged(self, *parm):
self.updateTransponders()
@@ -491,46 +500,55 @@ class TunerScreen(ScanSetup):
else:
pol = "??"
if x[4] == 0:
- fec = "FEC_AUTO"
+ fec = "FEC Auto"
elif x[4] == 1:
- fec = "FEC_1_2"
+ fec = "FEC 1/2"
elif x[4] == 2:
- fec = "FEC_2_3"
+ fec = "FEC 2/3"
elif x[4] == 3:
- fec = "FEC_3_4"
+ fec = "FEC 3/4"
elif x[4] == 4:
- fec = "FEC_5_6"
+ fec = "FEC 5/6"
elif x[4] == 5:
- fec = "FEC_7_8"
+ fec = "FEC 7/8"
elif x[4] == 6:
- fec = "FEC_8_9"
+ fec = "FEC 8/9"
elif x[4] == 7:
- fec = "FEC_3_5"
+ fec = "FEC 3/5"
elif x[4] == 8:
- fec = "FEC_4_5"
+ fec = "FEC 4/5"
elif x[4] == 9:
- fec = "FEC_9_10"
+ fec = "FEC 9/10"
elif x[4] == 15:
- fec = "FEC_None"
+ fec = "FEC None"
else:
- fec = "FEC_Unknown"
+ fec = "FEC Unknown"
tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
tuning.transponder = ConfigSelection(choices=tps)
def keyGo(self):
- returnvalue = (0, 0, 0, 0, 0, 0)
+ returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
satpos = int(tuning.sat.value)
if tuning.type.value == "manual_transponder":
+ if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
+ fec = self.scan_sat.fec_s2.value
+ else:
+ fec = self.scan_sat.fec.value
returnvalue = (
self.scan_sat.frequency.value,
self.scan_sat.symbolrate.value,
- self.scan_sat.polarization.index,
- self.scan_sat.fec.index,
- self.scan_sat.inversion.index,
- satpos)
+ self.scan_sat.polarization.value,
+ fec,
+ self.scan_sat.inversion.value,
+ satpos,
+ self.scan_sat.system.value,
+ self.scan_sat.modulation.value,
+ self.scan_sat.rolloff.value,
+ self.scan_sat.pilot.value)
elif tuning.type.value == "predefined_transponder":
transponder = nimmanager.getTransponders(satpos)[tuning.transponder.index]
- returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
+ returnvalue = (transponder[1] / 1000, transponder[2] / 1000,
+ transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9])
self.close(returnvalue)
def keyCancel(self):
@@ -538,8 +556,8 @@ class TunerScreen(ScanSetup):
class RotorNimSelection(Screen):
skin = """
- <screen position="140,165" size="400,100" title="select Slot">
- <widget name="nimlist" position="20,10" size="360,75" />
+ <screen position="140,165" size="400,130" title="select Slot">
+ <widget name="nimlist" position="20,10" size="360,100" />
</screen>"""
def __init__(self, session):
diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
index 74568855..8e148812 100644
--- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
@@ -12,73 +12,9 @@ from Components.ActionMap import ActionMap
from Components.NimManager import nimmanager, getConfigSatlist
from Components.MenuList import MenuList
from Components.config import ConfigSelection, getConfigListEntry
-
-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 = 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)
+from Components.TuneTest import Tuner
class Satfinder(ScanSetup):
- skin = """
- <screen position="90,100" size="520,400" title="Tune">
- <widget name="config" position="20,10" size="460,210" scrollbarMode="showOnDemand" />
- <widget name="introduction" position="20,360" zPosition="-10" size="350,30" font="Regular;23" />
- <eLabel text="dB:" position="23,230" size="60,22" font="Regular;21" />
- <eLabel text="SNR:" position="23,255" size="60,22" font="Regular;21" />
- <eLabel text="AGC:" position="23,280" size="60,22" font="Regular;21" />
- <eLabel text="BER:" position="23,305" size="60,22" font="Regular;21" />
- <eLabel text="Lock:" position="23,330" size="60,22" font="Regular;21" />
- <widget source="Frontend" render="Label" position="295,230" size="60,22" font="Regular;21" >
- <convert type="FrontendInfo">SNRdB</convert>
- </widget>
- <widget source="Frontend" render="Label" position="295,255" size="60,22" font="Regular;21" >
- <convert type="FrontendInfo">SNR</convert>
- </widget>
- <widget source="Frontend" render="Label" position="295,280" size="60,22" font="Regular;21" >
- <convert type="FrontendInfo">AGC</convert>
- </widget>
- <widget source="Frontend" render="Label" position="295,305" size="60,22" font="Regular;21" >
- <convert type="FrontendInfo">BER</convert>
- </widget>
- <widget source="Frontend" render="Progress" position="85,257" size="200,22" >
- <convert type="FrontendInfo">SNR</convert>
- </widget>
- <widget source="Frontend" render="Progress" position="85,282" size="200,22" >
- <convert type="FrontendInfo">AGC</convert>
- </widget>
- <widget source="Frontend" render="Progress" position="85,307" size="200,22" >
- <convert type="FrontendInfo">BER</convert>
- </widget>
- <widget source="Frontend" render="Pixmap" pixmap="skin_default/buttons/key_green.png" position="295,330" zPosition="4" size="28,20" alphatest="on" >
- <convert type="FrontendInfo">LOCK</convert>
- <convert type="ConditionalShowHide" />
- </widget>
- <widget source="Frontend" render="Pixmap" pixmap="skin_default/buttons/key_red.png" position="295,330" zPosition="4" size="28,20" alphatest="on" >
- <convert type="FrontendInfo">LOCK</convert>
- <convert type="ConditionalShowHide">Invert</convert>
- </widget>
- </screen>"""
-
def openFrontend(self):
res_mgr = eDVBResourceManager.getInstance()
if res_mgr:
@@ -125,25 +61,44 @@ class Satfinder(ScanSetup):
self.satEntry = None
self.list = []
+
self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
self.list.append(self.typeOfTuningEntry)
self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
self.list.append(self.satEntry)
+
+ nim = nimmanager.nim_slots[self.feid]
+
+ self.systemEntry = None
if self.tuning_type.value == "manual_transponder":
+ if nim.isCompatible("DVB-S2"):
+ self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
+ self.list.append(self.systemEntry)
+ else:
+ # downgrade to dvb-s, in case a -s2 config was active
+ self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S
self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
- self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
+ if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
+ self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
+ elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
+ self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
+ self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
+ self.list.append(self.modulationEntry)
+ self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff))
+ self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
self["config"].list = self.list
self["config"].l.setList(self.list)
def newConfig(self):
- if self["config"].getCurrent() == self.typeOfTuningEntry:
+ cur = self["config"].getCurrent()
+ if cur in (self.typeOfTuningEntry, self.systemEntry):
self.createSetup()
- elif self["config"].getCurrent() == self.satEntry:
+ elif cur == self.satEntry:
self.updateSats()
self.createSetup()
@@ -152,20 +107,33 @@ class Satfinder(ScanSetup):
self.retune(config_element)
def retune(self, configElement):
- returnvalue = (0, 0, 0, 0, 0, 0, 0)
- satpos = self.tuning_sat.orbital_position
-
- if satpos is not None:
- if self.tuning_type.value == "manual_transponder":
- returnvalue = (self.scan_sat.frequency.value, self.scan_sat.symbolrate.value, self.scan_sat.polarization.index, self.scan_sat.fec.index, self.scan_sat.inversion.index, satpos)
+ returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ satpos = int(self.tuning_sat.value)
+ if self.tuning_type.value == "manual_transponder":
+ if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
+ fec = self.scan_sat.fec_s2.value
+ else:
+ fec = self.scan_sat.fec.value
+ returnvalue = (
+ self.scan_sat.frequency.value,
+ self.scan_sat.symbolrate.value,
+ self.scan_sat.polarization.value,
+ fec,
+ self.scan_sat.inversion.value,
+ satpos,
+ self.scan_sat.system.value,
+ self.scan_sat.modulation.value,
+ self.scan_sat.rolloff.value,
+ self.scan_sat.pilot.value)
+ self.tune(returnvalue)
+ elif self.tuning_type.value == "predefined_transponder":
+ tps = nimmanager.getTransponders(satpos)
+ l = len(tps)
+ if l > self.tuning_transponder.index:
+ transponder = tps[self.tuning_transponder.index]
+ returnvalue = (transponder[1] / 1000, transponder[2] / 1000,
+ transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9])
self.tune(returnvalue)
- elif self.tuning_type.value == "predefined_transponder":
- tps = nimmanager.getTransponders(satpos)
- l = len(tps)
- if l > self.tuning_transponder.index:
- transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
- returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
- self.tune(returnvalue)
def createConfig(self, foo):
self.tuning_transponder = None
@@ -174,14 +142,13 @@ class Satfinder(ScanSetup):
ScanSetup.createConfig(self, None)
self.updateSats()
-
- self.tuning_type.addNotifier(self.retune, initial_call = False)
- self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
- self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
- self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
- self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
- self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
- self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
+
+ for x in (self.tuning_type, self.tuning_sat, self.scan_sat.frequency,
+ self.scan_sat.inversion, self.scan_sat.symbolrate,
+ self.scan_sat.polarization, self.scan_sat.fec, self.scan_sat.pilot,
+ self.scan_sat.fec_s2, self.scan_sat.fec, self.scan_sat.modulation,
+ self.scan_sat.rolloff, self.scan_sat.system):
+ x.addNotifier(self.retune, initial_call = False)
def updateSats(self):
orb_pos = self.tuning_sat.orbital_position
@@ -201,29 +168,29 @@ class Satfinder(ScanSetup):
else:
pol = "??"
if x[4] == 0:
- fec = "FEC_AUTO"
+ fec = "FEC Auto"
elif x[4] == 1:
- fec = "FEC_1_2"
+ fec = "FEC 1/2"
elif x[4] == 2:
- fec = "FEC_2_3"
+ fec = "FEC 2/3"
elif x[4] == 3:
- fec = "FEC_3_4"
+ fec = "FEC 3/4"
elif x[4] == 4:
- fec = "FEC_5_6"
+ fec = "FEC 5/6"
elif x[4] == 5:
- fec = "FEC_7_8"
+ fec = "FEC 7/8"
elif x[4] == 6:
- fec = "FEC_8_9"
+ fec = "FEC 8/9"
elif x[4] == 7:
- fec = "FEC_3_5"
+ fec = "FEC 3/5"
elif x[4] == 8:
- fec = "FEC_4_5"
+ fec = "FEC 4/5"
elif x[4] == 9:
- fec = "FEC_9_10"
+ fec = "FEC 9/10"
elif x[4] == 15:
- fec = "FEC_None"
+ fec = "FEC None"
else:
- fec = "FEC_Unknown"
+ fec = "FEC Unknown"
e = str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec
if default is None:
default = e
@@ -256,8 +223,8 @@ class Satfinder(ScanSetup):
class SatNimSelection(Screen):
skin = """
- <screen position="140,165" size="400,100" title="select Slot">
- <widget name="nimlist" position="20,10" size="360,75" />
+ <screen position="140,165" size="400,130" title="select Slot">
+ <widget name="nimlist" position="20,10" size="360,100" />
</screen>"""
def __init__(self, session):
@@ -281,7 +248,13 @@ class SatNimSelection(Screen):
self.session.open(Satfinder, selection)
def SatfinderMain(session, **kwargs):
- nimList = nimmanager.getNimListOfType("DVB-S")
+ nims = nimmanager.getNimListOfType("DVB-S")
+
+ nimList = []
+ for x in nims:
+ if not nimmanager.getNimConfig(x).configMode.value in ("loopthrough", "satposdepends", "nothing"):
+ nimList.append(x)
+
if len(nimList) == 0:
session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
else:
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py
index 2422475e..6a85c4da 100644
--- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py
+++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py
@@ -59,10 +59,37 @@ class VideoHardware:
widescreen_modes = set(["720p", "1080i"])
+ def getOutputAspect(self):
+ ret = (16,9)
+ port = config.av.videoport.value
+ if port not in config.av.videomode:
+ print "current port not available in getOutputAspect!!! force 16:9"
+ else:
+ mode = config.av.videomode[port].value
+ force_widescreen = self.isWidescreenMode(port, mode)
+ is_widescreen = force_widescreen or config.av.aspect.value in ["16_9", "16_10"]
+ is_auto = config.av.aspect.value == "auto"
+ if is_widescreen:
+ if force_widescreen:
+ pass
+ else:
+ aspect = {"16_9": "16:9", "16_10": "16:10"}[config.av.aspect.value]
+ if aspect == "16:10":
+ ret = (16,10)
+ elif is_auto:
+ try:
+ aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read()
+ if aspect_str == "1": # 4:3
+ ret = (4,3)
+ except IOError:
+ pass
+ else: # 4:3
+ ret = (4,3)
+ return ret
+
def __init__(self):
self.last_modes_preferred = [ ]
self.on_hotplug = CList()
- self.standby = False
self.current_mode = None
self.current_port = None
@@ -79,7 +106,7 @@ class VideoHardware:
config.av.aspectratio.notifiers = [ ]
config.av.tvsystem.notifiers = [ ]
config.av.wss.notifiers = [ ]
- AVSwitch.setInput = self.AVSwitchSetInput
+ AVSwitch.getOutputAspect = self.getOutputAspect
config.av.aspect.addNotifier(self.updateAspect)
config.av.wss.addNotifier(self.updateAspect)
@@ -91,12 +118,6 @@ class VideoHardware:
# self.timer.callback.append(self.readPreferredModes)
# self.timer.start(1000)
- config.av.colorformat.addNotifier(self.updateFastblank)
-
- def AVSwitchSetInput(self, mode):
- self.standby = mode == "SCART"
- self.updateStandby()
-
def readAvailableModes(self):
try:
modes = open("/proc/stb/video/videomode_choices").read()[:-1]
@@ -264,6 +285,7 @@ class VideoHardware:
is_widescreen = force_widescreen or config.av.aspect.value in ["16_9", "16_10"]
is_auto = config.av.aspect.value == "auto"
+ policy2 = "policy" # use main policy
if is_widescreen:
if force_widescreen:
@@ -271,6 +293,7 @@ class VideoHardware:
else:
aspect = {"16_9": "16:9", "16_10": "16:10"}[config.av.aspect.value]
policy = {"pillarbox": "panscan", "panscan": "letterbox", "nonlinear": "nonlinear", "scale": "bestfit"}[config.av.policy_43.value]
+ policy2 = {"letterbox": "letterbox", "panscan": "panscan", "scale": "bestfit"}[config.av.policy_169.value]
elif is_auto:
aspect = "any"
policy = "bestfit"
@@ -283,46 +306,14 @@ class VideoHardware:
else:
wss = "auto"
- print "-> setting aspect, policy, wss", aspect, policy, wss
+ print "-> setting aspect, policy, policy2, wss", aspect, policy, policy2, wss
open("/proc/stb/video/aspect", "w").write(aspect)
open("/proc/stb/video/policy", "w").write(policy)
open("/proc/stb/denc/0/wss", "w").write(wss)
- self.updateSlowblank()
- self.updateFastblank()
-
- def updateSlowblank(self):
- if self.standby:
- from Components.SystemInfo import SystemInfo
- if SystemInfo["ScartSwitch"]:
- input = "scart"
- sb = "vcr"
- else:
- input = "off"
- sb = "0"
- else:
- input = "encoder"
- sb = "auto"
-
- open("/proc/stb/avs/0/sb", "w").write(sb)
- open("/proc/stb/avs/0/input", "w").write(input)
-
- def updateStandby(self):
- self.updateSlowblank()
- self.updateFastblank()
-
- def updateFastblank(self, *args):
- if self.standby:
- from Components.SystemInfo import SystemInfo
- if SystemInfo["ScartSwitch"]:
- fb = "vcr"
- else:
- fb = "low"
- else:
- if self.current_port == "Scart" and config.av.colorformat.value == "rgb":
- fb = "high"
- else:
- fb = "low"
- open("/proc/stb/avs/0/fb", "w").write(fb)
+ try:
+ open("/proc/stb/video/policy2", "w").write(policy2)
+ except IOError:
+ pass
config.av.edid_override = ConfigYesNo(default = False)
video_hw = VideoHardware()
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py
index ab7aad72..30bdf796 100644
--- a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py
@@ -78,6 +78,7 @@ class VideoSetup(Screen, ConfigListScreen):
if force_wide or config.av.aspect.value in ["16_9", "16_10"]:
self.list.append(getConfigListEntry(_("Display 4:3 content as"), config.av.policy_43))
+ self.list.append(getConfigListEntry(_("Display >16:9 content as"), config.av.policy_169))
elif config.av.aspect.value == "4_3":
self.list.append(getConfigListEntry(_("Display 16:9 content as"), config.av.policy_169))