[FPGAUpgrade] improving ui
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / FPGAUpgrade / plugin.py
1 import os
2
3 import fpga
4 from enigma import eTimer
5
6 from urllib import urlretrieve
7 import urllib
8
9 from Screens.Screen import Screen
10 from Screens.MessageBox import MessageBox
11
12 from Plugins.Plugin import PluginDescriptor
13
14 from Tools.Directories import fileExists
15
16 from Components.Label import Label
17 from Components.Slider import Slider
18 from Components.Pixmap import Pixmap
19 from Components.FileList import FileList 
20 from Components.ActionMap import ActionMap
21 from Components.PluginComponent import plugins
22 from Components.Sources.StaticText import StaticText
23
24 class UpgradeStatus(Screen):
25         skin =  """
26                 <screen position="center,center" size="450,100" title="FPGA Upgrade">
27                         <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
28                         <widget name="slider" position="10,25" size="430,30" backgroundColor="white"/>
29                         <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="black" backgroundColor="black" transparent="1"/>
30                         <widget source="info" render="Label" position="10,70" zPosition="1" size="430,30" font="Regular;22" halign="center" valign="center" backgroundColor="#a08500" transparent="1"/>
31                 </screen>
32                 """
33         def __init__(self, session, parent, timeout = 10):
34                 Screen.__init__(self,session)
35                 self.session = session
36
37                 self["actions"] = ActionMap(["OkCancelActions"],
38                 {
39                         "ok": self.keyExit,
40                 }, -1)
41
42                 self.is_done = 0
43                 self.exit_count = 0
44                 self.timeout = timeout
45                 self.title_str = "FPGA Upgrade"
46
47                 #self["name"] = Label(_("Upgrade status"))
48                 self["name"] = Label(_(" "))
49                 self["info"] = StaticText(_("Can't cancel during upgrade!!"))
50
51                 self["status"] = Label(_("Status : 0%"))
52                 self.status_bar = self["status"] 
53
54                 self.slider = Slider(0, 100)
55                 self["slider"] = self.slider
56                 
57                 self.parent = parent
58                 self.timer_check_progress = eTimer()
59                 self.timer_check_progress.callback.append(self.callbackDoCheckProgress)
60                 interval = self.parent.FPGA.get_interval()
61                 self.timer_check_progress.start(interval)
62
63         def callbackDoCheckProgress(self):
64                 self.status = self.parent.FPGA.get_status()
65
66                 if self.status > 0:
67                         self.slider.setValue(self.status)
68
69                 if self.status == 100:
70                         #print "fpga-upgrade done!!"
71                         self.status_bar.setText(_("Success. Press OK to exit."))
72                         #self.status_bar.setText(_("%d / 100" % (self.status)))
73                         self.timer_check_progress.stop()
74                         self.is_done = 1
75
76                         self.timer_exit = eTimer()
77                         self.timer_exit.callback.append(self.callbackExit)
78                         self.timer_exit.start(1000)
79                 elif self.status == -1 or self.status == -2:
80                         #print "fpga-upgrade error >> errno : [%d]" % (self.status)
81                         self.status_bar.setText(_("Error[%d]. Press Cancel to exit." % (self.status)))
82                         self.timer_check_progress.stop()
83                         self.is_done = 1
84                 else:
85                         #print "fpga-upgrade status : %d" % self.status
86                         self.status_bar.setText(_("%d / 100" % (self.status)))
87
88         def callbackExit(self):
89                 if self.exit_count == self.timeout:
90                         self.timer_exit.stop()
91                         self.keyExit()
92                 self.exit_count = self.exit_count + 1
93                 self.instance.setTitle("%s (%d)" % (self.title_str, (self.timeout-self.exit_count)))
94
95         def keyExit(self):
96                 if self.is_done :
97                         self.close()
98                 
99 class FPGAUpgrade(Screen):
100         skin =  """
101                 <screen position="center,center" size="560,440" title="FPGA Upgrade" >
102                         <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,7" size="140,40" alphatest="blend" />
103                         <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,7" size="140,40" alphatest="blend" />
104                         <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,7" size="140,40" alphatest="blend" />
105                         <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,7" size="140,40" alphatest="blend" />
106
107                         <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
108                         <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
109                         <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
110                         <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
111
112                         <widget source="status" render="Label" position="15,45" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" backgroundColor="#a08500" transparent="1" />
113                         <widget name="file_list" position="0,100" size="555,325" scrollbarMode="showOnDemand" />
114                 </screen>
115                 """
116
117         def __init__(self, session): 
118                 Screen.__init__(self, session)
119                 self.session = session 
120
121                 self["key_red"] = StaticText(_("Close"))
122                 self["key_green"] = StaticText(_("Ugrade"))
123                 self["key_yellow"] = StaticText(_(" "))
124                 self["key_blue"] = StaticText(_("Download"))
125                 #self["key_blue"] = StaticText(_(" "))
126                 self["status"] = StaticText(_(" "))
127                 self["file_list"] = FileList("/", matchingPattern = "^.*")
128
129                 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", ],
130                 {
131                         "red": self.onClickRed,
132                         "green": self.onClickGreen,
133                         "blue": self.onClickBlue,
134                         "back": self.onClickRed,
135                         "ok": self.onClickOk,
136                         "up": self.onClickUp,
137                         "down": self.onClickDown,
138                         "left": self.onClickLeft,
139                         "right": self.onClickRight,
140                 }, -1) 
141                 self.onLayoutFinish.append(self.doLayoutFinish)
142         
143                 self.ERROR_MSG = ''                                                                                          
144                 self.ERROR_CODE = 0                                                                                          
145                 self.SOURCELIST = self["file_list"]                                                                          
146                 self.STATUS_BAR = self["status"]                                                                             
147                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
148
149                 self.DEVICE_PATH = '/dev/misc/dp'                                                                                       
150                 self.DOWNLOAD_TAR_PATH = '/tmp/'                                                                             
151                 self.DOWNLOAD_FILE_NAME = 'TS_PRO.dat'                                                                       
152                 self.DOWNLOAD_URL = ''
153                 self.doLoadConf()
154                 self.FPGA = fpga.Fpga()
155                 print self.DEVICE_PATH
156                 print self.DOWNLOAD_TAR_PATH
157                 print self.DOWNLOAD_FILE_NAME
158                 print self.DOWNLOAD_URL
159
160         def doLayoutFinish(self):
161                 return  
162
163         def doExit(self):
164                 if fileExists(self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME):
165                         os.remove(self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME)
166                 self.close()
167
168         def doLoadConf(self):
169                 if fileExists("/proc/stb/info/vumodel"):
170                         model = open("/proc/stb/info/vumodel").read().strip()
171                         download_uri_header = open('/usr/lib/enigma2/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.conf').readline().strip()
172                         self.DOWNLOAD_URL = str(download_uri_header) + "vu" + str(model) + "/" + self.DOWNLOAD_FILE_NAME
173
174         def doHook(self, blockNumber, blockSize, totalSize) :
175                 if blockNumber*blockSize > totalSize :
176                         self.STATUS_BAR.setText(_("Downloaded " + self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME))
177                 else :
178                         self.STATUS_BAR.setText(_("Downloading..."))
179                 
180         def onCallbackHandler(self, confirmed):                                                                                                                
181                 if confirmed:                                                                                                                    
182                         self.doExit()   
183
184
185
186         def doUpgradeHandler(self, confirmed):
187                 if confirmed == False:
188                         return
189                 
190                 path = ''
191                 try:
192                         path = self.SOURCELIST.getCurrentDirectory() + self.SOURCELIST.getFilename() 
193                 except:
194                         #self.session.open(MessageBox, _("Can't select directory."), MessageBox.TYPE_INFO, timeout = 5)
195                         return
196
197                 self.ERROR_CODE = self.FPGA.fpga_upgrade(path, self.DEVICE_PATH)
198                 if self.ERROR_CODE > 0:
199                         self.ERROR_MSG = self.FPGA.get_error_msg(self.ERROR_CODE, self.ERROR_MSG)
200                         message = "Fail to upgrade.\nCause : " + self.ERROR_MSG + "\nDo you want to exit?"
201                         self.session.openWithCallback(self.onCallbackHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True)
202
203                         print "DEVICE_PATH : ", self.DEVICE_PATH
204                         print "FILE_PATH : ", path
205                 else:
206                         #self.session.open(MessageBox, _("Success!!"), MessageBox.TYPE_INFO, timeout = 5)
207                         self.session.open(UpgradeStatus, self, timeout = 10)                    
208
209         def onClickRed(self):
210                 self.doExit()
211
212         # run upgrade!!
213         def onClickGreen(self):
214                 #self.session.open(MessageBox, _("Upgrade will take about 5 minutes to finish."), MessageBox.TYPE_INFO, timeout = 10)
215                 message = "Upgrade will take about 5 minutes to finish.\nDo you want to upgrade?"
216                 self.session.openWithCallback(self.doUpgradeHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True)
217
218         def onClickBlue(self):
219                 fname = ''
220                 header = ''
221                 test_opener = urllib.URLopener()
222                 try:
223                         test_opener.open(self.DOWNLOAD_URL)
224                 except:
225                         self.session.open(MessageBox, _('File not found'), MessageBox.TYPE_INFO, timeout = 5)
226                         del test_opener
227                         return
228                 try :
229                         fname, header = urlretrieve(self.DOWNLOAD_URL, self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME, self.doHook)
230                 except IOError, msg:
231                         self.session.open(MessageBox, _(str(msg)), MessageBox.TYPE_INFO, timeout = 5)
232                         del test_opener
233                         return
234                 del test_opener
235
236                 before_name = ''
237                 self.SOURCELIST.changeDir(self.DOWNLOAD_TAR_PATH)
238                 self.SOURCELIST.moveToIndex(0)
239                 while cmp(self.SOURCELIST.getFilename(), self.DOWNLOAD_FILE_NAME) != 0 :
240                         self.SOURCELIST.down()
241                         if cmp(before_name, self.SOURCELIST.getFilename()) == 0:
242                                 break
243                         before_name = self.SOURCELIST.getFilename()
244
245         def onClickOk(self):
246                 if self.SOURCELIST.canDescent() : # isDir                                                                   
247                         self.SOURCELIST.descent()                                                                              
248                         if self.SOURCELIST.getCurrentDirectory():
249                                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
250                 else:                                                                                                      
251                         self.onClickGreen()
252
253         def onClickUp(self):
254                 self.SOURCELIST.up()
255                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
256
257         def onClickDown(self):
258                 self.SOURCELIST.down()
259                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
260
261         def onClickLeft(self):
262                 self.SOURCELIST.pageUp()
263                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
264
265         def onClickRight(self):
266                 self.SOURCELIST.pageDown()
267                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
268
269 def main(session, **kwargs):
270         session.open(FPGAUpgrade)
271                                                            
272 def Plugins(**kwargs):            
273         return PluginDescriptor(name=_("FPGA Upgrade"), description="Upgrade FPGA..", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)
274