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)
188 for x in transponderlist:
223 e = str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec
227 self.tuning_transponder = ConfigSelection(choices = list, default = default)
228 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
231 self.retune(self.tuning_type)
233 def restartPrevService(self, yesno):
244 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
246 self.restartPrevService(False)
248 def tune(self, transponder):
249 if self.initcomplete:
250 if transponder is not None:
251 self.tuner.tune(transponder)
253 class NimSelection(Screen):
255 <screen position="140,165" size="400,100" title="select Slot">
256 <widget name="nimlist" position="20,10" size="360,75" />
259 def __init__(self, session):
260 Screen.__init__(self, session)
262 nimlist = nimmanager.getNimListOfType("DVB-S")
265 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
267 self["nimlist"] = MenuList(nimMenuList)
269 self["actions"] = ActionMap(["OkCancelActions"],
271 "ok": self.okbuttonClick ,
275 def okbuttonClick(self):
276 selection = self["nimlist"].getCurrent()[1]
277 self.session.open(Satfinder, selection)
279 def SatfinderMain(session, **kwargs):
280 nimList = nimmanager.getNimListOfType("DVB-S")
281 if len(nimList) == 0:
282 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
284 if session.nav.RecordTimer.isRecording():
285 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
287 if len(nimList) == 1:
288 session.open(Satfinder, nimList[0])
290 session.open(NimSelection)
292 def SatfinderStart(menuid, **kwargs):
294 return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
298 def Plugins(**kwargs):
299 if (nimmanager.hasNimType("DVB-S")):
300 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)