From 4b8c8a054ffa5cf8bf15ad1a6cafaa07c14432e2 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 26 Jun 2006 18:33:13 +0000 Subject: [PATCH] add FrontendStatus source, add converter to SNR/AGC/BER bar and text --- .../Components/Converter/FrontendInfo.py | 59 +++++++++++++++++++ lib/python/Components/Converter/Makefile.am | 4 +- .../Components/Sources/FrontendStatus.py | 40 +++++++++++++ lib/python/Components/Sources/Makefile.am | 5 +- 4 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 lib/python/Components/Converter/FrontendInfo.py create mode 100644 lib/python/Components/Sources/FrontendStatus.py diff --git a/lib/python/Components/Converter/FrontendInfo.py b/lib/python/Components/Converter/FrontendInfo.py new file mode 100644 index 00000000..a1064b97 --- /dev/null +++ b/lib/python/Components/Converter/FrontendInfo.py @@ -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) diff --git a/lib/python/Components/Converter/Makefile.am b/lib/python/Components/Converter/Makefile.am index d449bccb..59cb068f 100644 --- a/lib/python/Components/Converter/Makefile.am +++ b/lib/python/Components/Converter/Makefile.am @@ -2,6 +2,4 @@ installdir = $(LIBDIR)/enigma2/python/Components/Converter 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 index 00000000..778b4363 --- /dev/null +++ b/lib/python/Components/Sources/FrontendStatus.py @@ -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 diff --git a/lib/python/Components/Sources/Makefile.am b/lib/python/Components/Sources/Makefile.am index a7d5ae90..c3a75f86 100644 --- a/lib/python/Components/Sources/Makefile.am +++ b/lib/python/Components/Sources/Makefile.am @@ -1,6 +1,5 @@ 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 -- 2.30.2