aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Screens/RdsDisplay.py
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/RdsDisplay.py
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/RdsDisplay.py')
-rw-r--r--lib/python/Screens/RdsDisplay.py272
1 files changed, 272 insertions, 0 deletions
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