fix ui of plugins on 750s.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / FPGAUpgrade / plugin.py
index 313e162..87ecedf 100644 (file)
@@ -1,7 +1,6 @@
-import os
+import os, fcntl, thread
 
-import fpga
-from enigma import eTimer
+from enigma import eTimer, getDesktop
 
 from urllib import urlretrieve
 import urllib
@@ -21,16 +20,120 @@ 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):
+       size = getDesktop(0).size()
+       position_params = size.width() > 750 and (' ') or ('backgroundColor=\"blue\"')
        skin =  """
                <screen position="center,center" size="450,130" title="FPGA Upgrade">
                        <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 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="blue" %s transparent="1"/>
                        <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" backgroundColor="#a08500" transparent="1"/>
                </screen>
-               """
-       def __init__(self, session, parent, timeout = 10):
+               """ % position_params
+
+       def __init__(self, session, parent, timeout = 20):
                Screen.__init__(self,session)
                self.session = session
 
@@ -41,7 +144,7 @@ class UpgradeStatus(Screen):
 
                self.is_done = 0
                self.exit_count = 0
-               self.timeout = timeout
+               self.timeout = 20
                self.title_str = "FPGA Upgrade"
 
                #self["name"] = Label(_("Upgrade status"))
@@ -69,14 +172,14 @@ class UpgradeStatus(Screen):
 
                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 < 0:#elif self.status == -1 or self.status == -2:
                        #print "fpga-upgrade error >> errno : [%d]" % (self.status)
                        ERROR_MSG = ''
@@ -86,6 +189,7 @@ class UpgradeStatus(Screen):
                        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)))
@@ -96,7 +200,8 @@ class UpgradeStatus(Screen):
                        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:
@@ -106,8 +211,10 @@ class UpgradeStatus(Screen):
                        self.close()
                
 class FPGAUpgrade(Screen):
+       size = getDesktop(0).size()
+       position_params = size.width() > 750 and ('center', 440) or ('120', 420)
        skin =  """
-               <screen position="center,center" size="560,440" title="FPGA Upgrade" >
+               <screen position="center,%s" size="560,%d" title="FPGA Upgrade" >
                        <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,7" size="80,40" alphatest="blend" />
                        <ePixmap pixmap="Vu_HD/buttons/green.png" position="186,7" size="80,40" alphatest="blend" />
                        <ePixmap pixmap="Vu_HD/buttons/blue.png" position="372,7" size="80,40" alphatest="blend" />
@@ -119,7 +226,7 @@ class FPGAUpgrade(Screen):
                        <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_params 
 
        def __init__(self, session): 
                Screen.__init__(self, session)
@@ -157,7 +264,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
@@ -221,7 +328,7 @@ class FPGAUpgrade(Screen):
                        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()