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
119 def createSetup(self):
120 self.typeOfTuningEntry = None
124 self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
125 self.list.append(self.typeOfTuningEntry)
126 self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
127 self.list.append(self.satEntry)
128 if self.tuning_type.value == "manual_transponder":
129 self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
130 self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
131 self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
132 self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
133 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
134 elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
135 self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
136 self["config"].list = self.list
137 self["config"].l.setList(self.list)
140 if self["config"].getCurrent() == self.typeOfTuningEntry:
142 elif self["config"].getCurrent() == self.satEntry:
146 def sat_changed(self, config_element):
148 self.retune(config_element)
150 def retune(self, configElement):
151 returnvalue = (0, 0, 0, 0, 0, 0, 0)
152 satpos = self.tuning_sat.orbital_position
154 if satpos is not None:
155 if self.tuning_type.value == "manual_transponder":
156 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)
157 elif self.tuning_type.value == "predefined_transponder":
158 transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
159 returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
160 self.tune(returnvalue)
162 def createConfig(self, foo):
163 self.tuning_transponder = None
164 self.tuning_type = ConfigSelection(choices = [("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined transponder"))])
165 self.tuning_sat = getConfigSatlist(192, nimmanager.getSatListForNim(self.feid))
166 ScanSetup.createConfig(self, None)
170 self.tuning_type.addNotifier(self.retune, initial_call = False)
171 self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
172 self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
173 self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
174 self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
175 self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
176 self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
178 def updateSats(self):
179 orb_pos = self.tuning_sat.orbital_position
180 if orb_pos is not None:
181 transponderlist = nimmanager.getTransponders(orb_pos)
183 for x in transponderlist:
218 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
219 self.tuning_transponder = ConfigSelection(choices = list)
220 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
223 self.retune(self.tuning_type)
225 def restartPrevService(self, yesno):
230 self.session.nav.playService(self.oldref)
235 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
237 self.restartPrevService(False)
239 def tune(self, transponder):
240 if self.initcomplete:
241 if transponder is not None:
242 self.tuner.tune(transponder)
244 class NimSelection(Screen):
246 <screen position="140,165" size="400,100" title="select Slot">
247 <widget name="nimlist" position="20,10" size="360,75" />
250 def __init__(self, session):
251 Screen.__init__(self, session)
253 nimlist = nimmanager.getNimListOfType("DVB-S")
256 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
258 self["nimlist"] = MenuList(nimMenuList)
260 self["actions"] = ActionMap(["OkCancelActions"],
262 "ok": self.okbuttonClick ,
266 def okbuttonClick(self):
267 selection = self["nimlist"].getCurrent()[1]
268 self.session.open(Satfinder, selection)
270 def SatfinderMain(session, **kwargs):
271 nimList = nimmanager.getNimListOfType("DVB-S")
272 if len(nimList) == 0:
273 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
275 if session.nav.RecordTimer.isRecording():
276 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
278 if len(nimList) == 1:
279 session.open(Satfinder, nimList[0])
281 session.open(NimSelection)
283 def SatfinderStart(menuid, **kwargs):
285 return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
289 def Plugins(**kwargs):
290 if (nimmanager.hasNimType("DVB-S")):
291 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)