diff --git a/latest/Apps/maiana-update/maiana-update.fbp b/latest/Apps/maiana-update/maiana-update.fbp
index ea83dc2..86f8ea6 100644
--- a/latest/Apps/maiana-update/maiana-update.fbp
+++ b/latest/Apps/maiana-update/maiana-update.fbp
@@ -122,7 +122,7 @@
@@ -1323,6 +1326,7 @@
+ onStationEdit
@@ -1448,6 +1452,7 @@
+ onStationEdit
@@ -1573,6 +1578,7 @@
+ onStationEdit
@@ -1698,6 +1704,7 @@
+ onStationEdit
@@ -1823,6 +1830,7 @@
+ onStationEdit
@@ -2038,7 +2046,7 @@
Dock
0
Left
- 1
+ 0
1
diff --git a/latest/Apps/maiana-update/mainframe.py b/latest/Apps/maiana-update/mainframe.py
index 9c10d87..5299785 100644
--- a/latest/Apps/maiana-update/mainframe.py
+++ b/latest/Apps/maiana-update/mainframe.py
@@ -180,6 +180,8 @@ class MainFrame ( wx.Frame ):
gSizer2.Add( self.m_staticText20, 0, wx.ALL, 5 )
self.m_StationSaveBtn = wx.Button( self.m_StationPnl, wx.ID_ANY, u"Save", wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_StationSaveBtn.Enable( False )
+
gSizer2.Add( self.m_StationSaveBtn, 0, wx.ALL|wx.ALIGN_BOTTOM, 5 )
@@ -240,6 +242,14 @@ class MainFrame ( wx.Frame ):
# Connect Events
self.m_SerialPortChoice.Bind( wx.EVT_CHOICE, self.onSerialPortSelection )
self.m_SerialBtn.Bind( wx.EVT_BUTTON, self.onSerialBtnClick )
+ self.m_MMSIText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_CallsignText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_NameText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_VesselTypeChoice.Bind( wx.EVT_CHOICE, self.onStationEdit )
+ self.m_LengthText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_BeamText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_PortOffsetText.Bind( wx.EVT_TEXT, self.onStationEdit )
+ self.m_BowOffsetText.Bind( wx.EVT_TEXT, self.onStationEdit )
self.m_StationSaveBtn.Bind( wx.EVT_BUTTON, self.onStationSaveBtnClick )
self.m_FWBinaryPicker.Bind( wx.EVT_FILEPICKER_CHANGED, self.onFWBinarySelection )
self.m_FWUpdateBtn.Bind( wx.EVT_BUTTON, self.onFWUpdateBtnClick )
@@ -255,6 +265,16 @@ class MainFrame ( wx.Frame ):
def onSerialBtnClick( self, event ):
event.Skip()
+ def onStationEdit( self, event ):
+ event.Skip()
+
+
+
+
+
+
+
+
def onStationSaveBtnClick( self, event ):
event.Skip()
diff --git a/latest/Apps/maiana-update/mainwindow.py b/latest/Apps/maiana-update/mainwindow.py
index 6369f72..aeb57b7 100644
--- a/latest/Apps/maiana-update/mainwindow.py
+++ b/latest/Apps/maiana-update/mainwindow.py
@@ -15,14 +15,19 @@ class MainWindow(MainFrame):
def onSerialBtnClick(self, event):
if self.port is None:
- self.port = serial.Serial(self.m_SerialPortChoice.GetString(self.m_SerialPortChoice.GetSelection()), 38400, timeout=2)
- if self.port is None:
- wx.MessageBox(b'Unable to open port, it may be in use', 'Info', wx.OK | wx.ICON_ERROR)
- else:
- self.m_SerialBtn.SetLabel(b'Disconnect')
- self.enableUI()
- self.refreshSys()
+ try:
+ self.port = serial.Serial(self.m_SerialPortChoice.GetString(self.m_SerialPortChoice.GetSelection()), 38400, timeout=1)
+ except:
+ 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()
+ self.m_StationSaveBtn.Disable()
else:
self.port.close()
self.port = None
@@ -42,10 +47,11 @@ class MainWindow(MainFrame):
'portoffset': int(self.m_PortOffsetText.Value),
'bowoffset': int(self.m_BowOffsetText.Value),
'type': MaianaClient.VESSEL_TYPES[self.m_VesselTypeChoice.Selection]}
- print(newdata)
+ #print(newdata)
if MaianaClient.setStationData(self.port, newdata):
self.stationdata = newdata
+ self.m_StationSaveBtn.Disable()
def onFWBinarySelection(self, event):
@@ -64,18 +70,29 @@ class MainWindow(MainFrame):
def refreshSys(self):
self.sysdata = MaianaClient.loadSys(self.port)
- self.renderSys()
+ return self.renderSys()
def refreshStation(self):
self.stationdata = MaianaClient.loadStation(self.port)
- self.renderStation()
+ return self.renderStation()
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
+
self.m_HWRevLbl.SetLabel(self.sysdata['hw'])
self.m_FWRevLbl.SetLabel(self.sysdata['fw'])
self.m_CPULbl.SetLabel(self.sysdata['cpu'])
+ 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'])
@@ -87,8 +104,11 @@ class MainWindow(MainFrame):
t = self.stationdata['type']
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()
diff --git a/latest/Apps/maiana-update/model.py b/latest/Apps/maiana-update/model.py
index 3ec1867..e9051b9 100644
--- a/latest/Apps/maiana-update/model.py
+++ b/latest/Apps/maiana-update/model.py
@@ -40,36 +40,51 @@ class MaianaClient:
@staticmethod
def sendCmdWithResponse(port, cmd, resp):
+ port.flushInput()
+ port.flushOutput()
port.write(cmd + b'\r\n')
- for i in range(10):
+ for i in range(25):
s = port.readline().strip()
+ #print(s)
+ if s == b'':
+ break
if resp in s:
return s
return None
@staticmethod
def loadSys(port):
- sysline = MaianaClient.sendCmdWithResponse(port, b'sys?', b'$PAISYS')
- if sysline is None:
- return {}
+ for i in range(2):
+ try:
+ sysline = MaianaClient.sendCmdWithResponse(port, b'sys?', b'$PAISYS')
+ if sysline is None:
+ return {}
- systokens = re.split(',|\\*', sysline.decode('utf-8'))
- sysd = {'fw': systokens[2], 'hw': systokens[1], 'cpu': systokens[4]}
+ systokens = re.split(',|\\*', sysline.decode('utf-8'))
+ sysd = {'fw': systokens[2], 'hw': systokens[1], 'cpu': systokens[4]}
+ return sysd
+ finally:
+ pass
- return sysd
+ return {}
@staticmethod
def loadStation(port):
- stationline = MaianaClient.sendCmdWithResponse(port, b'station?', b'$PAISTN')
- if stationline is None:
- return {}
+ for i in range(2):
+ try:
+ stationline = MaianaClient.sendCmdWithResponse(port, b'station?', b'$PAISTN')
+ if stationline is None:
+ return {}
- stationtokens = re.split(',|\\*', stationline.decode('utf-8'))
- stad = {'mmsi': int(stationtokens[1]), 'name': stationtokens[2], 'callsign': stationtokens[3],
- 'type': int(stationtokens[4]), 'len': int(stationtokens[5]), 'beam': int(stationtokens[6]),
- 'portoffset': int(stationtokens[7]), 'bowoffset': int(stationtokens[8])}
+ stationtokens = re.split(',|\\*', stationline.decode('utf-8'))
+ stad = {'mmsi': int(stationtokens[1]), 'name': stationtokens[2], 'callsign': stationtokens[3],
+ 'type': int(stationtokens[4]), 'len': int(stationtokens[5]), 'beam': int(stationtokens[6]),
+ 'portoffset': int(stationtokens[7]), 'bowoffset': int(stationtokens[8])}
- return stad
+ return stad
+ finally:
+ pass
+ return {}
@staticmethod
def setStationData(port, data):
@@ -85,7 +100,10 @@ class MaianaClient:
)
resp = MaianaClient.sendCmdWithResponse(port, line.encode('utf-8'), b'$PAISTN')
+ #print(resp)
if resp:
- return MaianaClient.sendCmdWithResponse(port, b'reboot', b'$PAISTN')
+ resp = MaianaClient.sendCmdWithResponse(port, b'reboot', b'$PAISTN')
+ #print(resp)
+ return not resp is None
return False
\ No newline at end of file