X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/45164193c322c84366fbde35db544cf005bf20dc..90d9f3e7624282749eb59b57d4996f5d1d06c6b1:/lib/python/Screens/InfoBarGenerics.py diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 604f164a..9d610dc8 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1,12 +1,13 @@ from Screen import Screen from Components.ActionMap import ActionMap, HelpableActionMap from Components.ActionMap import NumberActionMap -from Components.Label import Label +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 -from Components.Pixmap import PixmapConditional +from Components.Pixmap import Pixmap, PixmapConditional from Components.BlinkingPixmap import BlinkingPixmapConditional from Components.ServiceName import ServiceName from Components.EventInfo import EventInfo @@ -17,8 +18,12 @@ from EpgSelection import EPGSelection from Screens.MessageBox import MessageBox from Screens.Volume import Volume from Screens.Mute import Mute +from Screens.Dish import Dish from Screens.Standby import Standby from Screens.EventView import EventView +from Components.Harddisk import harddiskmanager + +from Tools import Notifications #from enigma import eTimer, eDVBVolumecontrol, quitMainloop from enigma import * @@ -58,6 +63,8 @@ class InfoBarVolumeControl: config.audio.volume.save() def volUp(self): + if (eDVBVolumecontrol.getInstance().isMuted()): + self.volMute() eDVBVolumecontrol.getInstance().volumeUp() self.volumeDialog.instance.show() self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) @@ -65,6 +72,8 @@ class InfoBarVolumeControl: self.hideVolTimer.start(3000) def volDown(self): + if (eDVBVolumecontrol.getInstance().isMuted()): + self.volMute() eDVBVolumecontrol.getInstance().volumeDown() self.volumeDialog.instance.show() self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) @@ -83,6 +92,11 @@ class InfoBarVolumeControl: else: self.muteDialog.instance.hide() +class InfoBarDish: + def __init__(self): + self.dishDialog = self.session.instantiateDialog(Dish) + self.onShown.append(self.dishDialog.instance.hide) + class InfoBarShowHide: """ InfoBar show/hide control, accepts toggleShow and hide actions, might start fancy animations. """ @@ -246,7 +260,43 @@ class InfoBarNumberZap: def numberEntered(self, retval): # print self.servicelist if retval > 0: - self.servicelist.zapToNumber(retval) + self.zapToNumber(retval) + + def searchNumberHelper(self, serviceHandler, num, bouquet): + servicelist = serviceHandler.list(bouquet) + if not servicelist is None: + while num: + serviceIterator = servicelist.getNext() + if not serviceIterator.valid(): #check end of list + break + if serviceIterator.flags: #assume normal dvb service have no flags set + continue + num -= 1; + if not num: #found service with searched number ? + return serviceIterator, 0 + return None, num + + def zapToNumber(self, number): + bouquet = self.servicelist.bouquet_root + service = None + serviceHandler = eServiceCenter.getInstance() + if bouquet.toString().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK + service, number = self.searchNumberHelper(serviceHandler, number, bouquet) + else: + bouquetlist = serviceHandler.list(bouquet) + if not bouquetlist is None: + while number: + bouquet = bouquetlist.getNext() + if not bouquet.valid(): #check end of list + break + if ((bouquet.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory): + continue + service, number = self.searchNumberHelper(serviceHandler, number, bouquet) + if not service is None: + self.session.nav.playService(service) #play service + if self.servicelist.getRoot() != bouquet: #already in correct bouquet? + self.servicelist.setRoot(bouquet) + self.servicelist.setCurrentSelection(service) #select the service in servicelist class InfoBarChannelSelection: """ ChannelSelection - handles the channelSelection dialog and the initial @@ -334,6 +384,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(500) + + 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): @@ -351,6 +445,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", @@ -361,12 +473,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() @@ -379,10 +524,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 @@ -395,7 +570,7 @@ class InfoBarInstantRecord: self.recording = None self["BlinkingPoint"] = BlinkingPixmapConditional() - self.onShown.append(self["BlinkingPoint"].hidePixmap) + self.onShown.append(self["BlinkingPoint"].hideWidget) self["BlinkingPoint"].setConnect(self.session.nav.RecordTimer.isRecording) def stopCurrentRecording(self): @@ -464,6 +639,26 @@ class InfoBarAudioSelection: if n > 0: self.session.open(AudioSelection, audio) +from Screens.SubserviceSelection import SubserviceSelection + +class InfoBarSubserviceSelection: + def __init__(self): + self["SubserviceSelectionAction"] = HelpableActionMap(self, "InfobarSubserviceSelectionActions", + { + "subserviceSelection": (self.subserviceSelection, "Subservice list..."), + }) + + def subserviceSelection(self): + service = self.session.nav.getCurrentService() + subservices = service.subServices() + n = subservices.getNumberOfSubservices() + if n > 0: + self.session.openWithCallback(self.subserviceSelected, SubserviceSelection, subservices) + + def subserviceSelected(self, service): + if not service is None: + self.session.nav.playService(service) + class InfoBarAdditionalInfo: def __init__(self): self["DolbyActive"] = PixmapConditional() @@ -476,4 +671,42 @@ class InfoBarAdditionalInfo: self["FormatActive"] = PixmapConditional() # TODO: get the info from c++ somehow - self["FormatActive"].setConnect(lambda: False) \ No newline at end of file + self["FormatActive"].setConnect(lambda: False) + + self["ButtonRed"] = PixmapConditional(withTimer = False) + self["ButtonRed"].setConnect(lambda: harddiskmanager.HDDCount() > 0) + self.onShown.append(self["ButtonRed"].update) + self["ButtonRedText"] = LabelConditional(text = _("Record"), withTimer = False) + self["ButtonRedText"].setConnect(lambda: harddiskmanager.HDDCount() > 0) + self.onShown.append(self["ButtonRedText"].update) + + self["ButtonGreen"] = PixmapConditional() + self["ButtonGreen"].setConnect(lambda: self.session.nav.getCurrentService().subServices().getNumberOfSubservices() > 0) + self["ButtonGreenText"] = LabelConditional(text = _("Subservices")) + self["ButtonGreenText"].setConnect(lambda: self.session.nav.getCurrentService().subServices().getNumberOfSubservices() > 0) + + self["ButtonYellow"] = PixmapConditional() + self["ButtonYellow"].setConnect(lambda: False) + + self["ButtonBlue"] = PixmapConditional() + self["ButtonBlue"].setConnect(lambda: False) + +class InfoBarNotifications: + def __init__(self): + self.onExecBegin.append(self.checkNotifications) + Notifications.notificationAdded.append(self.checkNotificationsIfExecing) + + def checkNotificationsIfExecing(self): + if self.execing: + self.checkNotifications() + + def checkNotifications(self): + if len(Notifications.notifications): + n = Notifications.notifications[0] + Notifications.notifications = Notifications.notifications[1:] + print "open",n + cb = n[0] + if cb is not None: + self.session.openWithCallback(cb, *n[1:]) + else: + self.session.open(*n[1:])