diff --git a/latest/Apps/maiana-update/maiana-update.py b/latest/Apps/maiana-update/maiana.py similarity index 100% rename from latest/Apps/maiana-update/maiana-update.py rename to latest/Apps/maiana-update/maiana.py diff --git a/latest/Apps/maiana-update/model.py b/latest/Apps/maiana-update/maianaclient.py similarity index 83% rename from latest/Apps/maiana-update/model.py rename to latest/Apps/maiana-update/maianaclient.py index b6e432a..208b3fe 100644 --- a/latest/Apps/maiana-update/model.py +++ b/latest/Apps/maiana-update/maianaclient.py @@ -3,8 +3,14 @@ import sys import glob import time import re +from enum import Enum +class MaianaStatus(Enum): + UNKNOWN = 0 + RUNNING = 1 + DFU = 2 + class MaianaClient: VESSEL_TYPES = [30, 34, 36, 37] @@ -38,6 +44,23 @@ class MaianaClient: pass return result + @staticmethod + def determineStatus(port): + port.flushInput() + port.flushOutput() + s = port.readline().strip() + port.write(b'\r\n') + for i in range(5): + s = port.readline().strip() + if s.find(b"bootloader") > -1: + return MaianaStatus.DFU + else: + tokens = s.decode('utf-8').split(',') + if (tokens[0][0] == '$' or tokens[0][0] == '!') and len(tokens) >= 2: + return MaianaStatus.RUNNING + + return MaianaStatus.UNKNOWN + @staticmethod def sendCmdWithResponse(port, cmd, resp): port.flushInput() diff --git a/latest/Apps/maiana-update/mainwindow.py b/latest/Apps/maiana-update/mainwindow.py index d62d39e..77a6d9d 100644 --- a/latest/Apps/maiana-update/mainwindow.py +++ b/latest/Apps/maiana-update/mainwindow.py @@ -1,5 +1,5 @@ from mainframe import MainFrame -from model import MaianaClient +from maianaclient import MaianaClient, MaianaStatus import serial import wx from fwUpdateThread import * @@ -24,13 +24,23 @@ class MainWindow(MainFrame): wx.MessageBox(b'Unable to open port, it may be in use', 'Error', wx.OK | wx.ICON_ERROR) return - self.port.flushInput() - self.port.flushOutput() - self.m_SerialBtn.SetLabel(b'Disconnect') - self.enableUI() - if self.refreshSys(): - self.refreshStation() + status = MaianaClient.determineStatus(self.port) + + if status == MaianaStatus.UNKNOWN: + pass + elif status == MaianaStatus.DFU: + wx.MessageBox(b'MAIANA is currently in firmware update mode. This is the only task you can perform.', + 'DFU warning', wx.OK) + self.enableUI() + self.m_SerialBtn.SetLabel(b'Disconnect') self.m_StationSaveBtn.Disable() + else: + #Assuming status is RUNNING + self.m_SerialBtn.SetLabel(b'Disconnect') + self.enableUI() + if self.refreshSys(): + self.refreshStation() + self.m_StationSaveBtn.Disable() else: self.port.close() self.port = None @@ -78,6 +88,7 @@ class MainWindow(MainFrame): self.m_FWProgress.SetValue(0) self.m_FWUpdateStatusLbl.SetLabel("Transfer completed") self.refreshSys() + self.refreshStation() elif evt.eventType == EventType.ERROR: self.m_FWUpdateStatusLbl.SetLabel(evt.data)