catch up DiseqcTest development
[enigma2.git] / lib / python / Plugins / SystemPlugins / DiseqcTester / plugin.py
1 from Screens.Satconfig import NimSelection
2 from Screens.Screen import Screen
3
4 from Plugins.Plugin import PluginDescriptor
5
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
13
14 class DiseqcTester(Screen, TuneTest):
15         skin = """
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>
20                 </widget>
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>
24                 </widget>
25                 <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
26                         <convert type="FrontendInfo">SNR</convert>
27                 </widget>
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>
31                 </widget>
32                 <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
33                         <convert type="FrontendInfo">AGC</convert>
34                 </widget>
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>
38                 </widget>
39                 <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
40                         <convert type="FrontendInfo">BER</convert>
41                 </widget>
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" />
46                 </widget>
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>
50                 </widget>
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" />
55                 
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" />
58                 
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" />
61                 </screen>"""
62                 
63         TEST_TYPE_QUICK = 0
64         TEST_TYPE_RANDOM = 1
65         TEST_TYPE_COMPLETE = 2
66         def __init__(self, session, feid, test_type = TEST_TYPE_QUICK):
67                 Screen.__init__(self, session)
68                 self.feid = feid
69                 self.test_type = test_type
70                 
71                 self["actions"] = NumberActionMap(["SetupActions"],
72                 {
73                         "ok": self.keyGo,
74                         "cancel": self.keyCancel,
75                 }, -2)
76                 
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")
83                                 
84                 self.indexlist = {}
85                 self.readTransponderList()
86
87         def readTransponderList(self):
88                 for sat in nimmanager.getSatListForNim(self.feid):
89                         for transponder in nimmanager.getTransponders(sat[0]):
90                                 #print transponder
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)
93
94         def getIndexForTransponder(self, transponder):
95                 if transponder[0] < 11700:
96                         band = 1 # low
97                 else:
98                         band = 0 # high
99                         
100                 polarisation = transponder[2]
101                 
102                 sat = transponder[5]
103                 
104                 index = (band, polarisation, sat)
105                 return index
106
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
114         
115         # returns a string for the user representing a human readable output for index 
116         def getTextualIndexRepresentation(self, index):
117                 print "getTextualIndexRepresentation:", index
118                 text = ""
119                 
120                 # TODO better sat representation
121                 text += "%s, " % index[2] 
122                 
123                 if index[0] == 1:
124                         text += "Low Band, "
125                 else:
126                         text += "High Band, "
127                         
128                 if index[1] == 0:
129                         text += "H"
130                 else:
131                         text += "V"
132                 return text
133         
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
144                         return True
145                 else:
146                         return False
147                 
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])
152
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:
158                         self.myindex = 0
159                         keys = self.indexlist.keys()
160                         self["overall_progress"].setRange(len(keys))
161                         self["overall_progress"].setValue(self.myindex)
162                         return keys[0]
163                 
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:
168                         self.myindex += 1
169                         keys = self.indexlist.keys()
170                         
171                         self["overall_progress"].setValue(self.myindex)
172                         if self.myindex < len(keys):
173                                 return keys[self.myindex]
174                         else:
175                                 return None
176         
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()))
182         
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)
189
190         def keyGo(self):
191                 self.currentlyTestedIndex = self.getFirstIndex()
192                 if self.fillTransponderList():
193                         self.run(True)
194
195         def keyCancel(self):
196                 self.close()
197
198 class DiseqcTesterNimSelection(NimSelection):
199         skin = """
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">
203                                 {"template": [
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,
206                                         ],
207                                  "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
208                                  "itemHeight": 70
209                                 }
210                         </convert>
211                 </widget>
212         </screen>"""
213                 
214         def __init__(self, session, args = None):
215                 NimSelection.__init__(self, session)
216
217         def setResultClass(self):
218                 self.resultclass = DiseqcTester
219                 
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"]:
224                                 return False
225                         if nimConfig.configMode.value == "simple":
226                                 if nimConfig.diseqcMode.value == "positioner":
227                                         return False
228                         return True
229                 return False
230
231 def DiseqcTesterMain(session, **kwargs):
232         session.open(DiseqcTesterNimSelection)
233         
234 def autostart(reason, **kwargs):
235         resourcemanager.addResource("DiseqcTester", DiseqcTesterMain)
236
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)]