from enigma import iPlayableService, loadPNG, iRdsDecoder from Screens.Screen import Screen 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