aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Screens
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-03-24 00:49:20 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-03-24 00:49:20 +0000
commitd1e450f95a9b79b144a00dcf0f9356ff6cb9bfb2 (patch)
tree85131a89500ccc60f343732e6727f00df907bc17 /lib/python/Screens
parent058d38ca9bcfe94c5c551eac231f808330af3581 (diff)
downloadenigma2-d1e450f95a9b79b144a00dcf0f9356ff6cb9bfb2.tar.gz
enigma2-d1e450f95a9b79b144a00dcf0f9356ff6cb9bfb2.zip
add a radiomode background picture (mvi file.. changable in
/etc/enigma2/config ... config.misc.radiopic = /bla/blubber.mvi add support for radio text plus, add rass (radio screen show) support (yes used by SWR3, cont.ra and DASDING) thanks to seddi for some piece of code for better single iframe support its recommend to update in dreambox-dvb-modules.bb CVSDATE for dm7025 to 20070323
Diffstat (limited to 'lib/python/Screens')
-rw-r--r--lib/python/Screens/ChannelSelection.py58
-rw-r--r--lib/python/Screens/InfoBar.py12
-rw-r--r--lib/python/Screens/InfoBarGenerics.py51
-rw-r--r--lib/python/Screens/Makefile.am2
-rw-r--r--lib/python/Screens/RdsDisplay.py272
5 files changed, 369 insertions, 26 deletions
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 5a0f1177..7f9f797e 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -1,7 +1,7 @@
from Screen import Screen
from Components.Button import Button
from Components.ServiceList import ServiceList
-from Components.ActionMap import NumberActionMap, ActionMap
+from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
from Components.MenuList import MenuList
from Components.ServiceEventTracker import ServiceEventTracker
from EpgSelection import EPGSelection
@@ -11,11 +11,13 @@ from Screens.FixedMenu import FixedMenu
from Tools.NumericalTextInput import NumericalTextInput
from Components.NimManager import nimmanager
from Components.Sources.Clock import Clock
+from Components.Sources.RdsDecoder import RdsDecoder
from Components.Input import Input
from Components.ParentalControl import parentalControl
from Screens.InputBox import InputBox, PinInput
from Screens.MessageBox import MessageBox
from Screens.ServiceInfo import ServiceInfo
+from Screens.RdsDisplay import RassInteractive
from ServiceReference import ServiceReference
from Tools.BoundFunction import boundFunction
from re import *
@@ -1256,32 +1258,30 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
self.revertMode = None
self.close(None)
-from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarRadioText
+from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName
-class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord):
+class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName):
def __init__(self, session):
Screen.__init__(self, session)
InfoBarEvent.__init__(self)
InfoBarServiceName.__init__(self)
- InfoBarInstantRecord.__init__(self)
self["CurrentTime"] = Clock()
+ self["RdsDecoder"] = RdsDecoder(self.session.nav)
-class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText):
-
+class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
ALLOW_SUSPEND = True
- def __init__(self, session):
+ def __init__(self, session, infobar):
ChannelSelectionBase.__init__(self, session)
ChannelSelectionEdit.__init__(self)
ChannelSelectionEPG.__init__(self)
- InfoBarRadioText.__init__(self)
-
+ self.infobar = infobar
config.radio = ConfigSubsection();
config.radio.lastservice = ConfigText()
config.radio.lastroot = ConfigText()
self.onLayoutFinish.append(self.onCreate)
- self.info = session.instantiateDialog(RadioInfoBar)
+ self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
{
@@ -1297,6 +1297,37 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
iPlayableService.evEnd: self.__evServiceEnd
})
+########## RDS Radiotext / Rass Support BEGIN
+ self.infobar = infobar # reference to real infobar (the one and only)
+ self["RdsDecoder"] = self.info["RdsDecoder"]
+ self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+ {
+ "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+ },-1)
+ self["RdsActions"].setEnabled(False)
+ infobar.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
+
+ def startRassInteractive(self):
+ self.info.hide();
+ self.infobar.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
+
+ def RassInteractiveClosed(self):
+ self.info.show()
+ self.infobar.rass_interactive = None
+ self.infobar.RassSlidePicChanged()
+
+ def RassInteractivePossibilityChanged(self, state):
+ self["RdsActions"].setEnabled(state)
+########## RDS Radiotext / Rass Support END
+
+ def closeRadio(self):
+ self.infobar.rds_display.onRassInteractivePossibilityChanged.remove(self.RassInteractivePossibilityChanged)
+ self.info.hide()
+ #set previous tv service
+ lastservice=eServiceReference(config.tv.lastservice.value)
+ self.session.nav.playService(lastservice)
+ self.close(None)
+
def __evServiceStart(self):
service = self.session.nav.getCurrentService()
if service:
@@ -1371,13 +1402,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
config.radio.lastservice.save()
self.saveRoot()
- def closeRadio(self):
- self.info.hide()
- #set previous tv service
- lastservice=eServiceReference(config.tv.lastservice.value)
- self.session.nav.playService(lastservice)
- self.close(None)
-
class SimpleChannelSelection(ChannelSelectionBase):
def __init__(self, session, title):
ChannelSelectionBase.__init__(self, session)
diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py
index 24c2b40b..ab40838d 100644
--- a/lib/python/Screens/InfoBar.py
+++ b/lib/python/Screens/InfoBar.py
@@ -12,7 +12,7 @@ from Components.config import config
from Tools.Notifications import AddNotificationWithCallback
from Screens.InfoBarGenerics import InfoBarShowHide, \
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRadioText, \
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
InfoBarEPG, InfoBarEvent, InfoBarServiceName, InfoBarSeek, InfoBarInstantRecord, \
InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \
InfoBarSubserviceSelection, InfoBarTuner, InfoBarShowMovies, InfoBarTimeshift, \
@@ -23,7 +23,7 @@ from Screens.InfoBarGenerics import InfoBarShowHide, \
from Screens.HelpMenu import HelpableScreen, HelpMenu
class InfoBar(InfoBarShowHide,
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRadioText,
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarAudioSelection,
HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
InfoBarSubserviceSelection, InfoBarTuner, InfoBarTimeshift, InfoBarSeek,
@@ -47,7 +47,7 @@ class InfoBar(InfoBarShowHide,
for x in HelpableScreen, \
InfoBarShowHide, \
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRadioText, \
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarAudioSelection, \
InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
InfoBarTuner, InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
@@ -67,7 +67,11 @@ class InfoBar(InfoBarShowHide,
if config.usage.e1like_radio_mode.value:
self.showRadioChannelList(True)
else:
- self.session.open(ChannelSelectionRadio)
+ self.rds_display.hide() # in InfoBarRdsDecoder
+ self.session.openWithCallback(self.ChannelSelectionRadioClosed, ChannelSelectionRadio, self)
+
+ def ChannelSelectionRadioClosed(self, *arg):
+ self.rds_display.show() # in InfoBarRdsDecoder
def showMovies(self):
self.session.openWithCallback(self.movieSelected, MovieSelection)
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 2ccd52de..78a67b7c 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -12,7 +12,6 @@ from Components.ProgressBar import *
from Components.ServiceEventTracker import ServiceEventTracker
from Components.Sources.CurrentService import CurrentService
from Components.Sources.EventInfo import EventInfo
-from Components.Sources.RadioText import RadioText
from Components.Sources.FrontendStatus import FrontendStatus
from Components.Sources.Boolean import Boolean
from Components.Sources.Clock import Clock
@@ -32,6 +31,7 @@ from Screens.MinuteInput import MinuteInput
from Screens.TimerSelection import TimerSelection
from Screens.PictureInPicture import PictureInPicture
from Screens.SubtitleDisplay import SubtitleDisplay
+from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
from Screens.SleepTimerEdit import SleepTimerEdit
from ServiceReference import ServiceReference
@@ -538,10 +538,53 @@ class InfoBarEvent:
self["Event_Now"] = EventInfo(self.session.nav, EventInfo.NOW)
self["Event_Next"] = EventInfo(self.session.nav, EventInfo.NEXT)
-class InfoBarRadioText:
- """provides radio (RDS) text info display"""
+class InfoBarRdsDecoder:
+ """provides RDS and Rass support/display"""
def __init__(self):
- self["RadioText"] = RadioText(self.session.nav)
+ self.rds_display = self.session.instantiateDialog(RdsInfoDisplay)
+ self.rass_interactive = None
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evEnd: self.__serviceStopped,
+ iPlayableService.evUpdatedRassSlidePic: self.RassSlidePicChanged
+ })
+
+ self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+ {
+ "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+ },-1)
+
+ self["RdsActions"].setEnabled(False)
+
+ self.onLayoutFinish.append(self.rds_display.show)
+ self.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
+
+ def RassInteractivePossibilityChanged(self, state):
+ self["RdsActions"].setEnabled(state)
+
+ def RassSlidePicChanged(self):
+ if not self.rass_interactive:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if decoder:
+ decoder.showRassSlidePicture()
+
+ def __serviceStopped(self):
+ if self.rass_interactive is not None:
+ rass_interactive = self.rass_interactive
+ self.rass_interactive = None
+ rass_interactive.close()
+
+ def startRassInteractive(self):
+ self.rds_display.hide()
+ self.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
+
+ def RassInteractiveClosed(self, *val):
+ if self.rass_interactive is not None:
+ self.rass_interactive = None
+ self.RassSlidePicChanged()
+ self.rds_display.show()
class InfoBarServiceName:
def __init__(self):
diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am
index d5512e7e..920a97fb 100644
--- a/lib/python/Screens/Makefile.am
+++ b/lib/python/Screens/Makefile.am
@@ -12,4 +12,4 @@ install_PYTHON = \
Console.py InputBox.py ChoiceBox.py SimpleSummary.py ImageWizard.py \
MediaPlayer.py TimerSelection.py PictureInPicture.py TimeDateInput.py \
SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
- SleepTimerEdit.py Ipkg.py
+ SleepTimerEdit.py Ipkg.py RdsDisplay.py
diff --git a/lib/python/Screens/RdsDisplay.py b/lib/python/Screens/RdsDisplay.py
new file mode 100644
index 00000000..4190b945
--- /dev/null
+++ b/lib/python/Screens/RdsDisplay.py
@@ -0,0 +1,272 @@
+from enigma import iPlayableService, loadPNG, iRdsDecoder, ePoint, gRGB
+from Screens.Screen import Screen
+from Components.Sources.RdsDecoder import RdsDecoder
+from Components.ActionMap import NumberActionMap
+from Components.ServiceEventTracker import ServiceEventTracker
+from Components.Pixmap import Pixmap
+from Components.Label import Label
+from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+
+class RdsInfoDisplay(Screen):
+ ALLOW_SUSPEND = True
+
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evEnd: self.__serviceStopped,
+ iPlayableService.evUpdatedRadioText: self.RadioTextChanged,
+ iPlayableService.evUpdatedRtpText: self.RtpTextChanged,
+ iPlayableService.evUpdatedRassInteractivePicMask: self.RassInteractivePicMaskChanged,
+ })
+
+ self["RadioText"] = Label()
+ self["RtpText"] = Label()
+ self["RassLogo"] = Pixmap()
+
+ self.onLayoutFinish.append(self.hideWidgets)
+ self.rassInteractivePossible=False
+ self.onRassInteractivePossibilityChanged = [ ]
+
+ def hideWidgets(self):
+ for x in (self["RadioText"],self["RtpText"],self["RassLogo"]):
+ x.hide()
+
+ def RadioTextChanged(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ rdsText = decoder and decoder.getText(iRdsDecoder.RadioText)
+ if rdsText and len(rdsText):
+ self["RadioText"].setText(rdsText)
+ self["RadioText"].show()
+ else:
+ self["RadioText"].hide()
+
+ def RtpTextChanged(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ rtpText = decoder and decoder.getText(iRdsDecoder.RtpText)
+ if rtpText and len(rtpText):
+ self["RtpText"].setText(rtpText)
+ self["RtpText"].show()
+ else:
+ self["RtpText"].hide()
+
+ def RassInteractivePicMaskChanged(self):
+ if not self.rassInteractivePossible:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ mask = decoder and decoder.getRassInteractiveMask()
+ if mask[0] & 1: #rass interactive index page available
+ self["RassLogo"].show()
+ self.rassInteractivePossible = True
+ for x in self.onRassInteractivePossibilityChanged:
+ x(True)
+
+ def __serviceStopped(self):
+ self.hideWidgets()
+ if self.rassInteractivePossible:
+ self.rassInteractivePossible = False
+ for x in self.onRassInteractivePossibilityChanged:
+ x(False)
+
+class RassInteractive(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ self["actions"] = NumberActionMap( [ "NumberActions", "RassInteractiveActions" ],
+ {
+ "exit": self.close,
+ "0": lambda x : self.numPressed(0),
+ "1": lambda x : self.numPressed(1),
+ "2": lambda x : self.numPressed(2),
+ "3": lambda x : self.numPressed(3),
+ "4": lambda x : self.numPressed(4),
+ "5": lambda x : self.numPressed(5),
+ "6": lambda x : self.numPressed(6),
+ "7": lambda x : self.numPressed(7),
+ "8": lambda x : self.numPressed(8),
+ "9": lambda x : self.numPressed(9),
+ "nextPage": self.nextPage,
+ "prevPage": self.prevPage,
+ "nextSubPage": self.nextSubPage,
+ "prevSubPage": self.prevSubPage
+ })
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evUpdatedRassInteractivePicMask: self.recvRassInteractivePicMaskChanged
+ })
+
+ self["subpages_1"] = Pixmap()
+ self["subpages_2"] = Pixmap()
+ self["subpages_3"] = Pixmap()
+ self["subpages_4"] = Pixmap()
+ self["subpages_5"] = Pixmap()
+ self["subpages_6"] = Pixmap()
+ self["subpages_7"] = Pixmap()
+ self["subpages_8"] = Pixmap()
+ self["subpages_9"] = Pixmap()
+ self["Marker"] = Label(">")
+
+ self.subpage = {
+ 1 : self["subpages_1"],
+ 2 : self["subpages_2"],
+ 3 : self["subpages_3"],
+ 4 : self["subpages_4"],
+ 5 : self["subpages_5"],
+ 6 : self["subpages_6"],
+ 7 : self["subpages_7"],
+ 8 : self["subpages_8"],
+ 9 : self["subpages_9"] }
+
+ self.subpage_png = {
+ 1 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page1.png")),
+ 2 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page2.png")),
+ 3 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page3.png")),
+ 4 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page4.png")) }
+
+ self.current_page=0;
+ self.current_subpage=0;
+ self.showRassPage(0,0)
+ self.onLayoutFinish.append(self.updateSubPagePixmaps)
+
+ def updateSubPagePixmaps(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in showRassPage"
+ else:
+ mask = decoder.getRassInteractiveMask()
+ page = 1
+ while page < 10:
+ subpage_cnt = self.countAvailSubpages(page, mask)
+ subpage = self.subpage[page]
+ if subpage_cnt > 0:
+ if subpage.instance:
+ png = self.subpage_png[subpage_cnt]
+ if png:
+ subpage.instance.setPixmap(png)
+ subpage.show()
+ else:
+ print "rass png missing"
+ else:
+ subpage.hide()
+ page += 1
+
+ def recvRassInteractivePicMaskChanged(self):
+ self.updateSubPagePixmaps()
+
+ def showRassPage(self, page, subpage):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in showRassPage"
+ else:
+ decoder.showRassInteractivePic(page, subpage)
+ page_diff = page - self.current_page
+ self.current_page = page
+ if page_diff:
+ current_pos = self["Marker"].getPosition()
+ y = current_pos[1]
+ y += page_diff * 25
+ self["Marker"].setPosition(current_pos[0],y)
+
+ def getMaskForPage(self, page, masks=None):
+ if not masks:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in getMaskForPage"
+ masks = decoder.getRassInteractiveMask()
+ if masks:
+ mask = masks[(page*4)/8]
+ if page % 2:
+ mask >>= 4
+ else:
+ mask &= 0xF
+ return mask
+
+ def countAvailSubpages(self, page, masks):
+ mask = self.getMaskForPage(page, masks)
+ cnt = 0
+ while mask:
+ if mask & 1:
+ cnt += 1
+ mask >>= 1
+ return cnt
+
+ def nextPage(self):
+ mask = 0
+ page = self.current_page
+ while mask == 0:
+ page += 1
+ if page > 9:
+ page = 0
+ mask = self.getMaskForPage(page)
+ self.numPressed(page)
+
+ def prevPage(self):
+ mask = 0
+ page = self.current_page
+ while mask == 0:
+ if page > 0:
+ page -= 1
+ else:
+ page = 9
+ mask = self.getMaskForPage(page)
+ self.numPressed(page)
+
+ def nextSubPage(self):
+ self.numPressed(self.current_page)
+
+ def prevSubPage(self):
+ num = self.current_page
+ mask = self.getMaskForPage(num)
+ cur_bit = 1 << self.current_subpage
+ tmp = cur_bit
+ while True:
+ if tmp == 1:
+ tmp = 8
+ else:
+ tmp >>= 1
+ if tmp == cur_bit: # no other subpage avail
+ return
+ if mask & tmp: # next subpage found
+ subpage = 0
+ while tmp > 1: # convert bit to subpage
+ subpage += 1
+ tmp >>= 1
+ self.current_subpage = subpage
+ self.showRassPage(num, subpage)
+ return
+
+ def numPressed(self, num):
+ mask = self.getMaskForPage(num)
+ if self.current_page == num:
+ self.skip = 0
+ cur_bit = 1 << self.current_subpage
+ tmp = cur_bit
+ else:
+ self.skip = 1
+ cur_bit = 16
+ tmp = 1
+ while True:
+ if not self.skip:
+ if tmp == 8 and cur_bit < 16:
+ tmp = 1
+ else:
+ tmp <<= 1
+ else:
+ self.skip = 0
+ if tmp == cur_bit: # no other subpage avail
+ return
+ if mask & tmp: # next subpage found
+ subpage = 0
+ while tmp > 1: # convert bit to subpage
+ subpage += 1
+ tmp >>= 1
+ self.current_subpage = subpage
+ self.showRassPage(num, subpage)
+ return