diff --git a/README.md b/README.md
index 089f0f0..646bc41 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Fast forward to 2021, and several other sailors who are looking for the same fea
-The main difference between MAIANA™ and every commercial transponder is that it's a self-contained unit, and thus its performance is 100% repeatable. The entire transponder circuit, the GNSS and all antennas are in the same housing. The design has been validated by fabricating _over 80 units_ now (December 2021).
+The main difference between MAIANA™ and every commercial transponder is that it's a self-contained unit, and thus its performance is 100% repeatable. The entire transponder circuit, the GNSS and all antennas are in the same housing. The design has been validated by fabricating _over 100 units_ now (February 2022).
So with all the core functionality kept outside and under tight control, the only other thing we need is power and data connections. Now, what's the most common cable that can carry a few signals 50 feet away? If you guessed "Ethernet", you guessed right. Commonplace Cat5 cable can deliver power plus serial data signals anywhere on an average sized pleasure boat. So that's how the exterior unit connects to the cabin, where one of these breakouts offers USB, NMEA0183 or NMEA2000 adapters to connect to the rest of the boat's systems.
diff --git a/latest/Apps/maiana-update/maiana-update.fbp b/latest/Apps/maiana-update/maiana-update.fbp
index d9fa3f4..0ebebdc 100644
--- a/latest/Apps/maiana-update/maiana-update.fbp
+++ b/latest/Apps/maiana-update/maiana-update.fbp
@@ -47,10 +47,10 @@
MainFrame
- 605,300
+ 620,329
wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX
; ; forward_declare
- MAIANA Transponder Manager ver 0.1
+ MAIANA Transponder Manager ver 0.3
0
@@ -174,17 +174,17 @@
wxTAB_TRAVERSAL
-
+
2
0
gSizer1
none
- 5
+ 6
0
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -243,7 +243,7 @@
-1
-
+
5
wxEXPAND
1
@@ -290,8 +290,8 @@
0
- 150,-1
- 1
+ 180,-1
+ 0
m_SerialPortChoice
1
@@ -395,7 +395,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -517,7 +517,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -639,7 +639,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -759,6 +759,250 @@
-1
+
+ 5
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+ Breakout Board Generation
+ 0
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticText21
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+
+
+ -1
+
+
+
+ 5
+ wxALIGN_CENTER_VERTICAL|wxALL
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+ (unknown)
+ 0
+
+ 0
+
+
+ 0
+
+ 1
+ m_breakoutLbl
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+
+
+ -1
+
+
+
+ 5
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+ Bootloader Present
+ 0
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticText23
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+
+
+ -1
+
+
+
+ 5
+ wxALIGN_CENTER_VERTICAL|wxALL
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+ (unknown)
+ 0
+
+ 0
+
+
+ 0
+
+ 1
+ m_bootloaderLbl
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+
+
+ -1
+
+
@@ -827,7 +1071,7 @@
0
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -924,7 +1168,7 @@
0
-
+ 180,-1
1
m_MMSIText
1
@@ -935,7 +1179,7 @@
Resizable
1
- 100,-1
+ -1,-1
; ; forward_declare
0
@@ -953,7 +1197,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1050,7 +1294,7 @@
0
-
+ 120,-1
1
m_CallsignText
1
@@ -1079,7 +1323,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1176,7 +1420,7 @@
20
0
- 140,-1
+ 180,-1
1
m_NameText
1
@@ -1205,7 +1449,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1331,7 +1575,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1457,7 +1701,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1583,7 +1827,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1709,7 +1953,7 @@
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1835,7 +2079,7 @@
5
- wxALL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -1896,7 +2140,7 @@
5
- wxALL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL
0
1
@@ -1957,7 +2201,7 @@
5
- wxALL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
0
1
@@ -2167,7 +2411,7 @@
0
5
- wxALL|wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
1
1
@@ -2215,7 +2459,7 @@
Resizable
1
- 80,-1
+ -1,-1
; ; forward_declare
0
@@ -2294,11 +2538,11 @@
-
+
5
wxEXPAND
1
-
+
2
0
@@ -2446,11 +2690,11 @@
-
+
5
wxALL
0
-
+
1
1
1
diff --git a/latest/Apps/maiana-update/maianaclient.py b/latest/Apps/maiana-update/maianaclient.py
index 208b3fe..8b58390 100644
--- a/latest/Apps/maiana-update/maianaclient.py
+++ b/latest/Apps/maiana-update/maianaclient.py
@@ -84,7 +84,11 @@ class MaianaClient:
return {}
systokens = re.split(',|\\*', sysline.decode('utf-8'))
- sysd = {'fw': systokens[2], 'hw': systokens[1], 'cpu': systokens[4]}
+ sysd = {'fw': systokens[2],
+ 'hw': systokens[1],
+ 'cpu': systokens[4],
+ 'newbrkout': int(systokens[5]),
+ 'bootloader': int(systokens[6])}
return sysd
except:
pass
diff --git a/latest/Apps/maiana-update/mainframe.py b/latest/Apps/maiana-update/mainframe.py
index 37f2f7c..35cf614 100644
--- a/latest/Apps/maiana-update/mainframe.py
+++ b/latest/Apps/maiana-update/mainframe.py
@@ -17,7 +17,7 @@ import wx.xrc
class MainFrame ( wx.Frame ):
def __init__( self, parent ):
- wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"MAIANA Transponder Manager ver 0.1", pos = wx.DefaultPosition, size = wx.Size( 605,300 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.TAB_TRAVERSAL )
+ wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"MAIANA Transponder Manager ver 0.3", pos = wx.DefaultPosition, size = wx.Size( 620,329 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.TAB_TRAVERSAL )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
@@ -25,19 +25,19 @@ class MainFrame ( wx.Frame ):
self.m_notebook2 = wx.Notebook( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_StatusPnl = wx.Panel( self.m_notebook2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
- gSizer1 = wx.GridSizer( 5, 2, 0, 0 )
+ gSizer1 = wx.GridSizer( 6, 2, 0, 0 )
self.m_staticText1 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"Serial Port", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText1.Wrap( -1 )
- gSizer1.Add( self.m_staticText1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer1.Add( self.m_staticText1, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
bSizer4 = wx.BoxSizer( wx.HORIZONTAL )
m_SerialPortChoiceChoices = []
self.m_SerialPortChoice = wx.Choice( self.m_StatusPnl, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_SerialPortChoiceChoices, 0 )
self.m_SerialPortChoice.SetSelection( 0 )
- self.m_SerialPortChoice.SetMinSize( wx.Size( 150,-1 ) )
+ self.m_SerialPortChoice.SetMinSize( wx.Size( 180,-1 ) )
bSizer4.Add( self.m_SerialPortChoice, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
@@ -52,7 +52,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText7 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"CPU", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText7.Wrap( -1 )
- gSizer1.Add( self.m_staticText7, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer1.Add( self.m_staticText7, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_CPULbl = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"(unknown)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_CPULbl.Wrap( -1 )
@@ -64,7 +64,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText3 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"Hardware Revision", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText3.Wrap( -1 )
- gSizer1.Add( self.m_staticText3, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer1.Add( self.m_staticText3, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_HWRevLbl = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"(unknown)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_HWRevLbl.Wrap( -1 )
@@ -76,7 +76,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText5 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"Firmware Revision", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText5.Wrap( -1 )
- gSizer1.Add( self.m_staticText5, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer1.Add( self.m_staticText5, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_FWRevLbl = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"(unknown)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_FWRevLbl.Wrap( -1 )
@@ -85,6 +85,26 @@ class MainFrame ( wx.Frame ):
gSizer1.Add( self.m_FWRevLbl, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ self.m_staticText21 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"Breakout Board Generation", wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_staticText21.Wrap( -1 )
+
+ gSizer1.Add( self.m_staticText21, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
+
+ self.m_breakoutLbl = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"(unknown)", wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_breakoutLbl.Wrap( -1 )
+
+ gSizer1.Add( self.m_breakoutLbl, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
+
+ self.m_staticText23 = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"Bootloader Present", wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_staticText23.Wrap( -1 )
+
+ gSizer1.Add( self.m_staticText23, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
+
+ self.m_bootloaderLbl = wx.StaticText( self.m_StatusPnl, wx.ID_ANY, u"(unknown)", wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_bootloaderLbl.Wrap( -1 )
+
+ gSizer1.Add( self.m_bootloaderLbl, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
+
self.m_StatusPnl.SetSizer( gSizer1 )
self.m_StatusPnl.Layout()
@@ -98,34 +118,38 @@ class MainFrame ( wx.Frame ):
self.m_staticText101 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"MMSI", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText101.Wrap( -1 )
- gSizer2.Add( self.m_staticText101, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText101, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
+
+ self.m_MMSIText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( -1,-1 ), 0 )
+ self.m_MMSIText.SetMinSize( wx.Size( 180,-1 ) )
- self.m_MMSIText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), 0 )
gSizer2.Add( self.m_MMSIText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
self.m_staticText11 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Call Sign", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText11.Wrap( -1 )
- gSizer2.Add( self.m_staticText11, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText11, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_CallsignText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
+ self.m_CallsignText.SetMinSize( wx.Size( 120,-1 ) )
+
gSizer2.Add( self.m_CallsignText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
self.m_staticText12 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Name", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText12.Wrap( -1 )
- gSizer2.Add( self.m_staticText12, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText12, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_NameText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_NameText.SetMaxLength( 20 )
- self.m_NameText.SetMinSize( wx.Size( 140,-1 ) )
+ self.m_NameText.SetMinSize( wx.Size( 180,-1 ) )
gSizer2.Add( self.m_NameText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
self.m_staticText13 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Vessel Type", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText13.Wrap( -1 )
- gSizer2.Add( self.m_staticText13, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText13, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
m_VesselTypeChoiceChoices = [ u"Fishing", u"Diving", u"Sailing", u"Pleasure" ]
self.m_VesselTypeChoice = wx.Choice( self.m_StationPnl, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_VesselTypeChoiceChoices, 0 )
@@ -135,7 +159,7 @@ class MainFrame ( wx.Frame ):
self._ = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Length (m)", wx.DefaultPosition, wx.DefaultSize, 0 )
self._.Wrap( -1 )
- gSizer2.Add( self._, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self._, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_LengthText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, u"0", wx.DefaultPosition, wx.DefaultSize, 0 )
gSizer2.Add( self.m_LengthText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
@@ -143,7 +167,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText15 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Beam (m)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText15.Wrap( -1 )
- gSizer2.Add( self.m_staticText15, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText15, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_BeamText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, u"0", wx.DefaultPosition, wx.DefaultSize, 0 )
gSizer2.Add( self.m_BeamText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
@@ -151,7 +175,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText17 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Port Offset (m)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText17.Wrap( -1 )
- gSizer2.Add( self.m_staticText17, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText17, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_PortOffsetText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, u"0", wx.DefaultPosition, wx.DefaultSize, 0 )
gSizer2.Add( self.m_PortOffsetText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
@@ -159,7 +183,7 @@ class MainFrame ( wx.Frame ):
self.m_staticText16 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, u"Bow Offset (m)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText16.Wrap( -1 )
- gSizer2.Add( self.m_staticText16, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer2.Add( self.m_staticText16, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_BowOffsetText = wx.TextCtrl( self.m_StationPnl, wx.ID_ANY, u"0", wx.DefaultPosition, wx.DefaultSize, 0 )
gSizer2.Add( self.m_BowOffsetText, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
@@ -167,17 +191,17 @@ class MainFrame ( wx.Frame ):
self.m_staticText18 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText18.Wrap( -1 )
- gSizer2.Add( self.m_staticText18, 0, wx.ALL, 5 )
+ gSizer2.Add( self.m_staticText18, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_staticText19 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText19.Wrap( -1 )
- gSizer2.Add( self.m_staticText19, 0, wx.ALL, 5 )
+ gSizer2.Add( self.m_staticText19, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.ALL, 5 )
self.m_staticText20 = wx.StaticText( self.m_StationPnl, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText20.Wrap( -1 )
- gSizer2.Add( self.m_staticText20, 0, wx.ALL, 5 )
+ gSizer2.Add( self.m_staticText20, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|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 )
@@ -197,10 +221,10 @@ class MainFrame ( wx.Frame ):
gSizer4 = wx.GridSizer( 1, 2, 0, 0 )
gSizer4.SetMinSize( wx.Size( -1,90 ) )
- self.m_staticText28 = wx.StaticText( self.m_FWUpdatePnl, wx.ID_ANY, u"Binary File:", wx.DefaultPosition, wx.Size( 80,-1 ), 0 )
+ self.m_staticText28 = wx.StaticText( self.m_FWUpdatePnl, wx.ID_ANY, u"Binary File:", wx.DefaultPosition, wx.Size( -1,-1 ), 0 )
self.m_staticText28.Wrap( -1 )
- gSizer4.Add( self.m_staticText28, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
+ gSizer4.Add( self.m_staticText28, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
self.m_FWBinaryPicker = wx.FilePickerCtrl( self.m_FWUpdatePnl, wx.ID_ANY, wx.EmptyString, u"Select a file", u"*.bin", wx.DefaultPosition, wx.Size( -1,-1 ), wx.FLP_CHANGE_DIR|wx.FLP_DEFAULT_STYLE|wx.FLP_FILE_MUST_EXIST|wx.FLP_OPEN )
gSizer4.Add( self.m_FWBinaryPicker, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, 5 )
diff --git a/latest/Apps/maiana-update/mainwindow.py b/latest/Apps/maiana-update/mainwindow.py
index 77a6d9d..3a5c012 100644
--- a/latest/Apps/maiana-update/mainwindow.py
+++ b/latest/Apps/maiana-update/mainwindow.py
@@ -4,6 +4,8 @@ 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)
@@ -31,14 +33,15 @@ class MainWindow(MainFrame):
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.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')
- self.enableUI()
if self.refreshSys():
+ self.enableUI()
self.refreshStation()
self.m_StationSaveBtn.Disable()
else:
@@ -94,7 +97,8 @@ class MainWindow(MainFrame):
def enableUI(self):
self.m_StationPnl.Enable()
- self.m_FWUpdatePnl.Enable()
+ if self.sysdata['bootloader']:
+ self.m_FWUpdatePnl.Enable()
def disableUI(self):
self.m_StationPnl.Disable()
@@ -108,15 +112,43 @@ class MainWindow(MainFrame):
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):
@@ -134,8 +166,9 @@ class MainWindow(MainFrame):
self.m_BowOffsetText.SetValue('{}'.format(self.stationdata['bowoffset']))
t = self.stationdata['type']
- i = MaianaClient.VESSEL_TYPES.index(t)
- self.m_VesselTypeChoice.SetSelection(i)
+ if t in MaianaClient.VESSEL_TYPES:
+ i = MaianaClient.VESSEL_TYPES.index(t)
+ self.m_VesselTypeChoice.SetSelection(i)
return True
def validateStationInputs(self):
diff --git a/latest/Firmware/Transponder/Inc/config.h b/latest/Firmware/Transponder/Inc/config.h
index 30388da..7bb65fe 100644
--- a/latest/Firmware/Transponder/Inc/config.h
+++ b/latest/Firmware/Transponder/Inc/config.h
@@ -25,7 +25,7 @@
#include "TXPowerSettings.h"
-#define FW_REV "4.0.2"
+#define FW_REV "4.1.0"
/*
diff --git a/latest/Firmware/Transponder/Inc/radio_config_Si4463_nonstd_preamble.h b/latest/Firmware/Transponder/Inc/radio_config_Si4463_nonstd_preamble.h
index 3e25bbf..d9986cf 100644
--- a/latest/Firmware/Transponder/Inc/radio_config_Si4463_nonstd_preamble.h
+++ b/latest/Firmware/Transponder/Inc/radio_config_Si4463_nonstd_preamble.h
@@ -64,7 +64,7 @@
// Descriptions:
// GLOBAL_XO_TUNE - Configure the internal capacitor frequency tuning bank for the crystal oscillator.
*/
-#define RF_GLOBAL_XO_TUNE_1 0x11, 0x00, 0x01, 0x00, 0x2D
+#define RF_GLOBAL_XO_TUNE_1 0x11, 0x00, 0x01, 0x00, 0x41
/*
// Set properties: RF_GLOBAL_CONFIG_1
diff --git a/latest/Firmware/Transponder/Inc/radio_config_si4362_c2.h b/latest/Firmware/Transponder/Inc/radio_config_si4362_c2.h
index c4447e3..b00b570 100644
--- a/latest/Firmware/Transponder/Inc/radio_config_si4362_c2.h
+++ b/latest/Firmware/Transponder/Inc/radio_config_si4362_c2.h
@@ -68,7 +68,7 @@
// GLOBAL_XO_TUNE - Configure the internal capacitor frequency tuning bank for the crystal oscillator.
// GLOBAL_CLK_CFG - Clock configuration options.
*/
-#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x2D, 0x00
+#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x41, 0x00
/*
// Set properties: RF_GLOBAL_CONFIG_1
diff --git a/latest/Firmware/Transponder/Inc/radio_config_si4460.h b/latest/Firmware/Transponder/Inc/radio_config_si4460.h
index 6207ac9..1359c22 100644
--- a/latest/Firmware/Transponder/Inc/radio_config_si4460.h
+++ b/latest/Firmware/Transponder/Inc/radio_config_si4460.h
@@ -62,7 +62,7 @@
// GLOBAL_XO_TUNE - Configure the internal capacitor frequency tuning bank for the crystal oscillator.
// GLOBAL_CLK_CFG - Clock configuration options.
*/
-#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x2D, 0x00
+#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x41, 0x00
/*
// Set properties: RF_GLOBAL_CONFIG_1
diff --git a/latest/Firmware/Transponder/Inc/radio_config_si4467.h b/latest/Firmware/Transponder/Inc/radio_config_si4467.h
index fc69f11..4d5a36c 100644
--- a/latest/Firmware/Transponder/Inc/radio_config_si4467.h
+++ b/latest/Firmware/Transponder/Inc/radio_config_si4467.h
@@ -63,7 +63,7 @@
// GLOBAL_XO_TUNE - Configure the internal capacitor frequency tuning bank for the crystal oscillator.
// GLOBAL_CLK_CFG - Clock configuration options.
*/
-#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x2D, 0x00
+#define RF_GLOBAL_XO_TUNE_2 0x11, 0x00, 0x02, 0x00, 0x41, 0x00
/*
// Set properties: RF_GLOBAL_CONFIG_1