From: kos Date: Wed, 4 Jan 2012 10:33:09 +0000 (+0900) Subject: change plugins code. X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=0c5ce99c4f07836ab35fb0675a63c8cd4341a72c change plugins code. - fpgaupgrade/firmwareupgrade : cpp -> python. --- diff --git a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/Makefile.am b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/Makefile.am index 36e60c8..52ab77a 100755 --- a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/Makefile.am @@ -5,6 +5,4 @@ SUBDIRS = meta install_PYTHON = \ __init__.py \ plugin.py \ - fpga.py \ - fpga.conf \ - _fpga.so + fpga.conf diff --git a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/_fpga.so b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/_fpga.so deleted file mode 100644 index b031d6f..0000000 Binary files a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/_fpga.so and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.py b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.py deleted file mode 100644 index 8819dac..0000000 --- a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/fpga.py +++ /dev/null @@ -1,103 +0,0 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 1.3.39 -# -# Do not make changes to this file unless you know what you are doing--modify -# the SWIG interface file instead. -# This file is compatible with both classic and new-style classes. - -from sys import version_info -if version_info >= (2,6,0): - def swig_import_helper(): - from os.path import dirname - import imp - fp = None - try: - fp, pathname, description = imp.find_module('_fpga', [dirname(__file__)]) - except ImportError: - import _fpga - return _fpga - if fp is not None: - try: - _mod = imp.load_module('_fpga', fp, pathname, description) - finally: - fp.close() - return _mod - _fpga = swig_import_helper() - del swig_import_helper -else: - import _fpga -del version_info -try: - _swig_property = property -except NameError: - pass # Python < 2.2 doesn't have 'property'. -def _swig_setattr_nondynamic(self,class_type,name,value,static=1): - if (name == "thisown"): return self.this.own(value) - if (name == "this"): - if type(value).__name__ == 'SwigPyObject': - self.__dict__[name] = value - return - method = class_type.__swig_setmethods__.get(name,None) - if method: return method(self,value) - if (not static) or hasattr(self,name): - self.__dict__[name] = value - else: - raise AttributeError("You cannot add attributes to %s" % self) - -def _swig_setattr(self,class_type,name,value): - return _swig_setattr_nondynamic(self,class_type,name,value,0) - -def _swig_getattr(self,class_type,name): - if (name == "thisown"): return self.this.own() - method = class_type.__swig_getmethods__.get(name,None) - if method: return method(self) - raise AttributeError(name) - -def _swig_repr(self): - try: strthis = "proxy of " + self.this.__repr__() - except: strthis = "" - return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) - -try: - _object = object - _newclass = 1 -except AttributeError: - class _object : pass - _newclass = 0 - - -DP_NO_ACTION_FOUND = _fpga.DP_NO_ACTION_FOUND -DP_DEVICE_INFO_ACTION_CODE = _fpga.DP_DEVICE_INFO_ACTION_CODE -DP_READ_IDCODE_ACTION_CODE = _fpga.DP_READ_IDCODE_ACTION_CODE -DP_ERASE_ACTION_CODE = _fpga.DP_ERASE_ACTION_CODE -DP_PROGRAM_ACTION_CODE = _fpga.DP_PROGRAM_ACTION_CODE -DP_VERIFY_ACTION_CODE = _fpga.DP_VERIFY_ACTION_CODE -NO_SRC_FILE_PATH = _fpga.NO_SRC_FILE_PATH -NO_TAR_DEVICE_PATH = _fpga.NO_TAR_DEVICE_PATH -FAIL_OPEN_SRC_FILE = _fpga.FAIL_OPEN_SRC_FILE -ZERO_SRC_FILE_SIZE = _fpga.ZERO_SRC_FILE_SIZE -FAIL_OPEN_DEVICE = _fpga.FAIL_OPEN_DEVICE -ERROR_FILE_SIZE = _fpga.ERROR_FILE_SIZE -ERROR_SET_ACTION_CODE = _fpga.ERROR_SET_ACTION_CODE -ERROR_PROGRAMMING = _fpga.ERROR_PROGRAMMING -class Fpga(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, Fpga, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, Fpga, name) - __repr__ = _swig_repr - def __init__(self): - this = _fpga.new_Fpga() - try: self.this.append(this) - except: self.this = this - __swig_destroy__ = _fpga.delete_Fpga - __del__ = lambda self : None; - def get_interval(self): return _fpga.Fpga_get_interval(self) - def get_error_msg(self, *args): return _fpga.Fpga_get_error_msg(self, *args) - def fpga_upgrade(self, *args): return _fpga.Fpga_fpga_upgrade(self, *args) - def get_status(self): return _fpga.Fpga_get_status(self) -Fpga_swigregister = _fpga.Fpga_swigregister -Fpga_swigregister(Fpga) - - - diff --git a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py index 76cf06b..14b5087 100644 --- a/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py +++ b/lib/python/Plugins/SystemPlugins/FPGAUpgrade/plugin.py @@ -1,6 +1,5 @@ -import os +import os, fcntl, thread -import fpga from enigma import eTimer from urllib import urlretrieve @@ -21,6 +20,107 @@ from Components.ActionMap import ActionMap from Components.PluginComponent import plugins from Components.Sources.StaticText import StaticText +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): skin = """ @@ -159,7 +259,7 @@ class FPGAUpgrade(Screen): self.DOWNLOAD_FILE_NAME = 'TS_PRO.dat' self.DOWNLOAD_URL = '' self.doLoadConf() - self.FPGA = fpga.Fpga() + self.FPGA = FPGAUpgradeManager() print self.DEVICE_LIST print self.DOWNLOAD_TAR_PATH print self.DOWNLOAD_FILE_NAME diff --git a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/Makefile.am b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/Makefile.am index be62e85..e47942c 100644 --- a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/Makefile.am @@ -3,7 +3,5 @@ installdir = $(pkglibdir)/python/Plugins/SystemPlugins/FirmwareUpgrade SUBDIRS = meta install_PYTHON = __init__.py \ - fu.py \ - _fu.so \ plugin.py diff --git a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/_fu.so b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/_fu.so deleted file mode 100644 index c4c34be..0000000 Binary files a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/_fu.so and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/fu.py b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/fu.py deleted file mode 100644 index 1cc0778..0000000 --- a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/fu.py +++ /dev/null @@ -1,92 +0,0 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 1.3.39 -# -# Do not make changes to this file unless you know what you are doing--modify -# the SWIG interface file instead. -# This file is compatible with both classic and new-style classes. - -from sys import version_info -if version_info >= (2,6,0): - def swig_import_helper(): - from os.path import dirname - import imp - fp = None - try: - fp, pathname, description = imp.find_module('_fu', [dirname(__file__)]) - except ImportError: - import _fu - return _fu - if fp is not None: - try: - _mod = imp.load_module('_fu', fp, pathname, description) - finally: - fp.close() - return _mod - _fu = swig_import_helper() - del swig_import_helper -else: - import _fu -del version_info -try: - _swig_property = property -except NameError: - pass # Python < 2.2 doesn't have 'property'. -def _swig_setattr_nondynamic(self,class_type,name,value,static=1): - if (name == "thisown"): return self.this.own(value) - if (name == "this"): - if type(value).__name__ == 'SwigPyObject': - self.__dict__[name] = value - return - method = class_type.__swig_setmethods__.get(name,None) - if method: return method(self,value) - if (not static) or hasattr(self,name): - self.__dict__[name] = value - else: - raise AttributeError("You cannot add attributes to %s" % self) - -def _swig_setattr(self,class_type,name,value): - return _swig_setattr_nondynamic(self,class_type,name,value,0) - -def _swig_getattr(self,class_type,name): - if (name == "thisown"): return self.this.own() - method = class_type.__swig_getmethods__.get(name,None) - if method: return method(self) - raise AttributeError(name) - -def _swig_repr(self): - try: strthis = "proxy of " + self.this.__repr__() - except: strthis = "" - return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) - -try: - _object = object - _newclass = 1 -except AttributeError: - class _object : pass - _newclass = 0 - - -class FU(_object): - __swig_setmethods__ = {} - __setattr__ = lambda self, name, value: _swig_setattr(self, FU, name, value) - __swig_getmethods__ = {} - __getattr__ = lambda self, name: _swig_getattr(self, FU, name) - __repr__ = _swig_repr - def __init__(self): - this = _fu.new_FU() - try: self.this.append(this) - except: self.this = this - def getStatus(self): return _fu.FU_getStatus(self) - def getInterval(self): return _fu.FU_getInterval(self) - def checkError(self): return _fu.FU_checkError(self) - def getErrorMessage(self, *args): return _fu.FU_getErrorMessage(self, *args) - def startUpgrade(self, *args): return _fu.FU_startUpgrade(self, *args) - def getDataPath(self): return _fu.FU_getDataPath(self) - def getDevicePath(self): return _fu.FU_getDevicePath(self) - __swig_destroy__ = _fu.delete_FU - __del__ = lambda self : None; -FU_swigregister = _fu.FU_swigregister -FU_swigregister(FU) - - - diff --git a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/plugin.py b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/plugin.py index 0e1ec25..0181fac 100644 --- a/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/plugin.py +++ b/lib/python/Plugins/SystemPlugins/FirmwareUpgrade/plugin.py @@ -43,6 +43,172 @@ if os.path.exists("/proc/stb/info/vumodel"): "fpga" : ["http://archive.vuplus.com/download/fpga", "fpga.file", "/dev/fpga_dp;/dev/misc/dp;"] } +import os, fcntl, thread +STATUS_READY = 0 +STATUS_DONE = 1 +STATUS_ERROR = 2 +STATUS_PREPARED = 3 +STATUS_PROGRAMMING = 4 +STATUS_RETRY_UPGRADE = 5 + +class FPUpgradeCore() : + status = STATUS_READY + errmsg = '' + MAX_CALL_COUNT = 120 + def __init__(self, firmwarefile, devicefile): + 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 '[FPUpgradeCore] data_size :',size + + for xx in range(3): + self.callcount = 0 + self.status = STATUS_READY + + firmware = open(self.firmwarefile, 'rb') + device = os.open(self.devicefile, os.O_RDWR) + #print '[FPUpgradeCore] open >> [ok]' + + rc = fcntl.ioctl(device, 0, size) + if rc < 0: raise Exception, 'fail to set size : %d'%(rc) + #print '[FPUpgradeCore] set size >> [ok]' + self.status = STATUS_PREPARED + + while True: + data = firmware.read(1024) + if data == '': break + os.write(device, data) + #print '[FPUpgradeCore] write data >> [ok]' + + self.status = STATUS_PROGRAMMING + rc = fcntl.ioctl(device, 1, 0) + if rc == 0: break + if xx == 2: raise Exception, 'fail to upgrade : %d'%(rc) + self.errmsg = 'fail to upgrade, retry..' + self.status = STATUS_RETRY_UPGRADE + closefpga(firmware, device) + #print '[FPUpgradeCore] upgrade done.' + if self.callcount < 20: raise Exception, 'wrong fpga file.' + except Exception, msg: + self.errmsg = msg + print '[FPUpgradeCore] ERROR >>',msg + closefpga(firmware, device) + return STATUS_ERROR + return STATUS_DONE + + def upgradeMain(self): + self.status = STATUS_READY + self.status = self.doUpgrade() + if self.status == STATUS_DONE: + print 'upgrade done.' + elif self.status == STATUS_ERROR: + print 'error!!' + else: print 'unknown.' + +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 < 20: 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 FirmwareUpgradeManager: + fu = None + def getInterval(self): + return 200 + + def startUpgrade(self, datafile, device, firmware): + if firmware == 'fpga': + self.fu = FPGAUpgradeCore(firmwarefile=datafile, devicefile=device) + elif firmware == 'fp': + self.fu = FPUpgradeCore(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 getStatus(self): + if self.fu.status in (STATUS_READY, STATUS_ERROR): + return 0 + 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 getErrorMessage(self, errno, errmsg): + return str(self.fu.errmsg) + class UpgradeStatus(Screen): skin = """ @@ -78,8 +244,7 @@ class UpgradeStatus(Screen): self.setTitle(firmware.upper() + " Upgrade Status") - import fu - self.FU = fu.FU() + self.FU = FirmwareUpgradeManager() self.old_status = 0 self.status_exit = None