Skip to content

Commit 59f79f9

Browse files
committed
Fix version checking when doing OTA
Fix #742
1 parent 894a26b commit 59f79f9

File tree

1 file changed

+37
-24
lines changed

1 file changed

+37
-24
lines changed

Firmware/RTK_Surveyor/menuFirmware.ino

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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, &currentVersion[1]) == true || FIRMWARE_VERSION_MAJOR == 99)
88+
// Allow update if locally compiled developer version
89+
if (isReportedVersionNewer(reportedVersion, &currentVersion[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
742743
bool 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, &currentVersionNumber, &currentYear, &currentMonth, &currentDay);
755-
breakVersionIntoParts(reportedVersion, &reportedVersionNumber, &reportedYear, &reportedMonth, &reportedDay);
757+
breakVersionIntoParts(currentVersion, &currentVersionNumberMajor, &currentVersionNumberMinor, &currentYear,
758+
&currentMonth, &currentDay);
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

Comments
 (0)