Compare commits

...

28 Commits

Author SHA1 Message Date
3d-gussner ba6e103da1
Merge pull request #4620 from 3d-gussner/MK3_Pre-release_3.13.3
Pre-release 3.13.3
2024-02-27 18:16:52 +01:00
3d-gussner abe5108cde Pre-release FW3.13.3
- run `update-pot.py`
- run `update-po.py --all`
- Bump up to 3.13.3 and build 7094
  - previous build of t3.13.3 was 7092 and +1 commit +1 merge
2024-02-27 17:26:39 +01:00
3d-gussner 73181a649b
Merge pull request #4608 from leptun/xyzcal_use_stallguard_during_z_cal
Xyzcal use stallguard during z cal
2024-02-26 10:16:11 +01:00
Alex Voinea 997dd840a7
Fix MK2.5 build 2024-02-23 17:23:11 +01:00
Alex Voinea 59bb30291a
Properly check for Z crashes while lowering/raising Z for Z calibration 2024-02-23 17:01:38 +01:00
Alex Voinea 8d1c3531c9
Use stallguard during Z calibration after XYZ calibration 2024-02-23 12:57:32 +01:00
Alex Voinea a503730f04
Add tmc currents debug 2024-02-23 12:56:59 +01:00
3d-gussner 941d3ff8af
Merge pull request #4607 from 3d-gussner/MK3_3.13.3_4507
Raise `END_FILE_SECTION` from 20000 to 30720
2024-02-23 07:23:25 +01:00
3d-gussner 89442a47f7 Raise `END_FILE_SECTION` from 20000 to 30720 to prevent false positive `File incomplete. Continue Anyway?` messages. 2024-02-23 06:04:52 +01:00
3d-gussner be658f8bd4
Merge pull request #4606 from DRracer/mmu-302
Bump up MMU FW version to 3.0.2
2024-02-21 15:46:48 +01:00
D.R.racer 914be5c694 Bump up MMU FW version to 3.0.2
.
2024-02-21 15:24:13 +01:00
3d-gussner 5d37d5ba0c
Merge pull request #4599 from leptun/TMC_restore_currents_post_home
TMC Restore default XY currents after homing
2024-02-19 15:29:44 +01:00
Alex Voinea dd4b8f7352
Restore custom currents after homing end 2024-02-19 13:29:31 +01:00
Alex Voinea 40771fe7a4
Restore default XY currents after homing 2024-02-19 13:28:33 +01:00
3d-gussner 7aff0db645
Merge pull request #4459 from 3d-gussner/MK3_3132_Final_pre_release
Pre-release tasks for FW 3.13.2 final
2023-10-20 17:24:08 +02:00
3d-gussner 90ce87906e Pre-release tasks for FW 3.13.2 final
-[X] Bumped up build number to 7080 (pre build was 7078 + 1 commit + 1 merge)
-[X] Updated .pot and .po files code lines using `update-pot.py` and `update-po.py --all`
  -[X] Verifed pot and po files changes
2023-10-20 16:44:17 +02:00
3d-gussner 63680d69eb
Merge pull request #4450 from gudnimg/PFW-1542-v3-3_13_2
3.13.2 Cherry-pick PFW-1542 Don't allow starting SD print if there is a thermal or fan error
2023-10-16 15:37:38 +02:00
gudnimg 7169a098ff PFW-1542 Reset status line message on EFCE_OK
If the error is really resolved, I'd prefer to see

"Prusa i3 MK3S OK" instead of "Err:HOTEND FAN ERROR"
2023-10-15 12:33:57 +00:00
gudnimg e1eb952f9e PFW-1542 Don't allow starting SD print if there is a fan error
Apply same conditions as on "Resume print" feature.
Starting a SD print should not be possible if there is an active hardware error
2023-10-15 12:33:46 +00:00
3d-gussner bf80ea93f8 Fix issues new cmake and PF-build.sh 2023-10-12 09:37:18 +02:00
3d-gussner 53b8cea33d Update cmake from MK3 branch 2023-10-12 09:37:18 +02:00
3d-gussner 525055c0ce
Merge pull request #4423 from 3d-gussner/MK3_3132_PFW-1542-v2
PFW-1542 Handle fan error sooner when waiting for heating to complete
2023-10-03 10:17:04 +02:00
gudnimg 341654692d PFW-1542 Handle fan error sooner when waiting for heating to complete
While waiting for the nozzle to reach a certain temperature, a fan error
should disable the hotend heater. If printing, it will simply pause the print.

Previously the printer would wait for the nozzle to heat up before pausing the print
and turning off the hotend heater.

We rely on LcdCommands::LongPause and must return to the top level loop to process it.
Waiting in the while loop e.g. in M190 does not make sense.
2023-10-02 10:48:57 +02:00
3d-gussner 4a91c5018d
Merge pull request #4409 from gudnimg/PFW-1542-cherrypick
PFW-1542 Cherry-pick for 3.13.2
2023-09-25 09:59:40 +02:00
gudnimg c452c00930 Hide menus more consistently when the printer is busy
lcd_calibration_menu: Remove redundant if (!isPrintPaused). The menu
is never called unless this condition is true.

eeprom_switch_to_next_sheet: Don't show this menu if the printer
is busy doing work!

Do not allow these menus to run while a print is paused or
when we're recovering a print:

- Preload to MMU
- Load to Nozzle
- Unload filament
- Eject from MMU
- Cut filament
- Autoload filament
- Settings
- Calibration
2023-09-24 17:30:44 +00:00
gudnimg 3e7dd84102 Fix an issue where print can't be stopped under specific circumstances
There is a bug where if the printer is recovering a print, it run a
blocking loop to restore the extruder and bed temperatures.
But if a Fan error is triggered in this loop, then the user can't
abort the print via LCD.

If the fan error resolves on its own the 'Resume print' menu will
appear in a few seconds. But if not, then the user can't resume the print
(which is normal). But with the bug above the user can't abort the print either!

The problem is essentially isPrintPaused variable is cleared too early.
We should wait until the print is completely restored first.

Steps to reproduce:
1. Start a print
2. Pause the print
3. Wait for extruder temperature to fall at lest 180°C
4. Click 'Resume' print
5. While heating, stop the hotend fan and wait for a few seconds until an error is raised
6. Observe issue => 'Stop print' menu item is gone!

PFW-1542
2023-09-24 17:30:27 +00:00
3d-gussner 024178b0fd
Merge pull request #4371 from 3d-gussner/MK3_3132
Pre-release PR for FW3.13.2-RC1
2023-09-11 11:43:48 +02:00
3d-gussner 2fd51769b3 Update pot and po files
Bump up to FW 3.13.2-RC1 and build number +2 (+1 commit + 1 merge)
2023-09-05 15:26:33 +02:00
44 changed files with 7475 additions and 7246 deletions

View File

@ -2,60 +2,97 @@ cmake_minimum_required(VERSION 3.19)
include(cmake/Utilities.cmake) include(cmake/Utilities.cmake)
include(cmake/GetGitRevisionDescription.cmake) include(cmake/GetGitRevisionDescription.cmake)
include(cmake/ReproducibleBuild.cmake) include(cmake/ReproducibleBuild.cmake)
include(cmake/ProjectVersion.cmake)
resolve_version_variables()
OPTION(ENFORCE_VERSION_MATCH "Enforce checking that configuration.h matches any parsed git tags" OFF)
OPTION(NO_TAG_IS_FATAL "If tag parsing fails, issue a fatal error" OFF)
set(PROJECT_VERSION_SUFFIX set(PROJECT_VERSION_SUFFIX
"<auto>" "<auto>"
CACHE CACHE
STRING STRING
"Full version suffix to be shown on the info screen in settings (e.g. full_version=4.0.3-BETA+1035.PR111.B4, suffix=-BETA+1035.PR111.B4). Defaults to '+<commit sha>.<dirty?>.<debug?>' if set to '<auto>'." "Version suffix to be appended to the final filename (<ver+PROJECT_VERSION_SUFFIX>). Overrides git hash if set."
) )
set(PROJECT_VERSION_SUFFIX_SHORT if(PROJECT_VERSION_SUFFIX STREQUAL "<auto>")
set(PROJECT_VERSION_SUFFIX "${FW_COMMIT_HASH}")
endif()
set(PROJECT_VERSION_FULL
"<auto>" "<auto>"
CACHE CACHE
STRING STRING
"Short version suffix to be shown on splash screen. Defaults to '+<BUILD_NUMBER>' if set to '<auto>'." "Full version string to be shown on the info screen in settings. Overrides git version if set."
) )
set(BUILD_NUMBER if(PROJECT_VERSION_FULL STREQUAL "<auto>")
"" set(PROJECT_VERSION_FULL "${FW_COMMIT_DSC}")
CACHE STRING "Build number of the firmware. Resolved automatically if not specified." endif()
) set(PROJECT_REPOSITORY
set(PROJECT_VERSION_TIMESTAMP "Unknown"
"" CACHE STRING "Repository string to be shown on the info screen in settings."
CACHE STRING "Timestamp for the build. Resolved automatically if not specified."
) )
set(CUSTOM_COMPILE_OPTIONS set(CUSTOM_COMPILE_OPTIONS
"" ""
CACHE STRING "Allows adding custom C/C++ flags" CACHE STRING "Allows adding custom C/C++ flags"
) )
include(cmake/ProjectVersion.cmake) set(FN_PREFIX "FW${PROJECT_VERSION}+${PROJECT_VERSION_SUFFIX}")
resolve_version_variables()
set(PROJECT_VERSION_FLAVOUR
""
CACHE STRING "Firmware flavour to build - DEBUG, DEVEL, APLHA, BETA or RC"
)
set(PROJECT_VERSION_FLAVOUR_REVISION
""
CACHE STRING "Firmware flavour version, e.g. 1 for RC1, etc"
)
if(NOT PROJECT_VERSION_FLAVOUR STREQUAL "")
set(PROJECT_VERSION "${PROJECT_VERSION}-${PROJECT_VERSION_FLAVOUR}")
add_compile_definitions(FW_FLAVOR=${PROJECT_VERSION_FLAVOUR})
if(NOT PROJECT_VERSION_FLAVOUR_REVISION STREQUAL "")
set(PROJECT_VERSION "${PROJECT_VERSION}${PROJECT_VERSION_FLAVOUR_REVISION}")
add_compile_definitions(FW_FLAVERSION=${PROJECT_VERSION_FLAVOUR_REVISION})
endif()
endif()
# Inform user about the resolved settings # Inform user about the resolved settings
message(STATUS "Project version: ${PROJECT_VERSION}") message(STATUS "Project version (Configuration.h): ${PROJECT_VERSION}")
message( message(STATUS "Project version suffix ..........: ${PROJECT_VERSION_SUFFIX}")
STATUS "Project version with short suffix: ${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}" message(STATUS "Project version description......: ${PROJECT_VERSION_FULL}")
)
set(FN_PREFIX "FW${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}") # testing
# SET(FW_COMMIT_DSC "v3.13.0-1234")
if(NOT "${PROJECT_VERSION_SUFFIX}" STREQUAL "UNKNOWN" AND NOT "${FW_COMMIT_DSC}" MATCHES ".+NOTFOUND.+") # else -> no commit hash is known... likely no git.
string(REGEX MATCH "v([0-9]+)\.([0-9]+)\.([0-9]+)-?(${DEV_TAG_REGEX})?([0-9]+)?-([0-9]+)" TAG_VERSION "${FW_COMMIT_DSC}")
if (CMAKE_MATCH_4) # Do we have a build type?
decode_flavor_code(PROJECT_VER_TAG_FLV "${CMAKE_MATCH_4}" "${CMAKE_MATCH_5}")
else()
# No dev status found, it must be a final tag.
decode_flavor_code(PROJECT_VER_TAG_FLV "RELEASED" "0")
endif()
if(ENFORCE_VERSION_MATCH)
if(NOT ${CMAKE_MATCH_1} STREQUAL ${PROJECT_VERSION_MAJOR})
message(FATAL_ERROR "Major version of current tag disagrees with Configuration.h ${CMAKE_MATCH_1}!=${PROJECT_VERSION_MAJOR}")
endif()
if(NOT ${CMAKE_MATCH_2} STREQUAL ${PROJECT_VERSION_MINOR})
message(FATAL_ERROR "Minor version of current tag disagrees with Configuration.h ${CMAKE_MATCH_2}!=${PROJECT_VERSION_MINOR}")
endif()
if(NOT ${CMAKE_MATCH_3} STREQUAL ${PROJECT_VERSION_REV})
message(FATAL_ERROR "Rev version of current tag disagrees with Configuration.h ${CMAKE_MATCH_3}!=${PROJECT_VERSION_REV}")
endif()
if(NOT ${PROJECT_VER_TAG_FLV} STREQUAL ${PROJECT_VERSION_TWEAK})
message(FATAL_ERROR "Dev status of current tag disagrees with Configuration.h ${PROJECT_VER_TAG_FLV}!=${PROJECT_VERSION_TWEAK}")
endif()
# Note - we don't check the commit counter, that'd be too much of a headache. Maybe it
# should be an error only on a tagged build?
MESSAGE(STATUS "Configuration.h and tag match: OK (${PROJECT_VERSION}/${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${PROJECT_VER_TAG_FLV})")
else()
MESSAGE(STATUS "Configuration.h and tag (not enforced): (${PROJECT_VERSION}/${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${PROJECT_VER_TAG_FLV})")
endif()
MESSAGE(STATUS "Commit Nr: Configuration.h: ${PROJECT_VERSION_COMMIT} Tag: ${CMAKE_MATCH_6}")
MESSAGE(STATUS "These tag values will override Configuration.h")
SET(PROJECT_VERSION ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${PROJECT_VER_TAG_FLV})
SET(PROJECT_VERSION_COMMIT ${CMAKE_MATCH_6})
git_get_repository(PROJECT_REPOSITORY)
else(GIT_FOUND)
if (NO_TAG_IS_FATAL)
MESSAGE(FATAL_ERROR "Git was not found or an error occurred parsing the tag. This is a fatal error according to the settings.")
else()
MESSAGE(STATUS "Git was not found or an error occurred parsing the tag. Falling back to Configuration.h values (${PROJECT_VERSION}).")
endif()
set(FW_COMMIT_HASH ${FW_COMMIT_HASH_UNKNOWN}) # Clear it, the code expects a binary...
set(PROJECT_VERSION_TIMESTAMP "0")
endif()
# Language configuration # Language configuration
set(MAIN_LANGUAGES set(MAIN_LANGUAGES
@ -75,7 +112,7 @@ set(COMMUNITY_LANGUAGES
set(SELECTED_LANGUAGES ${MAIN_LANGUAGES} ${COMMUNITY_LANGUAGES}) set(SELECTED_LANGUAGES ${MAIN_LANGUAGES} ${COMMUNITY_LANGUAGES})
get_dependency_directory(prusa3dboards PRUSA_BOARDS_DIR) get_dependency_directory(prusa3dboards PRUSA_BOARDS_DIR)
project(Prusa-Firmware) project(Prusa-Firmware VERSION ${PROJECT_VERSION})
add_subdirectory(lib) add_subdirectory(lib)
# Get LANG_MAX_SIZE from sources # Get LANG_MAX_SIZE from sources
@ -237,7 +274,6 @@ list(TRANSFORM AVR_SOURCES PREPEND ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/)
# Target configuration # Target configuration
# #
if(CMAKE_CROSSCOMPILING) if(CMAKE_CROSSCOMPILING)
# set source epoch
set_source_epoch(${PROJECT_VERSION_TIMESTAMP}) set_source_epoch(${PROJECT_VERSION_TIMESTAMP})
# default optimization flags # default optimization flags
@ -327,8 +363,25 @@ function(add_base_binary variant_name)
target_link_options( target_link_options(
${variant_name} PUBLIC -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${variant_name}.map ${variant_name} PUBLIC -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${variant_name}.map
) )
decode_tweak_version(PROJECT_VERSION_FLV PROJECT_VERSION_FLV_VER)
target_compile_definitions(${variant_name} PRIVATE CMAKE_CONTROL) target_compile_definitions(
${variant_name}
PRIVATE CMAKE_CONTROL FW_REPOSITORY="${PROJECT_REPOSITORY}"
FW_COMMIT_HASH="${FW_COMMIT_HASH}"
FW_COMMIT_HASH_LENGTH=${FW_COMMIT_HASH_LENGTH}
FW_MAJOR=${PROJECT_VERSION_MAJOR}
FW_MINOR=${PROJECT_VERSION_MINOR}
FW_REVISION=${PROJECT_VERSION_REV}
FW_COMMITNR=${PROJECT_VERSION_COMMIT}
)
if(NOT PROJECT_VERSION_FLV STREQUAL "RELEASED")
target_compile_definitions(
${variant_name}
PRIVATE
FW_FLAVERSION=${PROJECT_VERSION_FLV_VER}
FW_FLAVOR=${PROJECT_VERSION_FLV}
)
endif()
endfunction() endfunction()
function(fw_add_variant variant_name) function(fw_add_variant variant_name)
@ -386,7 +439,7 @@ function(fw_add_variant variant_name)
add_custom_target( add_custom_target(
check_lang_${variant_name}_${LANG} check_lang_${variant_name}_${LANG}
COMMENT "Checking ${variant_name} language ${LANG}" COMMENT "Checking ${variant_name} language ${LANG}"
COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-check.py --map ${LANG_MAP} ${PO_FILE} COMMAND "${Python3_EXECUTABLE}" ${CMAKE_SOURCE_DIR}/lang/lang-check.py --map ${LANG_MAP} ${PO_FILE}
DEPENDS ${LANG_MAP} ${PO_FILE} DEPENDS ${LANG_MAP} ${PO_FILE}
USES_TERMINAL USES_TERMINAL
) )
@ -458,7 +511,7 @@ function(fw_add_variant variant_name)
add_custom_command( add_custom_command(
OUTPUT ${FW_LANG_FINAL}.bin OUTPUT ${FW_LANG_FINAL}.bin
COMMAND ${CMAKE_OBJCOPY} -O binary ${FW_LANG_BASE} ${FW_LANG_FINAL}.bin COMMAND ${CMAKE_OBJCOPY} -O binary ${FW_LANG_BASE} ${FW_LANG_FINAL}.bin
COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-patchsec.py ${FW_LANG_BASE} ${LANG_BIN} COMMAND "${Python3_EXECUTABLE}" ${CMAKE_SOURCE_DIR}/lang/lang-patchsec.py ${FW_LANG_BASE} ${LANG_BIN}
${FW_LANG_FINAL}.bin ${FW_LANG_FINAL}.bin
DEPENDS ${FW_LANG_BASE} ${LANG_BIN} DEPENDS ${FW_LANG_BASE} ${LANG_BIN}
COMMENT "Generating ${FW_LANG_FINAL}.bin" COMMENT "Generating ${FW_LANG_FINAL}.bin"
@ -514,7 +567,7 @@ if(CMAKE_CROSSCOMPILING)
set(DIR_NAME ${THIS_VAR}) set(DIR_NAME ${THIS_VAR})
file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}) file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}/CMakeLists.txt file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}/CMakeLists.txt
"project(${DIR_NAME})\nfw_add_variant(${THIS_VAR})" "project(${DIR_NAME} VERSION ${PROJECT_VERSION})\nfw_add_variant(${THIS_VAR})"
) )
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
endforeach(THIS_VAR IN LISTS FW_VARIANTS) endforeach(THIS_VAR IN LISTS FW_VARIANTS)

View File

@ -5,6 +5,8 @@
#define STR_HELPER(x) #x #define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x) #define STR(x) STR_HELPER(x)
#define _CONCAT(x,y) x##y
#define CONCAT(x,y) _CONCAT(x,y)
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
extern const uint16_t _nPrinterType; extern const uint16_t _nPrinterType;
@ -12,54 +14,42 @@ extern const char _sPrinterName[] PROGMEM;
extern const uint16_t _nPrinterMmuType; extern const uint16_t _nPrinterMmuType;
extern const char _sPrinterMmuName[] PROGMEM; extern const char _sPrinterMmuName[] PROGMEM;
// Firmware version // Firmware version.
// NOTE: These are ONLY used if you are not building via cmake and/or not in a git repository.
// Otherwise the repository information takes precedence.
#ifndef CMAKE_CONTROL
#define FW_MAJOR 3 #define FW_MAJOR 3
#define FW_MINOR 13 #define FW_MINOR 13
#define FW_REVISION 1 #define FW_REVISION 3
#define FW_FLAVOR RC //uncomment if DEBUG, DEVEL, ALPHA, BETA or RC #define FW_COMMITNR 7094
#define FW_FLAVERSION 1 //uncomment if FW_FLAVOR is defined and versioning is needed. Limited to max 8. //#define FW_FLAVOR RC //uncomment if DEV, ALPHA, BETA or RC
#ifndef FW_FLAVOR //#define FW_FLAVERSION 1 //uncomment if FW_FLAVOR is defined and versioning is needed. Limited to max 8.
#define FW_VERSION STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION)
#else
#define FW_VERSION STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION) "-" STR(FW_FLAVOR) "" STR(FW_FLAVERSION)
#endif #endif
#define FW_COMMIT_NR 7052 #ifndef FW_FLAVOR
#define FW_TWEAK (FIRMWARE_REVISION_RELEASED)
#define FW_VERSION STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION)
#define FW_VERSION_FULL STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION) "-" STR(FW_COMMITNR)
#else
// Construct the TWEAK value as it is expected from the enum.
#define FW_TWEAK (CONCAT(FIRMWARE_REVISION_,FW_FLAVOR) + FW_FLAVERSION)
#define FW_VERSION STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION) "-" STR(FW_FLAVOR) "" STR(FW_FLAVERSION)
#define FW_VERSION_FULL STR(FW_MAJOR) "." STR(FW_MINOR) "." STR(FW_REVISION) "-" STR(FW_FLAVOR) "" STR(FW_FLAVERSION) "-" STR(FW_COMMITNR)
#endif
// FW_VERSION_UNKNOWN means this is an unofficial build. // The full version string and repository source are set via cmake
// The firmware should only be checked into github with this symbol. #ifndef CMAKE_CONTROL
#define FW_DEV_VERSION FW_VERSION_UNKNOWN #define FW_COMMIT_HASH_LENGTH 1
#define FW_COMMIT_HASH "0"
#define FW_REPOSITORY "Unknown" #define FW_REPOSITORY "Unknown"
#define FW_VERSION_FULL FW_VERSION "-" STR(FW_COMMIT_NR) #ifndef FW_VERSION_FULL
#define FW_VERSION_FULL FW_VERSION
#endif //END FW_VERSION_FULL
#endif
// G-code language level // G-code language level
#define GCODE_LEVEL 1 #define GCODE_LEVEL 1
// Debug version has debugging enabled (the symbol DEBUG_BUILD is set).
// The debug build may be a bit slower than the non-debug build, therefore the debug build should
// not be shipped to a customer.
#define FW_VERSION_DEBUG 6
// This is a development build. A development build is either built from an unofficial git repository,
// or from an unofficial branch, or it does not have a label set. Only the build server should set this build type.
#define FW_VERSION_DEVEL 5
// This is an alpha release. Only the build server should set this build type.
#define FW_VERSION_ALPHA 4
// This is a beta release. Only the build server should set this build type.
#define FW_VERSION_BETA 3
// This is a release candidate build. Only the build server should set this build type.
#define FW_VERSION_RC 2
// This is a final release. Only the build server should set this build type.
#define FW_VERSION_GOLD 1
// This is an unofficial build. The firmware should only be checked into github with this symbol,
// the build server shall never produce builds with this build type.
#define FW_VERSION_UNKNOWN 0
#if FW_DEV_VERSION == FW_VERSION_DEBUG
#define DEBUG_BUILD
#else
#undef DEBUG_BUILD
#endif
#ifndef SOURCE_DATE_EPOCH #ifndef SOURCE_DATE_EPOCH
#define SOURCE_DATE_EPOCH __DATE__ #define SOURCE_DATE_EPOCH __DATE__
#endif #endif
@ -160,7 +150,7 @@ extern const char _sPrinterMmuName[] PROGMEM;
// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it
// Ultimaker // Ultimaker
// MakerGear // MakerGear
// #define DEFAULT_Kp 7.0 // #define DEFAULT_Kp 7.0
@ -196,15 +186,15 @@ The issue: If a thermistor come off, it will read a lower temperature than actua
The system will turn the heater on forever, burning up the filament and anything The system will turn the heater on forever, burning up the filament and anything
else around. else around.
After the temperature reaches the target for the first time, this feature will After the temperature reaches the target for the first time, this feature will
start measuring for how long the current temperature stays below the target start measuring for how long the current temperature stays below the target
minus _HYSTERESIS (set_temperature - THERMAL_RUNAWAY_PROTECTION_HYSTERESIS). minus _HYSTERESIS (set_temperature - THERMAL_RUNAWAY_PROTECTION_HYSTERESIS).
If it stays longer than _PERIOD, it means the thermistor temperature If it stays longer than _PERIOD, it means the thermistor temperature
cannot catch up with the target, so something *may be* wrong. Then, to be on the cannot catch up with the target, so something *may be* wrong. Then, to be on the
safe side, the system will he halt. safe side, the system will he halt.
Bear in mind the count down will just start AFTER the first time the Bear in mind the count down will just start AFTER the first time the
thermistor temperature is over the target, so you will have no problem if thermistor temperature is over the target, so you will have no problem if
your extruder heater takes 2 minutes to hit the target on heating. your extruder heater takes 2 minutes to hit the target on heating.
@ -296,7 +286,7 @@ your extruder heater takes 2 minutes to hit the target on heating.
#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) #define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS)
#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS)
#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS)
#define Z_HEIGHT_HIDE_LIVE_ADJUST_MENU 2.0f #define Z_HEIGHT_HIDE_LIVE_ADJUST_MENU 2.0f
@ -415,9 +405,9 @@ your extruder heater takes 2 minutes to hit the target on heating.
#endif #endif
#endif #endif
#endif #endif
#endif // ENABLE_AUTO_BED_LEVELING #endif // ENABLE_AUTO_BED_LEVELING

View File

@ -262,6 +262,7 @@ uint16_t restore_interrupted_gcode();
float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min); float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min);
#ifdef TMC2130 #ifdef TMC2130
void check_Z_crash(void);
void homeaxis(uint8_t axis, uint8_t cnt = 1, uint8_t* pstep = 0); void homeaxis(uint8_t axis, uint8_t cnt = 1, uint8_t* pstep = 0);
#else #else
void homeaxis(uint8_t axis, uint8_t cnt = 1); void homeaxis(uint8_t axis, uint8_t cnt = 1);

View File

@ -2192,7 +2192,7 @@ bool calibrate_z_auto()
#endif //TMC2130 #endif //TMC2130
#ifdef TMC2130 #ifdef TMC2130
static void check_Z_crash(void) void check_Z_crash(void)
{ {
if (!READ(Z_TMC2130_DIAG)) { //Z crash if (!READ(Z_TMC2130_DIAG)) { //Z crash
FORCE_HIGH_POWER_END; FORCE_HIGH_POWER_END;
@ -3362,9 +3362,6 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
final_result = true; final_result = true;
} }
} }
#ifdef TMC2130
tmc2130_home_exit();
#endif
} }
else else
{ {
@ -6154,6 +6151,12 @@ Sigma_Exit:
while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) ) while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) )
{ {
if (lcd_commands_type == LcdCommands::LongPause) {
// Print was suddenly paused, break out of the loop
// This can happen when the firmware report a fan error
break;
}
if(( _millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. if(( _millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{ {
if (!farm_mode) { if (!farm_mode) {
@ -9788,6 +9791,11 @@ static void wait_for_heater(long codenum, uint8_t extruder) {
#else #else
while (target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder) && (CooldownNoWait == false))) { while (target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder) && (CooldownNoWait == false))) {
#endif //TEMP_RESIDENCY_TIME #endif //TEMP_RESIDENCY_TIME
if (lcd_commands_type == LcdCommands::LongPause) {
// Print was suddenly paused, break out of the loop
// This can happen when the firmware report a fan error
break;
}
if ((_millis() - codenum) > 1000UL) if ((_millis() - codenum) > 1000UL)
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down { //Print Temp Reading and remaining time every 1 second while heating up/cooling down
if (!farm_mode) { if (!farm_mode) {

View File

@ -146,6 +146,7 @@ void checkFanSpeed()
if ((fan_check_error == EFCE_FIXED) && !printer_active()){ if ((fan_check_error == EFCE_FIXED) && !printer_active()){
fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately. fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately.
lcd_reset_alert_level(); //for another fan speed error lcd_reset_alert_level(); //for another fan speed error
lcd_setstatuspgm(MSG_WELCOME); // Reset the status line message to visually show the error is gone
} }
if (fans_check_enabled && (fan_check_error == EFCE_OK)) if (fans_check_enabled && (fan_check_error == EFCE_OK))
{ {

View File

@ -2838,6 +2838,10 @@ void go_home_with_z_lift()
// Returns false if the reference values are more than 3mm far away. // Returns false if the reference values are more than 3mm far away.
bool sample_mesh_and_store_reference() bool sample_mesh_and_store_reference()
{ {
bool result = false;
#ifdef TMC2130
tmc2130_home_enter(Z_AXIS_MASK);
#endif
bool endstops_enabled = enable_endstops(false); bool endstops_enabled = enable_endstops(false);
bool endstop_z_enabled = enable_z_endstop(false); bool endstop_z_enabled = enable_z_endstop(false);
@ -2853,30 +2857,25 @@ bool sample_mesh_and_store_reference()
// Sample Z heights for the mesh bed leveling. // Sample Z heights for the mesh bed leveling.
// In addition, store the results into an eeprom, to be used later for verification of the bed leveling process. // In addition, store the results into an eeprom, to be used later for verification of the bed leveling process.
{ {
// The first point defines the reference. // Lower Z to the mesh search height with stall detection
enable_endstops(true);
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
go_to_current(homing_feedrate[Z_AXIS]/60); go_to_current(homing_feedrate[Z_AXIS]/60);
#ifdef TMC2130
check_Z_crash();
#endif
enable_endstops(false);
// Move XY to first point
current_position[X_AXIS] = BED_X0; current_position[X_AXIS] = BED_X0;
current_position[Y_AXIS] = BED_Y0; current_position[Y_AXIS] = BED_Y0;
world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
go_to_current(homing_feedrate[X_AXIS]/60); go_to_current(homing_feedrate[X_AXIS]/60);
set_destination_to_current(); set_destination_to_current();
enable_endstops(true);
homeaxis(Z_AXIS); homeaxis(Z_AXIS);
#ifdef TMC2130
if (!axis_known_position[Z_AXIS] && (!READ(Z_TMC2130_DIAG))) //Z crash
{
kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
return false;
}
#endif //TMC2130
enable_endstops(false);
if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
{ {
kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
return false;
} }
mbl.set_z(0, 0, current_position[Z_AXIS]); mbl.set_z(0, 0, current_position[Z_AXIS]);
} }
@ -2902,7 +2901,6 @@ bool sample_mesh_and_store_reference()
if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
{ {
kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
return false;
} }
// Get cords of measuring point // Get cords of measuring point
@ -2921,7 +2919,7 @@ bool sample_mesh_and_store_reference()
// The span of the Z offsets is extreme. Give up. // The span of the Z offsets is extreme. Give up.
// Homing failed on some of the points. // Homing failed on some of the points.
SERIAL_PROTOCOLLNPGM("Exreme span of the Z values!"); SERIAL_PROTOCOLLNPGM("Exreme span of the Z values!");
return false; goto end;
} }
} }
@ -2962,9 +2960,14 @@ bool sample_mesh_and_store_reference()
go_home_with_z_lift(); go_home_with_z_lift();
result = true;
end:
enable_endstops(endstops_enabled); enable_endstops(endstops_enabled);
enable_z_endstop(endstop_z_enabled); enable_z_endstop(endstop_z_enabled);
return true; #ifdef TMC2130
tmc2130_home_exit();
#endif
return result;
} }
#ifndef NEW_XYZCAL #ifndef NEW_XYZCAL

View File

@ -286,7 +286,7 @@ static const char MSG_DESC_FILAMENT_CHANGE[] PROGMEM_I1 = ISTR("M600 Filament Ch
static const char MSG_DESC_UNKNOWN_ERROR[] PROGMEM_I1 = ISTR("Unexpected error occurred."); ////MSG_DESC_UNKNOWN_ERROR c=20 r=8 static const char MSG_DESC_UNKNOWN_ERROR[] PROGMEM_I1 = ISTR("Unexpected error occurred."); ////MSG_DESC_UNKNOWN_ERROR c=20 r=8
// Read explanation in mmu2_protocol_logic.cpp -> supportedMmuFWVersion // Read explanation in mmu2_protocol_logic.cpp -> supportedMmuFWVersion
static constexpr char MSG_DESC_FW_UPDATE_NEEDED[] PROGMEM_I1 = ISTR("MMU FW version is incompatible with printer FW.Update to version 3.0.1."); ////MSG_DESC_FW_UPDATE_NEEDED c=20 r=8 static constexpr char MSG_DESC_FW_UPDATE_NEEDED[] PROGMEM_I1 = ISTR("MMU FW version is incompatible with printer FW.Update to version 3.0.2."); ////MSG_DESC_FW_UPDATE_NEEDED c=20 r=8
static constexpr uint8_t szFWUN = sizeof(MSG_DESC_FW_UPDATE_NEEDED); static constexpr uint8_t szFWUN = sizeof(MSG_DESC_FW_UPDATE_NEEDED);
// at least check the individual version characters in MSG_DESC_FW_UPDATE_NEEDED // at least check the individual version characters in MSG_DESC_FW_UPDATE_NEEDED
static_assert(MSG_DESC_FW_UPDATE_NEEDED[szFWUN - 7] == ('0' + mmuVersionMajor)); static_assert(MSG_DESC_FW_UPDATE_NEEDED[szFWUN - 7] == ('0' + mmuVersionMajor));

View File

@ -5,6 +5,6 @@ namespace MMU2 {
static constexpr uint8_t mmuVersionMajor = 3; static constexpr uint8_t mmuVersionMajor = 3;
static constexpr uint8_t mmuVersionMinor = 0; static constexpr uint8_t mmuVersionMinor = 0;
static constexpr uint8_t mmuVersionPatch = 1; static constexpr uint8_t mmuVersionPatch = 2;
} // namespace MMU2 } // namespace MMU2

View File

@ -30,18 +30,25 @@ static constexpr uint8_t default_dedge_bit = 0;
//mode //mode
uint8_t tmc2130_mode = TMC2130_MODE_NORMAL; uint8_t tmc2130_mode = TMC2130_MODE_NORMAL;
uint8_t tmc2130_current_h[4] = TMC2130_CURRENTS_H;
//running currents
uint8_t tmc2130_current_r[4] = TMC2130_CURRENTS_R;
static constexpr uint8_t tmc2130_default_current_h[4] = TMC2130_CURRENTS_H;
//running currents
static constexpr uint8_t tmc2130_default_current_r[4] = TMC2130_CURRENTS_R;
//running currents for homing //running currents for homing
static uint8_t tmc2130_current_r_home[4] = TMC2130_CURRENTS_R_HOME; static constexpr uint8_t tmc2130_current_r_home[4] = TMC2130_CURRENTS_R_HOME;
static constexpr MotorCurrents homing_currents_P[NUM_AXIS] PROGMEM = {
MotorCurrents(tmc2130_current_r_home[0], tmc2130_current_r_home[0]),
MotorCurrents(tmc2130_current_r_home[1], tmc2130_current_r_home[1]),
MotorCurrents(tmc2130_current_r_home[2], tmc2130_current_r_home[2]),
MotorCurrents(tmc2130_current_r_home[3], tmc2130_current_r_home[3])
};
MotorCurrents currents[NUM_AXIS] = { MotorCurrents currents[NUM_AXIS] = {
MotorCurrents(tmc2130_current_r[0], tmc2130_current_h[0]), MotorCurrents(tmc2130_default_current_r[0], tmc2130_default_current_h[0]),
MotorCurrents(tmc2130_current_r[1], tmc2130_current_h[1]), MotorCurrents(tmc2130_default_current_r[1], tmc2130_default_current_h[1]),
MotorCurrents(tmc2130_current_r[2], tmc2130_current_h[2]), MotorCurrents(tmc2130_default_current_r[2], tmc2130_default_current_h[2]),
MotorCurrents(tmc2130_current_r[3], tmc2130_current_h[3]) MotorCurrents(tmc2130_default_current_r[3], tmc2130_default_current_h[3])
}; };
union ChopConfU { union ChopConfU {
@ -419,8 +426,8 @@ void tmc2130_home_enter(uint8_t axes_mask)
tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_NORMAL); tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_NORMAL);
tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr_home[axis]) << 16)); tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr_home[axis]) << 16));
tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, __tcoolthrs(axis)); tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, __tcoolthrs(axis));
currents[axis].setiRun(tmc2130_current_r_home[axis]); MotorCurrents curr(homing_currents_P[axis]);
tmc2130_setup_chopper(axis, tmc2130_mres[axis]); tmc2130_setup_chopper(axis, tmc2130_mres[axis], &curr);
tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); //stallguard output DIAG1, DIAG1 = pushpull tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); //stallguard output DIAG1, DIAG1 = pushpull
} }
} }
@ -516,17 +523,12 @@ static constexpr bool getIntpolBit([[maybe_unused]]const uint8_t axis, const uin
return (mres != 0); // intpol to 256 only if microsteps aren't 256 return (mres != 0); // intpol to 256 only if microsteps aren't 256
} }
static void SetCurrents(const uint8_t axis) { static void SetCurrents(const uint8_t axis, const MotorCurrents &curr) {
uint8_t iHold = currents[axis].getiHold(); uint8_t iHold = curr.getiHold();
const uint8_t iRun = currents[axis].getiRun(); const uint8_t iRun = curr.getiRun();
// Make sure iHold never exceeds iRun at runtime // Make sure iHold never exceeds iRun at runtime
if (iHold > iRun) { if (curr.iHoldIsClamped()) {
iHold = iRun;
// Update global array such that M913 reports correct values
currents[axis].setiHold(iRun);
// Let user know firmware modified the value // Let user know firmware modified the value
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(_n("Hold current truncated to Run current")); SERIAL_ECHOLNRPGM(_n("Hold current truncated to Run current"));
@ -548,11 +550,13 @@ static void SetCurrents(const uint8_t axis) {
}; };
IHoldRun ihold_irun(iHold, iRun); IHoldRun ihold_irun(iHold, iRun);
#ifdef DEBUG_TMC_CURRENTS
printf_P(PSTR("SetCurrents(axis=%u, iHold=%u, iRun=%u, vsense=%u, reg=%08lX)\n"), axis, iHold, iRun, curr.getvSense(), ihold_irun.dw);
#endif //DEBUG_TMC_CURRENTS
tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, ihold_irun.dw); tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, ihold_irun.dw);
} }
void tmc2130_setup_chopper(uint8_t axis, uint8_t mres) void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, const MotorCurrents *curr /* = nullptr */)
{ {
// Initialise the chopper configuration // Initialise the chopper configuration
ChopConfU chopconf = ChopConfU(currents[axis].getvSense(), mres); ChopConfU chopconf = ChopConfU(currents[axis].getvSense(), mres);
@ -564,21 +568,10 @@ void tmc2130_setup_chopper(uint8_t axis, uint8_t mres)
chopconf.s.tbl = tmc2130_chopper_config[axis].tbl; //blanking time, original value = 2 chopconf.s.tbl = tmc2130_chopper_config[axis].tbl; //blanking time, original value = 2
tmc2130_wr(axis, TMC2130_REG_CHOPCONF, chopconf.dw); tmc2130_wr(axis, TMC2130_REG_CHOPCONF, chopconf.dw);
SetCurrents(axis); if (curr == nullptr) {
} curr = &currents[axis];
}
void tmc2130_set_current_h(uint8_t axis, uint8_t current) SetCurrents(axis, *curr);
{
// DBG(_n("tmc2130_set_current_h(axis=%d, current=%d\n"), axis, current);
currents[axis].setiHold(current);
tmc2130_setup_chopper(axis, tmc2130_mres[axis]);
}
void tmc2130_set_current_r(uint8_t axis, uint8_t current)
{
// DBG(_n("tmc2130_set_current_r(axis=%d, current=%d\n"), axis, current);
currents[axis].setiRun(current);
tmc2130_setup_chopper(axis, tmc2130_mres[axis]);
} }
void tmc2130_print_currents() void tmc2130_print_currents()

View File

@ -95,13 +95,17 @@ struct MotorCurrents {
} }
} }
// PROGMEM initializer
inline __attribute__((always_inline)) MotorCurrents(const MotorCurrents &curr_P) { memcpy_P(this, &curr_P, sizeof(*this)); }
constexpr inline __attribute__((always_inline)) MotorCurrents(uint8_t ir, uint8_t ih) constexpr inline __attribute__((always_inline)) MotorCurrents(uint8_t ir, uint8_t ih)
: vSense((ir < 32) ? 1 : 0) : vSense((ir < 32) ? 1 : 0)
, iRun((ir < 32) ? ir : (ir >> 1)) , iRun((ir < 32) ? ir : (ir >> 1))
, iHold((ir < 32) ? ih : (ih >> 1)) {} , iHold((ir < 32) ? ih : (ih >> 1)) {}
inline uint8_t getiRun() const { return iRun; } inline uint8_t getiRun() const { return iRun; }
inline uint8_t getiHold() const { return iHold; } inline uint8_t getiHold() const { return min(iHold, iRun); }
inline bool iHoldIsClamped() const { return iHold > iRun; }
inline uint8_t getvSense() const { return vSense; } inline uint8_t getvSense() const { return vSense; }
void __attribute__((noinline)) setiRun(uint8_t ir) { void __attribute__((noinline)) setiRun(uint8_t ir) {
@ -162,12 +166,11 @@ extern void tmc2130_sg_measure_start(uint8_t axis);
//stop current stallguard measuring and report result //stop current stallguard measuring and report result
extern uint16_t tmc2130_sg_measure_stop(); extern uint16_t tmc2130_sg_measure_stop();
extern void tmc2130_setup_chopper(uint8_t axis, uint8_t mres); // Enable or Disable crash detection according to EEPROM
void crashdet_use_eeprom_setting();
extern void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, const MotorCurrents *curr = nullptr);
//set holding current for any axis (M911)
extern void tmc2130_set_current_h(uint8_t axis, uint8_t current);
//set running current for any axis (M912)
extern void tmc2130_set_current_r(uint8_t axis, uint8_t current);
//print currents (M913) //print currents (M913)
extern void tmc2130_print_currents(); extern void tmc2130_print_currents();

View File

@ -99,7 +99,6 @@ static void lcd_language_menu();
static void lcd_main_menu(); static void lcd_main_menu();
static void lcd_tune_menu(); static void lcd_tune_menu();
static void lcd_settings_menu(); static void lcd_settings_menu();
static void lcd_calibration_menu();
static void lcd_control_temperature_menu(); static void lcd_control_temperature_menu();
#ifdef TMC2130 #ifdef TMC2130
static void lcd_settings_linearity_correction_menu_save(); static void lcd_settings_linearity_correction_menu_save();
@ -1606,10 +1605,8 @@ static void lcd_support_menu()
MENU_ITEM_BACK_P(PSTR("Firmware:")); MENU_ITEM_BACK_P(PSTR("Firmware:"));
MENU_ITEM_BACK_P(PSTR(" " FW_VERSION_FULL)); MENU_ITEM_BACK_P(PSTR(" " FW_VERSION_FULL));
#if (FW_DEV_VERSION != FW_VERSION_GOLD) && (FW_DEV_VERSION != FW_VERSION_RC) MENU_ITEM_BACK_P(PSTR(" Repo:" FW_REPOSITORY));
MENU_ITEM_BACK_P(PSTR(" repo " FW_REPOSITORY)); MENU_ITEM_BACK_P(PSTR(" Hash:" FW_COMMIT_HASH));
#endif
MENU_ITEM_BACK_P(_n("prusa3d.com"));////MSG_PRUSA3D c=18 MENU_ITEM_BACK_P(_n("prusa3d.com"));////MSG_PRUSA3D c=18
MENU_ITEM_BACK_P(_n("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=18 MENU_ITEM_BACK_P(_n("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=18
MENU_ITEM_BACK_P(_n("help.prusa3d.com"));////MSG_PRUSA3D_HELP c=18 MENU_ITEM_BACK_P(_n("help.prusa3d.com"));////MSG_PRUSA3D_HELP c=18
@ -4561,20 +4558,18 @@ static void lcd_settings_linearity_correction_menu_save()
static void lcd_calibration_menu() static void lcd_calibration_menu()
{ {
MENU_BEGIN(); MENU_BEGIN();
MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_BACK_P(_T(MSG_MAIN));
if (!isPrintPaused) MENU_ITEM_FUNCTION_P(_i("Wizard"), lcd_wizard);////MSG_WIZARD c=17
{
MENU_ITEM_FUNCTION_P(_i("Wizard"), lcd_wizard);////MSG_WIZARD c=17
if (lcd_commands_type == LcdCommands::Idle) if (lcd_commands_type == LcdCommands::Idle)
{ {
MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), lcd_first_layer_calibration_reset); MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), lcd_first_layer_calibration_reset);
} }
MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), G28W); MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), G28W);
#ifdef TMC2130 #ifdef TMC2130
MENU_ITEM_FUNCTION_P(_i("Belt test"), lcd_belttest_v);////MSG_BELTTEST c=18 MENU_ITEM_FUNCTION_P(_i("Belt test"), lcd_belttest_v);////MSG_BELTTEST c=18
#endif //TMC2130 #endif //TMC2130
MENU_ITEM_FUNCTION_P(_i("Selftest"), lcd_selftest_v);////MSG_SELFTEST c=18 MENU_ITEM_FUNCTION_P(_i("Selftest"), lcd_selftest_v);////MSG_SELFTEST c=18
// MK2 // MK2
MENU_ITEM_FUNCTION_P(_i("Calibrate XYZ"), lcd_mesh_calibration);////MSG_CALIBRATE_BED c=18 MENU_ITEM_FUNCTION_P(_i("Calibrate XYZ"), lcd_mesh_calibration);////MSG_CALIBRATE_BED c=18
// "Calibrate Z" with storing the reference values to EEPROM. // "Calibrate Z" with storing the reference values to EEPROM.
@ -4583,21 +4578,21 @@ static void lcd_calibration_menu()
MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bedleveling); ////MSG_MESH_BED_LEVELING c=18 MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bedleveling); ////MSG_MESH_BED_LEVELING c=18
MENU_ITEM_SUBMENU_P(_i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU c=18 MENU_ITEM_SUBMENU_P(_i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU c=18
MENU_ITEM_SUBMENU_P(_i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17 MENU_ITEM_SUBMENU_P(_i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17
#ifndef TMC2130 #ifndef TMC2130
MENU_ITEM_SUBMENU_P(_i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=18 MENU_ITEM_SUBMENU_P(_i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=18
#endif #endif
MENU_ITEM_GCODE_P(_i("Reset XYZ calibr."), PSTR("M44"));////MSG_CALIBRATE_BED_RESET c=18 MENU_ITEM_GCODE_P(_i("Reset XYZ calibr."), PSTR("M44"));////MSG_CALIBRATE_BED_RESET c=18
#ifdef PINDA_THERMISTOR #ifdef PINDA_THERMISTOR
if(has_temperature_compensation()) if(has_temperature_compensation())
MENU_ITEM_FUNCTION_P(_T(MSG_PINDA_CALIBRATION), lcd_calibrate_pinda); MENU_ITEM_FUNCTION_P(_T(MSG_PINDA_CALIBRATION), lcd_calibrate_pinda);
#endif #endif
}
#ifdef THERMAL_MODEL #ifdef THERMAL_MODEL
MENU_ITEM_SUBMENU_P(_n("Thermal Model cal."), lcd_thermal_model_cal); MENU_ITEM_SUBMENU_P(_n("Thermal Model cal."), lcd_thermal_model_cal);
#endif //THERMAL_MODEL #endif //THERMAL_MODEL
MENU_END(); MENU_END();
} }
//! @brief Select one of numbered items //! @brief Select one of numbered items
@ -5017,7 +5012,6 @@ void lcd_resume_print()
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
st_synchronize(); st_synchronize();
custom_message_type = CustomMsg::Resuming; custom_message_type = CustomMsg::Resuming;
isPrintPaused = false;
// resume processing USB commands again and restore hotend fan state (in case the print was // resume processing USB commands again and restore hotend fan state (in case the print was
// stopped due to a thermal error) // stopped due to a thermal error)
@ -5025,6 +5019,7 @@ void lcd_resume_print()
Stopped = false; Stopped = false;
restore_print_from_ram_and_continue(default_retraction); restore_print_from_ram_and_continue(default_retraction);
isPrintPaused = false;
pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation
refresh_cmd_timeout(); refresh_cmd_timeout();
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint
@ -5241,37 +5236,44 @@ static void lcd_main_menu()
MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop); MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop);
} }
#endif #endif
// only allow starting SD print if hardware errors (temperature or fan) are cleared
if(!get_temp_error()
#ifdef FANCHECK
&& fan_check_error != EFCE_REPORTED
#endif //FANCHECK
)
{
#ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code #ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code
if (card.cardOK || lcd_commands_type != LcdCommands::Idle) { if (card.cardOK || lcd_commands_type != LcdCommands::Idle) {
if (!card.isFileOpen()) { if (!card.isFileOpen()) {
if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) { if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) {
bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function
MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu); MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
} }
#if SDCARDDETECT < 1 #if SDCARDDETECT < 1
MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21")); // SD-card changed by user ////MSG_CNG_SDCARD c=18 MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21")); // SD-card changed by user ////MSG_CNG_SDCARD c=18
#endif //SDCARDDETECT
}
} else {
bMain=true; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu); ////MSG_NO_CARD c=18
#if SDCARDDETECT < 1
MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface ////MSG_INIT_SDCARD c=18
#endif //SDCARDDETECT #endif //SDCARDDETECT
} }
} else {
bMain=true; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu); ////MSG_NO_CARD c=18
#if SDCARDDETECT < 1
MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface ////MSG_INIT_SDCARD c=18
#endif //SDCARDDETECT
}
#endif //SDSUPPORT #endif //SDSUPPORT
}
if(!isPrintPaused && !printJobOngoing() && (lcd_commands_type == LcdCommands::Idle)) { if(!printer_active() && !farm_mode) {
if (!farm_mode) { const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
const int8_t nextSheet = eeprom_next_initialized_sheet(sheet); if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized
if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
}
} }
} }
if ( ! ( printJobOngoing() || (lcd_commands_type != LcdCommands::Idle) || (eFilamentAction != FilamentAction::None) || Stopped ) ) { if ( ! ( printer_active() || (eFilamentAction != FilamentAction::None) || Stopped ) ) {
if (MMU2::mmu2.Enabled()) { if (MMU2::mmu2.Enabled()) {
if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) { if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) {
// The MMU 'Load filament' state machine will reject the command if any // The MMU 'Load filament' state machine will reject the command if any
@ -5298,8 +5300,8 @@ static void lcd_main_menu()
} }
MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
} }
MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu); MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu);
if(!isPrintPaused && (custom_message_type != CustomMsg::Resuming)) MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu); if(!isPrintPaused) MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu);
} }
if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) { if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) {

View File

@ -14,21 +14,17 @@ const uint16_t FW_VERSION_NR[4] PROGMEM = {
FW_MAJOR, FW_MAJOR,
FW_MINOR, FW_MINOR,
FW_REVISION, FW_REVISION,
#ifndef FW_FLAVOR FW_TWEAK,
FW_COMMIT_NR
#else
# if FW_DEV_VERSION == FW_VERSION_ALPHA
FIRMWARE_REVISION_ALPHA + FW_FLAVERSION
# elif FW_DEV_VERSION == FW_VERSION_BETA
FIRMWARE_REVISION_BETA + FW_FLAVERSION
# elif FW_DEV_VERSION == FW_VERSION_RC
FIRMWARE_REVISION_RC + FW_FLAVERSION
# elif FW_DEV_VERSION == FW_VERSION_GOLD
0
# endif
#endif
}; };
const char FW_VERSION_HASH[] PROGMEM = FW_COMMIT_HASH;
static_assert(sizeof(FW_VERSION_HASH) == FW_COMMIT_HASH_LENGTH + 1);
const char* FW_VERSION_HASH_P()
{
return FW_VERSION_HASH;
}
const char* FW_VERSION_STR_P() const char* FW_VERSION_STR_P()
{ {
return FW_VERSION_STR; return FW_VERSION_STR;
@ -159,7 +155,7 @@ inline bool strncmp_PP(const char *p1, const char *p2, uint8_t n)
return -1; return -1;
if (pgm_read_byte(p1) > pgm_read_byte(p2)) if (pgm_read_byte(p1) > pgm_read_byte(p2))
return 1; return 1;
} }
} }
return 0; return 0;
} }

View File

@ -2,7 +2,10 @@
#include <stdint.h> #include <stdint.h>
extern const uint16_t FW_VERSION_NR[4]; extern const uint16_t FW_VERSION_NR[4];
extern const char* FW_VERSION_STR_P(); const char* FW_VERSION_STR_P();
extern const char FW_VERSION_HASH[];
const char* FW_VERSION_HASH_P();
// Definition of a firmware flavor numerical values. // Definition of a firmware flavor numerical values.
// To keep it short as possible // To keep it short as possible

View File

@ -98,7 +98,7 @@
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min) #define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -99,7 +99,7 @@
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min) #define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -98,7 +98,7 @@
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min) #define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -99,7 +99,7 @@
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min) #define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -109,7 +109,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -109,7 +109,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -109,7 +109,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -111,7 +111,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -111,7 +111,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -111,7 +111,7 @@
#define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s #define NORMAL_MAX_FEEDRATE_XY 200 // max feedrate in mm/s
//number of bytes from end of the file to start check //number of bytes from end of the file to start check
#define END_FILE_SECTION 20000 #define END_FILE_SECTION 30720
#define Z_AXIS_ALWAYS_ON 1 #define Z_AXIS_ALWAYS_ON 1

View File

@ -389,7 +389,7 @@ THERMISTORS SETTINGS
#define DEFAULT_PID_TEMP 210 #define DEFAULT_PID_TEMP 210
#define END_FILE_SECTION 20000 //number of bytes from end of file used for checking if file is complete #define END_FILE_SECTION 30720 //number of bytes from end of file used for checking if file is complete
// Safety timer // Safety timer
#define SAFETYTIMER #define SAFETYTIMER

View File

@ -388,7 +388,7 @@ THERMISTORS SETTINGS
#define DEFAULT_PID_TEMP 210 #define DEFAULT_PID_TEMP 210
#define END_FILE_SECTION 20000 //number of bytes from end of file used for checking if file is complete #define END_FILE_SECTION 30720 //number of bytes from end of file used for checking if file is complete
// Safety timer // Safety timer
#define SAFETYTIMER #define SAFETYTIMER

View File

@ -56,7 +56,7 @@
# Some may argue that this is only used by a script, BUT as soon someone accidentally or on purpose starts Arduino IDE # Some may argue that this is only used by a script, BUT as soon someone accidentally or on purpose starts Arduino IDE
# it will use the default Arduino IDE folders and so can corrupt the build environment. # it will use the default Arduino IDE folders and so can corrupt the build environment.
# #
# Version: 2.0.2-Build_80 # Version: 2.0.3-Build_89
# Change log: # Change log:
# 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt' # 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt'
# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown # 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown
@ -183,6 +183,11 @@
# 06 Jul 2022, 3d-gussner, Change to v1.0.8 and Ardunio_boards v1.0.5-2 # 06 Jul 2022, 3d-gussner, Change to v1.0.8 and Ardunio_boards v1.0.5-2
# 06 Jul 2022, 3d-gussner, Fix branch check # 06 Jul 2022, 3d-gussner, Fix branch check
# 12 Jul 2022, 3d-gussner, Check if FW_FLAVAVOR and FW_FLAVERSION are correct # 12 Jul 2022, 3d-gussner, Check if FW_FLAVAVOR and FW_FLAVERSION are correct
# 29 Sep 2022, 3d-gussner, Rename EN_ONLY to EN_FARM
# 03 Oct 2022, 3d-gussner, Update to Arduino boards 1.0.6 and remove gawk
# 17 Dec 2022, wavexx , Check for the coorect pyton version, improve depencies
# 14 Mar 2023, 3d-gussner, Rename MMU2 to MMU
# 11 Oct 2023, 3d-gussner, Fix issues with new cmake build, remove devel flag
SCRIPT_PATH="$( cd "$(dirname "$0")" ; pwd -P )" SCRIPT_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
export SRCDIR=$SCRIPT_PATH export SRCDIR=$SCRIPT_PATH
@ -219,7 +224,6 @@ while getopts b:c:d:g:h:i:j:l:m:n:o:p:v:x:y:?h flag
case "${flag}" in case "${flag}" in
b) build_flag=${OPTARG};; b) build_flag=${OPTARG};;
c) clean_flag=${OPTARG};; c) clean_flag=${OPTARG};;
d) devel_flag=${OPTARG};;
g) mk404_graphics_flag=${OPTARG};; g) mk404_graphics_flag=${OPTARG};;
h) help_flag=1;; h) help_flag=1;;
i) IDE_flag=${OPTARG};; i) IDE_flag=${OPTARG};;
@ -245,7 +249,6 @@ echo "***************************************"
echo "Arguments:" echo "Arguments:"
echo "$(tput setaf 2)-b$(tput sgr0) Build/commit number" echo "$(tput setaf 2)-b$(tput sgr0) Build/commit number"
echo "$(tput setaf 2)-c$(tput sgr0) Do not clean up lang build" echo "$(tput setaf 2)-c$(tput sgr0) Do not clean up lang build"
echo "$(tput setaf 2)-d$(tput sgr0) Devel build"
echo "$(tput setaf 2)-g$(tput sgr0) Start MK404 graphics" echo "$(tput setaf 2)-g$(tput sgr0) Start MK404 graphics"
echo "$(tput setaf 2)-i$(tput sgr0) Arduino IDE version" echo "$(tput setaf 2)-i$(tput sgr0) Arduino IDE version"
echo "$(tput setaf 2)-j$(tput sgr0) Arduino IDE verbose output" echo "$(tput setaf 2)-j$(tput sgr0) Arduino IDE verbose output"
@ -264,7 +267,6 @@ echo " $(tput setaf 2)./PF-build.sh$(tput sgr0) [-b] [-c] [-d] [-g] [-i] [-j] [
echo echo
echo " -b : '$(tput setaf 2)Auto$(tput sgr0)' needs git or a number" echo " -b : '$(tput setaf 2)Auto$(tput sgr0)' needs git or a number"
echo " -c : '$(tput setaf 2)0$(tput sgr0)' clean up, '$(tput setaf 2)1$(tput sgr0)' keep" echo " -c : '$(tput setaf 2)0$(tput sgr0)' clean up, '$(tput setaf 2)1$(tput sgr0)' keep"
echo " -d : '$(tput setaf 2)GOLD$(tput sgr0)', '$(tput setaf 2)RC$(tput sgr0)', '$(tput setaf 2)BETA$(tput sgr0)', '$(tput setaf 2)ALPHA$(tput sgr0)', '$(tput setaf 2)DEBUG$(tput sgr0)', '$(tput setaf 2)DEVEL$(tput sgr0)' and '$(tput setaf 2)UNKNOWN$(tput sgr0)'"
echo " -g : '$(tput setaf 2)0$(tput sgr0)' no '$(tput setaf 2)1$(tput sgr0)' lite '$(tput setaf 2)2$(tput sgr0)' fancy '$(tput setaf 2)3$(tput sgr0)' lite with Quad_HR '$(tput setaf 2)4$(tput sgr0)' fancy with Quad_HR" echo " -g : '$(tput setaf 2)0$(tput sgr0)' no '$(tput setaf 2)1$(tput sgr0)' lite '$(tput setaf 2)2$(tput sgr0)' fancy '$(tput setaf 2)3$(tput sgr0)' lite with Quad_HR '$(tput setaf 2)4$(tput sgr0)' fancy with Quad_HR"
echo " -i : '$(tput setaf 2)1.8.5$(tput sgr0)', '$(tput setaf 2)1.8.19$(tput sgr0)'" echo " -i : '$(tput setaf 2)1.8.5$(tput sgr0)', '$(tput setaf 2)1.8.19$(tput sgr0)'"
echo " -j : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes" echo " -j : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes"
@ -897,18 +899,6 @@ else
failures 5 failures 5
fi fi
fi fi
#Check if DEV_STATUS is selected via argument '-d'
if [ ! -z "$devel_flag" ] ; then
if [[ "$devel_flag" == "GOLD" || "$devel_flag" == "RC" || "$devel_flag" == "BETA" || "$devel_flag" == "ALPHA" || "$devel_flag" == "DEVEL" || "$devel_flag" == "DEBUG" || "$devel_flag" == "UNKNOWN" ]] ; then
DEV_STATUS_SELECTED=$devel_flag
elif [[ "$devel_flag" == "atmega404" || "$devel_flag" == "atmega404_no_bootloader" ]] ; then
MK404_DEBUG=$devel_flag
else
echo "$(tput setaf 1)Development argument is wrong!$(tput sgr0)"
echo "Only $(tput setaf 2)'GOLD', 'RC', 'BETA', 'ALPHA', 'DEVEL', 'DEBUG' or 'UNKNOWN' $(tput sgr0) are allowed as devel '-d' argument!$(tput sgr0)"
failures 5
fi
fi
#Check if Build is selected via argument '-b' #Check if Build is selected via argument '-b'
if [ ! -z "$build_flag" ] ; then if [ ! -z "$build_flag" ] ; then
@ -1024,44 +1014,6 @@ prepare_code_for_compiling()
failures 26 failures 26
fi fi
fi fi
#DEV_CHECK=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/ */ /g'|cut -d '"' -f2|sed 's/\.//g'|cut -d '-' -f2)
if [ -z "$DEV_STATUS_SELECTED" ] ; then
if [[ "$DEV_CHECK" == *"RC"* ]] ; then
DEV_STATUS="RC"
elif [[ "$DEV_CHECK" == *"ALPHA"* ]]; then
DEV_STATUS="ALPHA"
elif [[ "$DEV_CHECK" == *"BETA"* ]]; then
DEV_STATUS="BETA"
elif [[ "$DEV_CHECK" == "DEVEL" ]]; then
DEV_STATUS="DEVEL"
elif [[ "$DEV_CHECK" == "DEBUG" ]]; then
DEV_STATUS="DEBUG"
else
DEV_STATUS="UNKNOWN"
echo
echo "$(tput setaf 5)DEV_STATUS is UNKNOWN. Do you wish to set DEV_STATUS to GOLD?$(tput sgr0)"
PS3="Select YES only if source code is tested and trusted: "
select yn in "Yes" "No"; do
case $yn in
Yes)
DEV_STATUS="GOLD"
DEV_STATUS_SELECTED="GOLD"
break
;;
No)
DEV_STATUS="UNKNOWN"
DEV_STATUS_SELECTED="UNKNOWN"
break
;;
*)
echo "$(tput setaf 1)This is not a valid DEV_STATUS$(tput sgr0)"
;;
esac
done
fi
else
DEV_STATUS=$DEV_STATUS_SELECTED
fi
} }
#### End: Prepare code for compiling #### End: Prepare code for compiling
@ -1121,7 +1073,6 @@ list_usefull_data()
echo "Firmware :" $FW echo "Firmware :" $FW
echo "Build # :" $BUILD echo "Build # :" $BUILD
echo "Dev Check :" $DEV_CHECK echo "Dev Check :" $DEV_CHECK
echo "DEV Status :" $DEV_STATUS
echo "Motherboard :" $MOTHERBOARD echo "Motherboard :" $MOTHERBOARD
echo "Board flash :" $BOARD_FLASH echo "Board flash :" $BOARD_FLASH
echo "Board mem :" $BOARD_MEM echo "Board mem :" $BOARD_MEM
@ -1147,9 +1098,6 @@ prepare_variant_for_compiling()
cp -f $SCRIPT_PATH/Firmware/variants/$VARIANT.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || failures 12 cp -f $SCRIPT_PATH/Firmware/variants/$VARIANT.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || failures 12
fi fi
#Prepare Configuration.h to use the correct FW_DEV_VERSION to prevent LCD messages when connecting with OctoPrint
sed -i -- "s/#define FW_DEV_VERSION FW_VERSION_.*/#define FW_DEV_VERSION FW_VERSION_$DEV_STATUS/g" $SCRIPT_PATH/Firmware/Configuration.h
# set FW_REPOSITORY # set FW_REPOSITORY
sed -i -- 's/#define FW_REPOSITORY "Unknown"/#define FW_REPOSITORY "Prusa3d"/g' $SCRIPT_PATH/Firmware/Configuration.h sed -i -- 's/#define FW_REPOSITORY "Unknown"/#define FW_REPOSITORY "Prusa3d"/g' $SCRIPT_PATH/Firmware/Configuration.h
@ -1407,7 +1355,6 @@ cleanup_firmware()
fi fi
# Restore files to previous state # Restore files to previous state
sed -i -- "s/^#define FW_DEV_VERSION FW_VERSION_.*/#define FW_DEV_VERSION FW_VERSION_UNKNOWN/g" $SCRIPT_PATH/Firmware/Configuration.h
sed -i -- 's/^#define FW_REPOSITORY.*/#define FW_REPOSITORY "Unknown"/g' $SCRIPT_PATH/Firmware/Configuration.h sed -i -- 's/^#define FW_REPOSITORY.*/#define FW_REPOSITORY "Unknown"/g' $SCRIPT_PATH/Firmware/Configuration.h
if [ ! -z "$BUILD_ORG" ] ; then if [ ! -z "$BUILD_ORG" ] ; then
sed -i -- "s/^#define FW_COMMIT_NR.*/#define FW_COMMIT_NR $BUILD_ORG/g" $SCRIPT_PATH/Firmware/Configuration.h sed -i -- "s/^#define FW_COMMIT_NR.*/#define FW_COMMIT_NR $BUILD_ORG/g" $SCRIPT_PATH/Firmware/Configuration.h

View File

@ -1,33 +1,33 @@
# * Returns a version string from Git # - Returns a version string from Git
# #
# These functions force a re-configure on each git commit so that you can trust the values of the # These functions force a re-configure on each git commit so that you can
# variables in your build system. # trust the values of the variables in your build system.
# #
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...]) # get_git_head_revision(<refspecvar> <hashvar> [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR])
# #
# Returns the refspec and sha hash of the current head revision # Returns the refspec and sha hash of the current head revision
# #
# git_describe(<var> [<additional arguments to git describe> ...]) # git_describe(<var> [<additional arguments to git describe> ...])
# #
# Returns the results of git describe on the source tree, and adjusting the output so that it tests # Returns the results of git describe on the source tree, and adjusting
# false if an error occurs. # the output so that it tests false if an error occurs.
# #
# git_get_exact_tag(<var> [<additional arguments to git describe> ...]) # git_describe_working_tree(<var> [<additional arguments to git describe> ...])
# #
# Returns the results of git describe --exact-match on the source tree, and adjusting the output so # Returns the results of git describe on the working tree (--dirty option),
# that it tests false if there was no exact matching tag. # and adjusting the output so that it tests false if an error occurs.
# #
# git_local_changes(<var>) # git_get_exact_tag(<var> [<additional arguments to git describe> ...])
# #
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. Uses the return code of # Returns the results of git describe --exact-match on the source tree,
# "git diff-index --quiet HEAD --". Does not regard untracked files. # and adjusting the output so that it tests false if there was no exact
# matching tag.
# #
# git_count_parent_commits(<var>) # git_local_changes(<var>)
# #
# Returns number of commits preceeding current commit -1 if git rev-list --count HEAD failed or # Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
# "GIT-NOTFOUND" if git executable was not found or "HEAD-HASH-NOTFOUND" if head hash was not found. # Uses the return code of "git diff-index --quiet HEAD --".
# I don't know if get_git_head_revision() must be called internally or not, as reason of calling it # Does not regard untracked files.
# is not clear for me also in git_local_changes().
# #
# git_head_commit_timestamp(<var>) # git_head_commit_timestamp(<var>)
# #
@ -35,204 +35,260 @@
# #
# Requires CMake 2.6 or newer (uses the 'function' command) # Requires CMake 2.6 or newer (uses the 'function' command)
# #
# Original Author: 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> # Original Author:
# http://academic.cleardefinition.com Iowa State University HCI Graduate Program/VRAC # 2009-2020 Ryan Pavlik <ryan.pavlik@gmail.com> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# #
# Copyright Iowa State University 2009-2010. Distributed under the Boost Software License, Version # Copyright 2009-2013, Iowa State University.
# 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) # Copyright 2013-2020, Ryan Pavlik
# Copyright 2013-2020, Contributors
# SPDX-License-Identifier: BSL-1.0
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__get_git_revision_description) if(__get_git_revision_description)
return() return()
endif() endif()
set(__get_git_revision_description YES) set(__get_git_revision_description YES)
# We must run the following at "include" time, not at function call time, to find the path to this # We must run the following at "include" time, not at function call time,
# module rather than the path to a calling list file # to find the path to this module rather than the path to a calling list file
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
# Function _git_find_closest_git_dir finds the next closest .git directory
# that is part of any directory in the path defined by _start_dir.
# The result is returned in the parent scope variable whose name is passed
# as variable _git_dir_var. If no .git directory can be found, the
# function returns an empty string via _git_dir_var.
#
# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and
# neither foo nor bar contain a file/directory .git. This wil return
# C:/bla/.git
#
function(_git_find_closest_git_dir _start_dir _git_dir_var)
set(cur_dir "${_start_dir}")
set(git_dir "${_start_dir}/.git")
while(NOT EXISTS "${git_dir}")
# .git dir not found, search parent directories
set(git_previous_parent "${cur_dir}")
get_filename_component(cur_dir "${cur_dir}" DIRECTORY)
if(cur_dir STREQUAL git_previous_parent)
# We have reached the root directory, we are not in git
set(${_git_dir_var}
""
PARENT_SCOPE)
return()
endif()
set(git_dir "${cur_dir}/.git")
endwhile()
set(${_git_dir_var}
"${git_dir}"
PARENT_SCOPE)
endfunction()
function(get_git_head_revision _refspecvar _hashvar) function(get_git_head_revision _refspecvar _hashvar)
set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") _git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR)
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories if("${ARGN}" STREQUAL "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR TRUE)
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) else()
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR FALSE)
# We have reached the root directory, we are not in git endif()
set(${_refspecvar} if(NOT "${GIT_DIR}" STREQUAL "")
"GITDIR-NOTFOUND" file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}"
PARENT_SCOPE "${GIT_DIR}")
) if("${_relative_to_source_dir}" MATCHES "[.][.]" AND NOT ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR)
set(${_hashvar} # We've gone above the CMake root dir.
"GITDIR-NOTFOUND" set(GIT_DIR "")
PARENT_SCOPE endif()
) endif()
return() if("${GIT_DIR}" STREQUAL "")
set(${_refspecvar}
"GITDIR-NOTFOUND"
PARENT_SCOPE)
set(${_hashvar}
"GITDIR-NOTFOUND"
PARENT_SCOPE)
return()
endif() endif()
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
endwhile()
# check if this is a submodule
if(NOT IS_DIRECTORY ${GIT_DIR})
file(READ ${GIT_DIR} submodule)
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
endif()
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
if(NOT EXISTS "${GIT_DATA}")
file(MAKE_DIRECTORY "${GIT_DATA}")
endif()
if(NOT EXISTS "${GIT_DIR}/HEAD") # Check if the current source dir is a git submodule or a worktree.
return() # In both cases .git is a file instead of a directory.
endif() #
set(HEAD_FILE "${GIT_DATA}/HEAD") if(NOT IS_DIRECTORY ${GIT_DIR})
configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) # The following git command will return a non empty string that
# points to the super project working tree if the current
# source dir is inside a git submodule.
# Otherwise the command will return an empty string.
#
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse
--show-superproject-working-tree
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT "${out}" STREQUAL "")
# If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule
file(READ ${GIT_DIR} submodule)
string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE
${submodule})
string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE}
ABSOLUTE)
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
else()
# GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree
file(READ ${GIT_DIR} worktree_ref)
# The .git directory contains a path to the worktree information directory
# inside the parent git repo of the worktree.
#
string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir
${worktree_ref})
string(STRIP ${git_worktree_dir} git_worktree_dir)
_git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR)
set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD")
endif()
else()
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
endif()
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
if(NOT EXISTS "${GIT_DATA}")
file(MAKE_DIRECTORY "${GIT_DATA}")
endif()
configure_file( if(NOT EXISTS "${HEAD_SOURCE_FILE}")
"${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY return()
) endif()
include("${GIT_DATA}/grabRef.cmake") set(HEAD_FILE "${GIT_DATA}/HEAD")
configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY)
set(${_refspecvar} configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
"${HEAD_REF}" "${GIT_DATA}/grabRef.cmake" @ONLY)
PARENT_SCOPE include("${GIT_DATA}/grabRef.cmake")
)
set(${_hashvar} set(${_refspecvar}
"${HEAD_HASH}" "${HEAD_REF}"
PARENT_SCOPE PARENT_SCOPE)
) set(${_hashvar}
"${HEAD_HASH}"
PARENT_SCOPE)
endfunction() endfunction()
function(git_describe _var) function(git_describe _var)
if(NOT GIT_FOUND) if(NOT GIT_FOUND)
find_package(Git QUIET) find_package(Git QUIET)
endif() endif()
get_git_head_revision(refspec hash) get_git_head_revision(refspec hash)
if(NOT GIT_FOUND) if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
if(NOT hash)
set(${_var}
"HEAD-HASH-NOTFOUND"
PARENT_SCOPE)
return()
endif()
# TODO sanitize
#if((${ARGN}" MATCHES "&&") OR
# (ARGN MATCHES "||") OR
# (ARGN MATCHES "\\;"))
# message("Please report the following error to the project!")
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
#endif()
#message(STATUS "Arguments to execute_process: ${ARGN}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var} set(${_var}
"GIT-NOTFOUND" "${out}"
PARENT_SCOPE PARENT_SCOPE)
) endfunction()
return()
endif() function(git_describe_working_tree _var)
if(NOT hash) if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
git_head_commit_number(COMMIT_COUNT) #Bake the commit count into the full DSC
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --abbrev=0 --dirty=-D --broken=-B ${ARGN}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
if( "${out}" MATCHES "-D\$")
STRING(REPLACE "-D" "-${COMMIT_COUNT}-D" out "${out}")
else()
set(out "${out}-${COMMIT_COUNT}")
endif()
set(${_var} set(${_var}
"HEAD-HASH-NOTFOUND" "${out}"
PARENT_SCOPE PARENT_SCOPE)
)
return()
endif()
# TODO sanitize if((${ARGN}" MATCHES "&&") OR (ARGN MATCHES "||") OR (ARGN MATCHES "\\;"))
# message("Please report the following error to the project!") message(FATAL_ERROR "Looks like
# someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") endif()
# message(STATUS "Arguments to execute_process: ${ARGN}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var}
"${out}"
PARENT_SCOPE
)
endfunction() endfunction()
function(git_get_exact_tag _var) function(git_get_exact_tag _var)
git_describe(out --exact-match ${ARGN}) git_describe(out --exact-match ${ARGN})
set(${_var} set(${_var}
"${out}" "${out}"
PARENT_SCOPE PARENT_SCOPE)
)
endfunction() endfunction()
function(git_local_changes _var) function(git_local_changes _var)
if(NOT GIT_FOUND) if(NOT GIT_FOUND)
find_package(Git QUIET) find_package(Git QUIET)
endif() endif()
get_git_head_revision(refspec hash) get_git_head_revision(refspec hash)
if(NOT GIT_FOUND) if(NOT GIT_FOUND)
set(${_var} set(${_var}
"GIT-NOTFOUND" "GIT-NOTFOUND"
PARENT_SCOPE PARENT_SCOPE)
) return()
return() endif()
endif() if(NOT hash)
if(NOT hash) set(${_var}
set(${_var} "HEAD-HASH-NOTFOUND"
"HEAD-HASH-NOTFOUND" PARENT_SCOPE)
PARENT_SCOPE return()
) endif()
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(res EQUAL 0)
set(${_var}
"CLEAN"
PARENT_SCOPE
)
else()
set(${_var}
"DIRTY"
PARENT_SCOPE
)
endif()
endfunction()
function(git_count_parent_commits _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
get_git_head_revision(refspec hash)
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE
)
return()
endif()
if(NOT hash)
set(${_var}
"HEAD-HASH-NOTFOUND"
PARENT_SCOPE
)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-list --count HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(res EQUAL 0)
set(${_var}
"${out}"
PARENT_SCOPE
)
else()
set(${_var}
"-1"
PARENT_SCOPE
)
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(res EQUAL 0)
set(${_var}
"CLEAN"
PARENT_SCOPE)
else()
set(${_var}
"DIRTY"
PARENT_SCOPE)
endif()
endfunction() endfunction()
function(git_get_commit_timestamp _var hash) function(git_get_commit_timestamp _var hash)
@ -282,3 +338,85 @@ function(git_head_commit_timestamp _var)
PARENT_SCOPE PARENT_SCOPE
) )
endfunction() endfunction()
function(git_head_commit_data _var _format)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" show -s --quiet --format=format:${_format} HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "HEAD-FORMAT-NOTFOUND")
endif()
set(${_var}
${out}
PARENT_SCOPE)
endfunction()
function(git_head_commit_number _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-list --count HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var}
"${out}"
PARENT_SCOPE)
endfunction()
function(git_get_repository _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"Unknown"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" ls-remote --get-url
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
message("remote URL is ${out}")
string(REGEX MATCH "([A-z0-9-]+)/Prusa-Firmware.?g?i?t?" out "${out}")
if("${CMAKE_MATCH_COUNT}" EQUAL 1)
message("Found repository name ${CMAKE_MATCH_1}")
set(${_var}
"${CMAKE_MATCH_1}"
PARENT_SCOPE)
else()
message("Failed to get repository information")
set(${_var}
#"${out}" #outputs the github repo user name
"Unknown" #All other repos shown as unknown
PARENT_SCOPE)
endif()
endfunction()

View File

@ -3,11 +3,17 @@
# #
# Requires CMake 2.6 or newer (uses the 'function' command) # Requires CMake 2.6 or newer (uses the 'function' command)
# #
# Original Author: 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> # Original Author:
# http://academic.cleardefinition.com Iowa State University HCI Graduate Program/VRAC # 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
# #
# Copyright Iowa State University 2009-2010. Distributed under the Boost Software License, Version # Copyright 2009-2012, Iowa State University
# 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) # Copyright 2011-2015, Contributors
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# SPDX-License-Identifier: BSL-1.0
set(HEAD_HASH) set(HEAD_HASH)
@ -15,23 +21,23 @@ file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
if(HEAD_CONTENTS MATCHES "ref") if(HEAD_CONTENTS MATCHES "ref")
# named branch # named branch
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
if(EXISTS "@GIT_DIR@/${HEAD_REF}") if(EXISTS "@GIT_DIR@/${HEAD_REF}")
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
else() else()
configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
set(HEAD_HASH "${CMAKE_MATCH_1}") set(HEAD_HASH "${CMAKE_MATCH_1}")
endif() endif()
endif() endif()
else() else()
# detached HEAD # detached HEAD
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
endif() endif()
if(NOT HEAD_HASH) if(NOT HEAD_HASH)
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
string(STRIP "${HEAD_HASH}" HEAD_HASH) string(STRIP "${HEAD_HASH}" HEAD_HASH)
endif() endif()

View File

@ -1,71 +1,132 @@
# #[[
# This file is responsible for setting the following variables: # This file is responsible for setting the following variables:
# #
# ~~~ # ~~~
# BUILD_NUMBER (1035) # PROJECT_VERSION_MAJOR (3)
# PROJECT_VERSION (4.0.3) # PROJECT_VERSION_MINOR (13)
# PROJECT_VERSION_FULL (4.0.3-BETA+1035.PR111.B4) # PROJECT_VERSION_REV (2)
# PROJECT_VERSION_SUFFIX (-BETA+1035.PR111.B4) # PROJECT_VERSION (3.13.2)
# PROJECT_VERSION_SUFFIX_SHORT (+1035) # FW_COMMIT_DSC ("v3.13.2-deadbeef")
# PROJECT_VERSION_TIMESTAMP (unix timestamp) # FW_COMMIT_HASH (deadbeef)
# FW_COMMIT_DATE (1665051856)
# #
# The `PROJECT_VERSION` variable is set as soon as the file is included. # The `PROJECT_VERSION` variable is set as soon as the file is included.
# To set the rest, the function `resolve_version_variables` has to be called. # To set the rest, the function `resolve_version_variables` has to be called.
#
# ~~~ # ~~~
#]]
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/Configuration.h CFG_VER_DATA REGEX "#define FW_[A-Z]+ ([0-9]+)" ) # NOTE: these are ordered according to the enum in Util.h. DO NOT ALTER!
LIST(GET CFG_VER_DATA 0 PROJECT_VERSION_MAJOR) # // Definition of a firmware flavor numerical values.
LIST(GET CFG_VER_DATA 1 PROJECT_VERSION_MINOR) # // To keep it short as possible
LIST(GET CFG_VER_DATA 2 PROJECT_VERSION_REV) # // DEVs/ALPHAs/BETAs limited to max 8 flavor versions
STRING(REGEX MATCH "FW_MAJOR ([0-9]+)" PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") # // RCs limited to 32 flavor versions
SET(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}") # // Final Release always 64 as highest
# enum FirmwareRevisionFlavorType : uint16_t {
# FIRMWARE_REVISION_RELEASED = 0x0040,
# FIRMWARE_REVISION_DEV = 0x0000,
# FIRMWARE_REVISION_ALPHA = 0x008,
# FIRMWARE_REVISION_BETA = 0x0010,
# FIRMWARE_REVISION_RC = 0x0020
# };
STRING(REGEX MATCH "FW_MINOR ([0-9]+)" PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}") # Note - the Xes are padding because there is an extended allowance of RC numbers.
SET(PROJECT_VERSION_MINOR ${CMAKE_MATCH_1}) SET(DEV_TAGS "DEV" "ALPHA" "BETA" "RC" "X" "X" "X" "X" "RELEASED")
STRING(REPLACE ";" "\|" DEV_TAG_REGEX "${DEV_TAGS}")
function(decode_flavor_code _output _label _ver)
LIST(FIND DEV_TAGS "${_label}" _code_index)
MESSAGE(DEBUG "Tweak math: (8*0${_code_index})+${_ver}")
MATH(EXPR _decoded "(8*0${_code_index})+${_ver}")
set(${_output}
"${_decoded}"
PARENT_SCOPE)
endfunction()
STRING(REGEX MATCH "FW_REVISION +([0-9]+)" PROJECT_VERSION_REV "${PROJECT_VERSION_REV}") function(decode_tweak_version _str _ver)
SET(PROJECT_VERSION_REV ${CMAKE_MATCH_1}) MATH(EXPR _string_id "(${PROJECT_VERSION_TWEAK})/8")
MATH(EXPR _version "${PROJECT_VERSION_TWEAK}-(8*${_string_id})")
set(${_ver} "${_version}" PARENT_SCOPE)
LIST(GET DEV_TAGS ${_string_id} _string_val)
set(${_str} "${_string_val}" PARENT_SCOPE)
endfunction()
SET(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_REV}")
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/Configuration.h CFG_VER_DATA
REGEX "#define FW_[A-Z]+ (${DEV_TAG_REGEX}|[0-9]+)"
)
list(GET CFG_VER_DATA 0 PROJECT_VERSION_MAJOR)
list(GET CFG_VER_DATA 1 PROJECT_VERSION_MINOR)
list(GET CFG_VER_DATA 2 PROJECT_VERSION_REV)
list(GET CFG_VER_DATA 3 PROJECT_VERSION_COMMIT)
list(GET CFG_VER_DATA 4 PROJECT_VERSION_FLV)
list(GET CFG_VER_DATA 5 PROJECT_VERSION_FLV_VER)
string(REGEX MATCH "FW_MAJOR ([0-9]+)" PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
set(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}")
string(REGEX MATCH "FW_MINOR ([0-9]+)" PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_1})
string(REGEX MATCH "FW_REVISION +([0-9]+)" PROJECT_VERSION_REV "${PROJECT_VERSION_REV}")
set(PROJECT_VERSION_REV ${CMAKE_MATCH_1})
string(REGEX MATCH "FW_COMMITNR +([0-9]+)" PROJECT_VERSION_COMMIT "${PROJECT_VERSION_COMMIT}")
set(PROJECT_VERSION_COMMIT ${CMAKE_MATCH_1})
string(REGEX MATCH "^#define FW_FLAVOR +(${DEV_TAG_REGEX})" PROJECT_VERSION_FLV "${PROJECT_VERSION_FLV}")
IF(PROJECT_VERSION_FLV)
message(STATUS "Found a defined FW_FLAVOR")
set(PROJECT_VERSION_FLV ${CMAKE_MATCH_1})
string(REGEX MATCH "FW_FLAVERSION +([0-9]+)" PROJECT_VERSION_FLV_VER "${PROJECT_VERSION_FLV_VER}")
set(PROJECT_VERSION_FLV_VER ${CMAKE_MATCH_1})
decode_flavor_code(PROJECT_VERSION_TWEAK "${PROJECT_VERSION_FLV}" "${PROJECT_VERSION_FLV_VER}")
ELSE()
decode_flavor_code(PROJECT_VERSION_TWEAK "RELEASED" "0")
ENDIF()
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_REV}.${PROJECT_VERSION_TWEAK}")
# Define a constant length for the commit hash
set(FW_COMMIT_HASH_LENGTH 9)
# Create fallback value with constant length
string(REPEAT "0" ${FW_COMMIT_HASH_LENGTH} FW_COMMIT_HASH_UNKNOWN)
function(resolve_version_variables) function(resolve_version_variables)
# BUILD_NUMBER if(FW_COMMIT_DSC)
if(NOT BUILD_NUMBER) return()
git_count_parent_commits(BUILD_NUMBER) endif()
set(ERRORS "GIT-NOTFOUND" "HEAD-HASH-NOTFOUND") if(NOT GIT_FOUND)
if(BUILD_NUMBER IN_LIST ERRORS) find_package(Git QUIET)
message(WARNING "Failed to resolve build number: ${BUILD_NUMBER}. Setting to zero.")
set(BUILD_NUMBER "0")
endif()
set(BUILD_NUMBER
${BUILD_NUMBER}
PARENT_SCOPE
)
endif() endif()
# PROJECT_VERSION_SUFFIX # Get the full commit hash
if(PROJECT_VERSION_SUFFIX STREQUAL "<auto>") git_head_commit_data(FW_COMMIT_HASH "%H")
# TODO: set to +<sha>.dirty?.debug?
set(PROJECT_VERSION_SUFFIX "+${BUILD_NUMBER}.LOCAL")
set(PROJECT_VERSION_SUFFIX
"+${BUILD_NUMBER}.LOCAL"
PARENT_SCOPE
)
endif()
# PROJECT_VERSION_SUFFIX_SHORT # Keep only the first 'FW_COMMIT_HASH_LENGTH' characters
if(PROJECT_VERSION_SUFFIX_SHORT STREQUAL "<auto>") string(SUBSTRING "${FW_COMMIT_HASH}" 0 ${FW_COMMIT_HASH_LENGTH} FW_COMMIT_HASH)
set(PROJECT_VERSION_SUFFIX_SHORT
"+${BUILD_NUMBER}"
PARENT_SCOPE
)
endif()
# PROJECT_VERSION_FULL set(ERRORS "GIT-NOTFOUND" "HEAD-FORMAT-NOTFOUND")
set(PROJECT_VERSION_FULL if(FW_COMMIT_HASH IN_LIST ERRORS)
"${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX}" # git not available, set fallback values
set(FW_COMMIT_HASH ${FW_COMMIT_HASH_UNKNOWN})
set(FW_COMMIT_DSC "v${PROJECT_VERSION}-${FW_COMMIT_HASH}")
string(TIMESTAMP FW_COMMIT_DATE "%s")
else()
git_describe_working_tree(FW_COMMIT_DSC)
git_head_commit_data(FW_COMMIT_DATE "%ct")
endif()
set(FW_COMMIT_DSC
"${FW_COMMIT_DSC}"
PARENT_SCOPE
)
set(FW_COMMIT_HASH
"${FW_COMMIT_HASH}"
PARENT_SCOPE
)
set(FW_COMMIT_DATE
"${FW_COMMIT_DATE}"
PARENT_SCOPE PARENT_SCOPE
) )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -16,3 +16,27 @@ add_executable(tests ${TEST_SOURCES})
target_include_directories(tests PRIVATE tests) target_include_directories(tests PRIVATE tests)
target_link_libraries(tests Catch2::Catch2WithMain) target_link_libraries(tests Catch2::Catch2WithMain)
catch_discover_tests(tests) catch_discover_tests(tests)
set(ctest_test_args --output-on-failure)
include(ProcessorCount)
ProcessorCount(N)
if(N EQUAL 0)
message(
WARNING "CTest: There was an issue reading the core count, tests won't be run in parallel"
)
else()
message(STATUS "CTest: Detected ${N} CPU threads")
set(ctest_test_args -j${N} ${ctest_test_args})
endif()
# This step needs to always return OK but log whether it was successful or not. The thought here
# is that if the tests all pass, .ctest-finished is created and we can check for its existance
# after generating the report to determine if the overall build result is a pass or fail.
add_custom_target(
test_run_all
COMMAND ${CMAKE_CTEST_COMMAND} ${ctest_test_args}
COMMAND ${CMAKE_COMMAND} -E touch .ctest-finished || exit 0
BYPRODUCTS ${PROJECT_BINARY_DIR}/.ctest-finished
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
)