1 from enigma import eTimer, 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="key_green-fs8.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="key_red-fs8.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:
208 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
209 self.tuning_transponder = ConfigSelection(choices = list)
210 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
213 self.retune(self.tuning_type)
215 def restartPrevService(self, yesno):
220 self.session.nav.playService(self.oldref)
225 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
227 self.restartPrevService(False)
229 def tune(self, transponder):
230 if self.initcomplete:
231 if transponder is not None:
232 self.tuner.tune(transponder)
234 class NimSelection(Screen):
236 <screen position="140,165" size="400,100" title="select Slot">
237 <widget name="nimlist" position="20,10" size="360,75" />
240 def __init__(self, session):
241 Screen.__init__(self, session)
243 nimlist = nimmanager.getNimListOfType("DVB-S")
246 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
248 self["nimlist"] = MenuList(nimMenuList)
250 self["actions"] = ActionMap(["OkCancelActions"],
252 "ok": self.okbuttonClick ,
256 def okbuttonClick(self):
257 selection = self["nimlist"].getCurrent()[1]
258 self.session.open(Satfinder, selection)
260 def SatfinderMain(session, **kwargs):
261 nimList = nimmanager.getNimListOfType("DVB-S")
262 if len(nimList) == 0:
263 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
265 if session.nav.RecordTimer.isRecording():
266 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
268 if len(nimList) == 1:
269 session.open(Satfinder, nimList[0])
271 session.open(NimSelection)
273 def SatfinderStart(menuid, **kwargs):
275 return [(_("Satfinder"), SatfinderMain)]
279 def Plugins(**kwargs):
280 if (nimmanager.hasNimType("DVB-S")):
281 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)