Browse Source

Simplify FW eeprom version checks

- Generalize force_selftest_if_fw_version() so we can check when upgrading
  between arbitrary FW versions.
- Do not call update_current_firmware_version_to_eeprom() prematurely
  when forcing self-test (if a reset happens before self-test completes,
  the check would be incorrectly skipped on the next run).
Yuri D'Elia 1 year ago
parent
commit
0e2c2d9eea
3 changed files with 17 additions and 28 deletions
  1. 1 2
      Firmware/Marlin_main.cpp
  2. 13 22
      Firmware/util.cpp
  3. 3 4
      Firmware/util.h

+ 1 - 2
Firmware/Marlin_main.cpp

@@ -1550,9 +1550,8 @@ void setup()
   }
 
 #if !defined (DEBUG_DISABLE_FORCE_SELFTEST) && defined (TMC2130)
-  if (force_selftest_if_fw_version() && calibration_status() < CALIBRATION_STATUS_ASSEMBLED) {
+  if (eeprom_fw_version_older_than({3, 2, 0, 4}) && calibration_status() < CALIBRATION_STATUS_ASSEMBLED) {
 	  lcd_show_fullscreen_message_and_wait_P(_i("Selftest will be run to calibrate accurate sensorless rehoming."));////MSG_FORCE_SELFTEST c=20 r=8
-	  update_current_firmware_version_to_eeprom();
 	  lcd_selftest();
   }
 #endif //TMC2130 && !DEBUG_DISABLE_FORCE_SELFTEST

+ 13 - 22
Firmware/util.cpp

@@ -181,32 +181,23 @@ inline int8_t is_provided_version_newer(const char *version_string)
     return 0;
 }
 
-bool force_selftest_if_fw_version()
+bool eeprom_fw_version_older_than(const uint16_t (&ver_req)[4])
 {
-	//if fw version used before flashing new firmware (fw version currently stored in eeprom) is lower then 3.1.2-RC2, function returns true to force selftest
+    uint16_t ver_eeprom[4];
 
-	uint16_t ver_eeprom[4];
-	uint16_t ver_with_calibration[4] = {3, 1, 2, 4}; //hardcoded 3.1.2-RC2 version
-	bool force_selftest = false;
+    ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR);
+    ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR);
+    ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION);
+    ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR);
 
-	ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR);
-	ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR);
-	ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION);
-	ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR);
+    for (uint8_t i = 0; i < 4; ++i) {
+        if (ver_req[i] > ver_eeprom[i])
+            return true;
+        else if (ver_req[i] < ver_eeprom[i])
+            break;
+    }
 
-	for (uint8_t i = 0; i < 4; ++i) {
-		if (ver_with_calibration[i] > ver_eeprom[i]) {
-			force_selftest = true;
-			break;
-		}
-		else if (ver_with_calibration[i] < ver_eeprom[i])
-			break;
-	}
-
-	//force selftest also in case that version used before flashing new firmware was 3.2.0-RC1
-	if ((ver_eeprom[0] == 3) && (ver_eeprom[1] == 2) && (ver_eeprom[2] == 0) && (ver_eeprom[3] == 3)) force_selftest = true;
-	
-	return force_selftest;
+    return false;
 }
 
 bool show_upgrade_dialog_if_version_newer(const char *version_string)

+ 3 - 4
Firmware/util.h

@@ -16,10 +16,9 @@ enum FirmwareRevisionFlavorType : uint16_t {
     FIRMWARE_REVISION_RC = 0x0020
 };
 
-extern bool show_upgrade_dialog_if_version_newer(const char *version_string);
-extern bool force_selftest_if_fw_version();
-
-extern void update_current_firmware_version_to_eeprom();
+bool show_upgrade_dialog_if_version_newer(const char *version_string);
+bool eeprom_fw_version_older_than(const uint16_t (&req_ver)[4]);
+void update_current_firmware_version_to_eeprom();
 
 
 //-//