add a radiomode background picture (mvi file.. changable in
[enigma2.git] / lib / python / Screens / RdsDisplay.py
diff --git a/lib/python/Screens/RdsDisplay.py b/lib/python/Screens/RdsDisplay.py
new file mode 100644 (file)
index 0000000..4190b94
--- /dev/null
@@ -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