fix syntax error,
[enigma2.git] / lib / python / Plugins / SystemPlugins / Satfinder / plugin.py
1 from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager,\
2         eDVBDiseqcCommand, eDVBFrontendParametersSatellite, eDVBFrontendParameters
3
4 from Screens.Screen import Screen
5 from Screens.ScanSetup import ScanSetup
6 from Screens.MessageBox import MessageBox
7 from Plugins.Plugin import PluginDescriptor
8
9 from Components.Label import Label
10 from Components.ConfigList import ConfigList
11 from Components.TunerInfo import TunerInfo
12 from Components.ActionMap import ActionMap
13 from Components.NimManager import nimmanager, getConfigSatlist
14 from Components.MenuList import MenuList
15 from Components.config import ConfigSelection, ConfigSatlist, getConfigListEntry
16
17 class Tuner:
18         def __init__(self, frontend):
19                 self.frontend = frontend
20                 
21         def tune(self, transponder):
22                 if self.frontend:
23                         print "tuning to transponder with data", transponder
24                         parm = eDVBFrontendParametersSatellite()
25                         parm.frequency = transponder[0] * 1000
26                         parm.symbol_rate = transponder[1] * 1000
27                         parm.polarisation = transponder[2]
28                         parm.fec = transponder[3]
29                         parm.inversion = transponder[4]
30                         parm.orbital_position = transponder[5]
31                         parm.system = 0  # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2)
32                         parm.modulation = 1 # FIXMEE !! HARDCODED QPSK 
33                         feparm = eDVBFrontendParameters()
34                         feparm.setDVBS(parm)
35                         self.lastparm = feparm
36                         self.frontend.tune(feparm)
37         
38         def retune(self):
39                 if self.frontend:
40                         self.frontend.tune(self.lastparm)
41
42 class Satfinder(ScanSetup):
43         skin = """
44                 <screen position="90,100" size="520,400" title="Tune">
45                         <widget name="config" position="20,10" size="460,240" scrollbarMode="showOnDemand" />
46                         <widget name="introduction" position="20,360" zPosition="-10" size="350,30" font="Regular;23" />
47                         <widget name="snr" text="SNR:" position="0,245" size="60,22" font="Regular;21" />
48                         <widget name="agc" text="AGC:" position="0,270" size="60,22" font="Regular;21" />
49                         <widget name="ber" text="BER:" position="0,295" size="60,22" font="Regular;21" />
50                         <widget name="lock" text="Lock:" position="0,320" size="60,22" font="Regular;21" />
51                         <widget name="snr_percentage" position="220,245" size="60,22" font="Regular;21" />
52                         <widget name="agc_percentage" position="220,270" size="60,22" font="Regular;21" />
53                         <widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
54                         <widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
55                         <widget name="snr_bar" position="60,245" size="150,22" />
56                         <widget name="agc_bar" position="60,270" size="150,22" />
57                         <widget name="ber_bar" position="60,295" size="150,22" />
58                 </screen>"""
59
60         def openFrontend(self):
61                 res_mgr = eDVBResourceManager.getInstance()
62                 if res_mgr:
63                         self.raw_channel = res_mgr.allocateRawChannel(self.feid)
64                         if self.raw_channel:
65                                 self.frontend = self.raw_channel.getFrontend()
66                                 if self.frontend:
67                                         return True
68                                 else:
69                                         print "getFrontend failed"
70                         else:
71                                 print "getRawChannel failed"
72                 else:
73                         print "getResourceManager instance failed"
74                 return False
75
76         def getFrontend(self):
77                 return self.frontend
78
79         def __init__(self, session, feid):
80                 self.initcomplete = False
81                 self.feid = feid
82                 self.oldref = None
83                 
84                 if not self.openFrontend():
85                         self.oldref = session.nav.getCurrentlyPlayingServiceReference()
86                         session.nav.stopService() # try to disable foreground service
87                         if not self.openFrontend():
88                                 if session.pipshown: # try to disable pip
89                                         session.pipshown = False
90                                         del session.pip
91                                         if not self.openFrontend():
92                                                 self.frontend = None # in normal case this should not happen
93                                                 self.getFrontend = None
94                 
95                 ScanSetup.__init__(self, session)
96                 self.tuner = Tuner(self.frontend)
97                 
98                 self["snr"] = Label()
99                 self["agc"] = Label()
100                 self["ber"] = Label()
101                 self["lock"] = Label()
102                 self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, frontendfkt = self.getFrontend)
103                 self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, frontendfkt = self.getFrontend)
104                 self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, frontendfkt = self.getFrontend)
105                 self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, frontendfkt = self.getFrontend)
106                 self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, frontendfkt = self.getFrontend)
107                 self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, frontendfkt = self.getFrontend)
108                 self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, frontendfkt = self.getFrontend)
109                 
110                 self["introduction"].setText("")
111                 
112                 self.statusTimer = eTimer()
113                 self.statusTimer.timeout.get().append(self.updateStatus)
114                 self.statusTimer.start(50, False)
115                 
116                 self.initcomplete = True
117                 self.session = session
118
119         def updateStatus(self):
120                 self["snr_percentage"].update()
121                 self["agc_percentage"].update()
122                 self["ber_value"].update()
123                 self["snr_bar"].update()
124                 self["agc_bar"].update()
125                 self["ber_bar"].update()
126                 self["lock_state"].update()
127
128         def createSetup(self):
129                 self.typeOfTuningEntry = None
130                 self.satEntry = None
131                 
132                 self.list = []
133                 self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
134                 self.list.append(self.typeOfTuningEntry)
135                 self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
136                 self.list.append(self.satEntry)
137                 if self.tuning_type.value == "manual_transponder":
138                         self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
139                         self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
140                         self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
141                         self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
142                         self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
143                 elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
144                         self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
145                 self["config"].list = self.list
146                 self["config"].l.setList(self.list)
147
148         def newConfig(self):
149                 if self["config"].getCurrent() == self.typeOfTuningEntry:
150                         self.createSetup()
151                 elif self["config"].getCurrent() == self.satEntry:
152                         self.updateSats()
153                         self.createSetup()
154
155         def sat_changed(self, config_element):
156                 self.newConfig()
157                 self.retune(config_element)
158
159         def retune(self, configElement):
160                 returnvalue = (0, 0, 0, 0, 0, 0, 0)
161                 satpos = self.tuning_sat.orbital_position
162                 
163                 if satpos is not None:
164                         if self.tuning_type.value == "manual_transponder":
165                                 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)
166                         elif self.tuning_type.value == "predefined_transponder":
167                                 transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
168                                 returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
169                         self.tune(returnvalue)
170
171         def createConfig(self, foo):
172                 self.tuning_transponder = None
173                 self.tuning_type = ConfigSelection(choices = [("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined transponder"))])
174                 self.tuning_sat = getConfigSatlist(192, nimmanager.getSatListForNim(self.feid))
175                 ScanSetup.createConfig(self, None)
176                 
177                 self.updateSats()
178                 
179                 self.tuning_type.addNotifier(self.retune, initial_call = False)
180                 self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
181                 self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
182                 self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
183                 self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
184                 self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
185                 self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
186
187         def updateSats(self):
188                 orb_pos = self.tuning_sat.orbital_position
189                 if orb_pos is not None:
190                         transponderlist = nimmanager.getTransponders(orb_pos)
191                         list = []
192                         for x in transponderlist:
193                                 if x[3] == 0:
194                                         pol = "H"
195                                 elif x[3] == 1:
196                                         pol = "V"
197                                 elif x[3] == 2:
198                                         pol = "CL"
199                                 elif x[3] == 3:
200                                         pol = "CR"
201                                 if x[4] == 0:
202                                         fec = "FEC_AUTO"
203                                 elif x[4] == 1:
204                                         fec = "FEC_1_2"
205                                 elif x[4] == 2:
206                                         fec = "FEC_2_3"
207                                 elif x[4] == 3:
208                                         fec = "FEC_3_4"
209                                 elif x[4] == 4:
210                                         fec = "FEC_5_6"
211                                 elif x[4] == 5:
212                                         fec = "FEC_7_8"
213                                 elif x[4] == 5:
214                                         fec = "FEC_8_9"
215                                 elif x[4] == 6:
216                                         fec = "FEC_None"
217                                 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
218                         self.tuning_transponder = ConfigSelection(choices = list)
219                         self.tuning_transponder.addNotifier(self.retune, initial_call = False)
220
221         def keyGo(self):
222                 self.retune(self.tuning_type)
223
224         def restartPrevService(self, yesno):
225                 if yesno:
226                         if self.frontend:
227                                 self.frontend = None
228                                 del self.raw_channel
229                         self.session.nav.playService(self.oldref)
230                 self.close(None)
231
232         def keyCancel(self):
233                 if self.oldref:
234                         self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
235                 else:
236                         self.restartPrevService(False)
237
238         def tune(self, transponder):
239                 if self.initcomplete:
240                         if transponder is not None:
241                                 self.tuner.tune(transponder)
242
243 class NimSelection(Screen):
244         skin = """
245                 <screen position="140,165" size="400,100" title="select Slot">
246                         <widget name="nimlist" position="20,10" size="360,75" />
247                 </screen>"""
248                 
249         def __init__(self, session):
250                 Screen.__init__(self, session)
251
252                 nimlist = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
253                 nimMenuList = []
254                 for x in nimlist:
255                         nimMenuList.append((_("NIM ") + (["A", "B", "C", "D"][x]) + ": " + nimmanager.getNimName(x) + " (" + nimmanager.getNimTypeName(x) + ")", x))
256                 
257                 self["nimlist"] = MenuList(nimMenuList)
258
259                 self["actions"] = ActionMap(["OkCancelActions"],
260                 {
261                         "ok": self.okbuttonClick ,
262                         "cancel": self.close
263                 }, -1)
264
265         def okbuttonClick(self):
266                 selection = self["nimlist"].getCurrent()
267                 self.session.open(Satfinder, selection[1])
268
269 def SatfinderMain(session, **kwargs):
270         nimList = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
271         if len(nimList) == 0:
272                 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
273         else:
274                 if session.nav.RecordTimer.isRecording():
275                         session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
276                 else:
277                         if len(nimList) == 1:
278                                 session.open(Satfinder, nimList[0])
279                         else:
280                                 session.open(NimSelection)
281
282 def SatfinderStart(menuid):
283         if menuid == "scan":
284                 return [(_("Satfinder"), SatfinderMain)]
285         else:
286                 return []
287
288 def Plugins(**kwargs):
289         return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_SETUP, fnc=SatfinderStart)