1 from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, \
2 eDVBDiseqcCommand, eDVBFrontendParametersSatellite, eDVBFrontendParameters,\
5 from Screens.Screen import Screen
6 from Screens.ScanSetup import ScanSetup
7 from Screens.MessageBox import MessageBox
8 from Plugins.Plugin import PluginDescriptor
10 from Components.Label import Label
11 from Components.ConfigList import ConfigList
12 from Components.TunerInfo import TunerInfo
13 from Components.ActionMap import ActionMap
14 from Components.NimManager import nimmanager
15 from Components.MenuList import MenuList
16 from Components.config import ConfigSatlist, ConfigNothing, ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, getConfigListEntry
17 from Components.TuneTest import Tuner
19 from time import sleep
21 class PositionerSetup(Screen):
23 <screen position="100,100" size="560,400" title="Positioner setup..." >
24 <widget name="list" position="100,0" size="350,155" />
26 <widget name="red" position="0,155" size="140,80" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
27 <widget name="green" position="140,155" size="140,80" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
28 <widget name="yellow" position="280,155" size="140,80" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
29 <widget name="blue" position="420,155" size="140,80" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
31 <widget name="snr_db" position="60,245" size="150,22" halign="center" valign="center" font="Regular;21" />
32 <eLabel text="SNR:" position="0,270" size="60,22" font="Regular;21" />
33 <eLabel text="BER:" position="0,295" size="60,22" font="Regular;21" />
34 <eLabel text="Lock:" position="0,320" size="60,22" font="Regular;21" />
35 <widget name="snr_percentage" position="220,270" size="60,22" font="Regular;21" />
36 <widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
37 <widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
38 <widget name="snr_bar" position="60,270" size="150,22" />
39 <widget name="ber_bar" position="60,295" size="150,22" />
41 <eLabel text="Frequency:" position="300,245" size="120,22" font="Regular;21" />
42 <eLabel text="Symbolrate:" position="300,270" size="120,22" font="Regular;21" />
43 <eLabel text="FEC:" position="300,295" size="120,22" font="Regular;21" />
44 <widget name="frequency_value" position="420,245" size="120,22" font="Regular;21" />
45 <widget name="symbolrate_value" position="420,270" size="120,22" font="Regular;21" />
46 <widget name="fec_value" position="420,295" size="120,22" font="Regular;21" />
48 def __init__(self, session, feid):
49 self.skin = PositionerSetup.skin
50 Screen.__init__(self, session)
55 if not self.openFrontend():
56 self.oldref = session.nav.getCurrentlyPlayingServiceReference()
57 service = session.nav.getCurrentService()
58 feInfo = service and service.frontendInfo()
60 cur = feInfo.getTransponderData(True)
63 session.nav.stopService() # try to disable foreground service
64 if not self.openFrontend():
65 if session.pipshown: # try to disable pip
66 service = self.session.pip.pipservice
67 feInfo = service and service.frontendInfo()
69 cur = feInfo.getTransponderData()
72 session.pipshown = False
74 if not self.openFrontend():
75 self.frontend = None # in normal case this should not happen
77 self.frontendStatus = { }
78 self.diseqc = Diseqc(self.frontend)
79 self.tuner = Tuner(self.frontend)
81 tp = ( cur.get("frequency", 0) / 1000,
82 cur.get("symbol_rate", 0) / 1000,
83 cur.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal),
84 cur.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto),
85 cur.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown),
86 cur.get("orbital_position", 0),
87 cur.get("system", eDVBFrontendParametersSatellite.System_DVB_S),
88 cur.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK),
89 cur.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35),
90 cur.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown))
96 self.stopOnLock = False
99 self["red"] = self.red
100 self.green = Label("")
101 self["green"] = self.green
102 self.yellow = Label("")
103 self["yellow"] = self.yellow
104 self.blue = Label("")
105 self["blue"] = self.blue
108 self["list"] = ConfigList(self.list)
111 self["snr_db"] = TunerInfo(TunerInfo.SNR_DB, statusDict = self.frontendStatus)
112 self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, statusDict = self.frontendStatus)
113 self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, statusDict = self.frontendStatus)
114 self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, statusDict = self.frontendStatus)
115 self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, statusDict = self.frontendStatus)
116 self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, statusDict = self.frontendStatus)
118 self["frequency_value"] = Label("")
119 self["symbolrate_value"] = Label("")
120 self["fec_value"] = Label("")
122 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
125 "cancel": self.keyCancel,
131 "green": self.greenKey,
132 "yellow": self.yellowKey,
133 "blue": self.blueKey,
136 self.updateColors("tune")
138 self.statusTimer = eTimer()
139 self.statusTimer.callback.append(self.updateStatus)
140 self.statusTimer.start(50, True)
141 self.onClose.append(self.__onClose)
144 self.session.nav.playService(self.oldref)
146 def restartPrevService(self, yesno):
157 self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before positioner setup?"), MessageBox.TYPE_YESNO)
159 self.restartPrevService(False)
161 def openFrontend(self):
162 res_mgr = eDVBResourceManager.getInstance()
164 self.raw_channel = res_mgr.allocateRawChannel(self.feid)
166 self.frontend = self.raw_channel.getFrontend()
170 print "getFrontend failed"
172 print "getRawChannel failed"
174 print "getResourceManager instance failed"
177 def createConfig(self):
178 self.positioner_tune = ConfigNothing()
179 self.positioner_move = ConfigNothing()
180 self.positioner_finemove = ConfigNothing()
181 self.positioner_limits = ConfigNothing()
182 self.positioner_goto0 = ConfigNothing()
184 for x in range(1,255):
185 storepos.append(str(x))
186 self.positioner_storage = ConfigSelection(choices = storepos)
188 def createSetup(self):
189 self.list.append((_("Tune"), self.positioner_tune, "tune"))
190 self.list.append((_("Positioner movement"), self.positioner_move, "move"))
191 self.list.append((_("Positioner fine movement"), self.positioner_finemove, "finemove"))
192 self.list.append((_("Set limits"), self.positioner_limits, "limits"))
193 self.list.append((_("Positioner storage"), self.positioner_storage, "storage"))
194 self.list.append((_("Goto 0"), self.positioner_goto0, "goto0"))
195 self["list"].l.setList(self.list)
200 def getCurrentConfigPath(self):
201 return self["list"].getCurrent()[2]
204 if not self.isMoving:
205 self["list"].instance.moveSelection(self["list"].instance.moveUp)
206 self.updateColors(self.getCurrentConfigPath())
209 if not self.isMoving:
210 self["list"].instance.moveSelection(self["list"].instance.moveDown)
211 self.updateColors(self.getCurrentConfigPath())
214 self["list"].handleKey(KEY_LEFT)
217 self["list"].handleKey(KEY_RIGHT)
219 def updateColors(self, entry):
221 self.red.setText(_("Tune"))
222 self.green.setText("")
223 self.yellow.setText("")
224 self.blue.setText("")
225 elif entry == "move":
227 self.red.setText(_("Stop"))
228 self.green.setText(_("Stop"))
229 self.yellow.setText(_("Stop"))
230 self.blue.setText(_("Stop"))
232 self.red.setText(_("Move west"))
233 self.green.setText(_("Search west"))
234 self.yellow.setText(_("Search east"))
235 self.blue.setText(_("Move east"))
236 elif entry == "finemove":
238 self.green.setText(_("Step west"))
239 self.yellow.setText(_("Step east"))
240 self.blue.setText("")
241 elif entry == "limits":
242 self.red.setText(_("Limits off"))
243 self.green.setText(_("Limit west"))
244 self.yellow.setText(_("Limit east"))
245 self.blue.setText(_("Limits on"))
246 elif entry == "storage":
248 self.green.setText(_("Store position"))
249 self.yellow.setText(_("Goto position"))
250 self.blue.setText("")
251 elif entry == "goto0":
252 self.red.setText(_("Goto 0"))
253 self.green.setText("")
254 self.yellow.setText("")
255 self.blue.setText("")
258 self.green.setText("")
259 self.yellow.setText("")
260 self.blue.setText("")
263 entry = self.getCurrentConfigPath()
266 self.diseqccommand("stop")
267 self.isMoving = False
268 self.stopOnLock = False
270 self.diseqccommand("moveWest", 0)
272 self.updateColors("move")
273 elif entry == "limits":
274 self.diseqccommand("limitOff")
275 elif entry == "tune":
277 self.frontend.getFrontendData(fe_data)
278 self.frontend.getTransponderData(fe_data, True)
279 feparm = self.tuner.lastparm.getDVBS()
280 fe_data["orbital_position"] = feparm.orbital_position
281 self.session.openWithCallback(self.tune, TunerScreen, self.feid, fe_data)
282 elif entry == "goto0":
283 print "move to position 0"
284 self.diseqccommand("moveTo", 0)
287 entry = self.getCurrentConfigPath()
290 self.diseqccommand("stop")
291 self.isMoving = False
292 self.stopOnLock = False
295 self.stopOnLock = True
296 self.diseqccommand("moveWest", 0)
297 self.updateColors("move")
298 elif entry == "finemove":
299 print "stepping west"
300 self.diseqccommand("moveWest", 0xFF) # one step
301 elif entry == "storage":
302 print "store at position", int(self.positioner_storage.value)
303 self.diseqccommand("store", int(self.positioner_storage.value))
305 elif entry == "limits":
306 self.diseqccommand("limitWest")
309 entry = self.getCurrentConfigPath()
312 self.diseqccommand("stop")
313 self.isMoving = False
314 self.stopOnLock = False
317 self.stopOnLock = True
318 self.diseqccommand("moveEast", 0)
319 self.updateColors("move")
320 elif entry == "finemove":
321 print "stepping east"
322 self.diseqccommand("moveEast", 0xFF) # one step
323 elif entry == "storage":
324 print "move to position", int(self.positioner_storage.value)
325 self.diseqccommand("moveTo", int(self.positioner_storage.value))
326 elif entry == "limits":
327 self.diseqccommand("limitEast")
330 entry = self.getCurrentConfigPath()
333 self.diseqccommand("stop")
334 self.isMoving = False
335 self.stopOnLock = False
337 self.diseqccommand("moveEast", 0)
339 self.updateColors("move")
341 elif entry == "limits":
342 self.diseqccommand("limitOn")
344 def diseqccommand(self, cmd, param = 0):
345 self.diseqc.command(cmd, param)
348 def updateStatus(self):
350 self.frontend.getFrontendStatus(self.frontendStatus)
351 self["snr_db"].update()
352 self["snr_percentage"].update()
353 self["ber_value"].update()
354 self["snr_bar"].update()
355 self["ber_bar"].update()
356 self["lock_state"].update()
357 transponderdata = self.tuner.getTransponderData()
358 self["frequency_value"].setText(str(transponderdata.get("frequency")))
359 self["symbolrate_value"].setText(str(transponderdata.get("symbol_rate")))
360 self["fec_value"].setText(str(transponderdata.get("fec_inner")))
361 if self.frontendStatus.get("tuner_locked", 0) == 1 and self.isMoving and self.stopOnLock:
362 self.diseqccommand("stop")
363 self.isMoving = False
364 self.stopOnLock = False
365 self.updateColors(self.getCurrentConfigPath())
366 self.statusTimer.start(50, True)
368 def tune(self, transponder):
369 if transponder is not None:
370 self.tuner.tune(transponder)
373 def __init__(self, frontend):
374 self.frontend = frontend
376 def command(self, what, param = 0):
378 cmd = eDVBDiseqcCommand()
379 if what == "moveWest":
380 string = 'e03169' + ("%02x" % param)
381 elif what == "moveEast":
382 string = 'e03168' + ("%02x" % param)
383 elif what == "moveTo":
384 string = 'e0316b' + ("%02x" % param)
385 elif what == "store":
386 string = 'e0316a' + ("%02x" % param)
387 elif what == "limitOn":
389 elif what == "limitOff":
391 elif what == "limitEast":
393 elif what == "limitWest":
396 string = 'e03160' #positioner stop
398 print "diseqc command:",
400 cmd.setCommandString(string)
401 self.frontend.setTone(iDVBFrontend.toneOff)
402 sleep(0.015) # wait 15msec after disable tone
403 self.frontend.sendDiseqc(cmd)
404 if string == 'e03160': #positioner stop
406 self.frontend.sendDiseqc(cmd) # send 2nd time
410 class TunerScreen(ScanSetup):
412 <screen position="90,100" size="520,400" title="Tune">
413 <widget name="config" position="20,10" size="460,350" scrollbarMode="showOnDemand" />
414 <widget name="introduction" position="20,360" size="350,30" font="Regular;23" />
417 def __init__(self, session, feid, fe_data):
419 self.fe_data = fe_data
420 ScanSetup.__init__(self, session)
421 self["introduction"].setText("")
423 def createSetup(self):
424 self.typeOfTuningEntry = None
427 self.typeOfTuningEntry = getConfigListEntry(_('Tune'), tuning.type)
428 self.list.append(self.typeOfTuningEntry)
429 self.satEntry = getConfigListEntry(_('Satellite'), tuning.sat)
430 self.list.append(self.satEntry)
431 nim = nimmanager.nim_slots[self.feid]
432 self.systemEntry = None
434 if tuning.type.value == "manual_transponder":
435 if nim.isCompatible("DVB-S2"):
436 self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
437 self.list.append(self.systemEntry)
439 # downgrade to dvb-s, in case a -s2 config was active
440 self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S
441 self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
442 self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
443 self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
444 self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
445 if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
446 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
447 elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
448 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
449 self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
450 self.list.append(self.modulationEntry)
451 self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff))
452 self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
453 elif tuning.type.value == "predefined_transponder":
454 self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder))
455 self["config"].list = self.list
456 self["config"].l.setList(self.list)
459 if self["config"].getCurrent() in (self.typeOfTuningEntry, self.satEntry, self.systemEntry):
462 def createConfig(self, foo):
465 tuning = ConfigSubsection()
466 tuning.type = ConfigSelection(
467 default = "manual_transponder",
468 choices = { "manual_transponder" : _("Manual transponder"),
469 "predefined_transponder" : _("Predefined transponder") } )
470 tuning.sat = ConfigSatlist(list=nimmanager.getRotorSatListForNim(self.feid))
471 tuning.sat.addNotifier(self.tuningSatChanged)
472 self.updateTransponders()
473 orb_pos = self.fe_data.get("orbital_position", None)
474 if orb_pos is not None:
475 for x in nimmanager.getRotorSatListForNim(self.feid):
477 if x[0] == orb_pos and tuning.sat.value != opos:
478 tuning.sat.value = opos
479 del self.fe_data["orbital_position"]
480 ScanSetup.createConfig(self, self.fe_data)
482 def tuningSatChanged(self, *parm):
483 self.updateTransponders()
485 def updateTransponders(self):
486 if len(tuning.sat.choices):
487 transponderlist = nimmanager.getTransponders(int(tuning.sat.value))
490 for x in transponderlist:
525 tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
526 tuning.transponder = ConfigSelection(choices=tps)
529 returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
530 satpos = int(tuning.sat.value)
531 if tuning.type.value == "manual_transponder":
532 if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
533 fec = self.scan_sat.fec_s2.value
535 fec = self.scan_sat.fec.value
537 self.scan_sat.frequency.value,
538 self.scan_sat.symbolrate.value,
539 self.scan_sat.polarization.value,
541 self.scan_sat.inversion.value,
543 self.scan_sat.system.value,
544 self.scan_sat.modulation.value,
545 self.scan_sat.rolloff.value,
546 self.scan_sat.pilot.value)
547 elif tuning.type.value == "predefined_transponder":
548 transponder = nimmanager.getTransponders(satpos)[tuning.transponder.index]
549 returnvalue = (transponder[1] / 1000, transponder[2] / 1000,
550 transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9])
551 self.close(returnvalue)
556 class RotorNimSelection(Screen):
558 <screen position="140,165" size="400,130" title="select Slot">
559 <widget name="nimlist" position="20,10" size="360,100" />
562 def __init__(self, session):
563 Screen.__init__(self, session)
565 nimlist = nimmanager.getNimListOfType("DVB-S")
568 nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
570 self["nimlist"] = MenuList(nimMenuList)
572 self["actions"] = ActionMap(["OkCancelActions"],
574 "ok": self.okbuttonClick ,
578 def okbuttonClick(self):
579 selection = self["nimlist"].getCurrent()
580 self.session.open(PositionerSetup, selection[1])
582 def PositionerMain(session, **kwargs):
583 nimList = nimmanager.getNimListOfType("DVB-S")
584 if len(nimList) == 0:
585 session.open(MessageBox, _("No positioner capable frontend found."), MessageBox.TYPE_ERROR)
587 if session.nav.RecordTimer.isRecording():
588 session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to configure the positioner."), MessageBox.TYPE_ERROR)
592 configured_rotor_sats = nimmanager.getRotorSatListForNim(x)
593 if len(configured_rotor_sats) != 0:
595 if len(usableNims) == 1:
596 session.open(PositionerSetup, usableNims[0])
597 elif len(usableNims) > 1:
598 session.open(RotorNimSelection)
600 session.open(MessageBox, _("No tuner is configured for use with a diseqc positioner!"), MessageBox.TYPE_ERROR)
602 def PositionerSetupStart(menuid, **kwargs):
604 return [(_("Positioner setup"), PositionerMain, "positioner_setup", None)]
608 def Plugins(**kwargs):
609 if (nimmanager.hasNimType("DVB-S")):
610 return PluginDescriptor(name=_("Positioner setup"), description="Setup your positioner", where = PluginDescriptor.WHERE_MENU, fnc=PositionerSetupStart)