7b70ac181b2ad18536cc69dfddf07f76ff87424a
[vuplus_openvuplus_3.0] / meta-bsp / recipes-vuplus / enigma2 / enigma2 / enigma2_vuplus_dvbs2x.patch
1 diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp
2 index 0f367be5..ca435464 100755
3 --- a/lib/dvb/db.cpp
4 +++ b/lib/dvb/db.cpp
5 @@ -512,7 +512,7 @@ void eDVBDB::saveServicelist(const char *file)
6                 ch.m_frontendParameters->getFlags(flags);
7                 if (!ch.m_frontendParameters->getDVBS(sat))
8                 {
9 -                       if (sat.system == eDVBFrontendParametersSatellite::System_DVB_S2)
10 +                       if ((sat.system == eDVBFrontendParametersSatellite::System_DVB_S2) || (sat.system == eDVBFrontendParametersSatellite::System_DVB_S2X))
11                         {
12                                 fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
13                                         sat.frequency, sat.symbol_rate,
14 diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
15 index 852c4034..67c3aa98 100644
16 --- a/lib/dvb/dvb.cpp
17 +++ b/lib/dvb/dvb.cpp
18 @@ -414,6 +414,10 @@ bool eDVBResourceManager::frontendIsCompatible(int index, const char *type)
19         {
20                 if (i->m_frontend->getSlotID() == index)
21                 {
22 +                       if (!strcmp(type, "DVB-S2X"))
23 +                       {
24 +                               return i->m_frontend->supportsDeliverySystem(SYS_DVBS2X, false);
25 +                       }
26                         if (!strcmp(type, "DVB-S2"))
27                         {
28                                 return i->m_frontend->supportsDeliverySystem(SYS_DVBS2, false);
29 @@ -456,6 +460,8 @@ void eDVBResourceManager::setFrontendType(int index, const char *type)
30                         {
31                                 whitelist.push_back(SYS_DVBS);
32                                 whitelist.push_back(SYS_DVBS2);
33 +                               if (!strcmp(type, "DVB-S2X"))
34 +                                       whitelist.push_back(SYS_DVBS2X);
35                         }
36                         else if (!strcmp(type, "DVB-T2") || !strcmp(type, "DVB-T"))
37                         {
38 diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
39 index 91c866c9..a2eb0e82 100755
40 --- a/lib/dvb/frontend.cpp
41 +++ b/lib/dvb/frontend.cpp
42 @@ -38,6 +38,9 @@
43  #define FEC_S2_QPSK_4_5 (fe_code_rate_t)(FEC_4_5)
44  #define FEC_S2_QPSK_9_10 (fe_code_rate_t)(FEC_9_10)
45  
46 +/* DVB-S2X */
47 +#define FEC_S2_QPSK_13_45 (fe_code_rate_t)(FEC_13_45)
48 +
49  #include <dvbsi++/satellite_delivery_system_descriptor.h>
50  #include <dvbsi++/cable_delivery_system_descriptor.h>
51  #include <dvbsi++/terrestrial_delivery_system_descriptor.h>
52 @@ -132,23 +135,23 @@ void eDVBFrontendParametersSatellite::set(const SatelliteDeliverySystemDescripto
53                 modulation=eDVBFrontendParametersSatellite::Modulation_QPSK;
54         }
55         rolloff = descriptor.getRollOff();
56 -       if (system == eDVBFrontendParametersSatellite::System_DVB_S2)
57 +       if (system == eDVBFrontendParametersSatellite::System_DVB_S)
58         {
59 -               eDebug("SAT DVB-S2 freq %d, %s, pos %d, sr %d, fec %d, modulation %d, rolloff %d",
60 +               eDebug("SAT DVB-S freq %d, %s, pos %d, sr %d, fec %d",
61                         frequency,
62                         polarisation ? "hor" : "vert",
63                         orbital_position,
64 -                       symbol_rate, fec,
65 -                       modulation,
66 -                       rolloff);
67 +                       symbol_rate, fec);
68         }
69 -       else
70 +       else // System_DVB_S2 or System_DVB_S2X
71         {
72 -               eDebug("SAT DVB-S freq %d, %s, pos %d, sr %d, fec %d",
73 +               eDebug("SAT DVB-S2 freq %d, %s, pos %d, sr %d, fec %d, modulation %d, rolloff %d",
74                         frequency,
75                         polarisation ? "hor" : "vert",
76                         orbital_position,
77 -                       symbol_rate, fec);
78 +                       symbol_rate, fec,
79 +                       modulation,
80 +                       rolloff);
81         }
82  }
83  
84 @@ -1018,7 +1021,7 @@ void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe
85         PutToDict(dict, "fec_inner", feparm.fec);
86         PutToDict(dict, "modulation", feparm.modulation);
87         PutToDict(dict, "polarization", feparm.polarisation);
88 -       if (feparm.system == eDVBFrontendParametersSatellite::System_DVB_S2)
89 +       if ((feparm.system == eDVBFrontendParametersSatellite::System_DVB_S2) || (feparm.system == eDVBFrontendParametersSatellite::System_DVB_S2X))
90         {
91                 PutToDict(dict, "rolloff", feparm.rolloff);
92                 PutToDict(dict, "pilot", feparm.pilot);
93 @@ -1084,6 +1087,7 @@ static void fillDictWithSatelliteData(ePyObject dict, struct dtv_property *p, lo
94         case FEC_7_8: tmp = eDVBFrontendParametersSatellite::FEC_7_8; break;
95         case FEC_8_9: tmp = eDVBFrontendParametersSatellite::FEC_8_9; break;
96         case FEC_9_10: tmp = eDVBFrontendParametersSatellite::FEC_9_10; break;
97 +       case FEC_13_45 ... FEC_26_45_L: tmp = eDVBFrontendParametersSatellite::FEC_13_45 + (long)(p_inner_fec - FEC_13_45); break;
98         case FEC_NONE: tmp = eDVBFrontendParametersSatellite::FEC_None; break;
99         case FEC_AUTO: tmp = eDVBFrontendParametersSatellite::FEC_Auto; break;
100         default: eDebug("got unsupported FEC from frontend! report as FEC_AUTO!\n");
101 @@ -1094,7 +1098,12 @@ static void fillDictWithSatelliteData(ePyObject dict, struct dtv_property *p, lo
102         {
103         default: eDebug("got unsupported system from frontend! report as DVBS!");
104         case SYS_DVBS: tmp = eDVBFrontendParametersSatellite::System_DVB_S; break;
105 -       case SYS_DVBS2:
106 +       case SYS_DVBS2: tmp = eDVBFrontendParametersSatellite::System_DVB_S2; break;
107 +       case SYS_DVBS2X: tmp = eDVBFrontendParametersSatellite::System_DVB_S2X; break;
108 +       }
109 +       PutToDict(dict, "system", tmp);
110 +
111 +       if ((p_system == SYS_DVBS2) || (p_system == SYS_DVBS2X))
112         {
113                 switch (p_rolloff)
114                 {
115 @@ -1112,17 +1121,16 @@ static void fillDictWithSatelliteData(ePyObject dict, struct dtv_property *p, lo
116                 case PILOT_AUTO: tmp = eDVBFrontendParametersSatellite::Pilot_Unknown; break;
117                 }
118                 PutToDict(dict, "pilot", tmp);
119 -
120 -               tmp = eDVBFrontendParametersSatellite::System_DVB_S2; break;
121         }
122 -       }
123 -       PutToDict(dict, "system", tmp);
124  
125         switch (p_modulation)
126         {
127         default: eDebug("got unsupported modulation from frontend! report as QPSK!");
128         case QPSK: tmp = eDVBFrontendParametersSatellite::Modulation_QPSK; break;
129         case PSK_8: tmp = eDVBFrontendParametersSatellite::Modulation_8PSK; break;
130 +       case APSK_8: tmp = eDVBFrontendParametersSatellite::Modulation_8APSK; break;
131 +       case APSK_16: tmp = eDVBFrontendParametersSatellite::Modulation_16APSK; break;
132 +       case APSK_32: tmp = eDVBFrontendParametersSatellite::Modulation_32APSK; break;
133         }
134         PutToDict(dict, "modulation", tmp);
135  
136 @@ -1475,7 +1483,7 @@ void eDVBFrontend::getFrontendData(ePyObject dest)
137                 const char *tmp=0;
138                 PutToDict(dest, "tuner_number", m_slotid);
139  
140 -               if (supportsDeliverySystem(SYS_DVBS, true) || supportsDeliverySystem(SYS_DVBS2, true))
141 +               if (supportsDeliverySystem(SYS_DVBS, true) || supportsDeliverySystem(SYS_DVBS2, true) || supportsDeliverySystem(SYS_DVBS2X, true))
142                 {
143                         tmp = "DVB-S";
144                 }
145 @@ -1973,12 +1981,16 @@ void eDVBFrontend::setFrontend(bool recvEvents)
146                         {
147                         case eDVBFrontendParametersSatellite::System_DVB_S: system = SYS_DVBS; break;
148                         case eDVBFrontendParametersSatellite::System_DVB_S2: system = SYS_DVBS2; break;
149 +                       case eDVBFrontendParametersSatellite::System_DVB_S2X: system = SYS_DVBS2X; break;
150                         };
151                         switch(sparm.modulation)
152                         {
153                         case eDVBFrontendParametersSatellite::Modulation_QPSK: modulation = QPSK; break;
154                         case eDVBFrontendParametersSatellite::Modulation_8PSK: modulation = PSK_8; break;
155                         case eDVBFrontendParametersSatellite::Modulation_QAM16: modulation = QAM_16; break;
156 +                       case eDVBFrontendParametersSatellite::Modulation_8APSK: modulation = APSK_8; break;
157 +                       case eDVBFrontendParametersSatellite::Modulation_16APSK: modulation = APSK_16; break;
158 +                       case eDVBFrontendParametersSatellite::Modulation_32APSK: modulation = APSK_32; break;
159                         };
160                         switch(sparm.pilot)
161                         {
162 @@ -2002,7 +2014,7 @@ void eDVBFrontend::setFrontend(bool recvEvents)
163                         p[4].cmd = DTV_SYMBOL_RATE,     p[4].u.data = parm_u_qpsk_symbol_rate;
164                         p[5].cmd = DTV_INNER_FEC,       p[5].u.data = parm_u_qpsk_fec_inner;
165                         p[6].cmd = DTV_INVERSION,       p[6].u.data = parm_inversion;
166 -                       if (system == SYS_DVBS2)
167 +                       if ((system == SYS_DVBS2) || (system == SYS_DVBS2X))
168                         {
169                                 p[7].cmd = DTV_ROLLOFF,         p[7].u.data = rolloff;
170                                 p[8].cmd = DTV_PILOT,           p[8].u.data = pilot;
171 @@ -2116,8 +2128,7 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
172         res = m_sec->prepare(*this, parm, feparm, 1 << m_slotid, tunetimeout);
173         if (!res)
174         {
175 -               eDebugNoSimulate("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d system %d modulation %d pilot %d, rolloff %d",
176 -                       feparm.system,
177 +               eDebugNoSimulate("prepare_sat Freq %d Pol %d SR %d INV %d FEC %d orbpos %d system %d modulation %d pilot %d, rolloff %d",
178                         feparm.frequency,
179                         feparm.polarisation,
180                         feparm.symbol_rate,
181 @@ -2171,7 +2182,7 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
182                                         break;
183                         }
184                 }
185 -               else // DVB_S2
186 +               else if (feparm.system == eDVBFrontendParametersSatellite::System_DVB_S2)
187                 {
188                         switch (feparm.fec)
189                         {
190 @@ -2207,6 +2218,45 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
191                                         return -EINVAL;
192                         }
193                 }
194 +               else // DVB_S2X
195 +               {
196 +                       switch (feparm.fec)
197 +                       {
198 +                               case eDVBFrontendParametersSatellite::FEC_1_2:
199 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_1_2;
200 +                                       break;
201 +                               case eDVBFrontendParametersSatellite::FEC_2_3:
202 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_2_3;
203 +                                       break;
204 +                               case eDVBFrontendParametersSatellite::FEC_3_4:
205 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_3_4;
206 +                                       break;
207 +                               case eDVBFrontendParametersSatellite::FEC_3_5:
208 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_3_5;
209 +                                       break;
210 +                               case eDVBFrontendParametersSatellite::FEC_4_5:
211 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_4_5;
212 +                                       break;
213 +                               case eDVBFrontendParametersSatellite::FEC_5_6:
214 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_5_6;
215 +                                       break;
216 +                               case eDVBFrontendParametersSatellite::FEC_7_8:
217 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_7_8;
218 +                                       break;
219 +                               case eDVBFrontendParametersSatellite::FEC_8_9:
220 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_8_9;
221 +                                       break;
222 +                               case eDVBFrontendParametersSatellite::FEC_9_10:
223 +                                       parm_u_qpsk_fec_inner = FEC_S2_QPSK_9_10;
224 +                                       break;
225 +                               case eDVBFrontendParametersSatellite::FEC_13_45 ... eDVBFrontendParametersSatellite::FEC_26_45_L:
226 +                                       parm_u_qpsk_fec_inner = (fe_code_rate_t)((int)FEC_S2_QPSK_13_45 + (feparm.fec-eDVBFrontendParametersSatellite::FEC_13_45));
227 +                                       break;
228 +                               default:
229 +                                       eDebugNoSimulate("no valid fec for DVB-S2X set.. abort !!");
230 +                                       return -EINVAL;
231 +                       }
232 +               }
233                 // FIXME !!! get frequency range from tuner
234                 if ( parm_frequency < 900000 || parm_frequency > 2200000 )
235                 {
236 @@ -2791,13 +2841,18 @@ int eDVBFrontend::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)
237         if (type == eDVBFrontend::feSatellite)
238         {
239                 eDVBFrontendParametersSatellite sat_parm;
240 -               bool can_handle_dvbs, can_handle_dvbs2;
241 +               bool can_handle_dvbs, can_handle_dvbs2, can_handle_dvbs2x;
242                 can_handle_dvbs = supportsDeliverySystem(SYS_DVBS, true);
243                 can_handle_dvbs2 = supportsDeliverySystem(SYS_DVBS2, true);
244 +               can_handle_dvbs2x = supportsDeliverySystem(SYS_DVBS2X, true);
245                 if (feparm->getDVBS(sat_parm) < 0)
246                 {
247                         return 0;
248                 }
249 +               if (sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S2X && !can_handle_dvbs2x)
250 +               {
251 +                       return 0;
252 +               }
253                 if (sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S2 && !can_handle_dvbs2)
254                 {
255                         return 0;
256 @@ -2897,17 +2952,18 @@ void eDVBFrontend::setDeliverySystemWhitelist(const std::vector<fe_delivery_syst
257  
258  bool eDVBFrontend::setSlotInfo(ePyObject obj)
259  {
260 -       ePyObject Id, Descr, Enabled, IsDVBS2, IsDVBT2, frontendId;
261 -       if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 6)
262 +       ePyObject Id, Descr, Enabled, IsDVBS2, IsDVBT2, IsDVBS2X, frontendId;
263 +       if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 7)
264                 goto arg_error;
265         Id = PyTuple_GET_ITEM(obj, 0);
266         Descr = PyTuple_GET_ITEM(obj, 1);
267         Enabled = PyTuple_GET_ITEM(obj, 2);
268         IsDVBS2 = PyTuple_GET_ITEM(obj, 3);
269         IsDVBT2 = PyTuple_GET_ITEM(obj, 4);
270 -       frontendId = PyTuple_GET_ITEM(obj, 5);
271 +       IsDVBS2X = PyTuple_GET_ITEM(obj, 5);
272 +       frontendId = PyTuple_GET_ITEM(obj, 6);
273         m_slotid = PyInt_AsLong(Id);
274 -       if (!PyInt_Check(Id) || !PyString_Check(Descr) || !PyBool_Check(Enabled) || !PyBool_Check(IsDVBS2) || !PyBool_Check(IsDVBT2) || !PyInt_Check(frontendId))
275 +       if (!PyInt_Check(Id) || !PyString_Check(Descr) || !PyBool_Check(Enabled) || !PyBool_Check(IsDVBS2) || !PyBool_Check(IsDVBT2) || !PyBool_Check(IsDVBS2X) || !PyInt_Check(frontendId))
276                 goto arg_error;
277         strcpy(m_description, PyString_AS_STRING(Descr));
278         if (PyInt_AsLong(frontendId) == -1 || PyInt_AsLong(frontendId) != m_dvbid) {
279 @@ -2931,9 +2987,14 @@ bool eDVBFrontend::setSlotInfo(ePyObject obj)
280                 /* HACK for legacy dvb api without DELSYS support */
281                 m_delsys[SYS_DVBT2] = true;
282         }
283 +       if (IsDVBS2X == Py_True)
284 +       {
285 +               /* HACK for legacy dvb api without DELSYS support */
286 +               m_delsys[SYS_DVBS2X] = true;
287 +       }
288  
289 -       eDebugNoSimulate("setSlotInfo for dvb frontend %d to slotid %d, descr %s, need rotorworkaround %s, enabled %s, DVB-S2 %s, DVB-T2 %s",
290 -               m_dvbid, m_slotid, m_description, m_need_rotor_workaround ? "Yes" : "No", Enabled == Py_True ? "Yes" : "No", IsDVBS2 == Py_True ? "Yes" : "No", IsDVBT2 == Py_True ? "Yes" : "No" );
291 +       eDebugNoSimulate("setSlotInfo for dvb frontend %d to slotid %d, descr %s, need rotorworkaround %s, enabled %s, DVB-S2 %s, DVB-T2 %s, DVB-S2X %s",
292 +               m_dvbid, m_slotid, m_description, m_need_rotor_workaround ? "Yes" : "No", Enabled == Py_True ? "Yes" : "No", IsDVBS2 == Py_True ? "Yes" : "No", IsDVBT2 == Py_True ? "Yes" : "No", IsDVBS2X == Py_True ? "Yes" : "No");
293         return true;
294  arg_error:
295         PyErr_SetString(PyExc_StandardError,
296 diff --git a/lib/dvb/frontendparms.h b/lib/dvb/frontendparms.h
297 index c4989fbc..c941ca69 100644
298 --- a/lib/dvb/frontendparms.h
299 +++ b/lib/dvb/frontendparms.h
300 @@ -21,15 +21,19 @@ struct eDVBFrontendParametersSatellite
301         };
302  
303         enum {
304 -               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_None=15
305 +               FEC_Auto=0, FEC_1_2=1, FEC_2_3=2, FEC_3_4=3, FEC_5_6=4, FEC_7_8=5, FEC_8_9=6, FEC_3_5=7, FEC_4_5=8, FEC_9_10=9, FEC_None=15,
306 +               FEC_13_45=16, FEC_9_20=17, FEC_11_20=18, FEC_23_36=19, FEC_25_36=20,
307 +               FEC_13_18=21, FEC_26_45=22, FEC_28_45=23, FEC_7_9=24, FEC_77_90=25,
308 +               FEC_32_45=26, FEC_11_15=27, FEC_1_2_L=28, FEC_8_15_L=29, FEC_3_5_L=30,
309 +               FEC_2_3_L=31, FEC_5_9_L=32, FEC_26_45_L=33
310         };
311  
312         enum {
313 -               System_DVB_S, System_DVB_S2
314 +               System_DVB_S, System_DVB_S2, System_DVB_S2X
315         };
316  
317         enum {
318 -               Modulation_Auto, Modulation_QPSK, Modulation_8PSK, Modulation_QAM16
319 +               Modulation_Auto, Modulation_QPSK, Modulation_8PSK, Modulation_QAM16, Modulation_16APSK, Modulation_32APSK, Modulation_8APSK
320         };
321  
322         // dvb-s2
323 diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp
324 index 969ed9fa..1f045df8 100644
325 --- a/lib/dvb/scan.cpp
326 +++ b/lib/dvb/scan.cpp
327 @@ -832,15 +832,41 @@ void eDVBScan::channelDone()
328                         {
329                                 case iDVBFrontend::feSatellite:
330                                 {
331 +                                       char system_name[255];
332 +                                       char modulation_name[255];
333 +                                       memset(system_name, 0, sizeof(system_name));
334 +                                       memset(modulation_name, 0, sizeof(modulation_name));
335 +
336                                         eDVBFrontendParametersSatellite parm;
337                                         m_ch_current->getDVBS(parm);
338 +
339 +                                       if (parm.system == eDVBFrontendParametersSatellite::System_DVB_S2)
340 +                                               strcpy(system_name, "DVB-S2");
341 +                                       else if (parm.system == eDVBFrontendParametersSatellite::System_DVB_S2X)
342 +                                               strcpy(system_name, "DVB-S2X");
343 +                                       else
344 +                                               strcpy(system_name, "DVB-S");
345 +
346 +                                       if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_QPSK)
347 +                                               strcpy(modulation_name, "QPSK");
348 +                                       else if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_8PSK)
349 +                                               strcpy(modulation_name, "8PSK");
350 +                                       else if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_8APSK)
351 +                                               strcpy(modulation_name, "8APSK");
352 +                                       else if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_16APSK)
353 +                                               strcpy(modulation_name, "16APSK");
354 +                                       else if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_32APSK)
355 +                                               strcpy(modulation_name, "32APSK");
356 +                                       else
357 +                                               strcpy(modulation_name, "8PSK");
358 +
359                                         snprintf(sname, 255, "%d%c SID 0x%02x",
360                                                         parm.frequency/1000,
361                                                         parm.polarisation ? 'V' : 'H',
362                                                         m_pmt_in_progress->first);
363                                         snprintf(pname, 255, "%s %s %d%c %d.%d°%c",
364 -                                               parm.system ? "DVB-S2" : "DVB-S",
365 -                                               parm.modulation == 1 ? "QPSK" : "8PSK",
366 +                                               system_name,
367 +                                               modulation_name,
368                                                 parm.frequency/1000,
369                                                 parm.polarisation ? 'V' : 'H',
370                                                 parm.orbital_position/10,
371 diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py
372 index b92ad92b..d726fece 100755
373 --- a/lib/python/Components/NimManager.py
374 +++ b/lib/python/Components/NimManager.py
375 @@ -153,7 +153,7 @@ class SecConfigure:
376  
377                 for slot in nim_slots:
378                         if slot.type is not None:
379 -                               used_nim_slots.append((slot.slot, slot.description, slot.config.configMode.value != "nothing" and True or False, slot.isCompatible("DVB-S2"), slot.isCompatible("DVB-T2"), slot.frontend_id is None and -1 or slot.frontend_id))
380 +                               used_nim_slots.append((slot.slot, slot.description, slot.config.configMode.value != "nothing" and True or False, slot.isCompatible("DVB-S2"), slot.isCompatible("DVB-T2"), slot.isCompatible("DVB-S2X"), slot.frontend_id is None and -1 or slot.frontend_id))
381                 eDVBResourceManager.getInstance().setFrontendSlotInformations(used_nim_slots)
382  
383                 for slot in nim_slots:
384 @@ -510,7 +510,7 @@ class NIM(object):
385         def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None, multi_type = {}, frontend_id = None, i2c = None, is_empty = False):
386                 self.slot = slot
387  
388 -               if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", "DVB-T2", None):
389 +               if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", "DVB-T2", "DVB-S2X", None):
390                         print "warning: unknown NIM type %s, not using." % type
391                         type = None
392  
393 @@ -528,7 +528,8 @@ class NIM(object):
394                                 "DVB-C": ("DVB-C", None),
395                                 "DVB-T": ("DVB-T", None),
396                                 "DVB-S2": ("DVB-S", "DVB-S2", None),
397 -                               "DVB-T2": ("DVB-T", "DVB-T2", None)
398 +                               "DVB-T2": ("DVB-T", "DVB-T2", None),
399 +                               "DVB-S2X": ("DVB-S", "DVB-S2", "DVB-S2X", None),
400                         }
401  
402         def getType(self):
403 @@ -558,7 +559,8 @@ class NIM(object):
404                                 "DVB-C": ("DVB-C",),
405                                 "DVB-T": ("DVB-T",),
406                                 "DVB-S2": ("DVB-S", "DVB-S2"),
407 -                               "DVB-T2": ("DVB-T", "DVB-T2",)
408 +                               "DVB-T2": ("DVB-T", "DVB-T2",),
409 +                               "DVB-S2X": ("DVB-S", "DVB-S2", "DVB-S2X"),
410                         }
411                 return connectable[self.getType()]
412  
413 @@ -615,6 +617,7 @@ class NIM(object):
414                         "DVB-C": "DVB-C",
415                         "DVB-S2": "DVB-S2",
416                         "DVB-T2": "DVB-T2",
417 +                       "DVB-S2X": "DVB-S2X",
418                         None: _("empty")
419                         }[self.getType()]
420  
421 @@ -798,13 +801,20 @@ class NimManager:
422  
423                         # get MultiType from DTV_ENUM_DELSYS
424                         if entry["frontend_device"] is not None:
425 -                               types = [type for type in ["DVB-C", "DVB-T2", "DVB-T", "DVB-S2", "DVB-S", "ATSC"] if eDVBResourceManager.getInstance().frontendIsCompatible(entry["frontend_device"], type)]
426 +                               types = [type for type in ["DVB-C", "DVB-T2", "DVB-T", "DVB-S2", "DVB-S", "ATSC", "DVB-S2X"] if eDVBResourceManager.getInstance().frontendIsCompatible(entry["frontend_device"], type)]
427                                 if "DVB-T2" in types and "DVB-T" in types:
428                                         # DVB-T2 implies DVB-T support
429                                         types.remove("DVB-T")
430                                 if "DVB-S2" in types and "DVB-S" in types:
431                                         # DVB-S2 implies DVB-S support
432                                         types.remove("DVB-S")
433 +                               if "DVB-S2X" in types:
434 +                                       if "DVB-S" in types:
435 +                                               # DVB-S2X implies DVB-S support
436 +                                               types.remove("DVB-S")
437 +                                       if "DVB-S2" in types:
438 +                                               # DVB-S2X implies DVB-S2 support
439 +                                               types.remove("DVB-S2")
440                                 if len(types) > 1:
441                                         entry["multi_type"] = {}
442                                         for type in types:
443 @@ -908,6 +918,8 @@ class NimManager:
444                         type = "DVB-S"
445                 elif type == "DVB-T2":
446                         type = "DVB-T"
447 +               elif type == "DVB-S2X":
448 +                       type = "DVB-S"
449                 nimList = self.getNimListOfType(type, slotid)
450                 for nim in nimList[:]:
451                         mode = self.getNimConfig(nim)
452 @@ -921,6 +933,8 @@ class NimManager:
453                         type = "DVB-S"
454                 elif type == "DVB-T2":
455                         type = "DVB-T"
456 +               elif type == "DVB-S2X":
457 +                       type = "DVB-S"
458                 nimList = self.getNimListOfType(type, slotid)
459                 positionerList = []
460                 for nim in nimList[:]:
461 diff --git a/lib/python/Components/ServiceScan.py b/lib/python/Components/ServiceScan.py
462 index 6a82ade0..74123861 100644
463 --- a/lib/python/Components/ServiceScan.py
464 +++ b/lib/python/Components/ServiceScan.py
465 @@ -54,9 +54,11 @@ class ServiceScan:
466                                                 else:
467                                                         network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h)
468                                                 tp_text = ("%s %s %d%c / %d / %s") %( { tp.System_DVB_S : "DVB-S",
469 -                                                       tp.System_DVB_S2 : "DVB-S2" }.get(tp.system, tp.System_DVB_S),
470 +                                                       tp.System_DVB_S2 : "DVB-S2" , tp.System_DVB_S2X : "DVB-S2X"}.get(tp.system, tp.System_DVB_S),
471                                                         { tp.Modulation_Auto : "Auto", tp.Modulation_QPSK : "QPSK",
472 -                                                               tp.Modulation_8PSK : "8PSK", tp.Modulation_QAM16 : "QAM16" }.get(tp.modulation, tp.Modulation_QPSK),
473 +                                                               tp.Modulation_8PSK : "8PSK", tp.Modulation_QAM16 : "QAM16",
474 +                                                               tp.Modulation_8APSK : "8APSK", tp.Modulation_16APSK : "16APSK",
475 +                                                               tp.Modulation_32APSK : "32APSK"}.get(tp.modulation, tp.Modulation_QPSK),
476                                                         tp.frequency/1000,
477                                                         { tp.Polarisation_Horizontal : 'H', tp.Polarisation_Vertical : 'V', tp.Polarisation_CircularLeft : 'L',
478                                                                 tp.Polarisation_CircularRight : 'R' }.get(tp.polarisation, tp.Polarisation_Horizontal),
479 @@ -64,7 +66,11 @@ class ServiceScan:
480                                                         { tp.FEC_Auto : "AUTO", tp.FEC_1_2 : "1/2", tp.FEC_2_3 : "2/3",
481                                                                 tp.FEC_3_4 : "3/4", tp.FEC_5_6 : "5/6", tp.FEC_7_8 : "7/8",
482                                                                 tp.FEC_8_9 : "8/9", tp.FEC_3_5 : "3/5", tp.FEC_4_5 : "4/5",
483 -                                                               tp.FEC_9_10 : "9/10", tp.FEC_None : "NONE" }.get(tp.fec, tp.FEC_Auto))
484 +                                                               tp.FEC_9_10 : "9/10", tp.FEC_None : "NONE",
485 +                                                               tp.FEC_13_45 : "13/45", tp.FEC_9_20 : "9/20", tp.FEC_11_20 : "11/20", tp.FEC_23_36 : "23/36", tp.FEC_25_36 : "25/36",
486 +                                                               tp.FEC_13_18 : "13/18", tp.FEC_26_45 : "26/45", tp.FEC_28_45 : "28/45", tp.FEC_7_9 : "7/9", tp.FEC_77_90 : "77/90",
487 +                                                               tp.FEC_32_45 : "32/45", tp.FEC_11_15 : "11/15", tp.FEC_1_2_L : "1/2-L", tp.FEC_8_15_L : "8/15-L", tp.FEC_3_5_L : "3/5-L",
488 +                                                               tp.FEC_2_3_L : "2/3-L", tp.FEC_5_9_L : "5/9-L", tp.FEC_26_45_L : "26/45-L"}.get(tp.fec, tp.FEC_Auto))
489                                         elif tp_type == iDVBFrontend.feCable:
490                                                 network = _("Cable")
491                                                 tp = transponder.getDVBC()
492 diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py b/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py
493 index 82ce819a..5215a4b8 100644
494 --- a/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py
495 +++ b/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py
496 @@ -199,7 +199,7 @@ class Blindscan(ConfigListScreen, Screen):
497                                 defaultSat["inversion"] = frontendData.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown)
498                                 defaultSat["symbolrate"] = frontendData.get("symbol_rate", 0) / 1000
499                                 defaultSat["polarization"] = frontendData.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal)
500 -                               if defaultSat["system"] == eDVBFrontendParametersSatellite.System_DVB_S2:
501 +                               if defaultSat["system"] in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X):
502                                         defaultSat["fec_s2"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto)
503                                         defaultSat["rolloff"] = frontendData.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35)
504                                         defaultSat["pilot"] = frontendData.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)
505 @@ -305,7 +305,7 @@ class Blindscan(ConfigListScreen, Screen):
506                 print "cur is", cur
507                 if cur == self.tunerEntry or \
508                         cur == self.systemEntry or \
509 -                       (self.modulationEntry and self.systemEntry[1].value == eDVBFrontendParametersSatellite.System_DVB_S2 and cur == self.modulationEntry):
510 +                       (self.modulationEntry and (self.systemEntry[1].value in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X)) and cur == self.modulationEntry):
511                         self.createSetup()
512  
513         def checkSettings(self):
514 @@ -506,7 +506,8 @@ class Blindscan(ConfigListScreen, Screen):
515                                 if data[0] == 'OK':
516                                         parm = eDVBFrontendParametersSatellite()
517                                         sys = { "DVB-S" : eDVBFrontendParametersSatellite.System_DVB_S,
518 -                                               "DVB-S2" : eDVBFrontendParametersSatellite.System_DVB_S2}
519 +                                               "DVB-S2" : eDVBFrontendParametersSatellite.System_DVB_S2,
520 +                                               "DVB-S2X" : eDVBFrontendParametersSatellite.System_DVB_S2X}
521                                         qam = { "QPSK" : parm.Modulation_QPSK,
522                                                 "8PSK" : parm.Modulation_8PSK}
523                                         inv = { "INVERSION_OFF" : parm.Inversion_Off,
524 @@ -521,7 +522,11 @@ class Blindscan(ConfigListScreen, Screen):
525                                                 "FEC_8_9" : parm.FEC_8_9,
526                                                 "FEC_3_5" : parm.FEC_3_5,
527                                                 "FEC_9_10" : parm.FEC_9_10,
528 -                                               "FEC_NONE" : parm.FEC_None}
529 +                                               "FEC_NONE" : parm.FEC_None, 
530 +                                               "FEC_13_45" : parm.FEC_13_45, "FEC_9_20" : parm.FEC_9_20, "FEC_11_20" : parm.FEC_11_20, "FEC_23_36" : parm.FEC_23_36, "FEC_25_36" : parm.FEC_25_36,
531 +                                               "FEC_13_18" : parm.FEC_13_18, "FEC_26_45" : parm.FEC_26_45, "FEC_28_45" : parm.FEC_28_45, "FEC_7_9" : parm.FEC_7_9, "FEC_77_90" : parm.FEC_77_90,
532 +                                               "FEC_32_45" : parm.FEC_32_45, "FEC_11_15" : parm.FEC_11_15, "FEC_1_2_L" : parm.FEC_1_2_L, "FEC_8_15_L" : parm.FEC_8_15_L, "FEC_3_5_L" : parm.FEC_3_5_L,
533 +                                               "FEC_2_3_L" : parm.FEC_2_3_L, "FEC_5_9_L" : parm.FEC_5_9_L, "FEC_26_45_L" : parm.FEC_26_45_L}
534                                         roll ={ "ROLLOFF_20" : parm.RollOff_alpha_0_20,
535                                                 "ROLLOFF_25" : parm.RollOff_alpha_0_25,
536                                                 "ROLLOFF_35" : parm.RollOff_alpha_0_35}
537 diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
538 index e0971173..b94a8819 100644
539 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
540 +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
541 @@ -433,7 +433,12 @@ class TunerScreen(ScanSetup):
542                 self.systemEntry = None
543                 
544                 if tuning.type.value == "manual_transponder":
545 -                       if nim.isCompatible("DVB-S2"):
546 +                       scan_sat_system_value = self.scan_sat.system.value
547 +                       if nim.isCompatible("DVB-S2X"):
548 +                               scan_sat_system_value = self.scan_sat.system_dvbs2x.value
549 +                               self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system_dvbs2x)
550 +                               self.list.append(self.systemEntry)
551 +                       elif nim.isCompatible("DVB-S2"):
552                                 self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
553                                 self.list.append(self.systemEntry)
554                         else:
555 @@ -443,21 +448,39 @@ class TunerScreen(ScanSetup):
556                         self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
557                         self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate))
558                         self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization))
559 -                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
560 +                       if scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S:
561                                 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
562 -                       elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
563 +                       elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2:
564                                 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
565                                 self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
566                                 self.list.append(self.modulationEntry)
567                                 self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
568                                 self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
569 +                       elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2X:
570 +                               if self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_QPSK:
571 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_qpsk))
572 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8PSK:
573 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8psk))
574 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8APSK:
575 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8apsk))
576 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_16APSK:
577 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_16apsk))
578 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_32APSK:
579 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_32apsk))
580 +                               self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation_dvbs2x)
581 +                               self.list.append(self.modulationEntry)
582 +                               self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
583 +                               self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
584                 elif tuning.type.value == "predefined_transponder":
585                         self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder))
586                 self["config"].list = self.list
587                 self["config"].l.setList(self.list)
588  
589         def newConfig(self):
590 -               if self["config"].getCurrent() in (self.typeOfTuningEntry, self.satEntry, self.systemEntry):
591 +               cur = self["config"].getCurrent()
592 +               if cur in (self.typeOfTuningEntry, self.satEntry, self.systemEntry) or \
593 +                       (self.modulationEntry and (cur == self.modulationEntry) and \
594 +                       self.systemEntry and (self.systemEntry[1].value == eDVBFrontendParametersSatellite.System_DVB_S2X)):
595                         self.createSetup()
596  
597         def createConfig(self, foo):
598 @@ -499,41 +522,49 @@ class TunerScreen(ScanSetup):
599                                         pol = "CR"
600                                 else:
601                                         pol = "??"
602 -                               if x[4] == 0:
603 -                                       fec = "FEC Auto"
604 -                               elif x[4] == 1:
605 -                                       fec = "FEC 1/2"
606 -                               elif x[4] == 2:
607 -                                       fec = "FEC 2/3"
608 -                               elif x[4] == 3:
609 -                                       fec = "FEC 3/4"
610 -                               elif x[4] == 4:
611 -                                       fec = "FEC 5/6"
612 -                               elif x[4] == 5:
613 -                                       fec = "FEC 7/8"
614 -                               elif x[4] == 6:
615 -                                       fec = "FEC 8/9"
616 -                               elif x[4] == 7:
617 -                                       fec = "FEC 3/5"
618 -                               elif x[4] == 8:
619 -                                       fec = "FEC 4/5"
620 -                               elif x[4] == 9:
621 -                                       fec = "FEC 9/10"
622 -                               elif x[4] == 15:
623 -                                       fec = "FEC None"
624 -                               else:
625 +
626 +                               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", \
627 +                                                       "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC Unknown", "FEC None", \
628 +                                                       "FEC_13_45", "FEC_9_20", "FEC_11_20", "FEC_23_36", "FEC_25_36", \
629 +                                                       "FEC_13_18", "FEC_26_45", "FEC_28_45", "FEC_7_9", "FEC_77_90", \
630 +                                                       "FEC_32_45", "FEC_11_15", "FEC_1_2_L", "FEC_8_15_L", "FEC_3_5_L", \
631 +                                                       "FEC_2_3_L", "FEC_5_9_L", "FEC_26_45_L")
632 +                               if x[4] > len(fec_desc)-1:
633                                         fec = "FEC Unknown"
634 +                               else:
635 +                                       fec = fec_desc[x[4]]
636                                 tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
637                         tuning.transponder = ConfigSelection(choices=tps)
638  
639         def keyGo(self):
640                 returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
641                 satpos = int(tuning.sat.value)
642 +               nim = nimmanager.nim_slots[self.feid]
643                 if tuning.type.value == "manual_transponder":
644 -                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
645 +                       system = self.scan_sat.system.value
646 +                       modulation = self.scan_sat.modulation.value
647 +                       if nim.isCompatible("DVB-S2X"):
648 +                               system = self.scan_sat.system_dvbs2x.value
649 +                               modulation = self.scan_sat.modulation_dvbs2x.value
650 +
651 +                       if system == eDVBFrontendParametersSatellite.System_DVB_S:
652 +                               fec = self.scan_sat.fec.value
653 +                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2:
654                                 fec = self.scan_sat.fec_s2.value
655 +                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2X:
656 +                               if modulation == eDVBFrontendParametersSatellite.Modulation_QPSK:
657 +                                       fec = self.scan_sat.fec_s2x_qpsk.value
658 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8PSK:
659 +                                       fec = self.scan_sat.fec_s2x_8psk.value
660 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8APSK:
661 +                                       fec = self.scan_sat.fec_s2x_8apsk.value
662 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_16APSK:
663 +                                       fec = self.scan_sat.fec_s2x_16apsk.value
664 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_32APSK:
665 +                                       fec = self.scan_sat.fec_s2x_32apsk.value
666                         else:
667 -                               fec = self.scan_sat.fec.value
668 +                               fec = self.scan_sat.fec_s2.value
669 +
670                         returnvalue = (
671                                 self.scan_sat.frequency.value,
672                                 self.scan_sat.symbolrate.value,
673 @@ -541,8 +572,8 @@ class TunerScreen(ScanSetup):
674                                 fec,
675                                 self.scan_sat.inversion.value,
676                                 satpos,
677 -                               self.scan_sat.system.value,
678 -                               self.scan_sat.modulation.value,
679 +                               system,
680 +                               modulation,
681                                 self.scan_sat.rolloff.value,
682                                 self.scan_sat.pilot.value)
683                 elif tuning.type.value == "predefined_transponder":
684 diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
685 index e611ca53..a87ca26f 100644
686 --- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
687 +++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
688 @@ -71,7 +71,12 @@ class Satfinder(ScanSetup):
689  
690                 self.systemEntry = None
691                 if self.tuning_type.value == "manual_transponder":
692 -                       if nim.isCompatible("DVB-S2"):
693 +                       scan_sat_system_value = self.scan_sat.system.value
694 +                       if nim.isCompatible("DVB-S2X"):
695 +                                       scan_sat_system_value = self.scan_sat.system_dvbs2x.value
696 +                                       self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system_dvbs2x)
697 +                                       self.list.append(self.systemEntry)
698 +                       elif nim.isCompatible("DVB-S2"):
699                                 self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
700                                 self.list.append(self.systemEntry)
701                         else:
702 @@ -81,14 +86,29 @@ class Satfinder(ScanSetup):
703                         self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
704                         self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate))
705                         self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization))
706 -                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
707 +                       if scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S:
708                                 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
709 -                       elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
710 +                       elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2:
711                                 self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
712                                 self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
713                                 self.list.append(self.modulationEntry)
714                                 self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
715                                 self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
716 +                       elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2X:
717 +                               if self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_QPSK:
718 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_qpsk))
719 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8PSK:
720 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8psk))
721 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8APSK:
722 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8apsk))
723 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_16APSK:
724 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_16apsk))
725 +                               elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_32APSK:
726 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_32apsk))
727 +                               self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation_dvbs2x)
728 +                               self.list.append(self.modulationEntry)
729 +                               self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
730 +                               self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
731                 elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder":
732                         self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder))
733                 self["config"].list = self.list
734 @@ -101,6 +121,9 @@ class Satfinder(ScanSetup):
735                 elif cur == self.satEntry:
736                         self.updateSats()
737                         self.createSetup()
738 +               elif self.modulationEntry and (cur == self.modulationEntry) and \
739 +                       self.systemEntry and (self.systemEntry[1].value == eDVBFrontendParametersSatellite.System_DVB_S2X):
740 +                       self.createSetup()
741  
742         def sat_changed(self, config_element):
743                 self.newConfig()
744 @@ -109,11 +132,29 @@ class Satfinder(ScanSetup):
745         def retune(self, configElement):
746                 returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
747                 satpos = int(self.tuning_sat.value)
748 +               nim = nimmanager.nim_slots[self.feid]
749                 if self.tuning_type.value == "manual_transponder":
750 -                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
751 -                               fec = self.scan_sat.fec_s2.value
752 -                       else:
753 +                       system = self.scan_sat.system.value
754 +                       modulation = self.scan_sat.modulation.value
755 +                       if nim.isCompatible("DVB-S2X"):
756 +                               system = self.scan_sat.system_dvbs2x.value
757 +                               modulation = self.scan_sat.modulation_dvbs2x.value
758 +
759 +                       if system == eDVBFrontendParametersSatellite.System_DVB_S:
760                                 fec = self.scan_sat.fec.value
761 +                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2:
762 +                               fec = self.scan_sat.fec_s2.value
763 +                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2X:
764 +                               if modulation == eDVBFrontendParametersSatellite.Modulation_QPSK:
765 +                                       fec = self.scan_sat.fec_s2x_qpsk.value
766 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8PSK:
767 +                                       fec = self.scan_sat.fec_s2x_8psk.value
768 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8APSK:
769 +                                       fec = self.scan_sat.fec_s2x_8apsk.value
770 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_16APSK:
771 +                                       fec = self.scan_sat.fec_s2x_16apsk.value
772 +                               elif modulation == eDVBFrontendParametersSatellite.Modulation_32APSK:
773 +                                       fec = self.scan_sat.fec_s2x_32apsk.value
774                         returnvalue = (
775                                 self.scan_sat.frequency.value,
776                                 self.scan_sat.symbolrate.value,
777 @@ -121,8 +162,8 @@ class Satfinder(ScanSetup):
778                                 fec,
779                                 self.scan_sat.inversion.value,
780                                 satpos,
781 -                               self.scan_sat.system.value,
782 -                               self.scan_sat.modulation.value,
783 +                               system,
784 +                               modulation,
785                                 self.scan_sat.rolloff.value,
786                                 self.scan_sat.pilot.value)
787                         self.tune(returnvalue)
788 @@ -143,11 +184,19 @@ class Satfinder(ScanSetup):
789                 
790                 self.updateSats()
791  
792 -               for x in (self.tuning_type, self.tuning_sat, self.scan_sat.frequency,
793 +               setup_list = [self.tuning_type, self.tuning_sat, self.scan_sat.frequency,
794                         self.scan_sat.inversion, self.scan_sat.symbolrate,
795                         self.scan_sat.polarization, self.scan_sat.fec, self.scan_sat.pilot,
796                         self.scan_sat.fec_s2, self.scan_sat.fec, self.scan_sat.modulation,
797 -                       self.scan_sat.rolloff, self.scan_sat.system):
798 +                       self.scan_sat.rolloff, self.scan_sat.system]
799 +
800 +               nim = nimmanager.nim_slots[self.feid]
801 +               if nim.isCompatible("DVB-S2X"):
802 +                       dvbs2x_setup_list = [self.scan_sat.system_dvbs2x, self.scan_sat.modulation_dvbs2x, self.scan_sat.fec_s2x_qpsk,
803 +                               self.scan_sat.fec_s2x_8psk, self.scan_sat.fec_s2x_8apsk, self.scan_sat.fec_s2x_16apsk, self.scan_sat.fec_s2x_32apsk]
804 +                       setup_list.extend(dvbs2x_setup_list)
805 +
806 +               for x in setup_list:
807                         x.addNotifier(self.retune, initial_call = False)
808  
809         def updateSats(self):
810 diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py
811 index 9cc6dea9..b7f57887 100644
812 --- a/lib/python/Screens/ScanSetup.py
813 +++ b/lib/python/Screens/ScanSetup.py
814 @@ -7,6 +7,7 @@ from Components.ActionMap import NumberActionMap, ActionMap
815  from Components.ConfigList import ConfigListScreen
816  from Components.NimManager import nimmanager, getConfigSatlist
817  from Components.Label import Label
818 +from Components.SystemInfo import SystemInfo
819  from Tools.Directories import resolveFilename, SCOPE_DEFAULTPARTITIONMOUNTDIR, SCOPE_DEFAULTDIR, SCOPE_DEFAULTPARTITION
820  from Tools.HardwareInfo import HardwareInfo
821  from Screens.MessageBox import MessageBox
822 @@ -601,7 +602,13 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
823                 if nim.isCompatible("DVB-S"):
824                         if self.scan_type.value == "single_transponder":
825                                 self.updateSatList()
826 -                               if nim.isCompatible("DVB-S2"):
827 +
828 +                               scan_sat_system_value = self.scan_sat.system.value
829 +                               if nim.isCompatible("DVB-S2X"):
830 +                                       scan_sat_system_value = self.scan_sat.system_dvbs2x.value
831 +                                       self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system_dvbs2x)
832 +                                       self.list.append(self.systemEntry)
833 +                               elif nim.isCompatible("DVB-S2"):
834                                         self.systemEntry = getConfigListEntry(_('System'), self.scan_sat.system)
835                                         self.list.append(self.systemEntry)
836                                 else:
837 @@ -612,14 +619,34 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
838                                 self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
839                                 self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate))
840                                 self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization))
841 -                               if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
842 -                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
843 -                               elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2:
844 -                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
845 +
846 +                               if scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2:
847                                         self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation)
848                                         self.list.append(self.modulationEntry)
849                                         self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
850                                         self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
851 +                               elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2X:
852 +                                       self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation_dvbs2x)
853 +                                       self.list.append(self.modulationEntry)
854 +                                       self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff))
855 +                                       self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot))
856 +
857 +                               if scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S:
858 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
859 +                               elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2:
860 +                                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2))
861 +                               elif scan_sat_system_value == eDVBFrontendParametersSatellite.System_DVB_S2X:
862 +                                       if self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_QPSK:
863 +                                               self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_qpsk))
864 +                                       elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8PSK:
865 +                                               self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8psk))
866 +                                       elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_8APSK:
867 +                                               self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_8apsk))
868 +                                       elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_16APSK:
869 +                                               self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_16apsk))
870 +                                       elif self.scan_sat.modulation_dvbs2x.value == eDVBFrontendParametersSatellite.Modulation_32APSK:
871 +                                               self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2x_32apsk))
872 +
873                         elif self.scan_type.value == "single_satellite":
874                                 self.updateSatList()
875                                 print self.scan_satselection[index_to_scan]
876 @@ -686,43 +713,18 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
877         def newConfig(self):
878                 cur = self["config"].getCurrent()
879                 print "cur is", cur
880 +               if cur is None:
881 +                       return
882 +
883                 if cur == self.typeOfScanEntry or \
884                         cur == self.tunerEntry or \
885                         cur == self.systemEntry or \
886 -                       (self.modulationEntry and self.systemEntry[1].value == eDVBFrontendParametersSatellite.System_DVB_S2 and cur == self.modulationEntry):
887 +                       (self.modulationEntry and \
888 +                       (self.systemEntry[1].value in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X)) and \
889 +                       cur == self.modulationEntry):
890                         self.createSetup()
891  
892         def createConfig(self, frontendData):
893 -                                                          #("Type", frontendData["system"], TYPE_TEXT),
894 -                                          #("Modulation", frontendData["modulation"], TYPE_TEXT),
895 -                                          #("Orbital position", frontendData["orbital_position"], TYPE_VALUE_DEC),
896 -                                          #("Frequency", frontendData["frequency"], TYPE_VALUE_DEC),
897 -                                          #("Symbolrate", frontendData["symbol_rate"], TYPE_VALUE_DEC),
898 -                                          #("Polarization", frontendData["polarization"], TYPE_TEXT),
899 -                                          #("Inversion", frontendData["inversion"], TYPE_TEXT),
900 -                                          #("FEC inner", frontendData["fec_inner"], TYPE_TEXT),
901 -                                               #)
902 -               #elif frontendData["tuner_type"] == "DVB-C":
903 -                       #return ( ("NIM", ['A', 'B', 'C', 'D'][frontendData["tuner_number"]], TYPE_TEXT),
904 -                                          #("Type", frontendData["tuner_type"], TYPE_TEXT),
905 -                                          #("Frequency", frontendData["frequency"], TYPE_VALUE_DEC),
906 -                                          #("Symbolrate", frontendData["symbol_rate"], TYPE_VALUE_DEC),
907 -                                          #("Modulation", frontendData["modulation"], TYPE_TEXT),
908 -                                          #("Inversion", frontendData["inversion"], TYPE_TEXT),
909 -                       #                  ("FEC inner", frontendData["fec_inner"], TYPE_TEXT),
910 -                                               #)
911 -               #elif frontendData["tuner_type"] == "DVB-T":
912 -                       #return ( ("NIM", ['A', 'B', 'C', 'D'][frontendData["tuner_number"]], TYPE_TEXT),
913 -                                          #("Type", frontendData["tuner_type"], TYPE_TEXT),
914 -                                          #("Frequency", frontendData["frequency"], TYPE_VALUE_DEC),
915 -                                          #("Inversion", frontendData["inversion"], TYPE_TEXT),
916 -                                          #("Bandwidth", frontendData["bandwidth"], TYPE_VALUE_DEC),
917 -                                          #("CodeRateLP", frontendData["code_rate_lp"], TYPE_TEXT),
918 -                                          #("CodeRateHP", frontendData["code_rate_hp"], TYPE_TEXT),
919 -                                          #("Constellation", frontendData["constellation"], TYPE_TEXT),
920 -                                          #("Transmission Mode", frontendData["transmission_mode"], TYPE_TEXT),
921 -                                          #("Guard Interval", frontendData["guard_interval"], TYPE_TEXT),
922 -                                          #("Hierarchy Inform.", frontendData["hierarchy_information"], TYPE_TEXT),
923                         defaultSat = {
924                                 "orbpos": 192,
925                                 "system": eDVBFrontendParametersSatellite.System_DVB_S,
926 @@ -732,7 +734,13 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
927                                 "polarization": eDVBFrontendParametersSatellite.Polarisation_Horizontal,
928                                 "fec": eDVBFrontendParametersSatellite.FEC_Auto,
929                                 "fec_s2": eDVBFrontendParametersSatellite.FEC_9_10,
930 -                               "modulation": eDVBFrontendParametersSatellite.Modulation_QPSK }
931 +                               "fec_s2x_qpsk": eDVBFrontendParametersSatellite.FEC_13_45,
932 +                               "fec_s2x_8psk": eDVBFrontendParametersSatellite.FEC_23_36,
933 +                               "fec_s2x_8apsk": eDVBFrontendParametersSatellite.FEC_5_9_L,
934 +                               "fec_s2x_16apsk": eDVBFrontendParametersSatellite.FEC_1_2_L,
935 +                               "fec_s2x_32apsk": eDVBFrontendParametersSatellite.FEC_2_3_L,
936 +                               "modulation": eDVBFrontendParametersSatellite.Modulation_QPSK,
937 +                               "modulation_s2x": eDVBFrontendParametersSatellite.Modulation_QPSK}
938                         defaultCab = {
939                                 "frequency": 466,
940                                 "inversion": eDVBFrontendParametersCable.Inversion_Unknown,
941 @@ -760,14 +768,34 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
942                                         defaultSat["inversion"] = frontendData.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown)
943                                         defaultSat["symbolrate"] = frontendData.get("symbol_rate", 0) / 1000
944                                         defaultSat["polarization"] = frontendData.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal)
945 +                                       defaultSat["orbpos"] = frontendData.get("orbital_position", 0)
946 +
947 +                                       defaultSat["modulation"] = frontendData.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK)
948 +                                       defaultSat["modulation_s2x"] = frontendData.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK)
949 +
950 +                                       if defaultSat["modulation"] > eDVBFrontendParametersSatellite.Modulation_8PSK:
951 +                                               defaultSat["modulation"] = eDVBFrontendParametersSatellite.Modulation_8PSK
952 +
953                                         if defaultSat["system"] == eDVBFrontendParametersSatellite.System_DVB_S2:
954                                                 defaultSat["fec_s2"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto)
955 -                                               defaultSat["rolloff"] = frontendData.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35)
956 -                                               defaultSat["pilot"] = frontendData.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)
957 +                                       elif defaultSat["system"] == eDVBFrontendParametersSatellite.System_DVB_S2X:
958 +                                               if defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_QPSK:
959 +                                                       defaultSat["fec_s2x_qpsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_13_45)
960 +                                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_8PSK:
961 +                                                       defaultSat["fec_s2x_8psk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_23_36)
962 +                                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_8APSK:
963 +                                                       defaultSat["fec_s2x_8apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_5_9_L)
964 +                                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_16APSK:
965 +                                                       defaultSat["fec_s2x_16apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_1_2_L)
966 +                                               elif defaultSat["modulation_s2x"] == eDVBFrontendParametersSatellite.Modulation_32APSK:
967 +                                                       defaultSat["fec_s2x_32apsk"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_2_3_L)
968                                         else:
969                                                 defaultSat["fec"] = frontendData.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto)
970 -                                       defaultSat["modulation"] = frontendData.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK)
971 -                                       defaultSat["orbpos"] = frontendData.get("orbital_position", 0)
972 +
973 +                                       if defaultSat["system"] in (eDVBFrontendParametersSatellite.System_DVB_S2, eDVBFrontendParametersSatellite.System_DVB_S2X):
974 +                                               defaultSat["rolloff"] = frontendData.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35)
975 +                                               defaultSat["pilot"] = frontendData.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)
976 +
977                                 elif ttype == "DVB-C":
978                                         defaultCab["frequency"] = frontendData.get("frequency", 0) / 1000
979                                         defaultCab["symbolrate"] = frontendData.get("symbol_rate", 0) / 1000
980 @@ -822,9 +850,17 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
981                         self.scan_ber.enabled = False
982  
983                         # sat
984 -                       self.scan_sat.system = ConfigSelection(default = defaultSat["system"], choices = [
985 +                       sat_choices = [
986 +                               (eDVBFrontendParametersSatellite.System_DVB_S, _("DVB-S")),
987 +                               (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2"))]
988 +
989 +                       sat_choices_dvbs2x = [
990                                 (eDVBFrontendParametersSatellite.System_DVB_S, _("DVB-S")),
991 -                               (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2"))])
992 +                               (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2")),
993 +                               (eDVBFrontendParametersSatellite.System_DVB_S2X, _("DVB-S2X"))]
994 +
995 +                       self.scan_sat.system = ConfigSelection(default = defaultSat["system"], choices = sat_choices)
996 +                       self.scan_sat.system_dvbs2x = ConfigSelection(default = defaultSat["system"], choices = sat_choices_dvbs2x)
997                         self.scan_sat.frequency = ConfigInteger(default = defaultSat["frequency"], limits = (1, 99999))
998                         self.scan_sat.inversion = ConfigSelection(default = defaultSat["inversion"], choices = [
999                                 (eDVBFrontendParametersSatellite.Inversion_Off, _("Off")),
1000 @@ -854,9 +890,51 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
1001                                 (eDVBFrontendParametersSatellite.FEC_7_8, "7/8"),
1002                                 (eDVBFrontendParametersSatellite.FEC_8_9, "8/9"),
1003                                 (eDVBFrontendParametersSatellite.FEC_9_10, "9/10")])
1004 +
1005 +                       self.scan_sat.fec_s2x_qpsk = ConfigSelection(default = defaultSat["fec_s2x_qpsk"], choices = [
1006 +                               (eDVBFrontendParametersSatellite.FEC_13_45, "13/45"),
1007 +                               (eDVBFrontendParametersSatellite.FEC_9_20, "9/20"),
1008 +                               (eDVBFrontendParametersSatellite.FEC_11_20, "11/20")])
1009 +
1010 +                       self.scan_sat.fec_s2x_8psk = ConfigSelection(default = defaultSat["fec_s2x_8psk"], choices = [
1011 +                               (eDVBFrontendParametersSatellite.FEC_23_36, "23/36"),
1012 +                               (eDVBFrontendParametersSatellite.FEC_25_36, "25/36"),
1013 +                               (eDVBFrontendParametersSatellite.FEC_13_18, "13/28")])
1014 +
1015 +                       self.scan_sat.fec_s2x_8apsk = ConfigSelection(default = defaultSat["fec_s2x_8apsk"], choices = [
1016 +                               (eDVBFrontendParametersSatellite.FEC_5_9_L, "5/9-L"),
1017 +                               (eDVBFrontendParametersSatellite.FEC_26_45_L, "26/45-L")])
1018 +
1019 +                       self.scan_sat.fec_s2x_16apsk = ConfigSelection(default = defaultSat["fec_s2x_16apsk"], choices = [
1020 +                               (eDVBFrontendParametersSatellite.FEC_1_2_L, "1/2-L"),
1021 +                               (eDVBFrontendParametersSatellite.FEC_8_15_L, "8/15-L"),
1022 +                               (eDVBFrontendParametersSatellite.FEC_5_9_L, "5/9-L"),
1023 +                               (eDVBFrontendParametersSatellite.FEC_26_45, "26/45"),
1024 +                               (eDVBFrontendParametersSatellite.FEC_3_5, "3/5"),
1025 +                               (eDVBFrontendParametersSatellite.FEC_3_5_L, "3/5-L"),
1026 +                               (eDVBFrontendParametersSatellite.FEC_28_45, "28/45"),
1027 +                               (eDVBFrontendParametersSatellite.FEC_23_36, "23/36"),
1028 +                               (eDVBFrontendParametersSatellite.FEC_2_3_L, "2/3-L"),
1029 +                               (eDVBFrontendParametersSatellite.FEC_25_36, "25/36"),
1030 +                               (eDVBFrontendParametersSatellite.FEC_13_18, "13/18"),
1031 +                               (eDVBFrontendParametersSatellite.FEC_7_9, "7/9"),
1032 +                               (eDVBFrontendParametersSatellite.FEC_77_90, "77/90")])
1033 +
1034 +                       self.scan_sat.fec_s2x_32apsk = ConfigSelection(default = defaultSat["fec_s2x_32apsk"], choices = [
1035 +                               (eDVBFrontendParametersSatellite.FEC_2_3_L, "2/3-L"),
1036 +                               (eDVBFrontendParametersSatellite.FEC_32_45, "32/45"),
1037 +                               (eDVBFrontendParametersSatellite.FEC_11_15, "11/15"),
1038 +                               (eDVBFrontendParametersSatellite.FEC_7_9, "7/9")])
1039 +
1040                         self.scan_sat.modulation = ConfigSelection(default = defaultSat["modulation"], choices = [
1041                                 (eDVBFrontendParametersSatellite.Modulation_QPSK, "QPSK"),
1042                                 (eDVBFrontendParametersSatellite.Modulation_8PSK, "8PSK")])
1043 +                       self.scan_sat.modulation_dvbs2x = ConfigSelection(default = defaultSat["modulation_s2x"], choices = [
1044 +                               (eDVBFrontendParametersSatellite.Modulation_QPSK, "QPSK"),
1045 +                               (eDVBFrontendParametersSatellite.Modulation_8PSK, "8PSK"),
1046 +                               (eDVBFrontendParametersSatellite.Modulation_8APSK, "8APSK"),
1047 +                               (eDVBFrontendParametersSatellite.Modulation_16APSK, "16APSK"),
1048 +                               (eDVBFrontendParametersSatellite.Modulation_32APSK, "32APSK")])
1049                         self.scan_sat.rolloff = ConfigSelection(default = defaultSat.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35), choices = [
1050                                 (eDVBFrontendParametersSatellite.RollOff_alpha_0_35, "0.35"),
1051                                 (eDVBFrontendParametersSatellite.RollOff_alpha_0_25, "0.25"),
1052 @@ -1072,13 +1150,34 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
1053                                 nimsats = self.satList[index_to_scan]
1054                                 selsatidx = self.scan_satselection[index_to_scan].index
1055  
1056 +                               modulation = self.scan_sat.modulation.value
1057                                 # however, the satList itself could be empty. in that case, "index" is 0 (for "None").
1058                                 if len(nimsats):
1059                                         orbpos = nimsats[selsatidx][0]
1060 -                                       if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S:
1061 +
1062 +                                       system = self.scan_sat.system.value
1063 +                                       if nim.isCompatible("DVB-S2X"):
1064 +                                               system = self.scan_sat.system_dvbs2x.value
1065 +
1066 +                                       if system == eDVBFrontendParametersSatellite.System_DVB_S:
1067                                                 fec = self.scan_sat.fec.value
1068 +                                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2:
1069 +                                               fec = self.scan_sat.fec_s2.value
1070 +                                       elif system == eDVBFrontendParametersSatellite.System_DVB_S2X:
1071 +                                               modulation = self.scan_sat.modulation_dvbs2x.value
1072 +                                               if modulation == eDVBFrontendParametersSatellite.Modulation_QPSK:
1073 +                                                       fec = self.scan_sat.fec_s2x_qpsk.value
1074 +                                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8PSK:
1075 +                                                       fec = self.scan_sat.fec_s2x_8psk.value
1076 +                                               elif modulation == eDVBFrontendParametersSatellite.Modulation_8APSK:
1077 +                                                       fec = self.scan_sat.fec_s2x_8apsk.value
1078 +                                               elif modulation == eDVBFrontendParametersSatellite.Modulation_16APSK:
1079 +                                                       fec = self.scan_sat.fec_s2x_16apsk.value
1080 +                                               elif modulation == eDVBFrontendParametersSatellite.Modulation_32APSK:
1081 +                                                       fec = self.scan_sat.fec_s2x_32apsk.value
1082                                         else:
1083                                                 fec = self.scan_sat.fec_s2.value
1084 +
1085                                         print "add sat transponder"
1086                                         self.addSatTransponder(tlist, self.scan_sat.frequency.value,
1087                                                                 self.scan_sat.symbolrate.value,
1088 @@ -1086,8 +1185,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, Terrest
1089                                                                 fec,
1090                                                                 self.scan_sat.inversion.value,
1091                                                                 orbpos,
1092 -                                                               self.scan_sat.system.value,
1093 -                                                               self.scan_sat.modulation.value,
1094 +                                                               system,
1095 +                                                               modulation,
1096                                                                 self.scan_sat.rolloff.value,
1097                                                                 self.scan_sat.pilot.value)
1098                                 removeAll = False
1099 diff --git a/lib/python/Tools/Transponder.py b/lib/python/Tools/Transponder.py
1100 index a8829813..2b46d0e6 100644
1101 --- a/lib/python/Tools/Transponder.py
1102 +++ b/lib/python/Tools/Transponder.py
1103 @@ -22,12 +22,34 @@ def ConvertToHumanReadable(tp, type = None):
1104                         eDVBFrontendParametersSatellite.FEC_3_5 : "3/5",
1105                         eDVBFrontendParametersSatellite.FEC_4_5 : "4/5",
1106                         eDVBFrontendParametersSatellite.FEC_8_9 : "8/9",
1107 -                       eDVBFrontendParametersSatellite.FEC_9_10 : "9/10"}[tp["fec_inner"]]
1108 +                       eDVBFrontendParametersSatellite.FEC_9_10 : "9/10",
1109 +                       eDVBFrontendParametersSatellite.FEC_13_45 : "13/45",
1110 +                       eDVBFrontendParametersSatellite.FEC_9_20 : "9/20",
1111 +                       eDVBFrontendParametersSatellite.FEC_11_20 : "11/20",
1112 +                       eDVBFrontendParametersSatellite.FEC_23_36 : "23/36",
1113 +                       eDVBFrontendParametersSatellite.FEC_25_36 : "25/36",
1114 +                       eDVBFrontendParametersSatellite.FEC_13_18 : "13/18",
1115 +                       eDVBFrontendParametersSatellite.FEC_26_45 : "26/45",
1116 +                       eDVBFrontendParametersSatellite.FEC_28_45 : "28/45",
1117 +                       eDVBFrontendParametersSatellite.FEC_7_9 : "7/9",
1118 +                       eDVBFrontendParametersSatellite.FEC_77_90 : "77/90",
1119 +                       eDVBFrontendParametersSatellite.FEC_32_45 : "32/45",
1120 +                       eDVBFrontendParametersSatellite.FEC_11_15 : "11/15",
1121 +                       eDVBFrontendParametersSatellite.FEC_1_2_L : "1/2-L",
1122 +                       eDVBFrontendParametersSatellite.FEC_8_15_L : "8/15-L",
1123 +                       eDVBFrontendParametersSatellite.FEC_3_5_L : "3/5-L",
1124 +                       eDVBFrontendParametersSatellite.FEC_2_3_L : "2/3-L",
1125 +                       eDVBFrontendParametersSatellite.FEC_5_9_L : "5/9-L",
1126 +                       eDVBFrontendParametersSatellite.FEC_26_45_L : "26/45-L"}[tp["fec_inner"]]
1127                 ret["modulation"] = {
1128                         eDVBFrontendParametersSatellite.Modulation_Auto : _("Auto"),
1129                         eDVBFrontendParametersSatellite.Modulation_QPSK : "QPSK",
1130                         eDVBFrontendParametersSatellite.Modulation_QAM16 : "QAM16",
1131 -                       eDVBFrontendParametersSatellite.Modulation_8PSK : "8PSK"}[tp["modulation"]]
1132 +                       eDVBFrontendParametersSatellite.Modulation_8PSK : "8PSK",
1133 +                       eDVBFrontendParametersSatellite.Modulation_16APSK : "16APSK",
1134 +                       eDVBFrontendParametersSatellite.Modulation_32APSK : "32APSK",
1135 +                       eDVBFrontendParametersSatellite.Modulation_8APSK : "8APSK",
1136 +                       }[tp["modulation"]]
1137                 ret["orbital_position"] = nimmanager.getSatName(int(tp["orbital_position"]))
1138                 ret["polarization"] = {
1139                         eDVBFrontendParametersSatellite.Polarisation_Horizontal : _("Horizontal"),
1140 @@ -36,8 +58,9 @@ def ConvertToHumanReadable(tp, type = None):
1141                         eDVBFrontendParametersSatellite.Polarisation_CircularRight : _("Circular right")}[tp["polarization"]]
1142                 ret["system"] = {
1143                         eDVBFrontendParametersSatellite.System_DVB_S : "DVB-S",
1144 -                       eDVBFrontendParametersSatellite.System_DVB_S2 : "DVB-S2"}[tp["system"]]
1145 -               if ret["system"] == "DVB-S2":
1146 +                       eDVBFrontendParametersSatellite.System_DVB_S2 : "DVB-S2",
1147 +                       eDVBFrontendParametersSatellite.System_DVB_S2X : "DVB-S2X"}[tp["system"]]
1148 +               if ret["system"] in ("DVB-S2", "DVB-S2X"):
1149                         ret["rolloff"] = {
1150                                 eDVBFrontendParametersSatellite.RollOff_alpha_0_35 : "0.35",
1151                                 eDVBFrontendParametersSatellite.RollOff_alpha_0_25 : "0.25",
1152 @@ -83,6 +106,7 @@ def ConvertToHumanReadable(tp, type = None):
1153                         eDVBFrontendParametersTerrestrial.FEC_1_2 : "1/2",
1154                         eDVBFrontendParametersTerrestrial.FEC_2_3 : "2/3",
1155                         eDVBFrontendParametersTerrestrial.FEC_3_4 : "3/4",
1156 +                       eDVBFrontendParametersTerrestrial.FEC_4_5 : "4/5",
1157                         eDVBFrontendParametersTerrestrial.FEC_5_6 : "5/6",
1158                         eDVBFrontendParametersTerrestrial.FEC_6_7 : "6/7",
1159                         eDVBFrontendParametersTerrestrial.FEC_7_8 : "7/8",
1160 @@ -92,6 +116,7 @@ def ConvertToHumanReadable(tp, type = None):
1161                         eDVBFrontendParametersTerrestrial.FEC_1_2 : "1/2",
1162                         eDVBFrontendParametersTerrestrial.FEC_2_3 : "2/3",
1163                         eDVBFrontendParametersTerrestrial.FEC_3_4 : "3/4",
1164 +                       eDVBFrontendParametersTerrestrial.FEC_4_5 : "4/5",
1165                         eDVBFrontendParametersTerrestrial.FEC_5_6 : "5/6",
1166                         eDVBFrontendParametersTerrestrial.FEC_6_7 : "6/7",
1167                         eDVBFrontendParametersTerrestrial.FEC_7_8 : "7/8",