fix non working ENQ fields in CI mmi (PIN inputs and other)
[vuplus_dvbapp] / lib / python / Screens / Ci.py
1 from Screen import *
2 from Components.MenuList import MenuList
3 from Components.ActionMap import ActionMap
4 from Components.ActionMap import NumberActionMap
5 from Components.Header import Header
6 from Components.Button import Button
7 from Components.Label import Label
8
9 from Components.HTMLComponent import *
10 from Components.GUIComponent import *
11 from Components.config import *
12 from Components.ConfigList import ConfigList
13
14 from enigma import eTimer, eDVBCI_UI, eListboxPythonStringContent, eListboxPythonConfigContent
15
16 TYPE_MENU = 0
17 TYPE_CONFIG = 1
18
19 class CiMmi(Screen):
20         def __init__(self, session, slotid, action):
21                 Screen.__init__(self, session)
22
23                 print "ciMMI with action" + str(action)
24
25                 self.slotid = slotid
26
27                 self.Timer = eTimer()
28                 self.Timer.timeout.get().append(self.TimerCheck)
29                 self.Timer.start(1000)
30
31                 #else the skins fails
32                 self["title"] = Label("")
33                 self["subtitle"] = Label("")
34                 self["bottom"] = Label("")
35                 self["entries"] = ConfigList([ ])
36                 self.listtype = TYPE_CONFIG
37
38                 self["actions"] = NumberActionMap(["SetupActions"],
39                         {
40                                 "ok": self.okbuttonClick,
41                                 "cancel": self.keyCancel,
42                                 #for PIN
43                                 "left": self.keyLeft,
44                                 "right": self.keyRight,
45                                 "1": self.keyNumberGlobal,
46                                 "2": self.keyNumberGlobal,
47                                 "3": self.keyNumberGlobal,
48                                 "4": self.keyNumberGlobal,
49                                 "5": self.keyNumberGlobal,
50                                 "6": self.keyNumberGlobal,
51                                 "7": self.keyNumberGlobal,
52                                 "8": self.keyNumberGlobal,
53                                 "9": self.keyNumberGlobal,
54                                 "0": self.keyNumberGlobal
55                         }, -1)
56
57                 self.action = action
58
59                 if action == 0:                 #reset
60                         eDVBCI_UI.getInstance().setReset(self.slotid)
61                         self.showWait()
62                 elif action == 1:               #init
63                         eDVBCI_UI.getInstance().setInit(self.slotid)
64                 elif action == 2:               #start MMI
65                         eDVBCI_UI.getInstance().startMMI(self.slotid)
66                         self.showWait()
67                 elif action == 3:               #mmi already there (called from infobar)
68                         self.showScreen()
69
70         def addEntry(self, list, entry):
71                 if entry[0] == "TEXT":          #handle every item (text / pin only?)
72                         list.append( (entry[1], entry[2]) )
73                 if entry[0] == "PIN":
74                         if entry[3] == 1:
75                                 # masked pins:
76                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (entry[1], "*")))
77                         else:                           
78                                 # unmasked pins:
79                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (entry[1], "")))
80                         
81                         self["subtitle"].setText(entry[2])
82                         self.pin = getConfigListEntry("",x)
83                         list.append( self.pin )
84                         self["bottom"].setText(_("please press OK when ready"))
85
86         def okbuttonClick(self):
87                 print "ok"
88                 if self.tag == "WAIT":
89                         print "do nothing - wait"
90                 elif self.tag == "MENU":
91                         print "answer MENU"
92                         eDVBCI_UI.getInstance().answerMenu(self.slotid, self["entries"].getCurrent()[1])
93                         self.showWait() 
94                 elif self.tag == "LIST":
95                         print "answer LIST"
96                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
97                         self.showWait() 
98                 elif self.tag == "ENQ":
99                         answer = str(self.pin[1].parent.value[0])
100                         print "answer ENQ", answer
101                         eDVBCI_UI.getInstance().answerEnq(self.slotid, answer)
102                         self.showWait()
103
104         def closeMmi(self):
105                 self.Timer.stop()
106                 self.close()
107
108         def keyCancel(self):
109                 print "keyCancel"
110                 if self.tag == "WAIT":
111                         eDVBCI_UI.getInstance().stopMMI(self.slotid)
112                         self.closeMmi()
113                 elif self.tag in [ "MENU", "LIST" ]:
114                         print "cancel list"
115                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
116                         self.showWait()
117                 elif self.tag == "ENQ":
118                         print "cancel enq"
119                         eDVBCI_UI.getInstance().cancelEnq(self.slotid)
120                         self.showWait()
121                 else:
122                         print "give cancel action to ci"        
123
124         def keyNumberGlobal(self, number):
125                 self["entries"].handleKey(config.key[str(number)])
126
127         def keyLeft(self):
128                 self["entries"].handleKey(config.key["prevElement"])
129
130         def keyRight(self):
131                 self["entries"].handleKey(config.key["nextElement"])
132
133         def updateList(self, list):
134                 List = self["entries"]
135                 try:
136                         List.instance.moveSelectionTo(0)
137                 except:
138                         List.l.setList(list)
139                         return
140
141                 if self.tag == "ENQ":
142                         type = TYPE_CONFIG
143                 else:
144                         type = TYPE_MENU
145
146                 if type != self.listtype:
147                         if type == TYPE_CONFIG:
148                                 List.l = eListboxPythonConfigContent()
149                         else:
150                                 List.l = eListboxPythonStringContent()
151                         List.instance.setContent(List.l)
152                         self.listtype = type
153
154                 List.l.setList(list)
155
156
157         def showWait(self):
158                 self.tag = "WAIT"
159                 self["title"].setText("")
160                 self["subtitle"].setText("")
161                 self["bottom"].setText("")
162                 list = [ ]
163                 list.append( ("wait for ci...", 0) )
164                 self.updateList(list)
165
166         def showScreen(self):
167                 screen = eDVBCI_UI.getInstance().getMMIScreen(self.slotid)
168         
169                 list = [ ]
170
171                 self.tag = screen[0][0]
172
173                 for entry in screen:
174                         if entry[0] == "PIN":
175                                 self.addEntry(list, entry)
176                         else:
177                                 if entry[0] == "TITLE":
178                                         self["title"].setText(entry[1])
179                                 elif entry[0] == "SUBTITLE":
180                                         self["subtitle"].setText(entry[1])
181                                 elif entry[0] == "BOTTOM":
182                                         self["bottom"].setText(entry[1])
183                                 elif entry[0] == "TEXT":
184                                         self.addEntry(list, entry)
185                 self.updateList(list)
186
187         def TimerCheck(self):
188                 if self.action == 0:                    #reset
189                         self.closeMmi()
190                 if self.action == 1:                    #init
191                         self.closeMmi()
192
193                 #module still there ?                   
194                 if eDVBCI_UI.getInstance().getState(self.slotid) != 2:
195                         self.closeMmi()
196
197                 #mmi session still active ?                     
198                 if eDVBCI_UI.getInstance().getMMIState(self.slotid) != 1:
199                         self.closeMmi()
200                         
201                 #new screen available?  
202                 if eDVBCI_UI.getInstance().availableMMI(self.slotid) == 1:
203                         self.showScreen()
204                         
205                 #FIXME: check for mmi-session closed    
206
207 class CiSelection(Screen):
208         def createMenu(self):
209                 self.list = [ ]
210                 self.list.append( (_("Reset"), 0) )
211                 self.list.append( (_("Init"), 1) )
212                 
213                 self.state = eDVBCI_UI.getInstance().getState(0)
214                 if self.state == 0:                     #no module
215                         self.list.append( (_("no module found"), 2) )
216                 elif self.state == 1:           #module in init
217                         self.list.append( (_("init module"), 2) )
218                 elif self.state == 2:           #module ready
219                         #get appname            
220                         appname = eDVBCI_UI.getInstance().getAppName(0)
221                         self.list.append( (appname, 2) )
222
223                 self["entries"].list = self.list
224                 self["entries"].l.setList(self.list)
225
226         def TimerCheck(self):
227                 state = eDVBCI_UI.getInstance().getState(0)
228                 if self.state != state:
229                         #print "something happens"
230                         self.state = state
231                         self.createMenu()
232         
233         def okbuttonClick(self):
234                 self.slot = 0
235         
236                 if self.state == 2:
237                         self.session.open(CiMmi, 0, self["entries"].getCurrent()[1])
238
239                 #generate menu / list
240                 #list = [ ]
241                 #list.append( ("TEXT", "CA-Info") )
242                 #list.append( ("TEXT", "Card Status") )
243                 #list.append( ("PIN", 6, "Card Pin", 1) )
244                 #self.session.open(CiMmi, 0, 0, "Wichtiges CI", "Mainmenu", "Footer", list)
245
246         def cancel(self):
247                 self.Timer.stop()
248                 self.close()
249                 
250         def __init__(self, session):
251                 #FIXME support for one ci only
252                 Screen.__init__(self, session)
253                 
254                 self["actions"] = ActionMap(["OkCancelActions"], 
255                         {
256                                 "ok": self.okbuttonClick,
257                                 "cancel": self.cancel
258                         })
259
260                 self.list = [ ]
261                 self["entries"] = MenuList(list)
262                 self.createMenu()
263
264                 self.Timer = eTimer()
265                 self.Timer.timeout.get().append(self.TimerCheck)
266                 self.Timer.start(1000)