Support turbo2.
[vuplus_dvbapp] / lib / python / Components / NimManager.py
index bd1a363..017e57b 100644 (file)
@@ -59,10 +59,10 @@ class SecConfigure:
                sec.setLNBLOFL(9750000)
                sec.setLNBLOFH(10600000)
                sec.setLNBThreshold(11700000)
-               sec.setLNBIncreasedVoltage(lnbParam.OFF)
+               sec.setLNBIncreasedVoltage(False)
                sec.setRepeats(0)
                sec.setFastDiSEqC(fastDiSEqC)
-               sec.setSeqRepeat(0)
+               sec.setSeqRepeat(False)
                sec.setCommandOrder(0)
 
                #user values
@@ -118,8 +118,11 @@ class SecConfigure:
 
        def linkNIMs(self, sec, nim1, nim2):
                print "link tuner", nim1, "to tuner", nim2
-               if nim2 == (nim1 - 1):
-                       self.linkInternally(nim1)
+#              if nim2 == (nim1 - 1):
+#                      self.linkInternally(nim1)
+#
+# for internally connect tuner A to B
+               self.linkInternally(nim1)
                sec.setTunerLinked(nim1, nim2)
                
        def getRoot(self, slotid, connto):
@@ -150,7 +153,7 @@ class SecConfigure:
 
                for slot in nim_slots:
                        if slot.type is not None:
-                               used_nim_slots.append((slot.slot, slot.description, slot.config.configMode.value != "nothing" and True or False, slot.isCompatible("DVB-S2"), slot.frontend_id is None and -1 or slot.frontend_id))
+                               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))
                eDVBResourceManager.getInstance().setFrontendSlotInformations(used_nim_slots)
 
                for slot in nim_slots:
@@ -262,7 +265,7 @@ class SecConfigure:
                        pass
 
                lnbSat = {}
-               for x in range(1,37):
+               for x in range(1,69):
                        lnbSat[x] = []
 
                #wildcard for all satellites ( for rotor )
@@ -279,12 +282,12 @@ class SecConfigure:
                                print "add", x[0], "to", lnb
                                lnbSat[lnb].append(x[0])
 
-               for x in range(1,37):
+               for x in range(1,69):
                        if len(lnbSat[x]) > 0:
                                currLnb = config.Nims[slotid].advanced.lnb[x]
                                sec.addLNB()
 
-                               if x < 33:
+                               if x < 65:
                                        sec.setLNBNum(x)
 
                                tunermask = 1 << slotid
@@ -307,24 +310,46 @@ class SecConfigure:
                                                manufacturer_name = configManufacturer.value
                                                manufacturer = ProductDict[manufacturer_name]
                                                product_name = manufacturer.product.value
-                                               sec.setLNBSatCR(manufacturer.scr[product_name].index)
-                                               sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000)
-                                               sec.setLNBSatCRpositions(manufacturer.positions[product_name][0].value)
-                                               sec.setLNBLOFL(manufacturer.lofl[product_name][0].value * 1000)
-                                               sec.setLNBLOFH(manufacturer.lofh[product_name][0].value * 1000)
-                                               sec.setLNBThreshold(manufacturer.loft[product_name][0].value * 1000)
-                                               configManufacturer.save_forced = True
-                                               manufacturer.product.save_forced = True
-                                               manufacturer.vco[product_name][manufacturer.scr[product_name].index].save_forced = True
-
+                                               manufacturer_scr = manufacturer.scr
+                                               manufacturer_positions_value = manufacturer.positions[product_name][0].value
+                                               position_idx = (x-1) % manufacturer_positions_value
+                                               if product_name in manufacturer_scr:
+                                                       diction = manufacturer.diction[product_name].value
+                                                       if x <= manufacturer_positions_value or diction !="EN50607": #for every allowed position
+                                                               sec.setLNBSatCR(manufacturer_scr[product_name].index)
+
+                                                               if diction =="EN50607":
+                                                                       sec.setLNBSatCRformat(1)        #JESS
+                                                               else:
+                                                                       sec.setLNBSatCRformat(0)        #DiSEqC
+                                                               sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer_scr[product_name].index].value*1000)
+                                                               sec.setLNBSatCRpositions(manufacturer_positions_value)
+                                                               sec.setLNBLOFL(manufacturer.lofl[product_name][position_idx].value * 1000)
+                                                               sec.setLNBLOFH(manufacturer.lofh[product_name][position_idx].value * 1000)
+                                                               sec.setLNBThreshold(manufacturer.loft[product_name][position_idx].value * 1000)
+                                                               configManufacturer.save_forced = True
+                                                               manufacturer.product.save_forced = True
+                                                               manufacturer.vco[product_name][manufacturer_scr[product_name].index].save_forced = True
+                                                       else: #positionnumber out of range
+                                                               print "positionnumber out of range"
+                                               else:
+                                                       print "no product in list"
+                                                       
                                        if currLnb.unicable.value == "unicable_user":
 #TODO satpositions for satcruser
+                                               if currLnb.dictionuser.value == "EN50607": 
+                                                       sec.setLNBSatCRformat(1)
+                                                       sec.setLNBSatCR(currLnb.satcruserEN50607.index)
+                                                       sec.setLNBSatCRvco(currLnb.satcrvcouserEN50607[currLnb.satcruserEN50607.index].value*1000)
+                                               else:
+                                                       sec.setLNBSatCRformat(0)
+                                                       sec.setLNBSatCR(currLnb.satcruserEN50494.index)
+                                                       sec.setLNBSatCRvco(currLnb.satcrvcouserEN50494[currLnb.satcruserEN50494.index].value*1000)
+
                                                sec.setLNBLOFL(currLnb.lofl.value * 1000)
                                                sec.setLNBLOFH(currLnb.lofh.value * 1000)
                                                sec.setLNBThreshold(currLnb.threshold.value * 1000)
-                                               sec.setLNBSatCR(currLnb.satcruser.index)
-                                               sec.setLNBSatCRvco(currLnb.satcrvcouser[currLnb.satcruser.index].value*1000)
-                                               sec.setLNBSatCRpositions(1)     #HACK
+                                               sec.setLNBSatCRpositions(64)    #HACK
                                        elif currLnb.unicable.value == "unicable_matrix":
                                                setupUnicable(currLnb.unicableMatrixManufacturer, currLnb.unicableMatrix)
                                        elif currLnb.unicable.value == "unicable_lnb":
@@ -344,9 +369,9 @@ class SecConfigure:
 #                                      pass # nyi in drivers
 
                                if currLnb.increased_voltage.value:
-                                       sec.setLNBIncreasedVoltage(lnbParam.ON)
+                                       sec.setLNBIncreasedVoltage(True)
                                else:
-                                       sec.setLNBIncreasedVoltage(lnbParam.OFF)
+                                       sec.setLNBIncreasedVoltage(False)
 
                                dm = currLnb.diseqcMode.value
                                if dm == "none":
@@ -449,8 +474,8 @@ class SecConfigure:
                                # finally add the orbital positions
                                for y in lnbSat[x]:
                                        self.addSatellite(sec, y)
-                                       if x > 32:
-                                               satpos = x > 32 and (3604-(36 - x)) or y
+                                       if x > 64:
+                                               satpos = x > 64 and (3604-(68 - x)) or y
                                        else:
                                                satpos = y
                                        currSat = config.Nims[slotid].advanced.sat[satpos]
@@ -471,7 +496,7 @@ class SecConfigure:
                                        elif currSat.tonemode.value == "off":
                                                sec.setToneMode(switchParam.OFF)
                                                
-                                       if not currSat.usals.value and x < 34:
+                                       if not currSat.usals.value and x < 66:
                                                sec.setRotorPosNum(currSat.rotorposition.value)
                                        else:
                                                sec.setRotorPosNum(0) #USALS
@@ -485,7 +510,7 @@ class NIM(object):
        def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None, multi_type = {}, frontend_id = None, i2c = None, is_empty = False):
                self.slot = slot
 
-               if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", None):
+               if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", "DVB-T2", "DVB-S2X", None):
                        print "warning: unknown NIM type %s, not using." % type
                        type = None
 
@@ -497,30 +522,47 @@ class NIM(object):
                self.i2c = i2c
                self.frontend_id = frontend_id
                self.__is_empty = is_empty
-
-       def isCompatible(self, what):
-               if not self.isSupported():
-                       return False
-               compatible = {
+               self.compatible = {
                                None: (None,),
                                "DVB-S": ("DVB-S", None),
                                "DVB-C": ("DVB-C", None),
                                "DVB-T": ("DVB-T", None),
-                               "DVB-S2": ("DVB-S", "DVB-S2", None)
+                               "DVB-S2": ("DVB-S", "DVB-S2", None),
+                               "DVB-T2": ("DVB-T", "DVB-T2", None),
+                               "DVB-S2X": ("DVB-S", "DVB-S2", "DVB-S2X", None),
                        }
-               return what in compatible[self.type]
-       
+
        def getType(self):
+               try:
+                       if self.isMultiType():
+                               return self.multi_type[self.config.multiType.value]
+               except:
+                       pass
                return self.type
+
+       def isCompatible(self, what):
+               if not self.isSupported():
+                       return False
+               return what in self.compatible[self.getType()]
+
+       def canBeCompatible(self, what):
+               if self.isCompatible(what):
+                       return True
+               for type in self.getMultiTypeList().values():
+                       if what in self.compatible[type]:
+                               return True
+               return False
        
        def connectableTo(self):
                connectable = {
                                "DVB-S": ("DVB-S", "DVB-S2"),
                                "DVB-C": ("DVB-C",),
                                "DVB-T": ("DVB-T",),
-                               "DVB-S2": ("DVB-S", "DVB-S2")
+                               "DVB-S2": ("DVB-S", "DVB-S2"),
+                               "DVB-T2": ("DVB-T", "DVB-T2",),
+                               "DVB-S2X": ("DVB-S", "DVB-S2", "DVB-S2X"),
                        }
-               return connectable[self.type]
+               return connectable[self.getType()]
 
        def getSlotName(self):
                # get a friendly description for a slot name.
@@ -561,7 +603,16 @@ class NIM(object):
        # empty tuners are supported!
        def isSupported(self):
                return (self.frontend_id is not None) or self.__is_empty
-       
+
+       def isMultistream(self):
+               multistream = self.frontend_id is not None and eDVBResourceManager.getInstance().frontendIsMultistream(self.frontend_id) or False
+               # HACK due to poor support for VTUNER_SET_FE_INFO
+               # When vtuner does not accept fe_info we have to fallback to detection using tuner name
+               # More tuner names will be added when confirmed as multistream (FE_CAN_MULTISTREAM)
+               if not multistream and "TBS" in self.description:
+                       multistream = True
+               return multistream
+
        # returns dict {<slotid>: <type>}
        def getMultiTypeList(self):
                return self.multi_type
@@ -572,10 +623,12 @@ class NIM(object):
                return {
                        "DVB-S": "DVB-S", 
                        "DVB-T": "DVB-T",
-                       "DVB-S2": "DVB-S2",
                        "DVB-C": "DVB-C",
+                       "DVB-S2": "DVB-S2",
+                       "DVB-T2": "DVB-T2",
+                       "DVB-S2X": "DVB-S2X",
                        None: _("empty")
-                       }[self.type]
+                       }[self.getType()]
 
        friendly_type = property(getFriendlyType)
 
@@ -594,7 +647,7 @@ class NIM(object):
        friendly_full_description = property(getFriendlyFullDescription)
        config_mode = property(lambda self: config.Nims[self.slot].configMode.value)
        config = property(lambda self: config.Nims[self.slot])
-       empty = property(lambda self: self.type is None)
+       empty = property(lambda self: self.getType() is None)
 
 class NimManager:
        def getConfiguredSats(self):
@@ -754,19 +807,38 @@ class NimManager:
                                entry["frontend_device"] = entry["internally_connectable"] = None
                        if not (entry.has_key("multi_type")):
                                entry["multi_type"] = {}
+
+                       # get MultiType from DTV_ENUM_DELSYS
+                       if entry["frontend_device"] is not None:
+                               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)]
+                               if "DVB-T2" in types and "DVB-T" in types:
+                                       # DVB-T2 implies DVB-T support
+                                       types.remove("DVB-T")
+                               if "DVB-S2" in types and "DVB-S" in types:
+                                       # DVB-S2 implies DVB-S support
+                                       types.remove("DVB-S")
+                               if "DVB-S2X" in types:
+                                       if "DVB-S" in types:
+                                               # DVB-S2X implies DVB-S support
+                                               types.remove("DVB-S")
+                                       if "DVB-S2" in types:
+                                               # DVB-S2X implies DVB-S2 support
+                                               types.remove("DVB-S2")
+                               if len(types) > 1:
+                                       entry["multi_type"] = {}
+                                       for type in types:
+                                               entry["multi_type"][str(types.index(type))] = type
+
                        self.nim_slots.append(NIM(slot = id, description = entry["name"], type = entry["type"], has_outputs = entry["has_outputs"], internally_connectable = entry["internally_connectable"], multi_type = entry["multi_type"], frontend_id = entry["frontend_device"], i2c = entry["i2c"], is_empty = entry["isempty"]))
 
        def hasNimType(self, chktype):
                for slot in self.nim_slots:
-                       if slot.isCompatible(chktype):
+                       if slot.canBeCompatible(chktype):
                                return True
-                       for type in slot.getMultiTypeList().values():
-                               if chktype == type:
-                                       return True
                return False
        
        def getNimType(self, slotid):
-               return self.nim_slots[slotid].type
+               return self.nim_slots[slotid].getType()
        
        def getNimDescription(self, slotid):
                return self.nim_slots[slotid].friendly_full_description
@@ -788,6 +860,9 @@ class NimManager:
                                list.append(x.slot)
                return list
 
+       def isSupportMultistream(self, slotid):
+               return self.getNim(slotid).isMultistream()
+
        def __init__(self):
                self.satList = [ ]
                self.cablesList = []
@@ -823,6 +898,10 @@ class NimManager:
                        for slot in self.getNimListOfType(type, exception = slotid):
                                if self.hasOutputs(slot):
                                        slots.append(slot)
+
+               # remove duplicates from list
+               slots = list(set(slots))
+
                # remove nims, that have a conntectedTo reference on
                for testnim in slots[:]:
                        for nim in self.getNimListOfType("DVB-S", slotid):
@@ -830,6 +909,17 @@ class NimManager:
                                if nimConfig.content.items.has_key("configMode") and nimConfig.configMode.value == "loopthrough" and int(nimConfig.connectedTo.value) == testnim:
                                        slots.remove(testnim)
                                        break 
+
+                               if nimConfig.content.items.has_key("configMode") and nimConfig.configMode.value == "advanced":
+                                       try:
+                                               if (nimConfig.advanced.unicableconnected is not None) and (nimConfig.advanced.unicableconnected.value == True):
+                                                       if int(nimConfig.advanced.unicableconnectedTo.value) == testnim:
+                                                               slots.remove(testnim)
+                                                               break
+                                       except:
+                                               pass
+
+
                slots.sort()
                
                return slots
@@ -838,6 +928,10 @@ class NimManager:
                type = self.getNimType(slotid)
                if type == "DVB-S2":
                        type = "DVB-S"
+               elif type == "DVB-T2":
+                       type = "DVB-T"
+               elif type == "DVB-S2X":
+                       type = "DVB-S"
                nimList = self.getNimListOfType(type, slotid)
                for nim in nimList[:]:
                        mode = self.getNimConfig(nim)
@@ -849,6 +943,10 @@ class NimManager:
                type = self.getNimType(slotid)
                if type == "DVB-S2":
                        type = "DVB-S"
+               elif type == "DVB-T2":
+                       type = "DVB-T"
+               elif type == "DVB-S2X":
+                       type = "DVB-S"
                nimList = self.getNimListOfType(type, slotid)
                positionerList = []
                for nim in nimList[:]:
@@ -1059,7 +1157,7 @@ def InitSecParams():
 # the C(++) part should can handle this
 # the configElement should be only visible when diseqc 1.2 is disabled
 
-def InitNimManager(nimmgr):
+def InitNimManager(nimmgr, update_slots = []):
        hw = HardwareInfo()
        addNimConfig = False
        try:
@@ -1087,11 +1185,15 @@ def InitNimManager(nimmgr):
        root = doc.getroot()
 
        entry = root.find("lnb")
+       lscr=("scr1","scr2","scr3","scr4","scr5","scr6","scr7","scr8","scr9","scr10",
+               "scr11","scr12","scr13","scr14","scr15","scr16","scr17","scr18","scr19","scr20",
+               "scr21","scr22","scr23","scr24","scr25","scr26","scr27","scr28","scr29","scr30",
+               "scr31","scr32")
        for manufacturer in entry.getchildren():
                m={}
                for product in manufacturer.getchildren():
+                       p={}                                                                                                                                            #new dict empty for new product
                        scr=[]
-                       lscr=("scr1","scr2","scr3","scr4","scr5","scr6","scr7","scr8")
                        for i in range(len(lscr)):
                                scr.append(product.get(lscr[i],"0"))
                        for i in range(len(lscr)):
@@ -1099,21 +1201,36 @@ def InitNimManager(nimmgr):
                                        scr.pop()
                                else:
                                        break;
-                       lof=[]
-                       lof.append(int(product.get("positions",1)))
-                       lof.append(int(product.get("lofl",9750)))
-                       lof.append(int(product.get("lofh",10600)))
-                       lof.append(int(product.get("threshold",11700)))
-                       scr.append(tuple(lof))
-                       m.update({product.get("name"):tuple(scr)})
+
+                       p.update({"frequencies":tuple(scr)})                                                                            #add scr frequencies to dict product
+
+                       diction = product.get("format","EN50494").upper()
+                       if diction =="JESS" or diction =="UNICABLE2" or diction =="SCD2" or diction =="EN50607":
+                               diction = "EN50607"
+                       else:
+                               diction = "EN50494"
+                       p.update({"diction":tuple([diction])})                                                                          #add diction to dict product
+
+                       positions=[]
+                       positions.append(int(product.get("positions",1)))
+                       for cnt in range(positions[0]):
+                               lof=[]
+                               lof.append(int(product.get("lofl",9750)))
+                               lof.append(int(product.get("lofh",10600)))
+                               lof.append(int(product.get("threshold",11700)))
+                               positions.append(tuple(lof))
+
+                       p.update({"positions":tuple(positions)})                                                                        #add positons to dict product.
+
+                       m.update({product.get("name"):p})                                                                                       #add dict product to dict manufacturer
                unicablelnbproducts.update({manufacturer.get("name"):m})
 
        entry = root.find("matrix")
        for manufacturer in entry.getchildren():
                m={}
                for product in manufacturer.getchildren():
+                       p={}    #new dict empty for new product
                        scr=[]
-                       lscr=("scr1","scr2","scr3","scr4","scr5","scr6","scr7","scr8")
                        for i in range(len(lscr)):
                                scr.append(product.get(lscr[i],"0"))
                        for i in range(len(lscr)):
@@ -1121,14 +1238,29 @@ def InitNimManager(nimmgr):
                                        scr.pop()
                                else:
                                        break;
-                       lof=[]
-                       lof.append(int(product.get("positions",1)))
-                       lof.append(int(product.get("lofl",9750)))
-                       lof.append(int(product.get("lofh",10600)))
-                       lof.append(int(product.get("threshold",11700)))
-                       scr.append(tuple(lof))
-                       m.update({product.get("name"):tuple(scr)})
-               unicablematrixproducts.update({manufacturer.get("name"):m})
+
+                       p.update({"frequencies":tuple(scr)})                                                                            #add scr frequencies to dict product
+
+                       diction = product.get("format","EN50494").upper()
+                       if diction =="JESS" or diction =="UNICABLE2" or diction =="SCD2" or diction =="EN50607":
+                               diction = "EN50607"
+                       else:
+                               diction = "EN50494"
+                       p.update({"diction":tuple([diction])})                                                                          #add diction to dict product
+
+                       positions=[]
+                       positions.append(int(product.get("positions",1)))
+                       for cnt in range(positions[0]):
+                               lof=[]
+                               lof.append(int(product.get("lofl",9750)))
+                               lof.append(int(product.get("lofh",10600)))
+                               lof.append(int(product.get("threshold",11700)))
+                               positions.append(tuple(lof))
+
+                       p.update({"positions":tuple(positions)})                                                                        #add positons to dict product
+
+                       m.update({product.get("name"):p})                                                                                       #add dict product to dict manufacturer
+               unicablematrixproducts.update({manufacturer.get("name"):m})                                             #add dict manufacturer to dict unicablematrixproducts
 
        UnicableLnbManufacturers = unicablelnbproducts.keys()
        UnicableLnbManufacturers.sort()
@@ -1141,8 +1273,14 @@ def InitNimManager(nimmgr):
                "unicable_user": "Unicable "+_("User defined")}
        unicable_choices_default = "unicable_lnb"
 
-       advanced_lnb_satcruser_choices = [ ("1", "SatCR 1"), ("2", "SatCR 2"), ("3", "SatCR 3"), ("4", "SatCR 4"),
-                                       ("5", "SatCR 5"), ("6", "SatCR 6"), ("7", "SatCR 7"), ("8", "SatCR 8")]
+       advanced_lnb_satcr_user_choicesEN50494 = [("1", "SatCR 1"), ("2", "SatCR 2"), ("3", "SatCR 3"), ("4", "SatCR 4"), ("5", "SatCR 5"), ("6", "SatCR 6"), ("7", "SatCR 7"), ("8", "SatCR 8")]
+
+       advanced_lnb_satcr_user_choicesEN50607 = [("1", "SatCR 1"), ("2", "SatCR 2"), ("3", "SatCR 3"), ("4", "SatCR 4"), ("5", "SatCR 5"), ("6", "SatCR 6"), ("7", "SatCR 7"), ("8", "SatCR 8"),
+                                                                  ("9", "SatCR 9"), ("10", "SatCR 10"), ("11", "SatCR 11"), ("12", "SatCR 12"), ("13", "SatCR 13"), ("14", "SatCR 14"), ("15", "SatCR 15"), ("16", "SatCR 16"),
+                                                                  ("17", "SatCR 17"), ("18", "SatCR 18"), ("19", "SatCR 19"), ("20", "SatCR 20"), ("21", "SatCR 21"), ("22", "SatCR 22"), ("23", "SatCR 23"), ("24", "SatCR 24"),
+                                                                  ("25", "SatCR 25"), ("26", "SatCR 26"), ("27", "SatCR 27"), ("28", "SatCR 28"), ("29", "SatCR 29"), ("30", "SatCR 30"), ("31", "SatCR 31"), ("32", "SatCR 32")]
+
+       advanced_lnb_diction_user_choices = [("EN50494", "Unicable(EN50494)"), ("EN50607", "JESS(EN50607)")]
 
        prio_list = [ ("-1", _("Auto")) ]
        prio_list += [(str(prio), str(prio)) for prio in range(65)+range(14000,14065)+range(19000,19065)]
@@ -1168,7 +1306,7 @@ def InitNimManager(nimmgr):
        advanced_satlist_choices = nimmgr.satList + [
                (3601, _('All Satellites')+' 1', 1), (3602, _('All Satellites')+' 2', 1),
                (3603, _('All Satellites')+' 3', 1), (3604, _('All Satellites')+' 4', 1)]
-       advanced_lnb_choices = [("0", "not available")] + [(str(y), "LNB " + str(y)) for y in range(1, 33)]
+       advanced_lnb_choices = [("0", "not available")] + [(str(y), "LNB " + str(y)) for y in range(1, 65)]
        advanced_voltage_choices = [("polarization", _("Polarization")), ("13V", _("13 V")), ("18V", _("18 V"))]
        advanced_tonemode_choices = [("band", _("Band")), ("on", _("On")), ("off", _("Off"))]
        advanced_lnb_toneburst_choices = [("none", _("None")), ("A", _("A")), ("B", _("B"))]
@@ -1193,81 +1331,127 @@ def InitNimManager(nimmgr):
                        if isinstance(section.unicable, ConfigNothing):
                                if lnb == 1:
                                        section.unicable = ConfigSelection(unicable_choices, unicable_choices_default)
-                               elif lnb == 2:
-                                       section.unicable = ConfigSelection(choices = {"unicable_matrix": _("Unicable Martix"),"unicable_user": "Unicable "+_("User defined")}, default = "unicable_matrix")
+#                              elif lnb == 2:
                                else:
-                                       section.unicable = ConfigSelection(choices = {"unicable_user": _("User defined")}, default = "unicable_user")
-
-                               def fillUnicableConf(sectionDict, unicableproducts, vco_null_check):
-                                       for y in unicableproducts:
-                                               products = unicableproducts[y].keys()
-                                               products.sort()
-                                               tmp = ConfigSubsection()
-                                               tmp.product = ConfigSelection(choices = products, default = products[0])
-                                               tmp.scr = ConfigSubDict()
-                                               tmp.vco = ConfigSubDict()
-                                               tmp.lofl = ConfigSubDict()
-                                               tmp.lofh = ConfigSubDict()
-                                               tmp.loft = ConfigSubDict()
-                                               tmp.positions = ConfigSubDict()
-                                               for z in products:
+                                       section.unicable = ConfigSelection(choices = {"unicable_matrix": _("Unicable Martix"),"unicable_user": "Unicable "+_("User defined")}, default = "unicable_matrix")
+#                                      section.unicable = ConfigSelection(choices = {"unicable_user": _("User defined")}, default = "unicable_user")
+                       def fillUnicableConf(sectionDict, unicableproducts, vco_null_check):
+                               for manufacturer in unicableproducts:
+                                       products = unicableproducts[manufacturer].keys()
+                                       products.sort()
+                                       products_valide = []
+                                       products_valide_append = products_valide.append
+                                       tmp = ConfigSubsection()
+                                       tmp.scr = ConfigSubDict()
+                                       tmp.vco = ConfigSubDict()
+                                       tmp.lofl = ConfigSubDict()
+                                       tmp.lofh = ConfigSubDict()
+                                       tmp.loft = ConfigSubDict()
+                                       tmp.positions = ConfigSubDict()
+                                       tmp.diction = ConfigSubDict()
+                                       for article in products:
+                                               positionslist = unicableproducts[manufacturer][article].get("positions")
+                                               positions = int(positionslist[0])
+                                               dictionlist = [unicableproducts[manufacturer][article].get("diction")]
+                                               if lnb <= positions or dictionlist[0][0] !="EN50607":
+                                                       tmp.positions[article] = ConfigSubList()
+                                                       tmp.positions[article].append(ConfigInteger(default=positions, limits = (positions, positions)))
+                                                       tmp.diction[article] = ConfigSelection(choices = dictionlist, default = dictionlist[0][0])
+
                                                        scrlist = []
-                                                       vcolist = unicableproducts[y][z]
-                                                       tmp.vco[z] = ConfigSubList()
-                                                       for cnt in range(1,1+len(vcolist)-1):
+                                                       scrlist_append = scrlist.append
+                                                       vcolist=unicableproducts[manufacturer][article].get("frequencies")
+                                                       tmp.vco[article] = ConfigSubList()
+                                                       for cnt in range(1,len(vcolist)+1):
                                                                vcofreq = int(vcolist[cnt-1])
                                                                if vcofreq == 0 and vco_null_check:
-                                                                       scrlist.append(("%d" %cnt,"SCR %d " %cnt +_("not used")))
+                                                                       scrlist_append(("%d" %cnt,"SCR %d " %cnt +_("not used")))
                                                                else:
-                                                                       scrlist.append(("%d" %cnt,"SCR %d" %cnt))
-                                                               tmp.vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq)))
-                                                               tmp.scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0])
-
-                                                               positions = int(vcolist[len(vcolist)-1][0])
-                                                               tmp.positions[z] = ConfigSubList()
-                                                               tmp.positions[z].append(ConfigInteger(default=positions, limits = (positions, positions)))
-
-                                                               lofl = vcolist[len(vcolist)-1][1]
-                                                               tmp.lofl[z] = ConfigSubList()
-                                                               tmp.lofl[z].append(ConfigInteger(default=lofl, limits = (lofl, lofl)))
-
-                                                               lofh = int(vcolist[len(vcolist)-1][2])
-                                                               tmp.lofh[z] = ConfigSubList()
-                                                               tmp.lofh[z].append(ConfigInteger(default=lofh, limits = (lofh, lofh)))
-
-                                                               loft = int(vcolist[len(vcolist)-1][3])
-                                                               tmp.loft[z] = ConfigSubList()
-                                                               tmp.loft[z].append(ConfigInteger(default=loft, limits = (loft, loft)))
-                                               sectionDict[y] = tmp
-
-                               if lnb < 3:
-                                       print "MATRIX"
-                                       section.unicableMatrix = ConfigSubDict()
-                                       section.unicableMatrixManufacturer = ConfigSelection(UnicableMatrixManufacturers, UnicableMatrixManufacturers[0])
-                                       fillUnicableConf(section.unicableMatrix, unicablematrixproducts, True)
-
-                               if lnb < 2:
-                                       print "LNB"
-                                       section.unicableLnb = ConfigSubDict()
-                                       section.unicableLnbManufacturer = ConfigSelection(UnicableLnbManufacturers, UnicableLnbManufacturers[0])
-                                       fillUnicableConf(section.unicableLnb, unicablelnbproducts, False)
+                                                                       scrlist_append(("%d" %cnt,"SCR %d" %cnt))
+                                                               tmp.vco[article].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq)))
+
+                                                       tmp.scr[article] = ConfigSelection(choices = scrlist, default = scrlist[0][0])
+
+                                                       tmp.lofl[article] = ConfigSubList()
+                                                       tmp.lofh[article] = ConfigSubList()
+                                                       tmp.loft[article] = ConfigSubList()
+
+                                                       tmp_lofl_article_append = tmp.lofl[article].append
+                                                       tmp_lofh_article_append = tmp.lofh[article].append
+                                                       tmp_loft_article_append = tmp.loft[article].append
+                                                       
+                                                       for cnt in range(1,positions+1):
+                                                               lofl = int(positionslist[cnt][0])
+                                                               lofh = int(positionslist[cnt][1])
+                                                               loft = int(positionslist[cnt][2])
+                                                               tmp_lofl_article_append(ConfigInteger(default=lofl, limits = (lofl, lofl)))
+                                                               tmp_lofh_article_append(ConfigInteger(default=lofh, limits = (lofh, lofh)))
+                                                               tmp_loft_article_append(ConfigInteger(default=loft, limits = (loft, loft)))
+                                                       products_valide_append(article)
+
+                                       if len(products_valide)==0:
+                                               products_valide_append("None")
+                                       tmp.product = ConfigSelection(choices = products_valide, default = products_valide[0])
+                                       sectionDict[manufacturer] = tmp
+
+                       if lnb < 65:
+                               print "MATRIX"
+                               section.unicableMatrix = ConfigSubDict()
+                               section.unicableMatrixManufacturer = ConfigSelection(UnicableMatrixManufacturers, UnicableMatrixManufacturers[0])
+                               fillUnicableConf(section.unicableMatrix, unicablematrixproducts, True)
+
+                       if lnb < 2: #Konfiguration nur fuer LNB1 zulassen
+                               print "LNB"
+                               section.unicableLnb = ConfigSubDict()
+                               section.unicableLnbManufacturer = ConfigSelection(UnicableLnbManufacturers, UnicableLnbManufacturers[0])
+                               fillUnicableConf(section.unicableLnb, unicablelnbproducts, False)
 
 #TODO satpositions for satcruser
-                               section.satcruser = ConfigSelection(advanced_lnb_satcruser_choices, default="1")
-                               tmp = ConfigSubList()
-                               tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
-                               tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
-                               section.satcrvcouser = tmp 
-
-                               nim.advanced.unicableconnected = ConfigYesNo(default=False)
-                               nim.advanced.unicableconnectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x])
-       
+
+                       section.dictionuser = ConfigSelection(advanced_lnb_diction_user_choices, default="EN50494")
+                       section.satcruserEN50494 = ConfigSelection(advanced_lnb_satcr_user_choicesEN50494, default="1")
+                       section.satcruserEN50607 = ConfigSelection(advanced_lnb_satcr_user_choicesEN50607, default="1")
+
+                       tmp = ConfigSubList()
+                       tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
+                       section.satcrvcouserEN50494 = tmp 
+
+                       tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
+                       tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
+                       section.satcrvcouserEN50607 = tmp 
+
+                       nim.advanced.unicableconnected = ConfigYesNo(default=False)
+                       nim.advanced.unicableconnectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x])
+
        def configDiSEqCModeChanged(configElement):
                section = configElement.section
                if configElement.value == "1_2" and isinstance(section.longitude, ConfigNothing):
@@ -1298,7 +1482,7 @@ def InitNimManager(nimmgr):
                        section.increased_voltage = ConfigYesNo(False)
                        section.toneburst = ConfigSelection(advanced_lnb_toneburst_choices, "none")
                        section.longitude = ConfigNothing()
-                       if lnb > 32:
+                       if lnb > 64:
                                tmp = ConfigSelection(advanced_lnb_allsat_diseqcmode_choices, "1_2")
                                tmp.section = section
                                configDiSEqCModeChanged(tmp)
@@ -1349,7 +1533,7 @@ def InitNimManager(nimmgr):
                                tmp.tonemode = ConfigSelection(advanced_tonemode_choices, "band")
                                tmp.usals = ConfigYesNo(default=True)
                                tmp.rotorposition = ConfigInteger(default=1, limits=(1, 255))
-                               lnbnum = 33+x-3601
+                               lnbnum = 65+x-3601
                                lnb = ConfigSelection([("0", "not available"), (str(lnbnum), "LNB %d"%(lnbnum))], "0")
                                lnb.slot_id = slot_id
                                lnb.addNotifier(configLNBChanged, initial_call = False)
@@ -1362,56 +1546,11 @@ def InitNimManager(nimmgr):
                if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2':
                        open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value)
 
-       def tunerTypeChanged(nimmgr, configElement):
-               fe_id = configElement.fe_id
-
-               cur_type = int(open("/proc/stb/frontend/%d/mode" % (fe_id), "r").read())
-               if cur_type != int(configElement.value):
-                       print "tunerTypeChanged feid %d from %d to mode %d" % (fe_id, cur_type, int(configElement.value))
-
-                       try:
-                               oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
-                               open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
-                       except:
-                               print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
-
-                       frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend()
-                       frontend.closeFrontend()
-                       open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
-                       frontend.reopenFrontend()
-                       try:
-                               open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue)
-                       except:
-                               print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
-                       nimmgr.enumerateNIMs()
-               else:
-                       print "tuner type is already already %d" %cur_type
-
-       empty_slots = 0
-       for slot in nimmgr.nim_slots:
-               x = slot.slot
-               nim = config.Nims[x]
-               addMultiType = False
+       def createSatConfig(nim, x, empty_slots):
+               print "[Nimmanager] slot %d create config satellite.." % slot.slot
                try:
-                       nim.multiType
+                       nim.toneAmplitude
                except:
-                       addMultiType = True
-               if slot.isMultiType() and addMultiType:
-                       typeList = []
-                       for id in slot.getMultiTypeList().keys():
-                               type = slot.getMultiTypeList()[id]
-                               typeList.append((id, type))
-                       nim.multiType = ConfigSelection(typeList, "0")
-                       
-                       nim.multiType.fe_id = x - empty_slots
-                       nim.multiType.addNotifier(boundFunction(tunerTypeChanged, nimmgr))
-               
-       empty_slots = 0
-       for slot in nimmgr.nim_slots:
-               x = slot.slot
-               nim = config.Nims[x]
-
-               if slot.isCompatible("DVB-S"):
                        nim.toneAmplitude = ConfigSelection([("11", "340mV"), ("10", "360mV"), ("9", "600mV"), ("8", "700mV"), ("7", "800mV"), ("6", "900mV"), ("5", "1100mV")], "7")
                        nim.toneAmplitude.fe_id = x - empty_slots
                        nim.toneAmplitude.slot_id = x
@@ -1438,25 +1577,12 @@ def InitNimManager(nimmgr):
                        nim.fastTurningBegin = ConfigDateTime(default = mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 900)
                        etime = datetime(1970, 1, 1, 19, 0);
                        nim.fastTurningEnd = ConfigDateTime(default = mktime(etime.timetuple()), formatstring = _("%H:%M"), increment = 900)
-                       config_mode_choices = [ ("nothing", _("nothing connected")),
-                               ("simple", _("simple")), ("advanced", _("advanced"))]
-                       if len(nimmgr.getNimListOfType(slot.type, exception = x)) > 0:
-                               config_mode_choices.append(("equal", _("equal to")))
-                               config_mode_choices.append(("satposdepends", _("second cable of motorized LNB")))
-                       if len(nimmgr.canConnectTo(x)) > 0:
-                               config_mode_choices.append(("loopthrough", _("loopthrough to")))
-                       nim.advanced = ConfigNothing()
-                       tmp = ConfigSelection(config_mode_choices, "nothing")
-                       tmp.slot_id = x
-                       tmp.addNotifier(configModeChanged, initial_call = False)
-                       nim.configMode = tmp
-               elif slot.isCompatible("DVB-C"):
-                       nim.configMode = ConfigSelection(
-                               choices = {
-                                       "enabled": _("enabled"),
-                                       "nothing": _("nothing connected"),
-                                       },
-                               default = "enabled")
+
+       def createCableConfig(nim, x):
+               print "[Nimmanager] slot %d create config cable.." % slot.slot
+               try:
+                       nim.cable
+               except:
                        list = [ ]
                        n = 0
                        for x in nimmgr.cablesList:
@@ -1490,13 +1616,12 @@ def InitNimManager(nimmgr):
                        nim.cable.scan_sr_6875 = ConfigYesNo(default = True)
                        nim.cable.scan_sr_ext1 = ConfigInteger(default = 0, limits = (0, 7230))
                        nim.cable.scan_sr_ext2 = ConfigInteger(default = 0, limits = (0, 7230))
-               elif slot.isCompatible("DVB-T"):
-                       nim.configMode = ConfigSelection(
-                               choices = {
-                                       "enabled": _("enabled"),
-                                       "nothing": _("nothing connected"),
-                                       },
-                               default = "enabled")
+
+       def createTerrestrialConfig(nim, x):
+               print "[Nimmanager] slot %d create config terrestrial.." % slot.slot
+               try:
+                       nim.terrestrial
+               except:
                        list = []
                        n = 0
                        for x in nimmgr.terrestrialsList:
@@ -1504,11 +1629,103 @@ def InitNimManager(nimmgr):
                                n += 1
                        nim.terrestrial = ConfigSelection(choices = list)
                        nim.terrestrial_5V = ConfigOnOff()
+
+       def tunerTypeChanged(nimmgr, configElement):
+               fe_id = configElement.fe_id
+               eDVBResourceManager.getInstance().setFrontendType(nimmgr.nim_slots[fe_id].frontend_id, nimmgr.nim_slots[fe_id].getType())
+               import os
+               if os.path.exists("/proc/stb/frontend/%d/mode" % fe_id):
+                       cur_type = int(open("/proc/stb/frontend/%d/mode" % (fe_id), "r").read())
+                       if cur_type == int(configElement.value):
+                               print "tuner type is already already %d" %cur_type
+                               return
+                               print "tunerTypeChanged feid %d from %d to mode %d" % (fe_id, cur_type, int(configElement.value))
+
+               print "tunerTypeChanged feid %d, mode %d" % (fe_id, int(configElement.value))
+       
+               try:
+                       oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
+                       open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
+               except:
+                       print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+
+               frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend()
+               frontend.closeFrontend()
+
+               if os.path.exists("/proc/stb/frontend/%d/mode" % fe_id):
+                       open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
+               
+               frontend.reopenFrontend()
+               try:
+                       open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue)
+               except:
+                       print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+               nimmgr.enumerateNIMs()
+
+       empty_slots = 0
+       for slot in nimmgr.nim_slots:
+               print "[InitNimManager] check multi type slot %d" % slot.slot
+               x = slot.slot
+               nim = config.Nims[x]
+               addMultiType = False
+               try:
+                       nim.multiType
+               except:
+                       addMultiType = True
+               if slot.isMultiType() and addMultiType:
+                       print "[InitNimManager] slot %d is multi type : " % slot.slot, slot.getMultiTypeList()
+                       typeList = []
+                       for id in slot.getMultiTypeList().keys():
+                               type = slot.getMultiTypeList()[id]
+                               typeList.append((id, type))
+                       nim.multiType = ConfigSelection(typeList, "0")
+                       nim.multiType.fe_id = x - empty_slots
+                       nim.multiType.addNotifier(boundFunction(tunerTypeChanged, nimmgr))
+
+       empty_slots = 0
+       for slot in nimmgr.nim_slots:
+               x = slot.slot
+               nim = config.Nims[x]
+
+               if update_slots and (x not in update_slots):
+                       continue
+
+               if slot.isCompatible("DVB-S"):
+                       createSatConfig(nim, x, empty_slots)
+                       config_mode_choices = [ ("nothing", _("nothing connected")),
+                               ("simple", _("simple")), ("advanced", _("advanced"))]
+                       if len(nimmgr.getNimListOfType(slot.getType(), exception = x)) > 0:
+                               config_mode_choices.append(("equal", _("equal to")))
+                               config_mode_choices.append(("satposdepends", _("second cable of motorized LNB")))
+                       if len(nimmgr.canConnectTo(x)) > 0:
+                               config_mode_choices.append(("loopthrough", _("loopthrough to")))
+                       nim.advanced = ConfigNothing()
+                       tmp = ConfigSelection(config_mode_choices, "nothing")
+                       tmp.slot_id = x
+                       tmp.addNotifier(configModeChanged, initial_call = False)
+                       nim.configMode = tmp
+               elif slot.isCompatible("DVB-C"):
+                       nim.configMode = ConfigSelection(
+                               choices = {
+                                       "enabled": _("enabled"),
+                                       "nothing": _("nothing connected"),
+                                       },
+                               default = "enabled")
+                       createCableConfig(nim, x)
+               elif slot.isCompatible("DVB-T"):
+                       nim.configMode = ConfigSelection(
+                               choices = {
+                                       "enabled": _("enabled"),
+                                       "nothing": _("nothing connected"),
+                                       },
+                               default = "enabled")
+                       createTerrestrialConfig(nim, x)
                else:
+                       print "[Nimmanager] slot %d create config nothing.." % slot.slot
                        empty_slots += 1
                        nim.configMode = ConfigSelection(choices = { "nothing": _("disabled") }, default="nothing");
-                       if slot.type is not None:
-                               print "pls add support for this frontend type!", slot.type
+                       if slot.getType() is not None:
+                               print "pls add support for this frontend type!", slot.getType()
 #                      assert False
 
        nimmgr.sec = SecConfigure(nimmgr)