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 @@ Status - 1 + 0 1 1 @@ -765,7 +765,7 @@ Station Data - 0 + 1 1 1 @@ -948,6 +948,7 @@ + onStationEdit @@ -1073,6 +1074,7 @@ + onStationEdit @@ -1198,6 +1200,7 @@ + onStationEdit @@ -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