X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FPlugins%2FSystemPlugins%2FFPGAUpgrade%2Fplugin.py;h=87ecedf13e36dd8444e7b3f459bfe591078ff1c2;hp=6c2eb8df7adef58cf16243e02926afeb1f2df42d;hb=630294d38cb3cab784ecc1102804394974b162b0;hpb=ecdd38f921146cec37a1c642270fa8be0abbe01e diff --git a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py index 6c2eb8d..87ecedf 100644 --- a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py +++ b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py @@ -1,3 +1,7 @@ +import os, fcntl, thread + +from enigma import eTimer, getDesktop + from urllib import urlretrieve import urllib @@ -6,38 +10,232 @@ from Screens.MessageBox import MessageBox from Plugins.Plugin import PluginDescriptor -from Components.PluginComponent import plugins +from Tools.Directories import fileExists + +from Components.Label import Label +from Components.Slider import Slider from Components.Pixmap import Pixmap +from Components.FileList import FileList from Components.ActionMap import ActionMap +from Components.PluginComponent import plugins from Components.Sources.StaticText import StaticText -from Components.FileList import FileList +STATUS_READY = 0 +STATUS_DONE = 1 +STATUS_ERROR = 2 +STATUS_PREPARED = 3 +STATUS_PROGRAMMING = 4 + +class FPGAUpgradeCore() : + status = STATUS_READY + errmsg = '' + callcount = 0 + MAX_CALL_COUNT = 1500 + def __init__(self, firmwarefile, devicefile): + print '[FPGAUpgrade]' + self.devicefile = devicefile + self.firmwarefile = firmwarefile + + def doUpgrade(self): + firmware,device = None,None + def closefpga(fp, fd): + if fd is not None: os.close(fd) + if fp is not None: fp.close() + try: + size = os.path.getsize(self.firmwarefile) + if size == 0: raise Exception, 'data_size is zero' + #print '[FPGAUpgradeCore] data_size :',size + + firmware = open(self.firmwarefile, 'rb') + device = os.open(self.devicefile, os.O_RDWR) + #print '[FPGAUpgradeCore] open >> [ok]' + + rc = fcntl.ioctl(device, 0, size) + if rc < 0: raise Exception, 'fail to set size : %d'%(rc) + #print '[FPGAUpgradeCore] set size >> [ok]' + + rc = fcntl.ioctl(device, 2, 5) + if rc < 0: raise Exception, 'fail to set programming mode : %d'%(rc) + #print '[FPGAUpgradeCore] programming mode >> [ok]' + self.status = STATUS_PREPARED + + while True: + data = firmware.read(1024) + if data == '': break + os.write(device, data) + #print '[FPGAUpgradeCore] write data >> [ok]' + + self.status = STATUS_PROGRAMMING + rc = fcntl.ioctl(device, 1, 0) + if rc < 0: raise Exception, 'fail to programming : %d'%(rc) + #print '[FPGAUpgradeCore] upgrade done.' + if self.callcount < 100: raise Exception, 'wrong fpga file.' + except Exception, msg: + self.errmsg = msg + print '[FPGAUpgradeCore] ERROR >>',msg + closefpga(firmware, device) + return STATUS_ERROR + closefpga(firmware, device) + return STATUS_DONE + + def upgradeMain(self): + self.status = STATUS_READY + self.status = self.doUpgrade() + if self.status == STATUS_DONE: + print '[FPGAUpgrade] upgrade done.' + elif self.status == STATUS_ERROR: + print '[FPGAUpgrade] occur error.' + else: print '[FPGAUpgrade] occur unknown error.' + +class FPGAUpgradeManager: + fu = None + def get_interval(self): + return 200 + + def fpga_upgrade(self, datafile, device): + self.fu = FPGAUpgradeCore(firmwarefile=datafile, devicefile=device) + thread.start_new_thread(self.fu.upgradeMain, ()) + + def checkError(self): + if self.fu.status == STATUS_ERROR: + self.fu.callcount = 0 + return True + return False + + def get_status(self): + if self.fu.status == STATUS_READY: + return 0 + elif self.fu.status == STATUS_ERROR: + return -1 + elif self.fu.status == STATUS_PREPARED: + return 2 + elif self.fu.status == STATUS_PROGRAMMING: + self.fu.callcount += 1 + ret = (self.fu.callcount * 100) / self.fu.MAX_CALL_COUNT + 2 + if ret >= 100: ret = 99 + #print "callcount : [%d]"%(self.fu.callcount); + return ret + elif self.fu.status == STATUS_DONE: + return 100 + + def get_error_msg(self, errno, errmsg): + return str(self.fu.errmsg) + +class UpgradeStatus(Screen): + size = getDesktop(0).size() + position_params = size.width() > 750 and (' ') or ('backgroundColor=\"blue\"') + skin = """ + + + + + + + """ % position_params + + def __init__(self, session, parent, timeout = 20): + Screen.__init__(self,session) + self.session = session + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.keyExit, + }, -2) + + self.is_done = 0 + self.exit_count = 0 + self.timeout = 20 + self.title_str = "FPGA Upgrade" + + #self["name"] = Label(_("Upgrade status")) + self["name"] = Label(_(" ")) + self["info"] = StaticText(_("Can't cancel during upgrade!!")) + + self["status"] = Label(_("Status : 0%")) + self.status_bar = self["status"] + + self.slider = Slider(0, 100) + self["slider"] = self.slider + + self.parent = parent + self.timer_check_progress = eTimer() + self.timer_check_progress.callback.append(self.callbackDoCheckProgress) + interval = self.parent.FPGA.get_interval() + self.timer_check_progress.start(interval) + self.need_restart = False + + def callbackDoCheckProgress(self): + self.status = self.parent.FPGA.get_status() + + if self.status > 0: + self.slider.setValue(self.status) + + if self.status == 100: + #print "fpga-upgrade done!!" + self.status_bar.setText(_("Succeed")) + #self.status_bar.setText(_("%d / 100" % (self.status))) + self.timer_check_progress.stop() + self.is_done = 1 + self.timer_exit = eTimer() + self.timer_exit.callback.append(self.callbackExit) + self.timer_exit.start(1000) + + elif self.status < 0:#elif self.status == -1 or self.status == -2: + #print "fpga-upgrade error >> errno : [%d]" % (self.status) + ERROR_MSG = '' + ERROR_CODE = int(self.status) * -1 + ERROR_MSG = self.parent.FPGA.get_error_msg(ERROR_CODE, ERROR_MSG) + self.status_bar.setText("Fail to update!!") + self["info"].setText(_("Error[%d] : %s.\nPress OK to exit." % (self.status, ERROR_MSG))) + self.timer_check_progress.stop() + self.is_done = 1 + + else: + #print "fpga-upgrade status : %d" % self.status + self.status_bar.setText(_("%d / 100" % (self.status))) + + def callbackExit(self): + self.need_restart = True + if self.exit_count == self.timeout: + self.timer_exit.stop() + self.keyExit() + self.exit_count = self.exit_count + 1 + #self.instance.setTitle("%s (%d)" % (self.title_str, (self.timeout-self.exit_count))) + self["info"].setText("Reboot after %d seconds.\nPress the OK to reboot now." %(self.timeout-self.exit_count)) + + def keyExit(self): + if self.need_restart: + from Screens.Standby import TryQuitMainloop + self.session.open(TryQuitMainloop, 2) + if self.is_done : + self.close() + class FPGAUpgrade(Screen): - skin = """ - - - - - - - - - - + size = getDesktop(0).size() + position_params = size.width() > 750 and ('center', 440) or ('120', 420) + skin = """ + + + + + + + + - """ + + """ % position_params def __init__(self, session): Screen.__init__(self, session) self.session = session self["key_red"] = StaticText(_("Close")) - self["key_green"] = StaticText(_("Ugrade")) - self["key_yellow"] = StaticText(_(" ")) + self["key_green"] = StaticText(_("Upgrade")) self["key_blue"] = StaticText(_("Download")) - #self["key_blue"] = StaticText(_(" ")) + self["status"] = StaticText(_(" ")) self["file_list"] = FileList("/", matchingPattern = "^.*") @@ -61,13 +259,13 @@ class FPGAUpgrade(Screen): self.STATUS_BAR = self["status"] self.STATUS_BAR.setText(_(self.SOURCELIST.getCurrentDirectory())) - self.DEVICE_PATH = 'a' + self.DEVICE_LIST = '/dev/fpga_dp;/dev/misc/dp;' self.DOWNLOAD_TAR_PATH = '/tmp/' - self.DOWNLOAD_FILE_NAME = 'fpga.vuplus' + self.DOWNLOAD_FILE_NAME = 'TS_PRO.dat' self.DOWNLOAD_URL = '' self.doLoadConf() - - print self.DEVICE_PATH + self.FPGA = FPGAUpgradeManager() + print self.DEVICE_LIST print self.DOWNLOAD_TAR_PATH print self.DOWNLOAD_FILE_NAME print self.DOWNLOAD_URL @@ -76,12 +274,15 @@ class FPGAUpgrade(Screen): return def doExit(self): + if fileExists(self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME): + os.remove(self.DOWNLOAD_TAR_PATH + self.DOWNLOAD_FILE_NAME) self.close() def doLoadConf(self): - import os - f = open('/usr/lib/enigma2/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.conf') - self.DOWNLOAD_URL = str(f.readline()) + if fileExists("/proc/stb/info/vumodel"): + model = open("/proc/stb/info/vumodel").read().strip() + download_uri_header = open('/usr/lib/enigma2/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.conf').readline().strip() + self.DOWNLOAD_URL = str(download_uri_header) + "vu" + str(model) + "/" + self.DOWNLOAD_FILE_NAME def doHook(self, blockNumber, blockSize, totalSize) : if blockNumber*blockSize > totalSize : @@ -93,14 +294,9 @@ class FPGAUpgrade(Screen): if confirmed: self.doExit() - def onClickRed(self): - self.doExit() - - # run upgrade!! - def onClickGreen(self): - import fpga - - FPGA = fpga.Fpga() + def doUpgradeHandler(self, confirmed): + if confirmed == False: + return path = '' try: @@ -109,15 +305,39 @@ class FPGAUpgrade(Screen): #self.session.open(MessageBox, _("Can't select directory."), MessageBox.TYPE_INFO, timeout = 5) return - self.ERROR_CODE = FPGA.fpga_upgrade(path, self.DEVICE_PATH) - if self.ERROR_CODE > 0: - self.ERROR_MSG = FPGA.get_error_msg(self.ERROR_CODE, self.ERROR_MSG) - self.session.openWithCallback(self.onCallbackHandler, MessageBox, _("Fail to upgrade.\nCause : " + self.ERROR_MSG + "\nDo you want to exit?"), MessageBox.TYPE_YESNO, timeout = 10, default = True) + device = "" + device_list = self.DEVICE_LIST.split(";") + + for d in device_list: + if os.path.exists(d): + device = d + break + + if device == None or len(device) == 0: + message = "Fail to upgrade.\nCause : Can't found device.\nDo you want to exit?" + self.session.openWithCallback(self.onCallbackHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True) + print "DEVICE_LIST : ", device_list - print "DEVICE_PATH : ", self.DEVICE_PATH - print "FILE_PATH : ", path + print "DEVICE : ", device + self.ERROR_CODE = self.FPGA.fpga_upgrade(path, device) + if self.ERROR_CODE > 0: + self.ERROR_MSG = self.FPGA.get_error_msg(self.ERROR_CODE, self.ERROR_MSG) + message = "Fail to upgrade.\nCause : " + self.ERROR_MSG + "\nDo you want to exit?" + self.session.openWithCallback(self.onCallbackHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True) + print "DEVICE : ", device + print "FILE : ", path else: - self.session.open(MessageBox, _("Success!!"), MessageBox.TYPE_INFO, timeout = 5) + #self.session.open(MessageBox, _("Success!!"), MessageBox.TYPE_INFO, timeout = 5) + self.session.open(UpgradeStatus, self, timeout = 20) + + def onClickRed(self): + self.doExit() + + # run upgrade!! + def onClickGreen(self): + #self.session.open(MessageBox, _("Upgrade will take about 5 minutes to finish."), MessageBox.TYPE_INFO, timeout = 10) + message = "Upgrade will take about 5 minutes to finish.\nDo you want to upgrade?" + self.session.openWithCallback(self.doUpgradeHandler, MessageBox, _(message), MessageBox.TYPE_YESNO, timeout = 10, default = True) def onClickBlue(self): fname = ''