from xml.sax import make_parser
from xml.sax.handler import ContentHandler
+from Tools.BoundFunction import boundFunction
+
def tryOpen(filename):
try:
procFile = open(filename)
self.NimManager = nimmgr
self.update()
-class boundFunction:
- def __init__(self, fnc, *args):
- self.fnc = fnc
- self.args = args
- def __call__(self, *args):
- self.fnc(*self.args + args)
-
class nimSlot:
def __init__(self, slotid, nimtype, name):
self.slotid = slotid
self.transponders[self.parsedSat].append((0, freq, sr, pol, fec))
+ class parseCables(ContentHandler):
+ def __init__(self, cablesList, transponders):
+ self.isPointsElement, self.isReboundsElement = 0, 0
+ self.cablesList = cablesList
+ self.transponders = transponders
+
+ def startElement(self, name, attrs):
+ if (name == "cable"):
+ #print "found sat " + attrs.get('name',"") + " " + str(attrs.get('position',""))
+ tname = attrs.get('name',"")
+ self.cablesList.append(str(tname))
+ self.parsedCab = str(tname)
+ elif (name == "transponder"):
+ freq = int(attrs.get('frequency',""))
+ sr = int(attrs.get('symbol_rate',""))
+ mod = int(attrs.get('modulation',""))
+ fec = int(attrs.get('fec_inner',""))
+ if self.parsedCab in self.transponders:
+ pass
+ else:
+ self.transponders[self.parsedCab] = [ ]
+
+ self.transponders[self.parsedCab].append((0, freq, sr, mod, fec))
+
+ class parseTerrestrials(ContentHandler):
+ def __init__(self, terrestrialsList, transponders):
+ self.isPointsElement, self.isReboundsElement = 0, 0
+ self.terrestrialsList = terrestrialsList
+ self.transponders = transponders
+
+ def startElement(self, name, attrs):
+ if (name == "terrestrial"):
+ #print "found sat " + attrs.get('name',"") + " " + str(attrs.get('position',""))
+ tname = attrs.get('name',"")
+ tflags = attrs.get('flags',"")
+ self.terrestrialsList.append((tname, tflags))
+ self.parsedTer = str(tname)
+ elif (name == "transponder"):
+ # TODO finish this!
+ freq = int(attrs.get('centre_frequency',""))
+ bw = int(attrs.get('bandwidth',""))
+ const = int(attrs.get('constellation',""))
+ crh = int(attrs.get('code_rate_hp',""))
+ crl = int(attrs.get('code_rate_lp',""))
+ guard = int(attrs.get('guard_interval',""))
+ transm = int(attrs.get('transmission_mode',""))
+ hierarchy = int(attrs.get('hierarchy_information',""))
+ inv = int(attrs.get('inversion',""))
+ if self.parsedTer in self.transponders:
+ pass
+ else:
+ self.transponders[self.parsedTer] = [ ]
+
+ self.transponders[self.parsedTer].append((0, freq, bw, const, crh, crl, guard, transm, hierarchy, inv))
+
def getTransponders(self, pos):
return self.transponders[pos]
def readSatsfromFile(self):
self.satellites = { }
self.transponders = { }
-
- print "Reading satellites.xml"
+ self.transponderscable = { }
+ self.transpondersterrestrial = { }
+
parser = make_parser()
- satHandler = self.parseSats(self.satList, self.satellites, self.transponders)
- parser.setContentHandler(satHandler)
- parser.parse('/etc/tuxbox/satellites.xml')
+ if (self.hasNimType(self.nimType["DVB-S"])):
+ print "Reading satellites.xml"
+ satHandler = self.parseSats(self.satList, self.satellites, self.transponders)
+ parser.setContentHandler(satHandler)
+ parser.parse('/etc/tuxbox/satellites.xml')
+ if (self.hasNimType(self.nimType["DVB-C"])):
+ print "Reading cables.xml"
+ cabHandler = self.parseCables(self.cablesList, self.transponderscable)
+ parser.setContentHandler(cabHandler)
+ parser.parse('/etc/tuxbox/cables.xml')
- def getNimType(self, slotID):
- #FIXME get it from /proc
+ if (self.hasNimType(self.nimType["DVB-T"])):
+ print "Reading terrestrial.xml"
+ terHandler = self.parseTerrestrials(self.terrestrialsList, self.transpondersterrestrial)
+ parser.setContentHandler(terHandler)
+ parser.parse('/etc/tuxbox/terrestrial.xml')
+
+ def parseProc(self):
+ self.nimTypes = {}
+ self.nimNames = {}
+ self.nimSocketCount = 0
nimfile = tryOpen("/proc/bus/nim_sockets")
if nimfile == "":
- # FIXME: remove this in the final version
- # check if we have a device for 7020 comp?atibility reasons
- try:
- open("/dev/dvb/card0/frontend" + str(slotID))
- return self.nimType["DVB-S"]
- except IOError:
return self.nimType["empty/unknown"]
-
+
+ lastsocket = -1
while 1:
line = nimfile.readline()
if line == "":
break
- if line.startswith("NIM Socket"):
+ if line.strip().startswith("NIM Socket"):
parts = line.strip().split(" ")
id = int(parts[2][:1])
- if id == slotID:
- line = nimfile.readline()
- if line == "":
- break
- if line.startswith(" Type:"):
- nimfile.close()
- return self.nimType["DVB-S"]
- else:
- break
+ lastsocket = int(id)
+ self.nimSocketCount += 1
+ elif line.strip().startswith("Type:"):
+ self.nimTypes[lastsocket] = str(line.strip()[6:])
+ elif line.strip().startswith("Name:"):
+ self.nimNames[lastsocket] = str(line.strip()[6:])
+ elif line.strip().startswith("empty"):
+ self.nimNames[lastsocket] = _("N/A")
+ self.nimTypes[lastsocket] = "empty/unknown"
+
nimfile.close()
- return self.nimType["empty/unknown"]
+
+
+ def getNimType(self, slotID):
+ return self.nimType[self.nimTypes[slotID]]
def getNimName(self, slotID):
- #FIXME get it from /proc
- return "Alps BSBE1"
+ return self.nimNames[slotID]
def getNimSocketCount(self):
- #FIXME get it from /proc
- return 2
+ return self.nimSocketCount
+
+ def hasNimType(self, chktype):
+ for id, type in self.nimTypes.items():
+ if (chktype == self.nimType[str(type)]):
+ return True
+ return False
def getConfigPrefix(self, slotid):
return "config.Nim" + ("A","B","C","D")[slotid] + "."
"DVB-S": 0,
"DVB-C": 1,
"DVB-T": 2}
- self.satList = [ ]
+ self.satList = [ ]
+ self.cablesList = []
+ self.terrestrialsList = []
- self.readSatsfromFile()
+ self.parseProc()
+
+ self.readSatsfromFile()
self.nimCount = self.getNimSocketCount()
nim = config.Nims[x]
if slot.nimType == nimmgr.nimType["DVB-S"]:
- nim.configMode = configElement(cname + "configMode",configSelection, 0, (_("Simple"), _("Advanced")));
- nim.diseqcMode = configElement(cname + "diseqcMode",configSelection, 2, (_("Single"), _("Toneburst A/B"), _("DiSEqC A/B"), _("DiSEqC A/B/C/D"), _("Positioner")));
- nim.diseqcA = configElement(cname + "diseqcA",configSatlist, 192, nimmgr.satList);
- nim.diseqcB = configElement(cname + "diseqcB",configSatlist, 130, nimmgr.satList);
- nim.diseqcC = configElement(cname + "diseqcC",configSatlist, 0, nimmgr.satList);
- nim.diseqcD = configElement(cname + "diseqcD",configSatlist, 0, nimmgr.satList);
- nim.longitude = configElement(cname + "longitude",configSequence, [0,0], configsequencearg.get("FLOAT", [(0,90),(0,999)]));
- nim.latitude = configElement(cname + "latitude",configSequence, [0,0], configsequencearg.get("FLOAT", [(0,90),(0,999)]));
+ nim.configMode = configElement(cname + "configMode", configSelection, 0, (_("Simple"), _("Advanced")));
+ nim.diseqcMode = configElement(cname + "diseqcMode", configSelection, 2, (_("Single"), _("Toneburst A/B"), _("DiSEqC A/B"), _("DiSEqC A/B/C/D"), _("Positioner")));
+ nim.diseqcA = configElement(cname + "diseqcA", configSatlist, 192, nimmgr.satList);
+ nim.diseqcB = configElement(cname + "diseqcB", configSatlist, 130, nimmgr.satList);
+ nim.diseqcC = configElement(cname + "diseqcC", configSatlist, 0, nimmgr.satList);
+ nim.diseqcD = configElement(cname + "diseqcD", configSatlist, 0, nimmgr.satList);
+ nim.longitude = configElement(cname + "longitude", configSequence, [0,0], configsequencearg.get("FLOAT", [(0,90),(0,999)]));
+ nim.latitude = configElement(cname + "latitude", configSequence, [0,0], configsequencearg.get("FLOAT", [(0,90),(0,999)]));
#perhaps the instance of the slot is more useful?
nim.configMode.addNotifier(boundFunction(nimConfigModeChanged,x))
nim.diseqcB.addNotifier(boundFunction(nimPortBChanged,x))
nim.diseqcC.addNotifier(boundFunction(nimPortCChanged,x))
nim.diseqcD.addNotifier(boundFunction(nimPortDChanged,x))
+ elif slot.nimType == nimmgr.nimType["DVB-C"]:
+ nim.cable = configElement(cname + "cable", configSelection, 0, nimmgr.cablesList);
+ elif slot.nimType == nimmgr.nimType["DVB-T"]:
+ nim.cable = configElement(cname + "terrestrial", configSelection, 0, nimmgr.terrestrialsList);
else:
print "pls add support for this frontend type!"