mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-16 07:20:08 -07:00
180 lines
6.5 KiB
Python
180 lines
6.5 KiB
Python
from mainframe import MainFrame
|
|
from maianaclient import MaianaClient, MaianaStatus
|
|
import serial
|
|
import wx
|
|
from fwUpdateThread import *
|
|
|
|
MIN_HW_REV = [b'11', b'0', b'0']
|
|
|
|
class MainWindow(MainFrame):
|
|
def __init__(self):
|
|
MainFrame.__init__(self, None)
|
|
self.m_SerialPortChoice.Set(MaianaClient.serial_ports())
|
|
self.portname = None
|
|
self.port = None
|
|
self.data = None
|
|
|
|
def onSerialPortSelection(self, event):
|
|
self.m_SerialBtn.Enable()
|
|
|
|
def onSerialBtnClick(self, event):
|
|
if self.port is None:
|
|
try:
|
|
self.portname = self.m_SerialPortChoice.GetString(self.m_SerialPortChoice.GetSelection())
|
|
self.port = serial.Serial(self.portname, 38400, timeout=1)
|
|
except:
|
|
wx.MessageBox(b'Unable to open port, it may be in use', 'Error', wx.OK | wx.ICON_ERROR)
|
|
return
|
|
|
|
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_FWUpdatePnl.Enable()
|
|
self.m_SerialBtn.SetLabel(b'Disconnect')
|
|
self.m_StationSaveBtn.Disable()
|
|
else:
|
|
#Assuming status is RUNNING
|
|
self.m_SerialBtn.SetLabel(b'Disconnect')
|
|
if self.refreshSys():
|
|
self.enableUI()
|
|
self.refreshStation()
|
|
self.m_StationSaveBtn.Disable()
|
|
else:
|
|
self.port.close()
|
|
self.port = None
|
|
self.m_SerialBtn.SetLabel(b'Connect')
|
|
self.disableUI()
|
|
|
|
def onStationSaveBtnClick(self, event):
|
|
# Let's validate
|
|
if not self.validateStationInputs():
|
|
return
|
|
|
|
newdata = {'mmsi': int(self.m_MMSIText.Value),
|
|
'name': self.m_NameText.Value,
|
|
'callsign': self.m_CallsignText.Value,
|
|
'len': int(self.m_LengthText.Value),
|
|
'beam': int(self.m_BeamText.Value),
|
|
'portoffset': int(self.m_PortOffsetText.Value),
|
|
'bowoffset': int(self.m_BowOffsetText.Value),
|
|
'type': MaianaClient.VESSEL_TYPES[self.m_VesselTypeChoice.Selection]}
|
|
#print(newdata)
|
|
|
|
if MaianaClient.setStationData(self.port, newdata):
|
|
self.stationdata = newdata
|
|
self.m_StationSaveBtn.Disable()
|
|
|
|
|
|
def onFWBinarySelection(self, event):
|
|
self.m_FWUpdateBtn.Enable()
|
|
|
|
def onFWUpdateBtnClick(self, event):
|
|
self.Connect(-1, -1, EVT_FWUPDATE_ID, self.onFwUpdateEvent)
|
|
thr = FWUpdateThread(self, self.port, self.m_FWBinaryPicker.Path)
|
|
thr.start()
|
|
self.m_FWUpdateBtn.Disable()
|
|
|
|
def onFwUpdateEvent(self, evt):
|
|
print(evt.eventType, evt.data)
|
|
if evt.eventType == EventType.DFU_ENABLED:
|
|
self.m_FWUpdateStatusLbl.SetLabel("DFU enabled")
|
|
elif evt.eventType == EventType.TRANSFER_STARTED:
|
|
self.m_FWUpdateStatusLbl.SetLabel("Transferring")
|
|
elif evt.eventType == EventType.TRANSFER_PROGRESS:
|
|
self.m_FWProgress.SetValue(evt.data * 100)
|
|
elif evt.eventType == EventType.TRANSFER_COMPLETE:
|
|
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)
|
|
|
|
def enableUI(self):
|
|
self.m_StationPnl.Enable()
|
|
if self.sysdata['bootloader']:
|
|
self.m_FWUpdatePnl.Enable()
|
|
|
|
def disableUI(self):
|
|
self.m_StationPnl.Disable()
|
|
self.m_FWUpdatePnl.Disable()
|
|
|
|
def refreshSys(self):
|
|
self.sysdata = MaianaClient.loadSys(self.port)
|
|
return self.renderSys()
|
|
|
|
def refreshStation(self):
|
|
self.stationdata = MaianaClient.loadStation(self.port)
|
|
return self.renderStation()
|
|
|
|
def validateRev(self, rev):
|
|
tokens = rev.split('.')
|
|
if len(tokens) < 3:
|
|
return False
|
|
|
|
for i in range(3):
|
|
if int(tokens[i]) < int(MIN_HW_REV[i]):
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
def renderSys(self):
|
|
if not 'hw' in self.sysdata:
|
|
wx.MessageDialog(self, b'There was no response from MAIANA. Please check connections and try again.',
|
|
'Timeout', wx.OK | wx.STAY_ON_TOP|wx.CENTRE).ShowModal()
|
|
return False
|
|
|
|
if not self.validateRev(self.sysdata['hw']):
|
|
wx.MessageDialog(self, b'This version of MAIANA is too old for this software to manage.',
|
|
'Unrecognized', wx.OK | wx.STAY_ON_TOP|wx.CENTRE).ShowModal()
|
|
return False
|
|
|
|
self.m_HWRevLbl.SetLabel(self.sysdata['hw'])
|
|
self.m_FWRevLbl.SetLabel(self.sysdata['fw'])
|
|
self.m_CPULbl.SetLabel(self.sysdata['cpu'])
|
|
if self.sysdata['newbrkout']:
|
|
self.m_breakoutLbl.SetLabel(b'New')
|
|
else:
|
|
self.m_breakoutLbl.SetLabel(b'Legacy')
|
|
|
|
if self.sysdata['bootloader']:
|
|
self.m_bootloaderLbl.SetLabel('Yes')
|
|
else:
|
|
self.m_bootloaderLbl.SetLabel('No')
|
|
|
|
return True
|
|
|
|
def renderStation(self):
|
|
if not 'mmsi' in self.stationdata:
|
|
wx.MessageDialog(self, b'There was no response from MAIANA. Please check connections and try again.',
|
|
'Timeout', wx.OK | wx.STAY_ON_TOP|wx.CENTRE).ShowModal()
|
|
return False
|
|
|
|
self.m_MMSIText.SetValue('{}'.format(self.stationdata['mmsi']))
|
|
self.m_NameText.SetValue(self.stationdata['name'])
|
|
self.m_CallsignText.SetValue(self.stationdata['callsign'])
|
|
self.m_LengthText.SetValue('{}'.format(self.stationdata['len']))
|
|
self.m_BeamText.SetValue('{}'.format(self.stationdata['beam']))
|
|
self.m_PortOffsetText.SetValue('{}'.format(self.stationdata['portoffset']))
|
|
self.m_BowOffsetText.SetValue('{}'.format(self.stationdata['bowoffset']))
|
|
|
|
t = self.stationdata['type']
|
|
if t in MaianaClient.VESSEL_TYPES:
|
|
i = MaianaClient.VESSEL_TYPES.index(t)
|
|
self.m_VesselTypeChoice.SetSelection(i)
|
|
return True
|
|
|
|
def validateStationInputs(self):
|
|
return True
|
|
|
|
def onStationEdit( self, event ):
|
|
self.m_StationSaveBtn.Enable()
|
|
event.Skip()
|