diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 4ee9f4fd..efdc63ee 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -16,8 +16,13 @@ extern uint16_t nPrinterType; extern PGM_P sPrinterName; // Firmware version -#define FW_VERSION "3.10.0" +#define FW_MAJOR 3 +#define FW_MINOR 10 +#define FW_REVISION 0 +#define FW_VERSION STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION) + #define FW_COMMIT_NR 4481 + // FW_VERSION_UNKNOWN means this is an unofficial build. // The firmware should only be checked into github with this symbol. #define FW_DEV_VERSION FW_VERSION_UNKNOWN diff --git a/Firmware/util.cpp b/Firmware/util.cpp index 5ce21cd0..97ea9fff 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -8,7 +8,8 @@ #include // Allocate the version string in the program memory. Otherwise the string lands either on the stack or in the global RAM. -const char FW_VERSION_STR[] PROGMEM = FW_VERSION; +static const char FW_VERSION_STR[] PROGMEM = FW_VERSION; +static const uint16_t FW_VERSION_NR[4] PROGMEM = { FW_MAJOR, FW_MINOR, FW_REVISION, FW_COMMIT_NR }; const char* FW_VERSION_STR_P() { @@ -139,105 +140,14 @@ inline bool strncmp_PP(const char *p1, const char *p2, uint8_t n) return 0; } -// Parse a major.minor.revision version number. -// Return true if valid. -inline bool parse_version_P(const char *str, uint16_t version[4]) -{ -#if 0 - SERIAL_ECHOPGM("Parsing version string "); - SERIAL_ECHORPGM(str); - SERIAL_ECHOLNPGM(""); -#endif - - const char *major = str; - const char *p = str; - while (is_digit(char(pgm_read_byte(p)))) ++ p; - if (pgm_read_byte(p) != '.') - return false; - const char *minor = ++ p; - while (is_digit(char(pgm_read_byte(p)))) ++ p; - if (pgm_read_byte(p) != '.') - return false; - const char *rev = ++ p; - while (is_digit(char(pgm_read_byte(p)))) ++ p; - if (! is_whitespace_or_nl_or_eol(char(pgm_read_byte(p))) && pgm_read_byte(p) != '-') - return false; - - char buf[5]; - uint8_t n = minor - major - 1; - if (n > 4) - return false; - memcpy_P(buf, major, n); buf[n] = 0; - char *endptr = NULL; - version[0] = strtol(buf, &endptr, 10); - if (*endptr != 0) - return false; - n = rev - minor - 1; - if (n > 4) - return false; - memcpy_P(buf, minor, n); buf[n] = 0; - version[1] = strtol(buf, &endptr, 10); - if (*endptr != 0) - return false; - n = p - rev; - if (n > 4) - return false; - memcpy_P(buf, rev, n); - buf[n] = 0; - version[2] = strtol(buf, &endptr, 10); - if (*endptr != 0) - return false; - - version[3] = FIRMWARE_REVISION_RELEASED; - if (pgm_read_byte(p ++) == '-') { - const char *q = p; - while (! is_whitespace_or_nl_or_eol(char(pgm_read_byte(q)))) - ++ q; - n = q - p; - if (n == strlen_P(STR_REVISION_DEV) && strncmp_PP(p, STR_REVISION_DEV, n) == 0) - version[3] = FIRMWARE_REVISION_DEV; - else if (n == strlen_P(STR_REVISION_ALPHA) && strncmp_PP(p, STR_REVISION_ALPHA, n) == 0) - version[3] = FIRMWARE_REVISION_ALPHA; - else if (n == strlen_P(STR_REVISION_BETA) && strncmp_PP(p, STR_REVISION_BETA, n) == 0) - version[3] = FIRMWARE_REVISION_BETA; - else if ((n == 2 || n == 3) && strncmp_PP(p, STR_REVISION_RC, 2) == 0) { - if (n == 2) - version[3] = FIRMWARE_REVISION_RC; - else { - p += 2; - if (is_digit(pgm_read_byte(p))) - version[3] = FIRMWARE_REVISION_RC + pgm_read_byte(p) - '1'; - else - return false; - } - } else - return false; - } - -#if 0 - SERIAL_ECHOPGM("Version parsed, major: "); - SERIAL_ECHO(version[0]); - SERIAL_ECHOPGM(", minor: "); - SERIAL_ECHO(version[1]); - SERIAL_ECHOPGM(", revision: "); - SERIAL_ECHO(version[2]); - SERIAL_ECHOPGM(", flavor: "); - SERIAL_ECHO(version[3]); - SERIAL_ECHOLNPGM(""); -#endif - return true; -} - // 1 - yes, 0 - false, -1 - error; inline int8_t is_provided_version_newer(const char *version_string) { - uint16_t ver_gcode[4], ver_current[4]; + uint16_t ver_gcode[4]; if (! parse_version(version_string, ver_gcode)) return -1; - if (! parse_version_P(FW_VERSION_STR, ver_current)) - return 0; // this shall not happen for (uint8_t i = 0; i < 3; ++ i) - if (ver_gcode[i] > ver_current[i]) + if (ver_gcode[i] > FW_VERSION_NR[i]) return 1; return 0; } @@ -272,22 +182,17 @@ bool force_selftest_if_fw_version() bool show_upgrade_dialog_if_version_newer(const char *version_string) { - uint16_t ver_gcode[4], ver_current[4]; + uint16_t ver_gcode[4]; if (! parse_version(version_string, ver_gcode)) { // SERIAL_PROTOCOLLNPGM("parse_version failed"); return false; } - if (! parse_version_P(FW_VERSION_STR, ver_current)) { -// SERIAL_PROTOCOLLNPGM("parse_version_P failed"); - return false; // this shall not happen - } -// SERIAL_PROTOCOLLNPGM("versions parsed"); bool upgrade = false; for (uint8_t i = 0; i < 4; ++ i) { - if (ver_gcode[i] > ver_current[i]) { + if (ver_gcode[i] > FW_VERSION_NR[i]) { upgrade = true; break; - } else if (ver_gcode[i] < ver_current[i]) + } else if (ver_gcode[i] < FW_VERSION_NR[i]) break; } @@ -312,16 +217,14 @@ bool show_upgrade_dialog_if_version_newer(const char *version_string) void update_current_firmware_version_to_eeprom() { - for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i) + for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){ eeprom_update_byte((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i)); - uint16_t ver_current[4]; - if (parse_version_P(FW_VERSION_STR, ver_current)) { - eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR, ver_current[0]); - eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR, ver_current[1]); - eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, ver_current[2]); - // See FirmwareRevisionFlavorType for the definition of firmware flavors. - eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR, ver_current[3]); } + eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR, FW_VERSION_NR[0]); + eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR, FW_VERSION_NR[1]); + eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, FW_VERSION_NR[2]); + // See FirmwareRevisionFlavorType for the definition of firmware flavors. + eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR, FW_VERSION_NR[3]); }