from enigma import eDVBResourceManager,\
eDVBFrontendParametersSatellite, eDVBFrontendParameters
from Screens.Screen import Screen
from Screens.ScanSetup import ScanSetup
from Screens.MessageBox import MessageBox
from Plugins.Plugin import PluginDescriptor
from Components.Label import Label
from Components.Sources.FrontendStatus import FrontendStatus
from Components.ActionMap import ActionMap
from Components.NimManager import nimmanager, getConfigSatlist
from Components.MenuList import MenuList
from Components.config import ConfigSelection, getConfigListEntry
class Tuner:
def __init__(self, frontend):
self.frontend = frontend
def tune(self, transponder):
if self.frontend:
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)
self.lastparm = feparm
self.frontend.tune(feparm)
def retune(self):
if self.frontend:
self.frontend.tune(self.lastparm)
class Satfinder(ScanSetup):
skin = """
SNRdB
SNR
AGC
BER
SNR
AGC
BER
LOCK
LOCK
Invert
"""
def openFrontend(self):
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"
else:
print "getRawChannel failed"
else:
print "getResourceManager instance failed"
return False
def __init__(self, session, feid):
self.initcomplete = False
self.feid = feid
self.oldref = None
if not self.openFrontend():
self.oldref = session.nav.getCurrentlyPlayingServiceReference()
session.nav.stopService() # try to disable foreground service
if not self.openFrontend():
if session.pipshown: # try to disable pip
session.pipshown = False
del session.pip
if not self.openFrontend():
self.frontend = None # in normal case this should not happen
ScanSetup.__init__(self, session)
self.tuner = Tuner(self.frontend)
self["introduction"].setText("")
self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100)
self.initcomplete = True
def createSetup(self):
self.typeOfTuningEntry = None
self.satEntry = None
self.list = []
self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
self.list.append(self.typeOfTuningEntry)
self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
self.list.append(self.satEntry)
if self.tuning_type.value == "manual_transponder":
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))
elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
self.list.append(getConfigListEntry(_("Transponder"), self.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:
self.updateSats()
self.createSetup()
def sat_changed(self, config_element):
self.newConfig()
self.retune(config_element)
def retune(self, configElement):
returnvalue = (0, 0, 0, 0, 0, 0, 0)
satpos = self.tuning_sat.orbital_position
if satpos is not None:
if self.tuning_type.value == "manual_transponder":
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)
elif self.tuning_type.value == "predefined_transponder":
transponder = nimmanager.getTransponders(satpos)[self.tuning_transponder.index]
returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
self.tune(returnvalue)
def createConfig(self, foo):
self.tuning_transponder = None
self.tuning_type = ConfigSelection(choices = [("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined transponder"))])
self.tuning_sat = getConfigSatlist(192, nimmanager.getSatListForNim(self.feid))
ScanSetup.createConfig(self, None)
self.updateSats()
self.tuning_type.addNotifier(self.retune, initial_call = False)
self.tuning_sat.addNotifier(self.sat_changed, initial_call = False)
self.scan_sat.frequency.addNotifier(self.retune, initial_call = False)
self.scan_sat.inversion.addNotifier(self.retune, initial_call = False)
self.scan_sat.symbolrate.addNotifier(self.retune, initial_call = False)
self.scan_sat.polarization.addNotifier(self.retune, initial_call = False)
self.scan_sat.fec.addNotifier(self.retune, initial_call = False)
def updateSats(self):
orb_pos = self.tuning_sat.orbital_position
if orb_pos is not None:
transponderlist = nimmanager.getTransponders(orb_pos)
list = []
for x in transponderlist:
if x[3] == 0:
pol = "H"
elif x[3] == 1:
pol = "V"
elif x[3] == 2:
pol = "CL"
elif x[3] == 3:
pol = "CR"
else:
pol = "??"
if x[4] == 0:
fec = "FEC_AUTO"
elif x[4] == 1:
fec = "FEC_1_2"
elif x[4] == 2:
fec = "FEC_2_3"
elif x[4] == 3:
fec = "FEC_3_4"
elif x[4] == 4:
fec = "FEC_5_6"
elif x[4] == 5:
fec = "FEC_7_8"
elif x[4] == 5:
fec = "FEC_8_9"
elif x[4] == 6:
fec = "FEC_None"
else:
fec = "FEC_Unknown"
list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
self.tuning_transponder = ConfigSelection(choices = list)
self.tuning_transponder.addNotifier(self.retune, initial_call = False)
def keyGo(self):
self.retune(self.tuning_type)
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)
def keyCancel(self):
if self.oldref:
self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before satfinder?"), MessageBox.TYPE_YESNO)
else:
self.restartPrevService(False)
def tune(self, transponder):
if self.initcomplete:
if transponder is not None:
self.tuner.tune(transponder)
class NimSelection(Screen):
skin = """
"""
def __init__(self, session):
Screen.__init__(self, session)
nimlist = nimmanager.getNimListOfType("DVB-S")
nimMenuList = []
for x in nimlist:
nimMenuList.append((nimmanager.nim_slots[x].friendly_full_description, x))
self["nimlist"] = MenuList(nimMenuList)
self["actions"] = ActionMap(["OkCancelActions"],
{
"ok": self.okbuttonClick ,
"cancel": self.close
}, -1)
def okbuttonClick(self):
selection = self["nimlist"].getCurrent()[1]
self.session.open(Satfinder, selection)
def SatfinderMain(session, **kwargs):
nimList = nimmanager.getNimListOfType("DVB-S")
if len(nimList) == 0:
session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
else:
if session.nav.RecordTimer.isRecording():
session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to start the satfinder."), MessageBox.TYPE_ERROR)
else:
if len(nimList) == 1:
session.open(Satfinder, nimList[0])
else:
session.open(NimSelection)
def SatfinderStart(menuid, **kwargs):
if menuid == "scan":
return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
else:
return []
def Plugins(**kwargs):
if (nimmanager.hasNimType("DVB-S")):
return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)
else:
return []