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