1 from Screens.Satconfig import NimSelection
2 from Screens.Screen import Screen
4 from Plugins.Plugin import PluginDescriptor
6 from Components.ActionMap import NumberActionMap
7 from Components.NimManager import nimmanager
8 from Components.ResourceManager import resourcemanager
9 from Components.Sources.FrontendStatus import FrontendStatus
10 from Components.TuneTest import TuneTest
11 from Components.Sources.Progress import Progress
12 from Components.Sources.StaticText import StaticText
14 class DiseqcTester(Screen, TuneTest):
16 <screen position="90,100" size="520,400" title="DiSEqC Tester" >
17 <ePixmap pixmap="skin_default/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
18 <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
19 <convert type="FrontendInfo">SNRdB</convert>
21 <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
22 <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
23 <convert type="FrontendInfo">SNR</convert>
25 <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
26 <convert type="FrontendInfo">SNR</convert>
28 <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
29 <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
30 <convert type="FrontendInfo">AGC</convert>
32 <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
33 <convert type="FrontendInfo">AGC</convert>
35 <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
36 <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="skin_default/bar_ber.png" borderWidth="2" borderColor="#cccccc">
37 <convert type="FrontendInfo">BER</convert>
39 <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
40 <convert type="FrontendInfo">BER</convert>
42 <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
43 <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
44 <convert type="FrontendInfo">LOCK</convert>
45 <convert type="ConditionalShowHide" />
47 <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
48 <convert type="FrontendInfo">LOCK</convert>
49 <convert type="ConditionalShowHide">Invert</convert>
51 <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" />
52 <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
53 <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" />
54 <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
56 <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" />
57 <widget source="failed_counter" render="Label" position="160,282" size="480,20" font="Regular;21" />
59 <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" />
60 <widget source="succeeded_counter" render="Label" position="160,312" size="480,20" font="Regular;21" />
65 TEST_TYPE_COMPLETE = 2
66 def __init__(self, session, feid, test_type = TEST_TYPE_QUICK):
67 Screen.__init__(self, session)
69 self.test_type = test_type
71 self["actions"] = NumberActionMap(["SetupActions"],
74 "cancel": self.keyCancel,
77 TuneTest.__init__(self, feid, stopOnSuccess = True)
78 self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100)
79 self["overall_progress"] = Progress()
80 self["sub_progress"] = Progress()
81 self["failed_counter"] = StaticText("10")
82 self["succeeded_counter"] = StaticText("10")
85 self.readTransponderList()
87 def readTransponderList(self):
88 for sat in nimmanager.getSatListForNim(self.feid):
89 for transponder in nimmanager.getTransponders(sat[0]):
91 mytransponder = (transponder[1] / 1000, transponder[2] / 1000, transponder[3], transponder[4], transponder[5], sat[0], None, None, transponder[10], transponder[11])
92 self.analyseTransponder(mytransponder)
94 def getIndexForTransponder(self, transponder):
95 if transponder[0] < 11700:
100 polarisation = transponder[2]
104 index = (band, polarisation, sat)
107 # sort the transponder into self.transponderlist
108 def analyseTransponder(self, transponder):
109 index = self.getIndexForTransponder(transponder)
110 if index not in self.indexlist:
111 self.indexlist[index] = []
112 self.indexlist[index].append(transponder)
113 #print "self.indexlist:", self.indexlist
115 # returns a string for the user representing a human readable output for index
116 def getTextualIndexRepresentation(self, index):
117 print "getTextualIndexRepresentation:", index
120 # TODO better sat representation
121 text += "%s, " % index[2]
126 text += "High Band, "
134 def fillTransponderList(self):
135 self.clearTransponder()
136 print "----------- fillTransponderList"
137 print "index:", self.currentlyTestedIndex
138 keys = self.indexlist.keys()
139 if self.getContinueScanning():
140 print "index:", self.getTextualIndexRepresentation(self.currentlyTestedIndex)
141 for transponder in self.indexlist[self.currentlyTestedIndex]:
142 self.addTransponder(transponder)
143 print "transponderList:", self.transponderlist
148 def progressCallback(self, progress):
149 if progress[0] != self["sub_progress"].getRange():
150 self["sub_progress"].setRange(progress[0])
151 self["sub_progress"].setValue(progress[1])
153 # logic for scanning order of transponders
154 # on go getFirstIndex is called
155 def getFirstIndex(self):
156 # TODO use other function to scan more randomly
157 if self.test_type == self.TEST_TYPE_QUICK:
159 keys = self.indexlist.keys()
160 self["overall_progress"].setRange(len(keys))
161 self["overall_progress"].setValue(self.myindex)
164 # after each index is finished, getNextIndex is called to get the next index to scan
165 def getNextIndex(self):
166 # TODO use other function to scan more randomly
167 if self.test_type == self.TEST_TYPE_QUICK:
169 keys = self.indexlist.keys()
171 self["overall_progress"].setValue(self.myindex)
172 if self.myindex < len(keys):
173 return keys[self.myindex]
177 # after each index is finished and the next index is returned by getNextIndex
178 # the algorithm checks, if we should continue scanning
179 def getContinueScanning(self):
180 if self.test_type == self.TEST_TYPE_QUICK:
181 return (self.myindex < len(self.indexlist.keys()))
183 def finishedChecking(self):
184 print "finishedChecking"
185 TuneTest.finishedChecking(self)
186 self.currentlyTestedIndex = self.getNextIndex()
187 if self.fillTransponderList():
188 self.run(checkPIDs = True)
191 self.currentlyTestedIndex = self.getFirstIndex()
192 if self.fillTransponderList():
198 class DiseqcTesterNimSelection(NimSelection):
200 <screen position="160,123" size="400,330" title="Choose Tuner">
201 <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
202 <convert type="TemplatedMultiContent">
204 MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
205 MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
207 "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
214 def __init__(self, session, args = None):
215 NimSelection.__init__(self, session)
217 def setResultClass(self):
218 self.resultclass = DiseqcTester
220 def showNim(self, nim):
221 nimConfig = nimmanager.getNimConfig(nim.slot)
222 if nim.isCompatible("DVB-S"):
223 if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends", "nothing"]:
225 if nimConfig.configMode.value == "simple":
226 if nimConfig.diseqcMode.value == "positioner":
231 def DiseqcTesterMain(session, **kwargs):
232 session.open(DiseqcTesterNimSelection)
234 def autostart(reason, **kwargs):
235 resourcemanager.addResource("DiseqcTester", DiseqcTesterMain)
237 def Plugins(**kwargs):
238 return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain),
239 PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)]