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="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:
212 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
213 self.tuning_transponder = ConfigSelection(choices = list)
214 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
217 self.retune(self.tuning_type)
219 def restartPrevService(self, yesno):
224 self.session.nav.playService(self.oldref)
229 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
231 self.restartPrevService(False)
233 def tune(self, transponder):
234 if self.initcomplete:
235 if transponder is not None:
236 self.tuner.tune(transponder)
238 class NimSelection(Screen):
240 <screen position="140,165" size="400,100" title="select Slot">
241 <widget name="nimlist" position="20,10" size="360,75" />
244 def __init__(self, session):
245 Screen.__init__(self, session)
247 nimlist = nimmanager.getNimListOfType("DVB-S")
250 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
252 self["nimlist"] = MenuList(nimMenuList)
254 self["actions"] = ActionMap(["OkCancelActions"],
256 "ok": self.okbuttonClick ,
260 def okbuttonClick(self):
261 selection = self["nimlist"].getCurrent()[1]
262 self.session.open(Satfinder, selection)
264 def SatfinderMain(session, **kwargs):
265 nimList = nimmanager.getNimListOfType("DVB-S")
266 if len(nimList) == 0:
267 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
269 if session.nav.RecordTimer.isRecording():
270 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
272 if len(nimList) == 1:
273 session.open(Satfinder, nimList[0])
275 session.open(NimSelection)
277 def SatfinderStart(menuid, **kwargs):
279 return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
283 def Plugins(**kwargs):
284 if (nimmanager.hasNimType("DVB-S")):
285 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)