X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a05609b3f55848ba7b935bfce20de1acff5405f9..513239a74d5abdc0c22fdd8d4dcb892703ef8c27:/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py index e09359ef..fa533c0b 100644 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py @@ -1,4 +1,7 @@ -from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, eDVBDiseqcCommand, eDVBResourceManagerPtr, iDVBChannelPtr, iDVBFrontendPtr, iDVBFrontend, eDVBFrontendParametersSatellite, eDVBFrontendParameters +from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, \ + eDVBDiseqcCommand, eDVBFrontendParametersSatellite, eDVBFrontendParameters,\ + iDVBFrontend + from Screens.Screen import Screen from Screens.ScanSetup import ScanSetup from Screens.MessageBox import MessageBox @@ -11,6 +14,8 @@ from Components.ActionMap import ActionMap from Components.NimManager import nimmanager from Components.MenuList import MenuList from Components.config import ConfigSatlist, ConfigNothing, ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, getConfigListEntry +from Components.TuneTest import Tuner +from Tools.Transponder import ConvertToHumanReadable from time import sleep @@ -23,22 +28,20 @@ class PositionerSetup(Screen): - - - - - - - + + + + + + - - + - - - + + + @@ -48,22 +51,46 @@ class PositionerSetup(Screen): Screen.__init__(self, session) self.feid = feid self.oldref = None - + + cur = { } if not self.openFrontend(): self.oldref = session.nav.getCurrentlyPlayingServiceReference() + service = session.nav.getCurrentService() + feInfo = service and service.frontendInfo() + if feInfo: + cur = feInfo.getTransponderData(True) + del feInfo + del service session.nav.stopService() # try to disable foreground service if not self.openFrontend(): if session.pipshown: # try to disable pip + service = self.session.pip.pipservice + feInfo = service and service.frontendInfo() + if feInfo: + cur = feInfo.getTransponderData() + del feInfo + del service session.pipshown = False del session.pip if not self.openFrontend(): self.frontend = None # in normal case this should not happen - self.getFrontend = None - self.diseqc = Diseqc(self.feid) + self.frontendStatus = { } + self.diseqc = Diseqc(self.frontend) self.tuner = Tuner(self.frontend) - self.tuner.tune((0,0,0,0,0,0)) - + + tp = ( cur.get("frequency", 0) / 1000, + cur.get("symbol_rate", 0) / 1000, + cur.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal), + cur.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto), + cur.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown), + cur.get("orbital_position", 0), + cur.get("system", eDVBFrontendParametersSatellite.System_DVB_S), + cur.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK), + cur.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35), + cur.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)) + + self.tuner.tune(tp) self.createConfig() self.isMoving = False @@ -77,26 +104,17 @@ class PositionerSetup(Screen): self["yellow"] = self.yellow self.blue = Label("") self["blue"] = self.blue - + self.list = [] self["list"] = ConfigList(self.list) self.createSetup() - - self["snr"] = Label() - self["agc"] = Label() - self["ber"] = Label() - self["lock"] = Label() - self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, frontendfkt = self.getFrontend) - self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, frontendfkt = self.getFrontend) - self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, frontendfkt = self.getFrontend) - self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, frontendfkt = self.getFrontend) - self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, frontendfkt = self.getFrontend) - self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, frontendfkt = self.getFrontend) - self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, frontendfkt = self.getFrontend) - - self["frequency"] = Label() - self["symbolrate"] = Label() - self["fec"] = Label() + + self["snr_db"] = TunerInfo(TunerInfo.SNR_DB, statusDict = self.frontendStatus) + self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, statusDict = self.frontendStatus) + self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, statusDict = self.frontendStatus) + self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, statusDict = self.frontendStatus) + self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, statusDict = self.frontendStatus) + self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, statusDict = self.frontendStatus) self["frequency_value"] = Label("") self["symbolrate_value"] = Label("") @@ -119,33 +137,35 @@ class PositionerSetup(Screen): self.updateColors("tune") self.statusTimer = eTimer() - self.statusTimer.timeout.get().append(self.updateStatus) - self.statusTimer.start(50, False) + self.statusTimer.callback.append(self.updateStatus) + self.statusTimer.start(50, True) + self.onClose.append(self.__onClose) + + def __onClose(self): + self.session.nav.playService(self.oldref) def restartPrevService(self, yesno): if yesno: if self.frontend: self.frontend = None del self.raw_channel - self.session.nav.playService(self.oldref) - self.close(None) - + else: + self.oldref=None + self.close(None) + def keyCancel(self): if self.oldref: self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before positioner setup?"), MessageBox.TYPE_YESNO) else: self.restartPrevService(False) - def getFrontend(self): - return self.frontend - def openFrontend(self): - res_mgr = eDVBResourceManagerPtr() - if eDVBResourceManager.getInstance(res_mgr) == 0: - self.raw_channel = iDVBChannelPtr() - if res_mgr.allocateRawChannel(self.raw_channel, self.feid) == 0: - self.frontend = iDVBFrontendPtr() - if self.raw_channel.getFrontend(self.frontend) == 0: + res_mgr = eDVBResourceManager.getInstance() + if res_mgr: + self.raw_channel = res_mgr.allocateRawChannel(self.feid) + if self.raw_channel: + self.frontend = self.raw_channel.getFrontend() + if self.frontend: return True else: print "getFrontend failed" @@ -254,7 +274,12 @@ class PositionerSetup(Screen): elif entry == "limits": self.diseqccommand("limitOff") elif entry == "tune": - self.session.openWithCallback(self.tune, TunerScreen, self.feid) + fe_data = { } + self.frontend.getFrontendData(fe_data) + self.frontend.getTransponderData(fe_data, True) + feparm = self.tuner.lastparm.getDVBS() + fe_data["orbital_position"] = feparm.orbital_position + self.session.openWithCallback(self.tune, TunerScreen, self.feid, fe_data) elif entry == "goto0": print "move to position 0" self.diseqccommand("moveTo", 0) @@ -277,6 +302,7 @@ class PositionerSetup(Screen): elif entry == "storage": print "store at position", int(self.positioner_storage.value) self.diseqccommand("store", int(self.positioner_storage.value)) + elif entry == "limits": self.diseqccommand("limitWest") @@ -321,22 +347,24 @@ class PositionerSetup(Screen): self.tuner.retune() def updateStatus(self): + if self.frontend: + self.frontend.getFrontendStatus(self.frontendStatus) + self["snr_db"].update() self["snr_percentage"].update() - self["agc_percentage"].update() self["ber_value"].update() self["snr_bar"].update() - self["agc_bar"].update() self["ber_bar"].update() self["lock_state"].update() - transponderdata = self.tuner.getTransponderData() - self["frequency_value"].setText(str(transponderdata["frequency"])) - self["symbolrate_value"].setText(str(transponderdata["symbol_rate"])) - self["fec_value"].setText(str(transponderdata["fec_inner"])) - if transponderdata["tuner_locked"] == 1 and self.isMoving and self.stopOnLock: + transponderdata = ConvertToHumanReadable(self.tuner.getTransponderData(), "DVB-S") + self["frequency_value"].setText(str(transponderdata.get("frequency"))) + self["symbolrate_value"].setText(str(transponderdata.get("symbol_rate"))) + self["fec_value"].setText(str(transponderdata.get("fec_inner"))) + if self.frontendStatus.get("tuner_locked", 0) == 1 and self.isMoving and self.stopOnLock: self.diseqccommand("stop") self.isMoving = False self.stopOnLock = False self.updateColors(self.getCurrentConfigPath()) + self.statusTimer.start(50, True) def tune(self, transponder): if transponder is not None: @@ -371,41 +399,13 @@ class Diseqc: print "diseqc command:", print string cmd.setCommandString(string) + self.frontend.setTone(iDVBFrontend.toneOff) + sleep(0.015) # wait 15msec after disable tone self.frontend.sendDiseqc(cmd) if string == 'e03160': #positioner stop sleep(0.05) self.frontend.sendDiseqc(cmd) # send 2nd time -class Tuner: - def __init__(self, frontend): - self.frontend = frontend - - def tune(self, transponder): - print "tuning to transponder with data", transponder - parm = eDVBFrontendParametersSatellite() - parm.frequency = transponder[0] * 1000 - parm.symbol_rate = transponder[1] * 1000 - parm.polarisation = transponder[2] - parm.fec = transponder[3] - parm.inversion = transponder[4] - parm.orbital_position = transponder[5] - parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2) - parm.modulation = 1 # FIXMEE !! HARDCODED QPSK - feparm = eDVBFrontendParameters() - feparm.setDVBS(parm, True) - self.lastparm = feparm - if self.frontend: - self.frontend.tune(feparm) - - def retune(self): - if self.frontend: - self.frontend.tune(self.lastparm) - - def getTransponderData(self): - if self.frontend: - return self.frontend.readTransponderData(True) - return None - tuning = None class TunerScreen(ScanSetup): @@ -415,8 +415,9 @@ class TunerScreen(ScanSetup): """ - def __init__(self, session, feid): + def __init__(self, session, feid, fe_data): self.feid = feid + self.fe_data = fe_data ScanSetup.__init__(self, session) self["introduction"].setText("") @@ -428,26 +429,40 @@ class TunerScreen(ScanSetup): self.list.append(self.typeOfTuningEntry) self.satEntry = getConfigListEntry(_('Satellite'), tuning.sat) self.list.append(self.satEntry) + nim = nimmanager.nim_slots[self.feid] + self.systemEntry = None + if tuning.type.value == "manual_transponder": + if nim.isCompatible("DVB-S2"): + self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system) + self.list.append(self.systemEntry) + else: + # downgrade to dvb-s, in case a -s2 config was active + self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency)) self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion)) self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate)) self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization)) - self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec)) + if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S: + self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec)) + elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2: + self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2)) + self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation) + self.list.append(self.modulationEntry) + self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff)) + self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot)) elif tuning.type.value == "predefined_transponder": self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder)) self["config"].list = self.list self["config"].l.setList(self.list) def newConfig(self): - if self["config"].getCurrent() == self.typeOfTuningEntry: - self.createSetup() - elif self["config"].getCurrent() == self.satEntry: + if self["config"].getCurrent() in (self.typeOfTuningEntry, self.satEntry, self.systemEntry): self.createSetup() def createConfig(self, foo): + global tuning if not tuning: - global tuning tuning = ConfigSubsection() tuning.type = ConfigSelection( default = "manual_transponder", @@ -456,8 +471,14 @@ class TunerScreen(ScanSetup): tuning.sat = ConfigSatlist(list=nimmanager.getRotorSatListForNim(self.feid)) tuning.sat.addNotifier(self.tuningSatChanged) self.updateTransponders() - TunerScreenConfigCreated = True - ScanSetup.createConfig(self, None) + orb_pos = self.fe_data.get("orbital_position", None) + if orb_pos is not None: + for x in nimmanager.getRotorSatListForNim(self.feid): + opos = str(orb_pos) + if x[0] == orb_pos and tuning.sat.value != opos: + tuning.sat.value = opos + del self.fe_data["orbital_position"] + ScanSetup.createConfig(self, self.fe_data) def tuningSatChanged(self, *parm): self.updateTransponders() @@ -476,57 +497,76 @@ class TunerScreen(ScanSetup): pol = "CL" elif x[3] == 3: pol = "CR" + else: + pol = "??" if x[4] == 0: - fec = "FEC_AUTO" + fec = "FEC Auto" elif x[4] == 1: - fec = "FEC_1_2" + fec = "FEC 1/2" elif x[4] == 2: - fec = "FEC_2_3" + fec = "FEC 2/3" elif x[4] == 3: - fec = "FEC_3_4" + fec = "FEC 3/4" elif x[4] == 4: - fec = "FEC_5_6" - elif x[4] == 5: - fec = "FEC_7_8" + fec = "FEC 5/6" elif x[4] == 5: - fec = "FEC_8_9" + fec = "FEC 7/8" elif x[4] == 6: - fec = "FEC_None" + fec = "FEC 8/9" + elif x[4] == 7: + fec = "FEC 3/5" + elif x[4] == 8: + fec = "FEC 4/5" + elif x[4] == 9: + fec = "FEC 9/10" + elif x[4] == 15: + fec = "FEC None" + else: + fec = "FEC Unknown" tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec) tuning.transponder = ConfigSelection(choices=tps) def keyGo(self): - returnvalue = (0, 0, 0, 0, 0, 0) + returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) satpos = int(tuning.sat.value) if tuning.type.value == "manual_transponder": + if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2: + fec = self.scan_sat.fec_s2.value + else: + fec = self.scan_sat.fec.value 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) + self.scan_sat.polarization.value, + fec, + self.scan_sat.inversion.value, + satpos, + self.scan_sat.system.value, + self.scan_sat.modulation.value, + self.scan_sat.rolloff.value, + self.scan_sat.pilot.value) elif tuning.type.value == "predefined_transponder": transponder = nimmanager.getTransponders(satpos)[tuning.transponder.index] - returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos) + returnvalue = (transponder[1] / 1000, transponder[2] / 1000, + transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9]) self.close(returnvalue) def keyCancel(self): self.close(None) -class NimSelection(Screen): +class RotorNimSelection(Screen): skin = """ - - + + """ def __init__(self, session): Screen.__init__(self, session) - nimlist = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"]) + nimlist = nimmanager.getNimListOfType("DVB-S") nimMenuList = [] for x in nimlist: - nimMenuList.append((_("NIM ") + (["A", "B", "C", "D"][x]) + ": " + nimmanager.getNimName(x) + " (" + nimmanager.getNimTypeName(x) + ")", x)) + nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x)) self["nimlist"] = MenuList(nimMenuList) @@ -541,7 +581,7 @@ class NimSelection(Screen): self.session.open(PositionerSetup, selection[1]) def PositionerMain(session, **kwargs): - nimList = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"]) + nimList = nimmanager.getNimListOfType("DVB-S") if len(nimList) == 0: session.open(MessageBox, _("No positioner capable frontend found."), MessageBox.TYPE_ERROR) else: @@ -556,15 +596,18 @@ def PositionerMain(session, **kwargs): if len(usableNims) == 1: session.open(PositionerSetup, usableNims[0]) elif len(usableNims) > 1: - session.open(NimSelection) + session.open(RotorNimSelection) else: session.open(MessageBox, _("No tuner is configured for use with a diseqc positioner!"), MessageBox.TYPE_ERROR) -def PositionerSetupStart(menuid): +def PositionerSetupStart(menuid, **kwargs): if menuid == "scan": - return [("Positioner setup", PositionerMain)] + return [(_("Positioner setup"), PositionerMain, "positioner_setup", None)] else: return [] def Plugins(**kwargs): - return PluginDescriptor(name="Positioner setup", description="Setup your positioner", where = PluginDescriptor.WHERE_SETUP, fnc=PositionerSetupStart) + if (nimmanager.hasNimType("DVB-S")): + return PluginDescriptor(name=_("Positioner setup"), description="Setup your positioner", where = PluginDescriptor.WHERE_MENU, fnc=PositionerSetupStart) + else: + return []