epgcache: add possibility to change the default epg cache read/write path
[enigma2.git] / lib / python / Plugins / SystemPlugins / Satfinder / plugin.py
index 40a655770135dede271137341064dd5d1e934e4f..d4fe6b58d5d5f89c015e3e04d1a81e1e6c47194f 100644 (file)
@@ -1,67 +1,27 @@
-from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, eDVBDiseqcCommand, eDVBResourceManagerPtr, iDVBChannelPtr, iDVBFrontendPtr, iDVBFrontend, eDVBFrontendParametersSatellite, eDVBFrontendParameters
+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 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.ConfigList import ConfigList
-from Components.TunerInfo import TunerInfo
+from Components.Sources.FrontendStatus import FrontendStatus
 from Components.ActionMap import ActionMap
 from Components.NimManager import nimmanager, getConfigSatlist
 from Components.MenuList import MenuList
 from Components.ActionMap import ActionMap
 from Components.NimManager import nimmanager, getConfigSatlist
 from Components.MenuList import MenuList
-from Components.config import ConfigSelection, ConfigSatlist, 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)
+from Components.config import ConfigSelection, getConfigListEntry
+from Components.TuneTest import Tuner
 
 class Satfinder(ScanSetup):
 
 class Satfinder(ScanSetup):
-       skin = """
-               <screen position="90,100" size="520,400" title="Tune">
-                       <widget name="config" position="20,10" size="460,240" scrollbarMode="showOnDemand" />
-                       <widget name="introduction" position="20,360" zPosition="-10" size="350,30" font="Regular;23" />
-                       <widget name="snr" text="SNR:" position="0,245" size="60,22" font="Regular;21" />
-                       <widget name="agc" text="AGC:" position="0,270" size="60,22" font="Regular;21" />
-                       <widget name="ber" text="BER:" position="0,295" size="60,22" font="Regular;21" />
-                       <widget name="lock" text="Lock:" position="0,320" size="60,22" font="Regular;21" />
-                       <widget name="snr_percentage" position="220,245" size="60,22" font="Regular;21" />
-                       <widget name="agc_percentage" position="220,270" size="60,22" font="Regular;21" />
-                       <widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
-                       <widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
-                       <widget name="snr_bar" position="60,245" size="150,22" />
-                       <widget name="agc_bar" position="60,270" size="150,22" />
-                       <widget name="ber_bar" position="60,295" size="150,22" />
-               </screen>"""
-
        def openFrontend(self):
        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"
                                        return True
                                else:
                                        print "getFrontend failed"
@@ -71,14 +31,11 @@ class Satfinder(ScanSetup):
                        print "getResourceManager instance failed"
                return False
 
                        print "getResourceManager instance failed"
                return False
 
-       def getFrontend(self):
-               return self.frontend
-
        def __init__(self, session, feid):
                self.initcomplete = False
                self.feid = feid
                self.oldref = None
        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():
                        self.oldref = session.nav.getCurrentlyPlayingServiceReference()
                        session.nav.stopService() # try to disable foreground service
@@ -88,65 +45,60 @@ class Satfinder(ScanSetup):
                                        del session.pip
                                        if not self.openFrontend():
                                                self.frontend = None # in normal case this should not happen
                                        del session.pip
                                        if not self.openFrontend():
                                                self.frontend = None # in normal case this should not happen
-                                               self.getFrontend = None
 
                ScanSetup.__init__(self, session)
                self.tuner = Tuner(self.frontend)
 
                ScanSetup.__init__(self, session)
                self.tuner = Tuner(self.frontend)
-
-               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["introduction"].setText("")
                self["introduction"].setText("")
-               
-               self.statusTimer = eTimer()
-               self.statusTimer.timeout.get().append(self.updateStatus)
-               self.statusTimer.start(50, False)
-
+               self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100)
                self.initcomplete = True
                self.initcomplete = True
-               self.session = session
-               
-       def updateStatus(self):
-               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()
+               self.onClose.append(self.__onClose)
+
+       def __onClose(self):
+               self.session.nav.playService(self.oldref)
 
        def createSetup(self):
                self.typeOfTuningEntry = None
                self.satEntry = None
 
        def createSetup(self):
                self.typeOfTuningEntry = None
                self.satEntry = None
-
+               
                self.list = []
                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)
                self.typeOfTuningEntry = getConfigListEntry(_('Tune'), self.tuning_type)
                self.list.append(self.typeOfTuningEntry)
                self.satEntry = getConfigListEntry(_('Satellite'), self.tuning_sat)
                self.list.append(self.satEntry)
+
+               nim = nimmanager.nim_slots[self.feid]
+
+               self.systemEntry = None
                if self.tuning_type.value == "manual_transponder":
                if self.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(_('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 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):
                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:
+               cur = self["config"].getCurrent()
+               if cur in (self.typeOfTuningEntry, self.systemEntry):
                        self.createSetup()
                        self.createSetup()
-               elif self["config"].getCurrent() == self.satEntry:
+               elif cur == self.satEntry:
                        self.updateSats()
                        self.createSetup()
 
                        self.updateSats()
                        self.createSetup()
 
@@ -155,19 +107,35 @@ class Satfinder(ScanSetup):
                self.retune(config_element)
 
        def retune(self, configElement):
                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)
+               returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+               satpos = int(self.tuning_sat.value)
+               if self.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.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)
                        self.tune(returnvalue)
                        self.tune(returnvalue)
+               elif self.tuning_type.value == "predefined_transponder":
+                       tps = nimmanager.getTransponders(satpos)
+                       l = len(tps)
+                       if l > self.tuning_transponder.index:
+                               transponder = tps[self.tuning_transponder.index]
+                               returnvalue = (transponder[1] / 1000, transponder[2] / 1000,
+                                       transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9])
+                               self.tune(returnvalue)
 
        def createConfig(self, foo):
 
        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))
                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))
@@ -175,19 +143,20 @@ class Satfinder(ScanSetup):
                
                self.updateSats()
 
                
                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)
+               for x in (self.tuning_type, self.tuning_sat, self.scan_sat.frequency,
+                       self.scan_sat.inversion, self.scan_sat.symbolrate,
+                       self.scan_sat.polarization, self.scan_sat.fec, self.scan_sat.pilot,
+                       self.scan_sat.fec_s2, self.scan_sat.fec, self.scan_sat.modulation,
+                       self.scan_sat.rolloff, self.scan_sat.system):
+                       x.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 = []
 
        def updateSats(self):
                orb_pos = self.tuning_sat.orbital_position
                if orb_pos is not None:
                        transponderlist = nimmanager.getTransponders(orb_pos)
                        list = []
+                       default = None
+                       index = 0
                        for x in transponderlist:
                                if x[3] == 0:
                                        pol = "H"
                        for x in transponderlist:
                                if x[3] == 0:
                                        pol = "H"
@@ -197,56 +166,77 @@ class Satfinder(ScanSetup):
                                        pol = "CL"
                                elif x[3] == 3:
                                        pol = "CR"
                                        pol = "CL"
                                elif x[3] == 3:
                                        pol = "CR"
+                               else:
+                                       pol = "??"
                                if x[4] == 0:
                                if x[4] == 0:
-                                       fec = "FEC_AUTO"
+                                       fec = "FEC Auto"
                                elif x[4] == 1:
                                elif x[4] == 1:
-                                       fec = "FEC_1_2"
+                                       fec = "FEC 1/2"
                                elif x[4] == 2:
                                elif x[4] == 2:
-                                       fec = "FEC_2_3"
+                                       fec = "FEC 2/3"
                                elif x[4] == 3:
                                elif x[4] == 3:
-                                       fec = "FEC_3_4"
+                                       fec = "FEC 3/4"
                                elif x[4] == 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:
                                elif x[4] == 5:
-                                       fec = "FEC_8_9"
+                                       fec = "FEC 7/8"
                                elif x[4] == 6:
                                elif x[4] == 6:
-                                       fec = "FEC_None"
-                               list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
-                       self.tuning_transponder = ConfigSelection(choices = list)
+                                       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"
+                               e = str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec
+                               if default is None:
+                                       default = str(index)
+                               list.append((str(index), e))
+                               index += 1
+                       self.tuning_transponder = ConfigSelection(choices = list, default = default)
                        self.tuning_transponder.addNotifier(self.retune, initial_call = False)
                        self.tuning_transponder.addNotifier(self.retune, initial_call = False)
-       
+
        def keyGo(self):
                self.retune(self.tuning_type)
 
        def keyGo(self):
                self.retune(self.tuning_type)
 
-       def keyCancel(self):
-               if self.oldref:
+       def restartPrevService(self, yesno):
+               if yesno:
                        if self.frontend:
                                self.frontend = None
                                del self.raw_channel
                        if self.frontend:
                                self.frontend = None
                                del self.raw_channel
-                       self.session.nav.playService(self.oldref)
+               else:
+                       self.oldref = None
                self.close(None)
                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)
 
        def tune(self, transponder):
                if self.initcomplete:
                        if transponder is not None:
                                self.tuner.tune(transponder)
 
-class NimSelection(Screen):
+class SatNimSelection(Screen):
        skin = """
        skin = """
-               <screen position="140,165" size="400,100" title="select Slot">
-                       <widget name="nimlist" position="20,10" size="360,75" />
+               <screen position="140,165" size="400,130" title="select Slot">
+                       <widget name="nimlist" position="20,10" size="360,100" />
                </screen>"""
                
        def __init__(self, session):
                Screen.__init__(self, session)
 
                </screen>"""
                
        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 = []
                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)
 
                self["actions"] = ActionMap(["OkCancelActions"],
                self["nimlist"] = MenuList(nimMenuList)
 
                self["actions"] = ActionMap(["OkCancelActions"],
@@ -256,24 +246,36 @@ class NimSelection(Screen):
                }, -1)
 
        def okbuttonClick(self):
                }, -1)
 
        def okbuttonClick(self):
-               selection = self["nimlist"].getCurrent()
-               self.session.open(Satfinder, selection[1])
+               selection = self["nimlist"].getCurrent()[1]
+               self.session.open(Satfinder, selection)
 
 def SatfinderMain(session, **kwargs):
 
 def SatfinderMain(session, **kwargs):
-       nimList = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
+       nims = nimmanager.getNimListOfType("DVB-S")
+
+       nimList = []
+       for x in nims:
+               if not nimmanager.getNimConfig(x).configMode.value in ("loopthrough", "satposdepends", "nothing"):
+                       nimList.append(x)
+
        if len(nimList) == 0:
        if len(nimList) == 0:
-               session.open(MessageBox, _("No positioner capable frontend found."), MessageBox.TYPE_ERROR)
+               session.open(MessageBox, _("No satellite frontend found!!"), MessageBox.TYPE_ERROR)
        else:
                if session.nav.RecordTimer.isRecording():
        else:
                if session.nav.RecordTimer.isRecording():
-                       session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to configure the positioner."), MessageBox.TYPE_ERROR)
+                       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:
                        if len(nimList) == 1:
                                session.open(Satfinder, nimList[0])
-                       elif len(nimList) > 1:
-                               session.open(NimSelection)
                        else:
                        else:
-                               session.open(MessageBox, _("No tuner is configured for use with a diseqc positioner!"), MessageBox.TYPE_ERROR)
+                               session.open(SatNimSelection)
 
 
+def SatfinderStart(menuid, **kwargs):
+       if menuid == "scan":
+               return [(_("Satfinder"), SatfinderMain, "satfinder", None)]
+       else:
+               return []
 
 def Plugins(**kwargs):
 
 def Plugins(**kwargs):
-       return PluginDescriptor(name="Satfinder", description="Helps setting up your dish", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=SatfinderMain)
+       if (nimmanager.hasNimType("DVB-S")):
+               return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart)
+       else:
+               return []