7ebadbe53515036cec0b34a562d48dfb092b04db
[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_LIST = '/dev/fpga_dp;/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_LIST
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         def doUpgradeHandler(self, confirmed):
185                 if confirmed == False:
186                         return
187                 
188                 path = ''
189                 try:
190                         path = self.SOURCELIST.getCurrentDirectory() + self.SOURCELIST.getFilename() 
191                 except:
192                         #self.session.open(MessageBox, _("Can't select directory."), MessageBox.TYPE_INFO, timeout = 5)
193                         return
194
195                 device = ""
196                 device_list = self.DEVICE_LIST.split(";")
197
198                 for d in device_list:
199                         if os.path.exists(d):
200                                 device = d
201                                 break
202
203                 if device == None or len(device) == 0:
204                         message = "Fail to upgrade.\nCause : Can't found device.\nDo you want to exit?"
205                         self.session.openWithCallback(self.onCallbackHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True)
206                         print "DEVICE_LIST : ", device_list
207
208                 print "DEVICE : ", device
209                 self.ERROR_CODE = self.FPGA.fpga_upgrade(path, device)
210                 if self.ERROR_CODE > 0:
211                         self.ERROR_MSG = self.FPGA.get_error_msg(self.ERROR_CODE, self.ERROR_MSG)
212                         message = "Fail to upgrade.\nCause : " + self.ERROR_MSG + "\nDo you want to exit?"
213                         self.session.openWithCallback(self.onCallbackHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True)
214                         print "DEVICE : ", device
215                         print "FILE : ", path
216                 else:
217                         #self.session.open(MessageBox, _("Success!!"), MessageBox.TYPE_INFO, timeout = 5)
218                         self.session.open(UpgradeStatus, self, timeout = 10)                    
219
220         def onClickRed(self):
221                 self.doExit()
222
223         # run upgrade!!
224         def onClickGreen(self):
225                 #self.session.open(MessageBox, _("Upgrade will take about 5 minutes to finish."), MessageBox.TYPE_INFO, timeout = 10)
226                 message = "Upgrade will take about 5 minutes to finish.\nDo you want to upgrade?"
227                 self.session.openWithCallback(self.doUpgradeHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True)
228
229         def onClickBlue(self):
230                 fname = ''
231                 header = ''
232                 test_opener = urllib.URLopener()
233                 try:
234                         test_opener.open(self.DOWNLOAD_URL)
235                 except:
236                         self.session.open(MessageBox, _('File not found'), MessageBox.TYPE_INFO, timeout = 5)
237                         del test_opener
238                         return
239                 try :
240                         fname, header = urlretrieve(self.DOWNLOAD_URL, self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME, self.doHook)
241                 except IOError, msg:
242                         self.session.open(MessageBox, _(str(msg)), MessageBox.TYPE_INFO, timeout = 5)
243                         del test_opener
244                         return
245                 del test_opener
246
247                 before_name = ''
248                 self.SOURCELIST.changeDir(self.DOWNLOAD_TAR_PATH)
249                 self.SOURCELIST.moveToIndex(0)
250                 while cmp(self.SOURCELIST.getFilename(), self.DOWNLOAD_FILE_NAME) != 0 :
251                         self.SOURCELIST.down()
252                         if cmp(before_name, self.SOURCELIST.getFilename()) == 0:
253                                 break
254                         before_name = self.SOURCELIST.getFilename()
255
256         def onClickOk(self):
257                 if self.SOURCELIST.canDescent() : # isDir                                                                   
258                         self.SOURCELIST.descent()                                                                              
259                         if self.SOURCELIST.getCurrentDirectory():
260                                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
261                 else:                                                                                                      
262                         self.onClickGreen()
263
264         def onClickUp(self):
265                 self.SOURCELIST.up()
266                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
267
268         def onClickDown(self):
269                 self.SOURCELIST.down()
270                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
271
272         def onClickLeft(self):
273                 self.SOURCELIST.pageUp()
274                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
275
276         def onClickRight(self):
277                 self.SOURCELIST.pageDown()
278                 self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory()))
279
280 def main(session, **kwargs):
281         session.open(FPGAUpgrade)
282                                                            
283 def Plugins(**kwargs):            
284         return PluginDescriptor(name=_("FPGA Upgrade"), description="Upgrade FPGA..", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)
285