2 from urllib import urlretrieve
4 from Plugins.Plugin import PluginDescriptor
6 from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigSelection, ConfigYesNo,ConfigText
7 from Components.ConfigList import ConfigListScreen
8 from Components.ActionMap import ActionMap
9 from Components.Sources.StaticText import StaticText
10 from Components.Pixmap import Pixmap
11 from Components.Label import Label
13 from Components.FileList import FileList
14 from Components.Slider import Slider
16 from Screens.Screen import Screen
17 from Screens.MessageBox import MessageBox
19 from enigma import ePoint, eConsoleAppContainer, eTimer, getDesktop
20 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
24 if os.path.exists("/proc/stb/info/vumodel"):
25 vumodel = open("/proc/stb/info/vumodel")
26 info = vumodel.read().strip()
32 ,("fp", _("Front Processor"))
35 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
36 ,"fp" : ["http://archive.vuplus.com/download/fp", "fp.files", "/dev/bcm_mu;"]
43 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
48 ,("fp", _("Front Processor"))
51 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
52 ,"fp" : ["http://archive.vuplus.com/download/fp", "fp.files", "/dev/bcm_mu;"]
57 ,("fp", _("Front Processor"))
58 ,("vfd", _("VFD Controller"))
61 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
62 ,"fp" : ["http://archive.vuplus.com/download/fp", "fp.files", "/dev/bcm_mu;"]
63 ,"vfd" : ["http://archive.vuplus.com/download/vfd", "vfd.files", "/dev/bcm_vfd_ctrl;"]
65 elif info == "solose":
68 ,("fp", _("Front Processor"))
71 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
72 ,"fp" : ["http://archive.vuplus.com/download/fp", "fp.files", "/dev/bcm_mu;"]
77 ,("fp", _("Front Processor"))
80 "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.files", "/dev/fpga_dp;/dev/misc/dp;"]
81 ,"fp" : ["http://archive.vuplus.com/download/fp", "fp.files", "/dev/bcm_mu;"]
84 import os, fcntl, thread
89 STATUS_PROGRAMMING = 4
90 STATUS_RETRY_UPGRADE = 5
92 class FPUpgradeCore() :
96 def __init__(self, firmwarefile, devicefile):
97 self.devicefile = devicefile
98 self.firmwarefile = firmwarefile
101 firmware,device = None,None
103 if fd is not None: os.close(fd)
104 if fp is not None: fp.close()
106 size = os.path.getsize(self.firmwarefile)
107 if size == 0: raise Exception, 'data_size is zero'
108 #print '[FPUpgradeCore] data_size :',size
112 self.status = STATUS_READY
114 firmware = open(self.firmwarefile, 'rb')
115 device = os.open(self.devicefile, os.O_RDWR)
116 #print '[FPUpgradeCore] open >> [ok]'
118 rc = fcntl.ioctl(device, 0, size)
119 if rc < 0: raise Exception, 'fail to set size : %d'%(rc)
120 #print '[FPUpgradeCore] set size >> [ok]'
121 self.status = STATUS_PREPARED
124 data = firmware.read(1024)
126 os.write(device, data)
127 #print '[FPUpgradeCore] write data >> [ok]'
129 self.status = STATUS_PROGRAMMING
130 rc = fcntl.ioctl(device, 1, 0)
132 if xx == 2: raise Exception, 'fail to upgrade : %d'%(rc)
133 self.errmsg = 'fail to upgrade, retry..'
134 self.status = STATUS_RETRY_UPGRADE
135 closefp(firmware, device)
136 #print '[FPUpgradeCore] upgrade done.'
137 if self.callcount < 20: raise Exception, 'wrong fpga file.'
138 except Exception, msg:
140 print '[FPUpgradeCore] ERROR >>',msg
141 closefp(firmware, device)
145 def upgradeMain(self):
146 self.status = STATUS_READY
147 self.status = self.doUpgrade()
148 if self.status == STATUS_DONE:
149 print 'upgrade done.'
150 elif self.status == STATUS_ERROR:
152 else: print 'unknown.'
154 class FPGAUpgradeCore() :
155 status = STATUS_READY
158 MAX_CALL_COUNT = 1500
159 def __init__(self, firmwarefile, devicefile):
160 print '[FPGAUpgrade]'
161 self.devicefile = devicefile
162 self.firmwarefile = firmwarefile
165 firmware,device = None,None
166 def closefpga(fp, fd):
167 if fd is not None: os.close(fd)
168 if fp is not None: fp.close()
170 size = os.path.getsize(self.firmwarefile)
171 if size == 0: raise Exception, 'data_size is zero'
172 #print '[FPGAUpgradeCore] data_size :',size
174 firmware = open(self.firmwarefile, 'rb')
175 device = os.open(self.devicefile, os.O_RDWR)
176 #print '[FPGAUpgradeCore] open >> [ok]'
178 rc = fcntl.ioctl(device, 0, size)
179 if rc < 0: raise Exception, 'fail to set size : %d'%(rc)
180 #print '[FPGAUpgradeCore] set size >> [ok]'
182 rc = fcntl.ioctl(device, 2, 5)
183 if rc < 0: raise Exception, 'fail to set programming mode : %d'%(rc)
184 #print '[FPGAUpgradeCore] programming mode >> [ok]'
185 self.status = STATUS_PREPARED
188 data = firmware.read(1024)
190 os.write(device, data)
191 #print '[FPGAUpgradeCore] write data >> [ok]'
193 self.status = STATUS_PROGRAMMING
194 rc = fcntl.ioctl(device, 1, 0)
195 if rc < 0: raise Exception, 'fail to programming : %d'%(rc)
196 #print '[FPGAUpgradeCore] upgrade done.'
197 if self.callcount < 20: raise Exception, 'wrong fpga file.'
198 except Exception, msg:
200 print '[FPGAUpgradeCore] ERROR >>',msg
201 closefpga(firmware, device)
203 closefpga(firmware, device)
206 def upgradeMain(self):
207 self.status = STATUS_READY
208 self.status = self.doUpgrade()
209 if self.status == STATUS_DONE:
210 print '[FPGAUpgrade] upgrade done.'
211 elif self.status == STATUS_ERROR:
212 print '[FPGAUpgrade] occur error.'
213 else: print '[FPGAUpgrade] occur unknown error.'
216 class VFDCtrlUpgradeCore() :
217 status = STATUS_READY
220 def __init__(self, firmwarefile, devicefile):
221 #print '[VFDCtrlUpgradeCore]'
222 self.devicefile = devicefile
223 self.firmwarefile = firmwarefile
224 #print '[VFDCtrlUpgradeCore] devicefile :', self.devicefile
225 #print '[VFDCtrlUpgradeCore] firmwarefile :', self.firmwarefile
228 firmware,device,firmwarename = None,None,None
229 print '[VFDCtrlUpgradeCore] checkvfd..'
230 cmd_t = "/usr/lib/enigma2/python/Plugins/SystemPlugins/FirmwareUpgrade/checkvfd %s"
231 ret_d = os.popen(cmd_t % (self.firmwarefile)).read()
233 if ret_d is not None and len(ret_d) > 0:
234 print '[VFDCtrlUpgradeCore] fail to checkvfd.. [' + ret_d + ']'
237 def closevfd(fp, fd, filename):
238 if fd is not None: os.close(fd)
239 if fp is not None: fp.close()
240 if filename is not None: os.system('rm -f %s' % (filename))
243 size = max_size #os.path.getsize(self.firmwarefile)
244 if size == 0: raise Exception, 'data_size is zero'
245 #print '[VFDCtrlUpgradeCore] data_size :',size
249 self.status = STATUS_READY
250 firmwarename = os.path.splitext(self.firmwarefile)[0]
251 firmware = open(firmwarename, 'rb')
252 device = os.open(self.devicefile, os.O_RDWR)
253 #print '[VFDCtrlUpgradeCore] open >> [ok]'
255 rc = fcntl.ioctl(device, 0, size)
256 if rc < 0: raise Exception, 'fail to set size : %d'%(rc)
257 #print '[VFDCtrlUpgradeCore] set size >> [ok]'
258 self.status = STATUS_PREPARED
262 data = firmware.read(1024)
263 if data == '' or total_write_size == max_size:
265 os.write(device, data)
266 total_write_size = total_write_size + 1024
267 #print '[VFDCtrlUpgradeCore] write data >> [ok]'
269 self.status = STATUS_PROGRAMMING
270 rc = fcntl.ioctl(device, 1, 0)
272 if rc < 0 or xx == 2: raise Exception, 'fail to upgrade : %d'%(rc)
273 self.errmsg = 'fail to upgrade, retry..'
274 self.status = STATUS_RETRY_UPGRADE
275 #print '[VFDCtrlUpgradeCore] upgrade done.'
276 if self.callcount < 20: raise Exception, 'wrong fpga file.'
277 except Exception, msg:
279 print '[VFDCtrlUpgradeCore] ERROR >>',msg
280 closevfd(firmware, device, firmwarename)
282 closevfd(firmware, device, firmwarename)
285 def upgradeMain(self):
286 self.status = STATUS_READY
287 self.status = self.doUpgrade()
288 if self.status == STATUS_DONE:
289 print '[VFDCtrlUpgradeCore] upgrade done.'
290 elif self.status == STATUS_ERROR:
291 print '[VFDCtrlUpgradeCore] error.'
292 else: print '[VFDCtrlUpgradeCore] unknown error.'
294 class FirmwareUpgradeManager:
296 def getInterval(self):
299 def startUpgrade(self, datafile, device, firmware):
300 if firmware == 'fpga':
301 self.fu = FPGAUpgradeCore(firmwarefile=datafile, devicefile=device)
302 elif firmware == 'fp':
303 self.fu = FPUpgradeCore(firmwarefile=datafile, devicefile=device)
304 elif firmware == 'vfd':
305 self.fu = VFDCtrlUpgradeCore(firmwarefile=datafile, devicefile=device)
306 thread.start_new_thread(self.fu.upgradeMain, ())
308 def checkError(self):
309 if self.fu.status == STATUS_ERROR:
310 self.fu.callcount = 0
315 if self.fu.status in (STATUS_READY, STATUS_ERROR):
317 elif self.fu.status == STATUS_PREPARED:
319 elif self.fu.status == STATUS_PROGRAMMING:
320 self.fu.callcount += 1
321 ret = (self.fu.callcount * 100) / self.fu.MAX_CALL_COUNT + 2
322 if ret >= 100: ret = 99
323 #print "callcount : [%d]"%(self.fu.callcount);
325 elif self.fu.status == STATUS_DONE:
328 def getErrorMessage(self, errno, errmsg):
329 return str(self.fu.errmsg)
331 class UpgradeStatus(Screen):
333 <screen position="center,center" size="450,130" title=" ">
334 <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
335 <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
336 <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/>
337 <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
341 def __init__(self, session, parent, firmware, datafile, device):
342 Screen.__init__(self,session)
343 self.session = session
345 self["actions"] = ActionMap(["OkCancelActions"],
350 self.firmware = firmware
351 self.datafile = datafile
352 #print "[FirmwareUpgrade] - [%s][%s][%s]" % (self.datafile, firmware, device)
354 self["name"] = Label(_(" "))
355 self["info"] = StaticText(_("Can't cancel during upgrade!!"))
357 self["status"] = Label(_("Status : 0%"))
359 self.slider = Slider(0, 100)
360 self["slider"] = self.slider
364 self.setTitle(firmware.upper() + " Upgrade Status")
366 self.FU = FirmwareUpgradeManager()
369 self.status_exit = None
370 self.check_status = eTimer()
371 self.check_status.callback.append(self.cbCheckStatus)
372 self.check_status.start(self.FU.getInterval())
374 self.exitTimerCallCount = 0;
375 self.upgradeLock = True
376 self.FU.startUpgrade(self.datafile, device, firmware)
378 def cbCheckStatus(self):
380 errno = self.FU.checkError()
382 self.check_status.stop()
383 errmsg = self.FU.getErrorMessage(errno, errmsg)
384 print "[FirmwareUpgrade] - ERROR : [%d][%s]" % (errno, errmsg)
385 self.session.open(MessageBox, _(errmsg), MessageBox.TYPE_INFO, timeout = 10)
386 self.cbConfirmExit(False)
388 status = self.FU.getStatus()
389 if self.old_status > status and status != -1:
390 self.session.open(MessageBox, _("Fail to upgrade!! Retry!!"), MessageBox.TYPE_INFO, timeout = 10)
391 self.slider.setValue(status)
392 self["status"].setText(_("%d / 100" % (status)))
394 self.check_status.stop()
395 self["status"].setText(_("Success. Press OK to exit."))
396 self.status_exit = eTimer()
397 self.status_exit.callback.append(self.cbTimerExit)
398 self.status_exit.start(1000)
399 self.upgradeLock = False
400 self.old_status = status
402 def setCallback(self, cb):
405 def cbTimerExit(self):
406 if self.exitTimerCallCount < 10: # exit after 10 sec.
407 self.exitTimerCallCount = self.exitTimerCallCount + 1
408 self.setTitle("%s Upgrade Status (%d)" % (self.firmware.upper(), 10-self.exitTimerCallCount))
410 if self.status_exit is not None:
411 self.status_exit.stop()
414 def cbConfirmExit(self, ret):
416 os.system("rm -f %s %s.md5" % (self.datafile, self.datafile))
422 if self.callback is not None:
423 self.callback("Reboot now for a successful upgrade.", True)
424 self.session.openWithCallback(self.cbConfirmExit, MessageBox, _("Do you want to remove binary data?"), MessageBox.TYPE_YESNO, timeout = 10, default = False)
426 class FUFilebrowser(Screen):
428 <screen position="center,center" size="500,290" title="File Browser" >
429 <ePixmap pixmap="skin_default/buttons/blue.png" position="5,10" size="140,40" alphatest="blend" />
431 <widget source="key_blue" render="Label" position="5,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1"/>
433 <widget name="file_list" position="0,70" size="495,160" scrollbarMode="showOnDemand" />
434 <widget source="status" render="Label" position="0,230" zPosition="1" size="495,70" font="Regular;18" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
438 def __init__(self, session, parent, firmware):
439 Screen.__init__(self, session)
440 self.session = session
442 self["key_blue"] = StaticText(_("Download"))
444 self["status"] = StaticText(_(" "))
445 self["file_list"] = FileList("/", matchingPattern = "^.*")
447 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", ],
449 "ok": self.onClickOk,
450 "cancel": self.onClickCancel,
451 "blue": self.onClickBlue,
452 "up": self.onClickUp,
453 "down": self.onClickDown,
454 "left": self.onClickLeft,
455 "right": self.onClickRight,
459 self.firmware = firmware
462 self.timer_downloading = None
464 self.downloadLock = False
465 self.setTitle(firmware.upper() + " File Browser")
468 self["status"].setText("Press OK to select, Press Cancel to exit.\nPress BLUE to download the latest firmware.")
470 def setCallback(self, func):
474 if self.downloadLock:
477 if self["file_list"].canDescent() : # isDir
478 self["file_list"].descent()
482 self.gbin = self["file_list"].getCurrentDirectory() + self["file_list"].getFilename()
483 if not os.path.exists(self.gbin):
484 self.session.open(MessageBox, _("Can't found binary file."), MessageBox.TYPE_INFO, timeout = 10)
486 if not os.path.exists(self.gbin+".md5"):
487 self.session.open(MessageBox, _("Can't found MD5 file."), MessageBox.TYPE_INFO, timeout = 10)
491 name_ext = os.path.splitext(self["file_list"].getFilename())
492 return len(name_ext)==2 and ext.startswith(name_ext[1])
493 self.check_ext = False
494 if (self.firmware == "fp" and checkExt(".bin")) or (self.firmware == "fpga" and checkExt(".dat")) or (self.firmware == "vfd" and checkExt(".vfd")):
495 self.check_ext = True
496 if self.check_ext == False:
497 print self.firmware,",",self["file_list"].getFilename()
498 self.session.open(MessageBox, _("You choose the incorrect file. "), MessageBox.TYPE_INFO)
501 print self.firmware,",",self["file_list"].getFilename()
502 self.session.open(MessageBox, _("You choose the incorrect file. "), MessageBox.TYPE_INFO)
505 if os.path.exists("/usr/bin/md5sum") == False:
506 self.session.open(MessageBox, _("Can't find /usr/bin/md5sum"), MessageBox.TYPE_INFO, timeout = 10)
508 md5sum_A = os.popen("md5sum %s | awk \'{print $1}\'"%(self.gbin)).readline().strip()
509 md5sum_B = os.popen("cat %s.md5 | awk \'{print $1}\'"%(self.gbin)).readline().strip()
510 #print "[FirmwareUpgrade] - Verify : file[%s], md5[%s]"%(md5sum_A,md5sum_B)
512 if md5sum_A != md5sum_B:
513 self.session.open(MessageBox, _("Fail to verify data file. \nfile[%s]\nmd5[%s]"%(md5sum_A,md5sum_B)), MessageBox.TYPE_INFO, timeout = 10)
516 if self.callback is not None:
517 self.callback(_(self.gbin))
520 def onClickCancel(self):
523 # uri : source file url(string)
524 # tf : target file name(string)
525 # bd : target base directory(string)
526 # cbfunc(string) : callback function(function)
527 def doDownload(self, uri, tf, bd='/tmp', cbfunc=None, errmsg="Fail to download."):
529 #print "[FirmwareUpgrade] - Download Info : [%s][%s]" % (uri, tar)
530 def doHook(blockNumber, blockSize, totalSize) :
531 if blockNumber*blockSize > totalSize and cbfunc is not None:
533 opener = urllib.URLopener()
537 #self.session.open(MessageBox, _("File not found in this URL:\n%s"%(uri)), MessageBox.TYPE_INFO, timeout = 10)
538 print "[FirmwareUpgrade] - Fail to download. URL :",uri
539 self.session.open(MessageBox, _(errmsg), MessageBox.TYPE_INFO, timeout = 10)
543 f, h = urlretrieve(uri, tar, doHook)
545 #self.session.open(MessageBox, _(str(msg)), MessageBox.TYPE_INFO, timeout = 10)
546 print "[FirmwareUpgrade] - Fail to download. ERR_MSG :",str(msg)
547 self.session.open(MessageBox, _(errmsg), MessageBox.TYPE_INFO, timeout = 10)
553 def runDownloading(self) :
554 self.timer_downloading.stop()
555 machine = str(open("/proc/stb/info/vumodel").read().strip())
557 def cbDownloadDone(tar):
559 if os.path.splitext(tar)[1] != ".files":
560 self["status"].setText("Downloaded : %s\nPress OK to select, Press Cancel to exit."%(tar))
565 root_uri = fwdata[self.firmware][0]
566 root_file = fwdata[self.firmware][1]
567 if not self.doDownload("%s/%s"%(root_uri, root_file), root_file, cbfunc=cbDownloadDone):
569 self.downloadLock = False
573 for l in file("/tmp/"+root_file).readlines():
574 if l.startswith(machine):
576 target_path = l.split("=")[1].strip()
580 if target_path == "":
581 self.session.open(MessageBox, _("Firmware does not exist."), MessageBox.TYPE_INFO)
583 self.downloadLock = False
586 self.guri = "%s/vu%s/%s"%(root_uri, machine, target_path)
587 self.gbin = os.path.basename(target_path)
588 #print "[FirmwareUpgrade] - uri[%s], data[%s], data_path[%s]" % (self.gbin, self.guri, target_path)
589 os.system("rm -f /tmp/" + root_file)
592 if not self.doDownload(self.guri+".md5", self.gbin+".md5", cbfunc=cbDownloadDone, errmsg="Can't download the checksum file."):
594 self.downloadLock = False
597 if not self.doDownload(self.guri, self.gbin, cbfunc=cbDownloadDone, errmsg="Can't download the firmware file."):
599 self.downloadLock = False
603 self["file_list"].changeDir("/tmp/")
604 self["file_list"].moveToIndex(0)
605 while cmp(self["file_list"].getFilename(), self.gbin) != 0 :
606 self["file_list"].down()
607 if cmp(t, self["file_list"].getFilename()) == 0:
609 t = self["file_list"].getFilename()
611 del self.timer_downloading
612 self.timer_downloading = None
613 self.downloadLock = False
615 def onClickBlue(self):
616 if self.downloadLock:
618 self.downloadLock = True
619 if not os.path.exists("/proc/stb/info/vumodel"):
620 self.session.open(MessageBox, _("Can't found model name."), MessageBox.TYPE_INFO, timeout = 10)
621 self.downloadLock = False
623 self["status"].setText("Please wait during download.")
624 self.timer_downloading = eTimer()
625 self.timer_downloading.callback.append(self.runDownloading)
626 self.timer_downloading.start(1000)
629 if self.downloadLock:
632 self["file_list"].up()
634 def onClickDown(self):
635 if self.downloadLock:
638 self["file_list"].down()
640 def onClickLeft(self):
641 if self.downloadLock:
644 self["file_list"].pageUp()
646 def onClickRight(self):
647 if self.downloadLock:
650 self["file_list"].pageDown()
655 class FirmwareUpgrade(Screen, ConfigListScreen):
657 <screen position="center,center" size="560,175" title="Firmware Upgrade" >
658 <ePixmap pixmap="skin_default/buttons/red.png" position="110,10" size="140,40" alphatest="blend" />
659 <ePixmap pixmap="skin_default/buttons/green.png" position="310,10" size="140,40" alphatest="blend" />
661 <widget source="key_red" render="Label" position="110,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
662 <widget source="key_green" render="Label" position="310,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
664 <widget name="config" zPosition="2" position="0,70" itemHeight="36" size="540,40" scrollbarMode="showOnDemand" transparent="1" />
665 <widget source="status" render="Label" position="0,100" zPosition="1" size="540,75" font="Regular;20" halign="center" valign="center" />
669 def __init__(self, session):
670 Screen.__init__(self, session)
671 self.session = session
673 self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
676 "cancel": self.keyRed,
678 "green": self.keyGreen,
679 "blue": self.keyBlue,
683 self.updateFilePath = ""
685 self.finishedExit = False
687 self.rebootLock = False
688 self.rebootMessage = ""
689 self.cbRebootCallCount = 0;
691 ConfigListScreen.__init__(self, self.list, session=self.session)
692 self["key_red"] = StaticText(_("Close"))
695 self.old_blue_clicked = 0
696 self.fileopenmode = False
697 self.upgrade_auto_run_timer = eTimer()
698 self.upgrade_auto_run_timer.callback.append(self.keyGreen)
702 self["key_green"] = StaticText(_(" "))
703 self["status"] = StaticText(_("Duo/Solo was not support."))
705 self["key_green"] = StaticText(_("Upgrade"))
706 self["status"] = StaticText(_(" "))
712 self._item_firmware = ConfigSelection(default=fwlist[0][0], choices=fwlist)
713 self._entry_firmware = getConfigListEntry(_("Firmware"), self._item_firmware)
714 self.list.append(self._entry_firmware)
715 self["config"].list = self.list
716 self["config"].l.setList(self.list)
719 def setupStatus(self,message=None,reboot=False):
720 self.updateFilePath = ""
721 if message is not None:
722 self.rebootLock = reboot
723 self["status"].setText(message)
725 self.rebootMessage = message
726 self.reboot_timer = eTimer()
727 self.reboot_timer.callback.append(self.cbReboot)
728 self.reboot_timer.start(1000)
730 if not self.rebootLock:
731 self["status"].setText(" ")
734 from Screens.Standby import TryQuitMainloop
735 self.session.open(TryQuitMainloop, 2)
739 self.finishedExit = True
740 if self.cbRebootCallCount < max_call_count:
741 self.cbRebootCallCount = self.cbRebootCallCount + 1
742 #self["status"].setText("%s (%d)"%(self.rebootMessage, max_call_count-self.cbRebootCallCount))
743 self["status"].setText("Reboot in %d seconds. Press OK to reboot now."%(max_call_count-self.cbRebootCallCount))
747 # filebrowser window callback function
748 def cbSetStatus(self, data=None):
750 self["status"].setText(" ")
751 self.updateFilePath = data
752 if self.fileopenmode == False:
753 self.upgrade_auto_run_timer.start(1000)
755 # upgrade window callback function
756 def cbFinishedUpgrade(self,message=None,reboot=False):
757 self.setupStatus(message=message,reboot=reboot)
759 def cbRunUpgrade(self, ret):
763 if self.updateFilePath == "":
764 self.session.open(MessageBox, _("No selected binary data!!"), MessageBox.TYPE_INFO, timeout = 10)
767 for d in fwdata[self._item_firmware.value][2].split(';'):
768 if os.path.exists(d):
771 self.session.open(MessageBox, _("Can't found device file!!"), MessageBox.TYPE_INFO, timeout = 10)
773 fbs = self.session.open(UpgradeStatus, self, self._item_firmware.value, self.updateFilePath, device)
774 fbs.setCallback(self.cbFinishedUpgrade)
776 def doFileOpen(self):
777 fbs = self.session.open(FUFilebrowser, self, self._item_firmware.value)
778 fbs.setCallback(self.cbSetStatus)
786 ConfigListScreen.keyLeft(self)
795 ConfigListScreen.keyRight(self)
799 if self.finishedExit:
802 self.upgrade_auto_run_timer.stop()
808 if self.updateFilePath == "":
809 #self.session.open(MessageBox, _("No selected binary data!!"), MessageBox.TYPE_INFO)
812 msg = "You can't cancel during upgrade.\nDo you want to continue?"
813 self.session.openWithCallback(self.cbRunUpgrade, MessageBox, _(msg), MessageBox.TYPE_YESNO, timeout = 15, default = True)
814 self.fileopenmode = False
822 self.fileopenmode = True
831 if self.old_blue_clicked:
834 if os.path.exists("/tmp/onlogmode"):
836 os.system("touch /tmp/onlogmode")
841 if self.logmode is not None and self.old_blue_clicked == 0:
843 if self.old_blue_clicked:
844 self.old_blue_clicked = 0
846 self.old_blue_clicked = 1
847 self.logmode = eTimer()
848 self.logmode.callback.append(self.cbLogMode)
849 self.logmode.start(1000)
854 def main(session, **kwargs):
855 session.open(FirmwareUpgrade)
857 def Plugins(**kwargs):
858 return PluginDescriptor(name=_("Firmware Upgrade"), description="Upgrade Firmware..", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)