lpcmanager

Parents a35ef79f2019
Children e57cb6dc67e2
Reworked Firmware Update Dialog. Reboot is now proposed systematically after update. Fixed exception handling when updating, now progress dialog realy turns modal as expected when exception occurs.
--- a/FirmwareUpdateDialog.py Fri Aug 24 14:29:40 2018 +0200
+++ b/FirmwareUpdateDialog.py Tue Sep 04 10:39:37 2018 +0200
@@ -29,91 +29,64 @@
This class is the dialog for firmware update parameters selection
"""
- def _init_ctrls(self, parent):
- wx.Dialog.__init__(self, parent=parent, size=wx.Size(600, 250), title=_('Firmware Update'))
+ def __init__(self, parent):
+ wx.Dialog.__init__(self, parent=parent, title=_('Firmware Update'))
# Widgets for the update image file selection
- self.StaticTextFirmwareUpdateImageFile = wx.StaticText(label=_('Update image file:'), parent=self)
self.TextCtrltFirmwareUpdateImageFile = wx.TextCtrl(self)
- self.TextCtrltFirmwareUpdateImageFile.SetMinSize((440, -1))
self.ButtonFirmwareUpdateImageFile = wx.Button(label=_('Add image file'), parent=self)
self.Bind(wx.EVT_BUTTON, self.OnButtonFirmwareUpdateImageFile, id=self.ButtonFirmwareUpdateImageFile.GetId())
- # Widgets for the update type
- self.StaticTextFirmwareUpdateType = wx.StaticText(label=_('Update type:'), parent=self)
- self.RadioButtonFirmwareUpdateTypeLinuxKernel = wx.RadioButton(self, -1,
- _('Linux kernel'), (10, 10), style=wx.RB_GROUP)
- self.RadioButtonFirmwareUpdateTypeLinuxDTB = wx.RadioButton(self, -1,
- _('Linux DTB'), (10, 30))
- self.RadioButtonFirmwareUpdateTypeRootFs = wx.RadioButton(self, -1,
- _('Root file system'), (10, 50))
# Widgets for the chunks size
- self.StaticTextFirmwareUpdateChunksSize = wx.StaticText(label=_('Chunks size in KiB:'), parent=self)
- self.SpinCtrlFirmwareUpdateChunksSize = wx.SpinCtrl(parent=self , size = (60, -1))
+ self.SpinCtrlFirmwareUpdateChunksSize = wx.SpinCtrl(parent=self)
self.SpinCtrlFirmwareUpdateChunksSize.SetRange(1, 1024)
self.SpinCtrlFirmwareUpdateChunksSize.SetValue(256)
- # Widgets for the reboot option
- self.CheckBoxFirmwareUpdateReboot = wx.CheckBox(label=_('Reboot after update'), parent=self)
-
# Widgets for validation
self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL)
# Sizers
- self.MainSizer = wx.FlexGridSizer(cols=1, rows=2)
- self.SizerFirmwareUpdateImageFile = wx.FlexGridSizer(cols=2, rows=2, hgap=10, vgap=10)
- self.SizerFirmwareUpdateTypeChunks = wx.FlexGridSizer(cols=2, rows=4, hgap=10, vgap=10)
-
- # Populate Main sizer
- self.MainSizer.Add(self.SizerFirmwareUpdateImageFile, flag=wx.EXPAND)
- self.MainSizer.Add(self.SizerFirmwareUpdateTypeChunks, flag=wx.EXPAND)
+ self.SizerFirmwareUpdateImageFile = wx.FlexGridSizer(cols=2, rows=1)
+ self.SizerFirmwareUpdateImageFile.AddGrowableCol(0)
+ self.SizerFirmwareUpdateImageFile.AddGrowableRow(0)
- # Make the main sizer rows and columns growable
- self.MainSizer.AddGrowableCol(0)
- self.MainSizer.AddGrowableRow(0)
- self.MainSizer.AddGrowableRow(1)
+ self.SizerFirmwareUpdateImageFile.Add(self.TextCtrltFirmwareUpdateImageFile,
+ flag=wx.LEFT|wx.EXPAND)
+ self.SizerFirmwareUpdateImageFile.Add(self.ButtonFirmwareUpdateImageFile,
+ flag=wx.RIGHT|wx.ALIGN_RIGHT)
+ self.SizerFirmwareUpdateImageFileBoxSizer = wx.StaticBoxSizer(wx.StaticBox(self, label=_('Update image file:')), wx.VERTICAL)
+ self.SizerFirmwareUpdateImageFileBoxSizer.AddSizer(self.SizerFirmwareUpdateImageFile, flag=wx.EXPAND)
- # Populate Update image file sizer
- self.SizerFirmwareUpdateImageFile.Add(self.StaticTextFirmwareUpdateImageFile, border=20,
- flag=wx.TOP|wx.LEFT)
- self.SizerFirmwareUpdateImageFile.Add((0,0))
- self.SizerFirmwareUpdateImageFile.Add(self.TextCtrltFirmwareUpdateImageFile, border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateImageFile.Add(self.ButtonFirmwareUpdateImageFile, border=20,
- flag=wx.RIGHT|wx.ALIGN_RIGHT)
+
+ self.RadioBoxFirmwareUpdateTypeChunks = wx.RadioBox(
+ self, -1, _('Update type:'), wx.DefaultPosition, wx.DefaultSize,
+ [_('Linux kernel'), _('Linux DTB'), _('Root file system')],
+ 1, wx.RA_SPECIFY_COLS)
+ self.RadioBoxFirmwareUpdateTypeChunks.SetSelection(2)
- # Populate Sizer for update type and chunks size
- self.SizerFirmwareUpdateTypeChunks.Add(self.StaticTextFirmwareUpdateType, border=20,
- flag=wx.TOP|wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.StaticTextFirmwareUpdateChunksSize, border=20,
- flag=wx.TOP|wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.RadioButtonFirmwareUpdateTypeLinuxKernel, border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.SpinCtrlFirmwareUpdateChunksSize, border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.RadioButtonFirmwareUpdateTypeLinuxDTB, border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.CheckBoxFirmwareUpdateReboot,border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.RadioButtonFirmwareUpdateTypeRootFs, border=20,
- flag=wx.LEFT)
- self.SizerFirmwareUpdateTypeChunks.Add(self.ButtonSizer, border=20, flag=wx.ALIGN_RIGHT|wx.RIGHT)
+ self.SizerFirmwareUpdateSizeChunks = wx.StaticBoxSizer(wx.StaticBox(self, label=_('Chunks size in KiB:')), wx.VERTICAL)
+ self.SizerFirmwareUpdateSizeChunks.Add(self.SpinCtrlFirmwareUpdateChunksSize,
+ flag=wx.EXPAND|wx.ALL)
- # Make the rows and columns growable
- self.SizerFirmwareUpdateImageFile.AddGrowableCol(0)
- self.SizerFirmwareUpdateImageFile.AddGrowableCol(1)
- self.SizerFirmwareUpdateImageFile.AddGrowableRow(0)
- self.SizerFirmwareUpdateImageFile.AddGrowableRow(1)
- self.SizerFirmwareUpdateTypeChunks.AddGrowableCol(0)
- self.SizerFirmwareUpdateTypeChunks.AddGrowableCol(1)
+ self.SizerFirmwareUpdateChunks = wx.FlexGridSizer(cols=2, rows=1)
+ self.SizerFirmwareUpdateChunks.AddGrowableCol(0)
+ self.SizerFirmwareUpdateChunks.AddGrowableCol(1)
+ self.SizerFirmwareUpdateChunks.Add(self.RadioBoxFirmwareUpdateTypeChunks, flag=wx.EXPAND|wx.RIGHT, border=20)
+ self.SizerFirmwareUpdateChunks.Add(self.SizerFirmwareUpdateSizeChunks, flag=wx.EXPAND)
+
+ self.MainSizer = wx.FlexGridSizer(cols=1, rows=3)
+ self.MainSizer.AddGrowableCol(0)
+ self.MainSizer.AddGrowableRow(1)
+ self.MainSizer.AddSizer(self.SizerFirmwareUpdateImageFileBoxSizer, flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=20)
+ self.MainSizer.AddSizer(self.SizerFirmwareUpdateChunks, flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=20)
+ self.MainSizer.AddSizer(self.ButtonSizer, flag=wx.ALIGN_RIGHT|wx.ALL, border=20)
+
# Set the main sizer
+ self.MainSizer.SetSizeHints(self)
self.SetSizer(self.MainSizer)
- def __init__(self, parent):
- self._init_ctrls(parent)
-
def OnButtonFirmwareUpdateImageFile(self, event):
dlg = wx.FileDialog(self, _("Choose a firmware image file"), expanduser("~"), "", "*", wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
@@ -125,17 +98,11 @@
return self.TextCtrltFirmwareUpdateImageFile.GetValue()
def GetFirmwareUpdateType(self):
- if self.RadioButtonFirmwareUpdateTypeLinuxKernel.GetValue() == True:
- return 1
- elif self.RadioButtonFirmwareUpdateTypeLinuxDTB.GetValue() == True:
- return 2
- elif self.RadioButtonFirmwareUpdateTypeRootFs.GetValue() == True:
- return 3
- else:
+ res = self.RadioBoxFirmwareUpdateTypeChunks.GetSelection()
+ if res == wx.NOT_FOUND:
return 0
+ return res+1
def GetChunksSize(self):
return self.SpinCtrlFirmwareUpdateChunksSize.GetValue()*1024
- def GetReboot(self):
- return self.CheckBoxFirmwareUpdateReboot.GetValue()
--- a/HostFirmwareUpdater.py Fri Aug 24 14:29:40 2018 +0200
+++ b/HostFirmwareUpdater.py Tue Sep 04 10:39:37 2018 +0200
@@ -39,12 +39,11 @@
class HostFirmwareUpdater(object):
# Create a new HostFirmwareUpdater
- def __init__(self, controller, firmwareImagePath, updateType, chunksSize, reboot, dialog):
+ def __init__(self, controller, firmwareImagePath, updateType, chunksSize, dialog):
self.Reset()
self.firmwareImagePath = firmwareImagePath
self.updateType = updateType
self.chunksSize = chunksSize
- self.reboot = reboot
self.controller = controller
self.dialog = dialog
self.controller.logger.write(_("HostFirmwareUpdater init.\n"))
@@ -71,10 +70,7 @@
raise Exception(textError)
# The update script is now running: Feeding the update script with firmware image data
self._RunFeedPipe()
- # Here, the update is successful, reboot?
- if self.reboot:
- self._RebootTarget()
-
+
def _CreateFirmwareImageFileSizeFile(self):
# Note Pyro exceptions are already caught by catcher_func and PyroCatcher in PyroProxyProxy
status, textError = self.controller._connector.CreateFirmwareImageFileSizeFile(self.firmwareImageFileSize)
@@ -139,7 +135,7 @@
raise Exception(textError)
else:
self.dialog.Update(100,_("Firmware update successful."))
- self.controller.logger.write(_("Firmware update log: \n\n") + textError + "\nFirmware update successful.")
+ self.controller.logger.write(_("Firmware update log: \n\n") + textError + "\nFirmware update successful.\n")
- def _RebootTarget(self):
+ def RebootTarget(self):
self.controller._connector.RebootTarget()
--- a/LPCProjectController.py Fri Aug 24 14:29:40 2018 +0200
+++ b/LPCProjectController.py Tue Sep 04 10:39:37 2018 +0200
@@ -171,7 +171,6 @@
imageFilePath = dialog.GetFirmwareImageFile()
updateType = dialog.GetFirmwareUpdateType()
chunksSize = dialog.GetChunksSize()
- reboot = dialog.GetReboot()
dialog.Destroy()
if answer == wx.ID_CANCEL:
@@ -207,8 +206,6 @@
else:
self.logger.write(_("Chunks size : %d KiB\n") % chunksSize)
- self.logger.write(_("Reboot after update : %s\n") % ("Yes" if reboot else "No"))
-
# Last confirmation before firmware update
answer = wx.MessageBox(_('Are you sure to launch the firmware update for the selected PLC?'),
_('Firmware Update'), wx.YES_NO | wx.CENTRE | wx.NO_DEFAULT,
@@ -241,22 +238,28 @@
)
# Lauch the firmaware update on the remote PLC
- updater = HostFirmwareUpdater(self, imageFilePath, updateType, chunksSize, reboot, dlg)
+ updater = HostFirmwareUpdater(self, imageFilePath, updateType, chunksSize, dlg)
try:
updater.update()
except Exception as e:
self.logger.write_error(str(e) + "\n")
self.logger.write_error(_("Firmware update failed!\n"))
+ if not dlg.WasCancelled():
+ dlg.Update(100, _("Firmware update failed!\n(%s)"%str(e)))
+ return
+ finally:
self.firmwareUpadateIsRunning = False
+ dlg.Destroy()
+
+
+ # Propose reboot
+ answer = wx.MessageBox(_('Firmware update requires reboot to complete. Reboot PLC now?'),
+ _('Firmware Update'), wx.YES_NO | wx.CENTRE | wx.NO_DEFAULT,
+ self.AppFrame)
+ if answer == wx.YES:
+ self.logger.write(_("Rebooting PLC.\n"))
+ updater.RebootTarget()
self._Disconnect()
- if not dlg.WasCanceled():
- dlg.Update(0, _("Firmware update failed!\n(%s)"%str(e)))
- dlg.ShowModal()
- dlg.Destroy()
return
- dlg.Destroy()
-
- self._Disconnect()
- self.firmwareUpadateIsRunning = False
return True