-import os
+import os, fcntl, thread
-import fpga
-from enigma import eTimer
+from enigma import eTimer, getDesktop
from urllib import urlretrieve
import urllib
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 = """
- <screen position="center,center" size="450,100" title="FPGA Upgrade">
+ <screen position="center,center" size="450,130" title=" ">
<widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
- <widget name="slider" position="10,25" size="430,30" backgroundColor="white"/>
- <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="black" backgroundColor="black" transparent="1"/>
- <widget source="info" render="Label" position="10,70" zPosition="1" size="430,30" font="Regular;22" halign="center" valign="center" backgroundColor="#a08500" transparent="1"/>
+ <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
+ <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/>
+ <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
</screen>
"""
- def __init__(self, session, parent, timeout = 10):
+
+ def __init__(self, session, parent, timeout = 20):
Screen.__init__(self,session)
self.session = session
self["actions"] = ActionMap(["OkCancelActions"],
{
"ok": self.keyExit,
- }, -1)
+ }, -2)
self.is_done = 0
self.exit_count = 0
- self.timeout = timeout
+ self.timeout = 20
self.title_str = "FPGA Upgrade"
#self["name"] = Label(_("Upgrade status"))
self.slider = Slider(0, 100)
self["slider"] = self.slider
+ self.setTitle("FPGA Upgrade Status")
+
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 == 100:
#print "fpga-upgrade done!!"
- self.status_bar.setText(_("Success. Press OK to exit."))
+ 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 == -1 or self.status == -2:
+
+ elif self.status < 0:#elif self.status == -1 or self.status == -2:
#print "fpga-upgrade error >> errno : [%d]" % (self.status)
- self.status_bar.setText(_("Error[%d]. Press Cancel to exit." % (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.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 = """
- <screen position="center,center" size="560,440" title="FPGA Upgrade" >
- <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,7" size="140,40" alphatest="blend" />
- <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,7" size="140,40" alphatest="blend" />
- <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,7" size="140,40" alphatest="blend" />
- <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,7" size="140,40" alphatest="blend" />
-
- <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
- <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
- <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
- <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" transparent="1" />
-
- <widget source="status" render="Label" position="15,45" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" backgroundColor="#a08500" transparent="1" />
- <widget name="file_list" position="0,100" size="555,325" scrollbarMode="showOnDemand" />
+ <screen position="center,center" size="560,430" title="FPGA Upgrade" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="40,10" size="140,40" alphatest="blend" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="210,10" size="140,40" alphatest="blend" />
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="380,10" size="140,40" alphatest="blend" />
+
+ <widget source="key_red" render="Label" position="40,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1"/>
+ <widget source="key_green" render="Label" position="210,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1"/>
+ <widget source="key_blue" render="Label" position="380,10" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1"/>
+
+ <widget source="status" render="Label" position="15,60" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" transparent="1" />
+ <widget name="file_list" position="0,100" size="555,320" scrollbarMode="showOnDemand" />
</screen>
"""
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 = "^.*")
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
print "FILE : ", path
else:
#self.session.open(MessageBox, _("Success!!"), MessageBox.TYPE_INFO, timeout = 5)
- self.session.open(UpgradeStatus, self, timeout = 10)
+ self.session.open(UpgradeStatus, self, timeout = 20)
def onClickRed(self):
self.doExit()