small radiomode fix
[enigma2.git] / lib / python / Screens / RdsDisplay.py
1 from enigma import iPlayableService, loadPNG, iRdsDecoder
2 from Screens.Screen import Screen
3 from Components.ActionMap import NumberActionMap
4 from Components.ServiceEventTracker import ServiceEventTracker
5 from Components.Pixmap import Pixmap
6 from Components.Label import Label
7 from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
8
9 class RdsInfoDisplay(Screen):
10         ALLOW_SUSPEND = True
11         
12         def __init__(self, session):
13                 Screen.__init__(self, session)
14
15                 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
16                         {
17                                 iPlayableService.evEnd: self.__serviceStopped,
18                                 iPlayableService.evUpdatedRadioText: self.RadioTextChanged,
19                                 iPlayableService.evUpdatedRtpText: self.RtpTextChanged,
20                                 iPlayableService.evUpdatedRassInteractivePicMask: self.RassInteractivePicMaskChanged,
21                         })
22
23                 self["RadioText"] = Label()
24                 self["RtpText"] = Label()
25                 self["RassLogo"] = Pixmap()
26
27                 self.onLayoutFinish.append(self.hideWidgets)
28                 self.rassInteractivePossible=False
29                 self.onRassInteractivePossibilityChanged = [ ]
30
31         def hideWidgets(self):
32                 for x in (self["RadioText"],self["RtpText"],self["RassLogo"]):
33                         x.hide()
34
35         def RadioTextChanged(self):
36                 service = self.session.nav.getCurrentService()
37                 decoder = service and service.rdsDecoder()
38                 rdsText = decoder and decoder.getText(iRdsDecoder.RadioText)
39                 if rdsText and len(rdsText):
40                         self["RadioText"].setText(rdsText)
41                         self["RadioText"].show()
42                 else:
43                         self["RadioText"].hide()
44
45         def RtpTextChanged(self):
46                 service = self.session.nav.getCurrentService()
47                 decoder = service and service.rdsDecoder()
48                 rtpText = decoder and decoder.getText(iRdsDecoder.RtpText)
49                 if rtpText and len(rtpText):
50                         self["RtpText"].setText(rtpText)
51                         self["RtpText"].show()
52                 else:
53                         self["RtpText"].hide()
54
55         def RassInteractivePicMaskChanged(self):
56                 if not self.rassInteractivePossible:
57                         service = self.session.nav.getCurrentService()
58                         decoder = service and service.rdsDecoder()
59                         mask = decoder and decoder.getRassInteractiveMask()
60                         if mask[0] & 1: #rass interactive index page available
61                                 self["RassLogo"].show()
62                                 self.rassInteractivePossible = True
63                                 for x in self.onRassInteractivePossibilityChanged:
64                                         x(True)
65
66         def __serviceStopped(self):
67                 self.hideWidgets()
68                 if self.rassInteractivePossible:
69                         self.rassInteractivePossible = False
70                         for x in self.onRassInteractivePossibilityChanged:
71                                 x(False)
72
73 class RassInteractive(Screen):
74         def __init__(self, session):
75                 Screen.__init__(self, session)
76
77                 self["actions"] = NumberActionMap( [ "NumberActions", "RassInteractiveActions" ],
78                         {
79                                 "exit": self.close,
80                                 "0": lambda x : self.numPressed(0),
81                                 "1": lambda x : self.numPressed(1),
82                                 "2": lambda x : self.numPressed(2),
83                                 "3": lambda x : self.numPressed(3),
84                                 "4": lambda x : self.numPressed(4),
85                                 "5": lambda x : self.numPressed(5),
86                                 "6": lambda x : self.numPressed(6),
87                                 "7": lambda x : self.numPressed(7),
88                                 "8": lambda x : self.numPressed(8),
89                                 "9": lambda x : self.numPressed(9),
90                                 "nextPage": self.nextPage,
91                                 "prevPage": self.prevPage,
92                                 "nextSubPage": self.nextSubPage,
93                                 "prevSubPage": self.prevSubPage
94                         })
95
96                 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
97                         {
98                                 iPlayableService.evUpdatedRassInteractivePicMask: self.recvRassInteractivePicMaskChanged
99                         })
100
101                 self["subpages_1"] = Pixmap()
102                 self["subpages_2"] = Pixmap()
103                 self["subpages_3"] = Pixmap()
104                 self["subpages_4"] = Pixmap()
105                 self["subpages_5"] = Pixmap()
106                 self["subpages_6"] = Pixmap()
107                 self["subpages_7"] = Pixmap()
108                 self["subpages_8"] = Pixmap()
109                 self["subpages_9"] = Pixmap()
110                 self["Marker"] = Label(">")
111
112                 self.subpage = {
113                         1 : self["subpages_1"],
114                         2 : self["subpages_2"],
115                         3 : self["subpages_3"],
116                         4 : self["subpages_4"],
117                         5 : self["subpages_5"],
118                         6 : self["subpages_6"],
119                         7 : self["subpages_7"],
120                         8 : self["subpages_8"],
121                         9 : self["subpages_9"] }
122
123                 self.subpage_png = {
124                         1 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page1.png")),
125                         2 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page2.png")),
126                         3 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page3.png")),
127                         4 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page4.png")) }
128
129                 self.current_page=0;
130                 self.current_subpage=0;
131                 self.showRassPage(0,0)
132                 self.onLayoutFinish.append(self.updateSubPagePixmaps)
133
134         def updateSubPagePixmaps(self):
135                 service = self.session.nav.getCurrentService()
136                 decoder = service and service.rdsDecoder()
137                 if not decoder: # this should never happen
138                         print "NO RDS DECODER in showRassPage"
139                 else:
140                         mask = decoder.getRassInteractiveMask()
141                         page = 1
142                         while page < 10:
143                                 subpage_cnt = self.countAvailSubpages(page, mask)
144                                 subpage = self.subpage[page]
145                                 if subpage_cnt > 0:
146                                         if subpage.instance:
147                                                 png = self.subpage_png[subpage_cnt]
148                                                 if png:
149                                                         subpage.instance.setPixmap(png)
150                                                         subpage.show()
151                                                 else:
152                                                         print "rass png missing"
153                                 else:
154                                         subpage.hide()
155                                 page += 1
156
157         def recvRassInteractivePicMaskChanged(self):
158                 self.updateSubPagePixmaps()
159
160         def showRassPage(self, page, subpage):
161                 service = self.session.nav.getCurrentService()
162                 decoder = service and service.rdsDecoder()
163                 if not decoder: # this should never happen
164                         print "NO RDS DECODER in showRassPage"
165                 else:
166                         decoder.showRassInteractivePic(page, subpage)
167                         page_diff = page - self.current_page
168                         self.current_page = page
169                         if page_diff:
170                                 current_pos = self["Marker"].getPosition()
171                                 y = current_pos[1]
172                                 y += page_diff * 25
173                                 self["Marker"].setPosition(current_pos[0],y)
174
175         def getMaskForPage(self, page, masks=None):
176                 if not masks:
177                         service = self.session.nav.getCurrentService()
178                         decoder = service and service.rdsDecoder()
179                         if not decoder: # this should never happen
180                                 print "NO RDS DECODER in getMaskForPage"
181                         masks = decoder.getRassInteractiveMask()
182                 if masks:
183                         mask = masks[(page*4)/8]
184                         if page % 2:
185                                 mask >>= 4
186                         else:
187                                 mask &= 0xF
188                 return mask
189
190         def countAvailSubpages(self, page, masks):
191                 mask = self.getMaskForPage(page, masks)
192                 cnt = 0
193                 while mask:
194                         if mask & 1:
195                                 cnt += 1
196                         mask >>= 1
197                 return cnt
198
199         def nextPage(self):
200                 mask = 0
201                 page = self.current_page
202                 while mask == 0:
203                         page += 1
204                         if page > 9:
205                                 page = 0
206                         mask = self.getMaskForPage(page)
207                 self.numPressed(page)
208
209         def prevPage(self):
210                 mask = 0
211                 page = self.current_page
212                 while mask == 0:
213                         if page > 0:
214                                 page -= 1
215                         else:
216                                 page = 9
217                         mask = self.getMaskForPage(page)
218                 self.numPressed(page)
219
220         def nextSubPage(self):
221                 self.numPressed(self.current_page)
222
223         def prevSubPage(self):
224                 num = self.current_page
225                 mask = self.getMaskForPage(num)
226                 cur_bit = 1 << self.current_subpage
227                 tmp = cur_bit
228                 while True:
229                         if tmp == 1:
230                                 tmp = 8
231                         else:
232                                 tmp >>= 1
233                         if tmp == cur_bit: # no other subpage avail
234                                 return
235                         if mask & tmp: # next subpage found
236                                 subpage = 0
237                                 while tmp > 1: # convert bit to subpage
238                                         subpage += 1
239                                         tmp >>= 1
240                                 self.current_subpage = subpage
241                                 self.showRassPage(num, subpage)
242                                 return
243
244         def numPressed(self, num):
245                 mask = self.getMaskForPage(num)
246                 if self.current_page == num:
247                         self.skip = 0
248                         cur_bit = 1 << self.current_subpage
249                         tmp = cur_bit
250                 else:
251                         self.skip = 1
252                         cur_bit = 16
253                         tmp = 1
254                 while True:
255                         if not self.skip:
256                                 if tmp == 8 and cur_bit < 16:
257                                         tmp = 1
258                                 else:
259                                         tmp <<= 1
260                         else:
261                                 self.skip = 0
262                         if tmp == cur_bit: # no other subpage avail
263                                 return
264                         if mask & tmp: # next subpage found
265                                 subpage = 0
266                                 while tmp > 1: # convert bit to subpage
267                                         subpage += 1
268                                         tmp >>= 1
269                                 self.current_subpage = subpage
270                                 self.showRassPage(num, subpage)
271                                 return