add FrontendStatus source, add converter to SNR/AGC/BER bar and text
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 26 Jun 2006 18:33:13 +0000 (18:33 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 26 Jun 2006 18:33:13 +0000 (18:33 +0000)
lib/python/Components/Converter/FrontendInfo.py [new file with mode: 0644]
lib/python/Components/Converter/Makefile.am
lib/python/Components/Sources/FrontendStatus.py [new file with mode: 0644]
lib/python/Components/Sources/Makefile.am

diff --git a/lib/python/Components/Converter/FrontendInfo.py b/lib/python/Components/Converter/FrontendInfo.py
new file mode 100644 (file)
index 0000000..a1064b9
--- /dev/null
@@ -0,0 +1,59 @@
+from Components.Converter.Converter import Converter
+
+class FrontendInfo(Converter, object):
+       BER = 0
+       SNR = 1
+       AGC = 2
+       LOCK = 3
+
+       def __init__(self, type, *args, **kwargs):
+               Converter.__init__(self)
+               if type == "BER":
+                       self.type = self.BER
+               elif type == "SNR":
+                       self.type = self.SNR
+               elif type == "AGC":
+                       self.type = self.AGC
+               else:
+                       self.type = self.LOCK
+
+       def getText(self):
+               assert self.type != self.LOCK, "the text output of FrontendInfo cannot be used for lock info"
+               if self.type == self.BER: # as count
+                       count = self.source.ber
+                       if count is not None:
+                               return str(count)
+                       else:
+                               return "N/A"
+               elif self.type == self.AGC:
+                       percent = self.source.agc
+               elif self.type == self.SNR:
+                       percent = self.source.snr
+               
+               if percent is None:
+                       return "N/A"
+
+               return "%d %%" % (percent * 100 / 65536)
+
+       def getBool(self):
+               assert self.type == LOCK, "the boolean output of FrontendInfo can only be used for lock info"
+               return self.source.lock
+
+       text = property(getText)
+
+       bool = property(getBool)
+
+       def getValue(self):
+               assert self.type != self.LOCK, "the value/range output of FrontendInfo can not be used for lock info"
+               if self.type == self.AGC:
+                       return self.source.agc or 0
+               elif self.type == self.SNR:
+                       return self.source.snr or 0
+               elif self.type == self.BER:
+                       if self.BER < self.range:
+                               return self.BER or 0
+                       else:
+                               return self.range
+
+       range = 65536
+       value = property(getValue)
index d449bccb57f8e6449bd7a16e6208e0787fcdfec0..59cb068f575e7520db6d2f82b1faeb78e89b126b 100644 (file)
@@ -2,6 +2,4 @@ installdir = $(LIBDIR)/enigma2/python/Components/Converter
 
 install_PYTHON = \
        __init__.py ClockToText.py Converter.py EventName.py StaticText.py EventTime.py \
 
 install_PYTHON = \
        __init__.py ClockToText.py Converter.py EventName.py StaticText.py EventTime.py \
-       Poll.py RemainingToText.py StringList.py ServiceName.py
-
-
+       Poll.py RemainingToText.py StringList.py ServiceName.py FrontendInfo.py
diff --git a/lib/python/Components/Sources/FrontendStatus.py b/lib/python/Components/Sources/FrontendStatus.py
new file mode 100644 (file)
index 0000000..778b436
--- /dev/null
@@ -0,0 +1,40 @@
+from Source import Source
+from enigma import eTimer, iFrontendInformation
+
+class FrontendStatus(Source):
+       def __init__(self, service_source = None, frontend_source = None):
+               Source.__init__(self)
+               self.service_source = service_source
+               self.frontend_source = frontend_source
+               self.invalidate()
+               
+               self.poll_timer = eTimer()
+               self.poll_timer.timeout.get().append(self.updateFrontendStatus)
+               self.poll_timer.start(1000)
+
+       def invalidate(self):
+               self.snr = self.agc = self.ber = self.lock = None
+
+       def updateFrontendStatus(self):
+               print "update frontend status. %d downstream elements" % len(self.downstream_elements)
+               feinfo = self.getFrontendInfo()
+               if feinfo is None:
+                       self.invalidate()
+               else:
+                       (self.snr, self.agc, self.ber, self.lock) = \
+                               [feinfo.getFrontendInfo(x) \
+                                       for x in [iFrontendInformation.signalPower, 
+                                               iFrontendInformation.signalQuality, 
+                                               iFrontendInformation.bitErrorRate, 
+                                               iFrontendInformation.lockState] ]
+
+               self.changed()
+
+       def getFrontendInfo(self):
+               if self.frontend_source:
+                       return self.frontend_source()
+               elif self.service_source:
+                       service = self.service_source()
+                       return service and service.frontendInfo()
+               else:
+                       return None
index a7d5ae90dea1f09e84631b1111c3db9feeb6a3bd..c3a75f86ee5b53091c1c8d01ee4a2ddb4e8db02b 100644 (file)
@@ -1,6 +1,5 @@
 installdir = $(LIBDIR)/enigma2/python/Components/Sources
 
 install_PYTHON = \
 installdir = $(LIBDIR)/enigma2/python/Components/Sources
 
 install_PYTHON = \
-       __init__.py Clock.py EventInfo.py Source.py MenuList.py CurrentService.py
-
-
+       __init__.py Clock.py EventInfo.py Source.py MenuList.py CurrentService.py \
+       FrontendStatus.py