1 from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager,\
2 eDVBDiseqcCommand, 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.ConfigList import ConfigList
11 from Components.TunerInfo import TunerInfo
12 from Components.ActionMap import ActionMap
13 from Components.NimManager import nimmanager, getConfigSatlist
14 from Components.MenuList import MenuList
15 from Components.config import ConfigSelection, ConfigSatlist, getConfigListEntry
18 def __init__(self, frontend):
19 self.frontend = frontend
21 def tune(self, transponder):
23 print "tuning to transponder with data", transponder
24 parm = eDVBFrontendParametersSatellite()
25 parm.frequency = transponder[0] * 1000
26 parm.symbol_rate = transponder[1] * 1000
27 parm.polarisation = transponder[2]
28 parm.fec = transponder[3]
29 parm.inversion = transponder[4]
30 parm.orbital_position = transponder[5]
31 parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2)
32 parm.modulation = 1 # FIXMEE !! HARDCODED QPSK
33 feparm = eDVBFrontendParameters()
35 self.lastparm = feparm
36 self.frontend.tune(feparm)
40 self.frontend.tune(self.lastparm)
42 class Satfinder(ScanSetup):
44 <screen position="90,100" size="520,400" title="Tune">
45 <widget name="config" position="20,10" size="460,240" scrollbarMode="showOnDemand" />
46 <widget name="introduction" position="20,360" zPosition="-10" size="350,30" font="Regular;23" />
47 <widget name="snr" text="SNR:" position="0,245" size="60,22" font="Regular;21" />
48 <widget name="agc" text="AGC:" position="0,270" size="60,22" font="Regular;21" />
49 <widget name="ber" text="BER:" position="0,295" size="60,22" font="Regular;21" />
50 <widget name="lock" text="Lock:" position="0,320" size="60,22" font="Regular;21" />
51 <widget name="snr_percentage" position="220,245" size="60,22" font="Regular;21" />
52 <widget name="agc_percentage" position="220,270" size="60,22" font="Regular;21" />
53 <widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
54 <widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
55 <widget name="snr_bar" position="60,245" size="150,22" />
56 <widget name="agc_bar" position="60,270" size="150,22" />
57 <widget name="ber_bar" position="60,295" size="150,22" />
60 def openFrontend(self):
61 res_mgr = eDVBResourceManager.getInstance()
63 self.raw_channel = res_mgr.allocateRawChannel(self.feid)
65 self.frontend = self.raw_channel.getFrontend()
69 print "getFrontend failed"
71 print "getRawChannel failed"
73 print "getResourceManager instance failed"
76 def getFrontend(self):
79 def __init__(self, session, feid):
80 self.initcomplete = False
84 if not self.openFrontend():
85 self.oldref = session.nav.getCurrentlyPlayingServiceReference()
86 session.nav.stopService() # try to disable foreground service
87 if not self.openFrontend():
88 if session.pipshown: # try to disable pip
89 session.pipshown = False
91 if not self.openFrontend():
92 self.frontend = None # in normal case this should not happen
93 self.getFrontend = None
95 ScanSetup.__init__(self, session)
96 self.tuner = Tuner(self.frontend)
100 self["ber"] = Label()
101 self["lock"] = Label()
102 self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, frontendfkt = self.getFrontend)
103 self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, frontendfkt = self.getFrontend)
104 self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, frontendfkt = self.getFrontend)
105 self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, frontendfkt = self.getFrontend)
106 self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, frontendfkt = self.getFrontend)
107 self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, frontendfkt = self.getFrontend)
108 self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, frontendfkt = self.getFrontend)
110 self["introduction"].setText("")
112 self.statusTimer = eTimer()
113 self.statusTimer.timeout.get().append(self.updateStatus)
114 self.statusTimer.start(50, False)
116 self.initcomplete = True
117 self.session = session
119 def updateStatus(self):
120 self["snr_percentage"].update()
121 self["agc_percentage"].update()
122 self["ber_value"].update()
123 self["snr_bar"].update()
124 self["agc_bar"].update()
125 self["ber_bar"].update()
126 self["lock_state"].update()
128 def createSetup(self):
129 self.typeOfTuningEntry = None
133 self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
134 self.list.append(self.typeOfTuningEntry)
135 self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
136 self.list.append(self.satEntry)
137 if self.tuning_type.value == "manual_transponder":
138 self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
139 self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
140 self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
141 self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
142 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
143 elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
144 self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
145 self["config"].list = self.list
146 self["config"].l.setList(self.list)
149 if self["config"].getCurrent() == self.typeOfTuningEntry:
151 elif self["config"].getCurrent() == self.satEntry:
155 def sat_changed(self, config_element):
157 self.retune(config_element)
159 def retune(self, configElement):
160 returnvalue = (0, 0, 0, 0, 0, 0, 0)
161 satpos = self.tuning_sat.orbital_position
163 if satpos is not None:
164 if self.tuning_type.value == "manual_transponder":
165 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)
166 elif self.tuning_type.value == "predefined_transponder":
167 transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
168 returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
169 self.tune(returnvalue)
171 def createConfig(self, foo):
172 self.tuning_transponder = None
173 self.tuning_type = ConfigSelection(choices = [("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined transponder"))])
174 self.tuning_sat = getConfigSatlist(192, nimmanager.getSatListForNim(self.feid))
175 ScanSetup.createConfig(self, None)
179 self.tuning_type.addNotifier(self.retune, initial_call = False)
180 self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
181 self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
182 self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
183 self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
184 self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
185 self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
187 def updateSats(self):
188 orb_pos = self.tuning_sat.orbital_position
189 if orb_pos is not None:
190 transponderlist = nimmanager.getTransponders(orb_pos)
192 for x in transponderlist:
217 list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
218 self.tuning_transponder = ConfigSelection(choices = list)
219 self.tuning_transponder.addNotifier(self.retune, initial_call = False)
222 self.retune(self.tuning_type)
224 def restartPrevService(self, yesno):
229 self.session.nav.playService(self.oldref)
234 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
236 self.restartPrevService(False)
238 def tune(self, transponder):
239 if self.initcomplete:
240 if transponder is not None:
241 self.tuner.tune(transponder)
243 class NimSelection(Screen):
245 <screen position="140,165" size="400,100" title="select Slot">
246 <widget name="nimlist" position="20,10" size="360,75" />
249 def __init__(self, session):
250 Screen.__init__(self, session)
252 nimlist = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
255 nimMenuList.append((_("NIM ") + (["A", "B", "C", "D"][x]) + ": " + nimmanager.getNimName(x) + " (" + nimmanager.getNimTypeName(x) + ")", x))
257 self["nimlist"] = MenuList(nimMenuList)
259 self["actions"] = ActionMap(["OkCancelActions"],
261 "ok": self.okbuttonClick ,
265 def okbuttonClick(self):
266 selection = self["nimlist"].getCurrent()
267 self.session.open(Satfinder, selection[1])
269 def SatfinderMain(session, **kwargs):
270 nimList = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
271 if len(nimList) == 0:
272 session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
274 if session.nav.RecordTimer.isRecording():
275 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
277 if len(nimList) == 1:
278 session.open(Satfinder, nimList[0])
280 session.open(NimSelection)
282 def SatfinderStart(menuid):
284 return [(_("Satfinder"), SatfinderMain)]
288 def Plugins(**kwargs):
289 return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_SETUP, fnc=SatfinderStart)