1
0
mirror of https://github.com/peterantypas/maiana.git synced 2025-05-16 07:20:08 -07:00
2022-02-24 15:00:15 -08:00

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()