@@ -41,8 +41,7 @@ void menuFirmware()
4141 systemPrintf (" e) Allow Beta Firmware: %s\r\n " , enableRCFirmware ? " Enabled" : " Disabled" );
4242
4343 if (settings.enableAutoFirmwareUpdate )
44- systemPrintf (" i) Automatic firmware check minutes: %d\r\n " ,
45- settings.autoFirmwareCheckMinutes );
44+ systemPrintf (" i) Automatic firmware check minutes: %d\r\n " , settings.autoFirmwareCheckMinutes );
4645
4746 if (newOTAFirmwareAvailable)
4847 systemPrintf (" u) Update to new firmware: v%s\r\n " , reportedVersion);
@@ -86,8 +85,9 @@ void menuFirmware()
8685 char currentVersion[21 ];
8786 getFirmwareVersion (currentVersion, sizeof (currentVersion), enableRCFirmware);
8887
89- // Allow update if locally compiled developer version
90- if (isReportedVersionNewer (reportedVersion, ¤tVersion[1 ]) == true || FIRMWARE_VERSION_MAJOR == 99 )
88+ // Allow update if locally compiled developer version
89+ if (isReportedVersionNewer (reportedVersion, ¤tVersion[1 ]) == true ||
90+ FIRMWARE_VERSION_MAJOR == 99 )
9191 {
9292 systemPrintln (" New version detected" );
9393 newOTAFirmwareAvailable = true ;
@@ -108,7 +108,7 @@ void menuFirmware()
108108 bool previouslyConnected = wifiIsConnected ();
109109
110110 bool bluetoothOriginallyConnected = false ;
111- if (bluetoothState == BT_CONNECTED)
111+ if (bluetoothState == BT_CONNECTED)
112112 bluetoothOriginallyConnected = true ;
113113
114114 bluetoothStop (); // Stop Bluetooth to allow for SSL on the heap
@@ -144,10 +144,10 @@ void menuFirmware()
144144 if (previouslyConnected == false )
145145 WIFI_STOP ();
146146
147- if (bluetoothOriginallyConnected == true )
147+ if (bluetoothOriginallyConnected == true )
148148 bluetoothStart (); // Restart BT according to settings
149149 }
150- } // End wifiNetworkCount() check
150+ } // End wifiNetworkCount() check
151151 }
152152 else if (incoming == ' c' && btPrintEcho == true )
153153 {
@@ -159,14 +159,14 @@ void menuFirmware()
159159 {
160160 enableRCFirmware ^= 1 ;
161161 strncpy (reportedVersion, " " , sizeof (reportedVersion) - 1 ); // Reset to force c) menu
162+ newOTAFirmwareAvailable = false ;
162163 }
163164
164165 else if ((incoming == ' i' ) && settings.enableAutoFirmwareUpdate )
165166 {
166167 systemPrint (" Enter minutes (1 - 999999) before next firmware check: " );
167168 int minutes = getNumber (); // Returns EXIT, TIMEOUT, or long
168- if ((minutes != INPUT_RESPONSE_GETNUMBER_EXIT) &&
169- (minutes != INPUT_RESPONSE_GETNUMBER_TIMEOUT))
169+ if ((minutes != INPUT_RESPONSE_GETNUMBER_EXIT) && (minutes != INPUT_RESPONSE_GETNUMBER_TIMEOUT))
170170 {
171171 if ((minutes < 1 ) || (minutes > 999999 ))
172172 systemPrintln (" Error: Out of range (1 - 999999)" );
@@ -739,23 +739,30 @@ const char *otaPullErrorText(int code)
739739// Returns true if reportedVersion is newer than currentVersion
740740// Version number comes in as v2.7-Jan 5 2023
741741// 2.7-Jan 5 2023 is newer than v2.7-Jan 1 2023
742+ // We can't use just the float number: v3.12 is a greater version than v3.9 but it is a smaller float number
742743bool isReportedVersionNewer (char *reportedVersion, char *currentVersion)
743744{
744- float currentVersionNumber = 0.0 ;
745+ int currentVersionNumberMajor = 0 ;
746+ int currentVersionNumberMinor = 0 ;
745747 int currentDay = 0 ;
746748 int currentMonth = 0 ;
747749 int currentYear = 0 ;
748750
749- float reportedVersionNumber = 0.0 ;
751+ int reportedVersionNumberMajor = 0 ;
752+ int reportedVersionNumberMinor = 0 ;
750753 int reportedDay = 0 ;
751754 int reportedMonth = 0 ;
752755 int reportedYear = 0 ;
753756
754- breakVersionIntoParts (currentVersion, ¤tVersionNumber, ¤tYear, ¤tMonth, ¤tDay);
755- breakVersionIntoParts (reportedVersion, &reportedVersionNumber, &reportedYear, &reportedMonth, &reportedDay);
757+ breakVersionIntoParts (currentVersion, ¤tVersionNumberMajor, ¤tVersionNumberMinor, ¤tYear,
758+ ¤tMonth, ¤tDay);
759+ breakVersionIntoParts (reportedVersion, &reportedVersionNumberMajor, &reportedVersionNumberMinor, &reportedYear,
760+ &reportedMonth, &reportedDay);
756761
757- log_d (" currentVersion: %f %d %d %d" , currentVersionNumber, currentYear, currentMonth, currentDay);
758- log_d (" reportedVersion: %f %d %d %d" , reportedVersionNumber, reportedYear, reportedMonth, reportedDay);
762+ log_d (" currentVersion (%s): %d.%d %d %d %d" , currentVersion, currentVersionNumberMajor, currentVersionNumberMinor,
763+ currentYear, currentMonth, currentDay);
764+ log_d (" reportedVersion (%s): %d.%d %d %d %d" , reportedVersion, reportedVersionNumberMajor,
765+ reportedVersionNumberMinor, reportedYear, reportedMonth, reportedDay);
759766 if (enableRCFirmware)
760767 log_d (" RC firmware enabled" );
761768
@@ -765,15 +772,20 @@ bool isReportedVersionNewer(char *reportedVersion, char *currentVersion)
765772 // If the user is not using Release Candidate firmware, then check only the version number
766773 if (enableRCFirmware == false )
767774 {
768- // Check only the version number
769- if (reportedVersionNumber > currentVersionNumber)
775+ if (reportedVersionNumberMajor > currentVersionNumberMajor)
776+ return (true );
777+ if (reportedVersionNumberMajor == currentVersionNumberMajor &&
778+ reportedVersionNumberMinor > currentVersionNumberMinor)
770779 return (true );
771780 return (false );
772781 }
773782
774783 // For RC firmware, compare firmware date as well
775784 // Check version number
776- if (reportedVersionNumber > currentVersionNumber)
785+ if (reportedVersionNumberMajor > currentVersionNumberMajor)
786+ return (true );
787+ if (reportedVersionNumberMajor == currentVersionNumberMajor &&
788+ reportedVersionNumberMinor > currentVersionNumberMinor)
777789 return (true );
778790
779791 // Check which date is more recent
@@ -791,27 +803,28 @@ bool isReportedVersionNewer(char *reportedVersion, char *currentVersion)
791803}
792804
793805// Version number comes in as v2.7-Jan 5 2023
794- // Given a char string, break into version number, year, month, day
806+ // Given a char string, break into version number major/minor , year, month, day
795807// Returns false if parsing failed
796- bool breakVersionIntoParts (char *version, float *versionNumber, int *year, int *month, int *day)
808+ bool breakVersionIntoParts (char *version, int *versionNumberMajor, int *versionNumberMinor, int *year, int *month,
809+ int *day)
797810{
798811 char monthStr[20 ];
799812 int placed = 0 ;
800813
801814 if (enableRCFirmware == false )
802815 {
803- placed = sscanf (version, " %f " , versionNumber );
804- if (placed != 1 )
816+ placed = sscanf (version, " %d.%d " , versionNumberMajor, versionNumberMinor );
817+ if (placed != 2 )
805818 {
806819 log_d (" Failed to sscanf basic" );
807820 return (false ); // Something went wrong
808821 }
809822 }
810823 else
811824 {
812- placed = sscanf (version, " %f -%s %d %d" , versionNumber , monthStr, day, year);
825+ placed = sscanf (version, " %d.%d -%s %d %d" , versionNumberMajor, versionNumberMinor , monthStr, day, year);
813826
814- if (placed != 4 )
827+ if (placed != 5 )
815828 {
816829 log_d (" Failed to sscanf RC" );
817830 return (false ); // Something went wrong
0 commit comments