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