Support DVB-S2X.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / PositionerSetup / plugin.py
index e097117..a900350 100644 (file)
@@ -10,11 +10,13 @@ from Plugins.Plugin import PluginDescriptor
 from Components.Label import Label
 from Components.ConfigList import ConfigList
 from Components.TunerInfo import TunerInfo
-from Components.ActionMap import ActionMap
+from Components.ActionMap import NumberActionMap, 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 Components.ConfigList import ConfigListScreen
+from Components.config import config, ConfigSubsection, ConfigSelection, ConfigInteger, getConfigListEntry
 from Tools.Transponder import ConvertToHumanReadable
 
 from time import sleep
@@ -88,7 +90,10 @@ class PositionerSetup(Screen):
                        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))
+                       cur.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown),
+                       cur.get("is_id", -1),
+                       cur.get("pls_mode", eDVBFrontendParametersSatellite.PLS_Unknown),
+                       cur.get("pls_code", 0))
 
                self.tuner.tune(tp)
                self.createConfig()
@@ -406,9 +411,7 @@ class Diseqc:
                                sleep(0.05)
                                self.frontend.sendDiseqc(cmd) # send 2nd time
 
-tuning = None
-
-class TunerScreen(ScanSetup):
+class TunerScreen(ConfigListScreen, Screen):
        skin = """
                <screen position="90,100" size="520,400" title="Tune">
                        <widget name="config" position="20,10" size="460,350" scrollbarMode="showOnDemand" />
@@ -418,24 +421,40 @@ class TunerScreen(ScanSetup):
        def __init__(self, session, feid, fe_data):
                self.feid = feid
                self.fe_data = fe_data
-               ScanSetup.__init__(self, session)
-               self["introduction"].setText("")
+               Screen.__init__(self, session)
+               ConfigListScreen.__init__(self, None)
+               self.createConfig(fe_data)
+               self.createSetup()
+               self.tuning.sat.addNotifier(self.tuningSatChanged)
+               self.tuning.type.addNotifier(self.tuningTypeChanged)
+               self.scan_sat.system.addNotifier(self.systemChanged)
+               self.scan_sat.system_dvbs2x.addNotifier(self.systemChanged)
+               self.scan_sat.is_id_bool.addNotifier(self.isIdChanged, initial_call = False)
+               self.scan_sat.pls_mode.addNotifier(self.plsModeChanged, initial_call = False)
+
+               self["actions"] = NumberActionMap(["SetupActions"],
+               {
+                       "ok": self.keyGo,
+                       "cancel": self.keyCancel,
+               }, -2)
+
+               self["introduction"] = Label(_(" "))
 
        def createSetup(self):
-               self.typeOfTuningEntry = None
-               self.satEntry = None
                self.list = []
-               self.typeOfTuningEntry = getConfigListEntry(_('Tune'), tuning.type)
-               self.list.append(self.typeOfTuningEntry)
-               self.satEntry = getConfigListEntry(_('Satellite'), tuning.sat)
-               self.list.append(self.satEntry)
+               self.list.append(getConfigListEntry(_('Tune'), self.tuning.type) )
+               self.list.append(getConfigListEntry(_('Satellite'), self.tuning.sat)    )
+
+               self.is_id_boolEntry = None
+               self.plsModeEntry = None
                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)
+               if self.tuning.type.value == "manual_transponder":
+                       scan_sat_system_value = self.scan_sat.system.value
+                       if nim.isCompatible("DVB-S2X"):
+                               scan_sat_system_value = self.scan_sat.system_dvbs2x.value
+                               self.list.append(getConfigListEntry(_('System'), self.scan_sat.system_dvbs2x))
+                       elif nim.isCompatible("DVB-S2"):
+                               self.list.append(getConfigListEntry(_('System'), self.scan_sat.system))
                        else:
                                # downgrade to dvb-s, in case a -s2 config was active
                                self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S
@@ -443,49 +462,241 @@ class TunerScreen(ScanSetup):
                        self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
                        self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate))
                        self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization))
-                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
+                       if 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:
+                       elif 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(_('Roll-off'), 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))
+                       elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2X:
+                               if self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_QPSK:
+                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_qpsk))
+                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8PSK:
+                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8psk))
+                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8APSK:
+                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8apsk))
+                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_16APSK:
+                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_16apsk))
+                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_32APSK:
+                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_32apsk))
+                               self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation_dvbs2x)
+                               self.list.append(self.modulationEntry)
+                               self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
+                               self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
+                       if scan_sat_system_value in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X):
+                               if nim.isMultistream():
+                                       self.is_id_boolEntry = getConfigListEntry(_('Transport Stream Type'), self.scan_sat.is_id_bool)
+                                       self.list.append(self.is_id_boolEntry)
+                                       if self.scan_sat.is_id_bool.value:
+                                               self.list.append(getConfigListEntry(_('Input Stream ID'), self.scan_sat.is_id))
+                                               self.plsModeEntry = getConfigListEntry(_('PLS Mode'), self.scan_sat.pls_mode)
+                                               self.list.append(self.plsModeEntry)
+                                               if self.scan_sat.pls_mode.value != eDVBFrontendParametersSatellite.PLS_Unknown:
+                                                       self.list.append(getConfigListEntry(_('PLS Code'), self.scan_sat.pls_code))
+               elif 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() in (self.typeOfTuningEntry, self.satEntry, self.systemEntry):
-                       self.createSetup()
-
-       def createConfig(self, foo):
-               global tuning
-               if not tuning:
-                       tuning = ConfigSubsection()
-                       tuning.type = ConfigSelection(
-                               default = "manual_transponder",
-                               choices = { "manual_transponder" : _("Manual transponder"),
-                                                       "predefined_transponder" : _("Predefined transponder") } )
-                       tuning.sat = ConfigSatlist(list=nimmanager.getRotorSatListForNim(self.feid))
-                       tuning.sat.addNotifier(self.tuningSatChanged)
-                       self.updateTransponders()
+       def createConfig(self, frontendData):
+               satlist = nimmanager.getRotorSatListForNim(self.feid)
                orb_pos = self.fe_data.get("orbital_position", None)
+               self.tuning = ConfigSubsection()
+               self.tuning.type = ConfigSelection(
+                       default = "manual_transponder",
+                       choices = { "manual_transponder" : _("Manual transponder"),
+                                               "predefined_transponder" : _("Predefined transponder") } )
+               self.tuning.sat = ConfigSatlist(list = satlist)
                if orb_pos is not None:
-                       for x in nimmanager.getRotorSatListForNim(self.feid):
+                       for x in satlist:
                                opos = str(orb_pos)
-                               if x[0] == orb_pos and tuning.sat.value != opos:
-                                       tuning.sat.value = opos
+                               if x[0] == orb_pos and self.tuning.sat.value != opos:
+                                       self.tuning.sat.value = opos
                        del self.fe_data["orbital_position"]
-               ScanSetup.createConfig(self, self.fe_data)
+
+               self.updateTransponders()
+
+               defaultSat = {
+                       "orbpos": 192,
+                       "system": eDVBFrontendParametersSatellite.System_DVB_S,
+                       "frequency": 11836,
+                       "inversion": eDVBFrontendParametersSatellite.Inversion_Unknown,
+                       "symbolrate": 27500,
+                       "polarization": eDVBFrontendParametersSatellite.Polarisation_Horizontal,
+                       "fec": eDVBFrontendParametersSatellite.FEC_Auto,
+                       "fec_s2": eDVBFrontendParametersSatellite.FEC_9_10,
+                       "fec_s2x_qpsk": eDVBFrontendParametersSatellite.FEC_13_45,
+                       "fec_s2x_8psk": eDVBFrontendParametersSatellite.FEC_23_36,
+                       "fec_s2x_8apsk": eDVBFrontendParametersSatellite.FEC_5_9_L,
+                       "fec_s2x_16apsk": eDVBFrontendParametersSatellite.FEC_1_2_L,
+                       "fec_s2x_32apsk": eDVBFrontendParametersSatellite.FEC_2_3_L,
+                       "modulation": eDVBFrontendParametersSatellite.Modulation_QPSK,
+                       "modulation_s2x": eDVBFrontendParametersSatellite.Modulation_QPSK,
+                       "is_id": -1,
+                       "pls_mode": eDVBFrontendParametersSatellite.PLS_Unknown,
+                       "pls_code": 0 }
+
+               if frontendData is not None:
+                       ttype = frontendData.get("tuner_type", "UNKNOWN")
+                       defaultSat["system"] = frontendData.get("system", eDVBFrontendParametersSatellite.System_DVB_S)
+                       defaultSat["frequency"] = frontendData.get("frequency", 0) / 1000
+                       defaultSat["inversion"] = frontendData.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown)
+                       defaultSat["symbolrate"] = frontendData.get("symbol_rate", 0) / 1000
+                       defaultSat["polarization"] = frontendData.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal)
+                       defaultSat["orbpos"] = frontendData.get("orbital_position", 0)
+
+                       defaultSat["modulation"] = frontendData.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK)
+                       defaultSat["modulation_s2x"] = frontendData.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK)
+
+                       if defaultSat["modulation"] > eDVBFrontendParametersSatellite.Modulation_8PSK:
+                               defaultSat["modulation"] = eDVBFrontendParametersSatellite.Modulation_8PSK
+
+                       if defaultSat["system"] == eDVBFrontendParametersSatellite.System_DVB_S2:
+                               defaultSat["fec_s2"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto)
+                       elif defaultSat["system"] == eDVBFrontendParametersSatellite.System_DVB_S2X:
+                               if defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_QPSK:
+                                       defaultSat["fec_s2x_qpsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_13_45)
+                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_8PSK:
+                                       defaultSat["fec_s2x_8psk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_23_36)
+                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_8APSK:
+                                       defaultSat["fec_s2x_8apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_5_9_L)
+                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_16APSK:
+                                       defaultSat["fec_s2x_16apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_1_2_L)
+                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_32APSK:
+                                       defaultSat["fec_s2x_32apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_2_3_L)
+                       else:
+                               defaultSat["fec"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto)
+
+                       if defaultSat["system"] in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X):
+                               defaultSat["rolloff"] = frontendData.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35)
+                               defaultSat["pilot"] = frontendData.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)
+                               defaultSat["is_id"] = frontendData.get("is_id", defaultSat["is_id"])
+                               defaultSat["pls_mode"] = frontendData.get("pls_mode", defaultSat["pls_mode"])
+                               defaultSat["pls_code"] = frontendData.get("pls_code", defaultSat["pls_code"])
+
+               self.scan_sat = ConfigSubsection()
+
+               sat_choices = [
+                               (eDVBFrontendParametersSatellite.System_DVB_S, _("DVB-S")),
+                               (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2"))]
+
+               sat_choices_dvbs2x = [
+                       (eDVBFrontendParametersSatellite.System_DVB_S, _("DVB-S")),
+                       (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2")),
+                       (eDVBFrontendParametersSatellite.System_DVB_S2X, _("DVB-S2X"))]
+
+               self.scan_sat.system = ConfigSelection(default = defaultSat["system"], choices = sat_choices)
+               self.scan_sat.system_dvbs2x = ConfigSelection(default = defaultSat["system"], choices = sat_choices_dvbs2x)
+               self.scan_sat.frequency = ConfigInteger(default = defaultSat["frequency"], limits = (1, 99999))
+               self.scan_sat.inversion = ConfigSelection(default = defaultSat["inversion"], choices = [
+                       (eDVBFrontendParametersSatellite.Inversion_Off, _("Off")),
+                       (eDVBFrontendParametersSatellite.Inversion_On, _("On")),
+                       (eDVBFrontendParametersSatellite.Inversion_Unknown, _("Auto"))])
+               self.scan_sat.symbolrate = ConfigInteger(default = defaultSat["symbolrate"], limits = (1, 99999))
+               self.scan_sat.polarization = ConfigSelection(default = defaultSat["polarization"], choices = [
+                       (eDVBFrontendParametersSatellite.Polarisation_Horizontal, _("horizontal")),
+                       (eDVBFrontendParametersSatellite.Polarisation_Vertical, _("vertical")),
+                       (eDVBFrontendParametersSatellite.Polarisation_CircularLeft, _("circular left")),
+                       (eDVBFrontendParametersSatellite.Polarisation_CircularRight, _("circular right"))])
+               self.scan_sat.fec = ConfigSelection(default = defaultSat["fec"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_Auto, _("Auto")),
+                       (eDVBFrontendParametersSatellite.FEC_1_2, "1/2"),
+                       (eDVBFrontendParametersSatellite.FEC_2_3, "2/3"),
+                       (eDVBFrontendParametersSatellite.FEC_3_4, "3/4"),
+                       (eDVBFrontendParametersSatellite.FEC_5_6, "5/6"),
+                       (eDVBFrontendParametersSatellite.FEC_7_8, "7/8"),
+                       (eDVBFrontendParametersSatellite.FEC_None, _("None"))])
+               self.scan_sat.fec_s2 = ConfigSelection(default = defaultSat["fec_s2"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_1_2, "1/2"),
+                       (eDVBFrontendParametersSatellite.FEC_2_3, "2/3"),
+                       (eDVBFrontendParametersSatellite.FEC_3_4, "3/4"),
+                       (eDVBFrontendParametersSatellite.FEC_3_5, "3/5"),
+                       (eDVBFrontendParametersSatellite.FEC_4_5, "4/5"),
+                       (eDVBFrontendParametersSatellite.FEC_5_6, "5/6"),
+                       (eDVBFrontendParametersSatellite.FEC_7_8, "7/8"),
+                       (eDVBFrontendParametersSatellite.FEC_8_9, "8/9"),
+                       (eDVBFrontendParametersSatellite.FEC_9_10, "9/10")])
+               self.scan_sat.fec_s2x_qpsk = ConfigSelection(default = defaultSat["fec_s2x_qpsk"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_13_45, "13/45"),
+                       (eDVBFrontendParametersSatellite.FEC_9_20, "9/20"),
+                       (eDVBFrontendParametersSatellite.FEC_11_20, "11/20")])
+
+               self.scan_sat.fec_s2x_8psk = ConfigSelection(default = defaultSat["fec_s2x_8psk"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_23_36, "23/36"),
+                       (eDVBFrontendParametersSatellite.FEC_25_36, "25/36"),
+                       (eDVBFrontendParametersSatellite.FEC_13_18, "13/28")])
+
+               self.scan_sat.fec_s2x_8apsk = ConfigSelection(default = defaultSat["fec_s2x_8apsk"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_5_9_L, "5/9-L"),
+                       (eDVBFrontendParametersSatellite.FEC_26_45_L, "26/45-L")])
+
+               self.scan_sat.fec_s2x_16apsk = ConfigSelection(default = defaultSat["fec_s2x_16apsk"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_1_2_L, "1/2-L"),
+                       (eDVBFrontendParametersSatellite.FEC_8_15_L, "8/15-L"),
+                       (eDVBFrontendParametersSatellite.FEC_5_9_L, "5/9-L"),
+                       (eDVBFrontendParametersSatellite.FEC_26_45, "26/45"),
+                       (eDVBFrontendParametersSatellite.FEC_3_5, "3/5"),
+                       (eDVBFrontendParametersSatellite.FEC_3_5_L, "3/5-L"),
+                       (eDVBFrontendParametersSatellite.FEC_28_45, "28/45"),
+                       (eDVBFrontendParametersSatellite.FEC_23_36, "23/36"),
+                       (eDVBFrontendParametersSatellite.FEC_2_3_L, "2/3-L"),
+                       (eDVBFrontendParametersSatellite.FEC_25_36, "25/36"),
+                       (eDVBFrontendParametersSatellite.FEC_13_18, "13/18"),
+                       (eDVBFrontendParametersSatellite.FEC_7_9, "7/9"),
+                       (eDVBFrontendParametersSatellite.FEC_77_90, "77/90")])
+
+               self.scan_sat.fec_s2x_32apsk = ConfigSelection(default = defaultSat["fec_s2x_32apsk"], choices = [
+                       (eDVBFrontendParametersSatellite.FEC_2_3_L, "2/3-L"),
+                       (eDVBFrontendParametersSatellite.FEC_32_45, "32/45"),
+                       (eDVBFrontendParametersSatellite.FEC_11_15, "11/15"),
+                       (eDVBFrontendParametersSatellite.FEC_7_9, "7/9")])
+               self.scan_sat.modulation = ConfigSelection(default = defaultSat["modulation"], choices = [
+                       (eDVBFrontendParametersSatellite.Modulation_QPSK, "QPSK"),
+                       (eDVBFrontendParametersSatellite.Modulation_8PSK, "8PSK")])
+               self.scan_sat.modulation_dvbs2x = ConfigSelection(default = defaultSat["modulation_s2x"], choices = [
+                       (eDVBFrontendParametersSatellite.Modulation_QPSK, "QPSK"),
+                       (eDVBFrontendParametersSatellite.Modulation_8PSK, "8PSK"),
+                       (eDVBFrontendParametersSatellite.Modulation_8APSK, "8APSK"),
+                       (eDVBFrontendParametersSatellite.Modulation_16APSK, "16APSK"),
+                       (eDVBFrontendParametersSatellite.Modulation_32APSK, "32APSK")])
+               self.scan_sat.rolloff = ConfigSelection(default = defaultSat.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35), choices = [
+                       (eDVBFrontendParametersSatellite.RollOff_alpha_0_35, "0.35"),
+                       (eDVBFrontendParametersSatellite.RollOff_alpha_0_25, "0.25"),
+                       (eDVBFrontendParametersSatellite.RollOff_alpha_0_20, "0.20")])
+               self.scan_sat.pilot = ConfigSelection(default = defaultSat.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown), choices = [
+                       (eDVBFrontendParametersSatellite.Pilot_Off, _("Off")),
+                       (eDVBFrontendParametersSatellite.Pilot_On, _("On")),
+                       (eDVBFrontendParametersSatellite.Pilot_Unknown, _("Auto"))])
+               self.scan_sat.is_id = ConfigInteger(default = defaultSat["is_id"] if defaultSat["is_id"] != -1 else 0, limits = (0, 255))
+               self.scan_sat.is_id_bool = ConfigSelection(default = defaultSat["is_id"] != -1, choices = [(True, _("Multistream")),(False, _("Ordinary"))])
+               self.scan_sat.pls_mode = ConfigSelection(default = defaultSat["pls_mode"], choices = [
+                               (eDVBFrontendParametersSatellite.PLS_Root, _("Root")),
+                               (eDVBFrontendParametersSatellite.PLS_Gold, _("Gold")),
+                               (eDVBFrontendParametersSatellite.PLS_Combo, _("Combo")),
+                               (eDVBFrontendParametersSatellite.PLS_Unknown, _("Auto"))])
+               self.scan_sat.pls_code = ConfigInteger(default = defaultSat["pls_code"], limits = (0, 262143))
 
        def tuningSatChanged(self, *parm):
                self.updateTransponders()
+               self.createSetup()
+
+       def tuningTypeChanged(self, *parm):
+               self.createSetup()
+
+       def systemChanged(self, *parm):
+               self.createSetup()
+
+       def isIdChanged(self, *parm):
+               self.createSetup()
+
+       def plsModeChanged(self, *parm):
+               self.createSetup()
 
        def updateTransponders(self):
-               if len(tuning.sat.choices):
-                       transponderlist = nimmanager.getTransponders(int(tuning.sat.value))
+               if len(self.tuning.sat.choices):
+                       transponderlist = nimmanager.getTransponders(int(self.tuning.sat.value))
                        tps = []
                        cnt=0
                        for x in transponderlist:
@@ -499,41 +710,66 @@ class TunerScreen(ScanSetup):
                                        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] == 6:
-                                       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_desc = ("FEC Auto", "FEC 1/2", "FEC 2/3", "FEC 3/4", "FEC 5/6", "FEC 7/8", "FEC 8/9", "FEC 3/5", "FEC 4/5", "FEC 9/10", \
+                                                       "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC None", \
+                                                       "FEC_13_45", "FEC_9_20", "FEC_11_20", "FEC_23_36", "FEC_25_36", \
+                                                       "FEC_13_18", "FEC_26_45", "FEC_28_45", "FEC_7_9", "FEC_77_90", \
+                                                       "FEC_32_45", "FEC_11_15", "FEC_1_2_L", "FEC_8_15_L", "FEC_3_5_L", \
+                                                       "FEC_2_3_L", "FEC_5_9_L", "FEC_26_45_L")
+                               if x[4] > len(fec_desc)-1:
                                        fec = "FEC Unknown"
+                               else:
+                                       fec = fec_desc[x[4]]
                                tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
-                       tuning.transponder = ConfigSelection(choices=tps)
+                       self.tuning.transponder = ConfigSelection(choices=tps)
+
+       def keyLeft(self):
+               ConfigListScreen.keyLeft(self)
+
+       def keyRight(self):
+               ConfigListScreen.keyRight(self)
 
        def keyGo(self):
-               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:
+               returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 0)
+               satpos = int(self.tuning.sat.value)
+               nim = nimmanager.nim_slots[self.feid]
+               if self.tuning.type.value == "manual_transponder":
+                       system = self.scan_sat.system.value
+                       modulation = self.scan_sat.modulation.value
+                       if nim.isCompatible("DVB-S2X"):
+                               system = self.scan_sat.system_dvbs2x.value
+                               modulation = self.scan_sat.modulation_dvbs2x.value
+
+                       if system == eDVBFrontendParametersSatellite.System_DVB_S:
+                               fec = self.scan_sat.fec.value
+                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2:
                                fec = self.scan_sat.fec_s2.value
+                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2X:
+                               if modulation == eDVBFrontendParametersSatellite.Modulation_QPSK:
+                                       fec = self.scan_sat.fec_s2x_qpsk.value
+                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8PSK:
+                                       fec = self.scan_sat.fec_s2x_8psk.value
+                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8APSK:
+                                       fec = self.scan_sat.fec_s2x_8apsk.value
+                               elif modulation == eDVBFrontendParametersSatellite.Modulation_16APSK:
+                                       fec = self.scan_sat.fec_s2x_16apsk.value
+                               elif modulation == eDVBFrontendParametersSatellite.Modulation_32APSK:
+                                       fec = self.scan_sat.fec_s2x_32apsk.value
                        else:
                                fec = self.scan_sat.fec.value
+
+                       is_id = -1
+                       pls_mode = eDVBFrontendParametersSatellite.PLS_Unknown
+                       pls_code = 0
+                       if self.scan_sat.is_id_bool.value:
+                               is_id = self.scan_sat.is_id.value
+                               pls_mode = self.scan_sat.pls_mode.value
+                               if pls_mode == eDVBFrontendParametersSatellite.PLS_Unknown:
+                                       pls_code = 0
+                               else:
+                                       pls_code = self.scan_sat.pls_code.value
+
                        returnvalue = (
                                self.scan_sat.frequency.value,
                                self.scan_sat.symbolrate.value,
@@ -541,14 +777,17 @@ class TunerScreen(ScanSetup):
                                fec,
                                self.scan_sat.inversion.value,
                                satpos,
-                               self.scan_sat.system.value,
-                               self.scan_sat.modulation.value,
+                               system,
+                               modulation,
                                self.scan_sat.rolloff.value,
-                               self.scan_sat.pilot.value)
-               elif tuning.type.value == "predefined_transponder":
-                       transponder = nimmanager.getTransponders(satpos)[tuning.transponder.index]
+                               self.scan_sat.pilot.value,
+                               is_id,
+                               pls_mode,
+                               pls_code)
+               elif self.tuning.type.value == "predefined_transponder":
+                       transponder = nimmanager.getTransponders(satpos)[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])
+                               transponder[3], transponder[4], 2, satpos, transponder[5], transponder[6], transponder[8], transponder[9], transponder[10], transponder[11], transponder[12])
                self.close(returnvalue)
 
        def keyCancel(self):