1 from enigma import eDVBResourceManager,\
2 eDVBFrontendParametersSatellite, eDVBFrontendParameters
4 from Screens.Screen import Screen
5 from Screens.ScanSetup import ScanSetup
6 from Screens.MessageBox import MessageBox
7 from Plugins.Plugin import PluginDescriptor
9 from Components.Label import Label
10 from Components.Sources.FrontendStatus import FrontendStatus
11 from Components.ActionMap import ActionMap
12 from Components.NimManager import nimmanager, getConfigSatlist
13 from Components.MenuList import MenuList
14 from Components.config import ConfigSelection, getConfigListEntry
17 def __init__(self, frontend):
18 self.frontend = frontend
20 def tune(self, transponder):
22 print "tuning to transponder with data", transponder
23 parm = eDVBFrontendParametersSatellite()
24 parm.frequency = transponder[0] * 1000
25 parm.symbol_rate = transponder[1] * 1000
26 parm.polarisation = transponder[2]
27 parm.fec = transponder[3]
28 parm.inversion = transponder[4]
29 parm.orbital_position = transponder[5]
30 parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2)
31 parm.modulation = 1 # FIXMEE !! HARDCODED QPSK
32 feparm = eDVBFrontendParameters()
34 self.lastparm = feparm
35 self.frontend.tune(feparm)
39 self.frontend.tune(self.lastparm)
41 class Satfinder(ScanSetup):
43 <screen position="90,100" size="520,400" title="Tune">
44 <widget name="config" position="20,10" size="460,210" scrollbarMode="showOnDemand" />
45 <widget name="introduction" position="20,360" zPosition="-10" size="350,30" font="Regular;23" />
46 <eLabel text="dB:" position="23,230" size="60,22" font="Regular;21" />
47 <eLabel text="SNR:" position="23,255" size="60,22" font="Regular;21" />
48 <eLabel text="AGC:" position="23,280" size="60,22" font="Regular;21" />
49 <eLabel text="BER:" position="23,305" size="60,22" font="Regular;21" />
50 <eLabel text="Lock:" position="23,330" size="60,22" font="Regular;21" />
51 <widget source="Frontend" render="Label" position="295,230" size="60,22" font="Regular;21" >
52 <convert type="FrontendInfo">SNRdB</convert>
54 <widget source="Frontend" render="Label" position="295,255" size="60,22" font="Regular;21" >
55 <convert type="FrontendInfo">SNR</convert>
57 <widget source="Frontend" render="Label" position="295,280" size="60,22" font="Regular;21" >
58 <convert type="FrontendInfo">AGC</convert>
60 <widget source="Frontend" render="Label" position="295,305" size="60,22" font="Regular;21" >
61 <convert type="FrontendInfo">BER</convert>
63 <widget source="Frontend" render="Progress" position="85,257" size="200,22" >
64 <convert type="FrontendInfo">SNR</convert>
66 <widget source="Frontend" render="Progress" position="85,282" size="200,22" >
67 <convert type="FrontendInfo">AGC</convert>
69 <widget source="Frontend" render="Progress" position="85,307" size="200,22" >
70 <convert type="FrontendInfo">BER</convert>
72 <widget source="Frontend" render="Pixmap" pixmap="skin_default/buttons/key_green.png" position="295,330" zPosition="4" size="28,20" alphatest="on" >
73 <convert type="FrontendInfo">LOCK</convert>
74 <convert type="ConditionalShowHide" />
76 <widget source="Frontend" render="Pixmap" pixmap="skin_default/buttons/key_red.png" position="295,330" zPosition="4" size="28,20" alphatest="on" >
77 <convert type="FrontendInfo">LOCK</convert>
78 <convert type="ConditionalShowHide">Invert</convert>
82 def openFrontend(self):
83 res_mgr = eDVBResourceManager.getInstance()
85 self.raw_channel = res_mgr.allocateRawChannel(self.feid)
87 self.frontend = self.raw_channel.getFrontend()
91 print "getFrontend failed"
93 print "getRawChannel failed"
95 print "getResourceManager instance failed"
98 def __init__(self, session, feid):
99 self.initcomplete = False
103 if not self.openFrontend():
104 self.oldref = session.nav.getCurrentlyPlayingServiceReference()
105 session.nav.stopService() # try to disable foreground service
106 if not self.openFrontend():
107 if session.pipshown: # try to disable pip
108 session.pipshown = False
110 if not self.openFrontend():
111 self.frontend = None # in normal case this should not happen
113 ScanSetup.__init__(self, session)
114 self.tuner = Tuner(self.frontend)
115 self["introduction"].setText("")
116 self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100)
117 self.initcomplete = True
118 self.onClose.append(self.__onClose)
121 self.session.nav.playService(self.oldref)
123 def createSetup(self):
124 self.typeOfTuningEntry = None
128 self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
129 self.list.append(self.typeOfTuningEntry)
130 self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
131 self.list.append(self.satEntry)
132 if self.tuning_type.value == "manual_transponder":
133 self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
134 self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
135 self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
136 self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
137 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
138 elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
139 self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
140 self["config"].list = self.list
141 self["config"].l.setList(self.list)
144 if self["config"].getCurrent() == self.typeOfTuningEntry:
146 elif self["config"].getCurrent() == self.satEntry:
150 def sat_changed(self, config_element):
152 self.retune(config_element)
154 def retune(self, configElement):
155 returnvalue = (0, 0, 0, 0, 0, 0, 0)
156 satpos = self.tuning_sat.orbital_position
158 if satpos is not None:
159 if self.tuning_type.value == "manual_transponder":
160 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)
161 elif self.tuning_type.value == "predefined_transponder":
162 transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
163 returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
164 self.tune(returnvalue)
166 def createConfig(self, foo):
167 self.tuning_transponder = None
168 self.tuning_type = ConfigSelection(choices = [("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined transponder"))])
169 self.tuning_sat = getConfigSatlist(192, nimmanager.getSatListForNim(self.feid))
170 ScanSetup.createConfig(self, None)
174 self.tuning_type.addNotifier(self.retune, initial_call = False)
175 self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
176 self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
177 self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
178 self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
179 self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
180 self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
182 def updateSats(self):
183 orb_pos = self.tuning_sat.orbital_position
184 if orb_pos is not None:
185 transponderlist = nimmanager.getTransponders(orb_pos)
187 for x in transponderlist:
222 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
223 self.tuning_transponder = ConfigSelection(choices = list)
224 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
227 self.retune(self.tuning_type)
229 def restartPrevService(self, yesno):
240 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
242 self.restartPrevService(False)
244 def tune(self, transponder):
245 if self.initcomplete:
246 if transponder is not None:
247 self.tuner.tune(transponder)
249 class NimSelection(Screen):
251 <screen position="140,165" size="400,100" title="select Slot">
252 <widget name="nimlist" position="20,10" size="360,75" />
255 def __init__(self, session):
256 Screen.__init__(self, session)
258 nimlist = nimmanager.getNimListOfType("DVB-S")
261 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
263 self["nimlist"] = MenuList(nimMenuList)
265 self["actions"] = ActionMap(["OkCancelActions"],
267 "ok": self.okbuttonClick ,
271 def okbuttonClick(self):
272 selection = self["nimlist"].getCurrent()[1]
273 self.session.open(Satfinder, selection)
275 def SatfinderMain(session, **kwargs):
276 nimList = nimmanager.getNimListOfType("DVB-S")
277 if len(nimList) == 0:
278 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
280 if session.nav.RecordTimer.isRecording():
281 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
283 if len(nimList) == 1:
284 session.open(Satfinder, nimList[0])
286 session.open(NimSelection)
288 def SatfinderStart(menuid, **kwargs):
290 return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
294 def Plugins(**kwargs):
295 if (nimmanager.hasNimType("DVB-S")):
296 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)