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