X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fpython%2FScreens%2FInfoBarGenerics.py;h=74603ff50697d9bd48b3955bd8a804b216e75c6a;hb=fe798a5d31319171dbb76c6d9fec268e691d3f77;hp=1b080d9bbc4bfcbc4cfdd24c1621899936ae2d1e;hpb=8c859d597bc88634e3e5f41d7ea800aae90d50fd;p=vuplus_dvbapp diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 1b080d9..74603ff 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -2,6 +2,7 @@ from Screen import Screen from Components.ActionMap import ActionMap, HelpableActionMap from Components.ActionMap import NumberActionMap from Components.Label import * +from Components.ProgressBar import * from Components.config import configfile, configsequencearg from Components.config import config, configElement, ConfigSubsection, configSequence from ChannelSelection import ChannelSelection @@ -68,7 +69,7 @@ class InfoBarVolumeControl: self.volumeDialog.instance.show() self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) self.volSave() - self.hideVolTimer.start(3000) + self.hideVolTimer.start(3000, True) def volDown(self): if (eDVBVolumecontrol.getInstance().isMuted()): @@ -77,7 +78,7 @@ class InfoBarVolumeControl: self.volumeDialog.instance.show() self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) self.volSave() - self.hideVolTimer.start(3000) + self.hideVolTimer.start(3000, True) def volHide(self): self.volumeDialog.instance.hide() @@ -118,7 +119,7 @@ class InfoBarShowHide: self.hideTimer = eTimer() self.hideTimer.timeout.get().append(self.doTimerHide) - self.hideTimer.start(5000) + self.hideTimer.start(5000, True) def delHideTimer(self): del self.hideTimer @@ -128,8 +129,7 @@ class InfoBarShowHide: def show(self): self.state = self.STATE_SHOWN - self.hideTimer.stop() - self.hideTimer.start(5000) + self.hideTimer.start(5000, True) def doTimerHide(self): self.hideTimer.stop() @@ -166,7 +166,7 @@ class NumberZap(Screen): self.close(int(self["number"].getText())) def keyNumberGlobal(self, number): - self.Timer.start(3000) #reset timer + self.Timer.start(3000, True) #reset timer self.field = self.field + str(number) self["number"].setText(self.field) if len(self.field) >= 4: @@ -198,7 +198,7 @@ class NumberZap(Screen): self.Timer = eTimer() self.Timer.timeout.get().append(self.keyOK) - self.Timer.start(3000) + self.Timer.start(3000, True) class InfoBarPowerKey: """ PowerKey stuff - handles the powerkey press and powerkey release actions""" @@ -220,7 +220,7 @@ class InfoBarPowerKey: def powerdown(self): self.standbyblocked = 0 - self.powerKeyTimer.start(3000) + self.powerKeyTimer.start(3000, True) def powerup(self): self.powerKeyTimer.stop() @@ -383,6 +383,50 @@ class InfoBarEPG: self.epglist[1]=tmp setEvent(self.epglist[0]) +from math import log + +class InfoBarTuner: + """provides a snr/agc/ber display""" + def __init__(self): + self["snr"] = Label() + self["agc"] = Label() + self["ber"] = Label() + self["snr_percent"] = Label() + self["agc_percent"] = Label() + self["ber_count"] = Label() + self["snr_progress"] = ProgressBar() + self["agc_progress"] = ProgressBar() + self["ber_progress"] = ProgressBar() + self.timer = eTimer() + self.timer.timeout.get().append(self.updateTunerInfo) + self.timer.start(1000) + + def calc(self,val): + if not val: + return 0 + if val < 2500: + return (long)(log(val)/log(2)) + return val*100/65535 + + def updateTunerInfo(self): + if self.instance.isVisible(): + service = self.session.nav.getCurrentService() + snr=0 + agc=0 + ber=0 + if service is not None: + feinfo = service.frontendStatusInfo() + if feinfo is not None: + ber=feinfo.getFrontendInfo(iFrontendStatusInformation.bitErrorRate) + snr=feinfo.getFrontendInfo(iFrontendStatusInformation.signalPower)*100/65536 + agc=feinfo.getFrontendInfo(iFrontendStatusInformation.signalQuality)*100/65536 + self["snr_percent"].setText("%d%%"%(snr)) + self["agc_percent"].setText("%d%%"%(agc)) + self["ber_count"].setText("%d"%(ber)) + self["snr_progress"].setValue(snr) + self["agc_progress"].setValue(agc) + self["ber_progress"].setValue(self.calc(ber)) + class InfoBarEvent: """provides a current/next event info display""" def __init__(self): @@ -400,6 +444,24 @@ class InfoBarServiceName: self["ServiceName"] = ServiceName(self.session.nav) class InfoBarPVR: + + # ispause, isff, issm, skip + SEEK_STATE_PLAY = (0, 0, 0, 0) + SEEK_STATE_PAUSE = (1, 0, 0, 0) + SEEK_STATE_FF_2X = (0, 2, 0, 0) + SEEK_STATE_FF_4X = (0, 4, 0, 0) + SEEK_STATE_FF_8X = (0, 8, 0, 0) + SEEK_STATE_FF_32X = (0, 0, 0, 32) + SEEK_STATE_FF_64X = (0, 0, 0, 64) + + SEEK_STATE_BACK_4X = (0, 0, 0, -4) + SEEK_STATE_BACK_32X = (0, 0, 0, -32) + SEEK_STATE_BACK_64X = (0, 0, 0, -64) + + SEEK_STATE_SM_HALF = (0, 0, 2, 0) + SEEK_STATE_SM_QUARTER = (0, 0, 4, 0) + SEEK_STATE_SM_EIGHTH = (0, 0, 8, 0) + """handles PVR specific actions like seeking, pause""" def __init__(self): self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions", @@ -410,12 +472,45 @@ class InfoBarPVR: "seekFwd": (self.seekFwd, "skip forward"), "seekBack": (self.seekBack, "skip backward"), }) + + self.seekstate = self.SEEK_STATE_PLAY + self.seekTimer = eTimer() + self.seekTimer.timeout.get().append(self.seekTimerFired) + self.skipinterval = 500 # 500ms skip interval + + def seekTimerFired(self): + if self.skipmode > 0: + self.doSeek(+1, self.skipmode * self.skipinterval) + else: + self.doSeek(-1, -self.skipmode * self.skipinterval) + + def setSeekState(self, state): + oldstate = self.seekstate + self.seekstate = state + + service = self.session.nav.getCurrentService() + if service is None: + return + + pauseable = service.pause() + + for i in range(4): + if oldstate[i] != self.seekstate[i]: + (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion, self.setSkipMode)[i](self.seekstate[i]) + + def setSkipMode(self, skipmode): + self.skipmode = skipmode + if skipmode == 0: + self.seekTimer.stop() + else: + self.seekTimer.start(500) + def pauseService(self): - self.session.nav.pause(1) + self.setSeekState(self.SEEK_STATE_PAUSE); def unPauseService(self): - self.session.nav.pause(0) + self.setSeekState(self.SEEK_STATE_PLAY); def doSeek(self, dir, seektime): service = self.session.nav.getCurrentService() @@ -428,10 +523,40 @@ class InfoBarPVR: seekable.seekRelative(dir, 90 * seektime) def seekFwd(self): - self.doSeek(+1, 60000) + lookup = { + self.SEEK_STATE_PLAY: self.SEEK_STATE_FF_2X, + self.SEEK_STATE_PAUSE: self.SEEK_STATE_SM_EIGHTH, + self.SEEK_STATE_FF_2X: self.SEEK_STATE_FF_4X, + self.SEEK_STATE_FF_4X: self.SEEK_STATE_FF_8X, + self.SEEK_STATE_FF_8X: self.SEEK_STATE_FF_32X, + self.SEEK_STATE_FF_32X: self.SEEK_STATE_FF_64X, + self.SEEK_STATE_FF_64X: self.SEEK_STATE_FF_64X, + self.SEEK_STATE_BACK_4X: self.SEEK_STATE_PLAY, + self.SEEK_STATE_BACK_32X: self.SEEK_STATE_BACK_4X, + self.SEEK_STATE_BACK_64X: self.SEEK_STATE_BACK_32X, + self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_HALF, + self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_HALF, + self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_SM_QUARTER + } + self.setSeekState(lookup[self.seekstate]); def seekBack(self): - self.doSeek(-1, 60000) + lookup = { + self.SEEK_STATE_PLAY: self.SEEK_STATE_BACK_4X, + self.SEEK_STATE_PAUSE: self.SEEK_STATE_PAUSE, + self.SEEK_STATE_FF_2X: self.SEEK_STATE_PLAY, + self.SEEK_STATE_FF_4X: self.SEEK_STATE_FF_2X, + self.SEEK_STATE_FF_8X: self.SEEK_STATE_FF_4X, + self.SEEK_STATE_FF_32X: self.SEEK_STATE_FF_8X, + self.SEEK_STATE_FF_64X: self.SEEK_STATE_FF_32X, + self.SEEK_STATE_BACK_4X: self.SEEK_STATE_BACK_32X, + self.SEEK_STATE_BACK_32X: self.SEEK_STATE_BACK_64X, + self.SEEK_STATE_BACK_64X: self.SEEK_STATE_BACK_64X, + self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_QUARTER, + self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_EIGHTH, + self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_PAUSE + } + self.setSeekState(lookup[self.seekstate]); class InfoBarInstantRecord: """Instant Record - handles the instantRecord action in order to