Browse Source

Merge pull request #1 from Hauzman/MK3_Romanian

Mk3 romanian
Hauzman 2 years ago
parent
commit
0957c72c36
100 changed files with 4264 additions and 1469 deletions
  1. 21 0
      .cmake-format.py
  2. 10 0
      .github/travis/cmake-build.sh
  3. 12 0
      .github/travis/cmake-lang.sh
  4. 8 0
      .github/travis/cmake-test.sh
  5. 22 0
      .github/travis/legacy-build.sh
  6. 6 1
      .gitignore
  7. 40 23
      .travis.yml
  8. 10 0
      .vscode/cmake-kits.json
  9. 11 0
      .vscode/cmake-variants.yaml
  10. 10 0
      .vscode/settings.json
  11. 530 23
      CMakeLists.txt
  12. 1 1
      Firmware/Configuration.cpp
  13. 9 4
      Firmware/Configuration.h
  14. 1 1
      Firmware/ConfigurationStore.cpp
  15. 10 0
      Firmware/Configuration_var.h
  16. 9 3
      Firmware/Filament_sensor.cpp
  17. 2 0
      Firmware/Marlin.h
  18. 18 17
      Firmware/Marlin_main.cpp
  19. 3 0
      Firmware/Sd2Card.cpp
  20. 5 1
      Firmware/config.h
  21. 308 300
      Firmware/eeprom.h
  22. 3 3
      Firmware/first_lay_cal.cpp
  23. 2 1
      Firmware/lcd.h
  24. 5 2
      Firmware/messages.cpp
  25. 9 6
      Firmware/messages.h
  26. 27 12
      Firmware/mmu2.cpp
  27. 8 4
      Firmware/mmu2.h
  28. 11 4
      Firmware/mmu2/error_codes.h
  29. 24 7
      Firmware/mmu2/errors_list.h
  30. 21 7
      Firmware/mmu2_error_converter.cpp
  31. 4 4
      Firmware/mmu2_error_converter.h
  32. 1 1
      Firmware/mmu2_power.cpp
  33. 3 3
      Firmware/mmu2_progress_converter.cpp
  34. 1 1
      Firmware/mmu2_progress_converter.h
  35. 4 0
      Firmware/mmu2_protocol.cpp
  36. 86 27
      Firmware/mmu2_protocol_logic.cpp
  37. 46 10
      Firmware/mmu2_protocol_logic.h
  38. 12 11
      Firmware/mmu2_reporting.cpp
  39. 1 2
      Firmware/mmu2_reporting.h
  40. 1 1
      Firmware/mmu2_serial.cpp
  41. 1 1
      Firmware/mmu2_serial.h
  42. 1 1
      Firmware/pat9125.cpp
  43. 1 1
      Firmware/sm4.c
  44. 1 1
      Firmware/swi2c.c
  45. 6 5
      Firmware/temperature.cpp
  46. 1 1
      Firmware/tone04.c
  47. 20 42
      Firmware/ultralcd.cpp
  48. 2 2
      Firmware/xyzcal.cpp
  49. 21 35
      PF-build.sh
  50. 1 1
      build.sh
  51. 101 0
      cmake/AnyAvrGcc.cmake
  52. 4 0
      cmake/AvrGcc.cmake
  53. 11 0
      cmake/Check_final_lang_bin_size.cmake
  54. 11 0
      cmake/Check_lang_size.cmake
  55. 232 0
      cmake/GetGitRevisionDescription.cmake
  56. 37 0
      cmake/GetGitRevisionDescription.cmake.in
  57. 70 0
      cmake/ProjectVersion.cmake
  58. 66 0
      cmake/ReproducibleBuild.cmake
  59. 65 0
      cmake/Utilities.cmake
  60. 8 1
      lang/lang-check.py
  61. 4 10
      lang/po/Firmware.pot
  62. 4 10
      lang/po/Firmware_cs.po
  63. 4 10
      lang/po/Firmware_da.po
  64. 4 10
      lang/po/Firmware_de.po
  65. 4 10
      lang/po/Firmware_es.po
  66. 4 10
      lang/po/Firmware_fr.po
  67. 4 10
      lang/po/Firmware_hr.po
  68. 4 10
      lang/po/Firmware_hu.po
  69. 579 587
      lang/po/Firmware_it.po
  70. 4 10
      lang/po/Firmware_lb.po
  71. 4 10
      lang/po/Firmware_lt.po
  72. 4 10
      lang/po/Firmware_nl.po
  73. 4 10
      lang/po/Firmware_no.po
  74. 4 10
      lang/po/Firmware_pl.po
  75. 4 10
      lang/po/Firmware_ro.po
  76. 174 151
      lang/po/Firmware_sk.po
  77. 4 10
      lang/po/Firmware_sl.po
  78. 4 10
      lang/po/Firmware_sv.po
  79. 3 0
      lib/CMakeLists.txt
  80. 25 0
      lib/Catch2/.clang-format
  81. 94 0
      lib/Catch2/.conan/build.py
  82. 11 0
      lib/Catch2/.conan/test_package/CMakeLists.txt
  83. 19 0
      lib/Catch2/.conan/test_package/conanfile.py
  84. 15 0
      lib/Catch2/.conan/test_package/test_package.cpp
  85. 22 0
      lib/Catch2/.gitattributes
  86. 1 0
      lib/Catch2/.github/FUNDING.yml
  87. 29 0
      lib/Catch2/.github/ISSUE_TEMPLATE/bug_report.md
  88. 14 0
      lib/Catch2/.github/ISSUE_TEMPLATE/feature_request.md
  89. 28 0
      lib/Catch2/.github/pull_request_template.md
  90. 31 0
      lib/Catch2/.gitignore
  91. 12 0
      lib/Catch2/.gitrepo
  92. 339 0
      lib/Catch2/.travis.yml
  93. 17 0
      lib/Catch2/BUILD.bazel
  94. 10 0
      lib/Catch2/CMake/Catch2Config.cmake.in
  95. 157 0
      lib/Catch2/CMake/FindGcov.cmake
  96. 354 0
      lib/Catch2/CMake/FindLcov.cmake
  97. 258 0
      lib/Catch2/CMake/Findcodecov.cmake
  98. 26 0
      lib/Catch2/CMake/MiscFunctions.cmake
  99. 7 0
      lib/Catch2/CMake/catch2.pc.in
  100. 0 0
      lib/Catch2/CMake/llvm-cov-wrapper

+ 21 - 0
.cmake-format.py

@@ -0,0 +1,21 @@
+# If a statement is wrapped to more than one line, than dangle the closing
+# parenthesis on it's own line.
+dangle_parens = True
+dangle_align = 'child'
+
+# If true, the parsers may infer whether or not an argument list is sortable
+# (without annotation).
+autosort = True
+
+# How wide to allow formatted cmake files
+line_width = 100
+
+additional_commands = {
+    "target_sources": {
+        "kwargs": {
+            "PUBLIC": "*",
+            "PRIVATE": "*",
+            "INTERFACE": "*",
+        }
+    },
+}

+ 10 - 0
.github/travis/cmake-build.sh

@@ -0,0 +1,10 @@
+#!/bin/sh
+set -xe
+rm -rf build
+mkdir build
+cd build
+cmake .. \
+    -DCMAKE_TOOLCHAIN_FILE="../cmake/AvrGcc.cmake" \
+    -DCMAKE_BUILD_TYPE=Release \
+    -G Ninja
+ninja ALL_FIRMWARE

+ 12 - 0
.github/travis/cmake-lang.sh

@@ -0,0 +1,12 @@
+#!/bin/sh
+set -xe
+rm -rf build
+mkdir build
+cd build
+cmake .. \
+    -DCMAKE_TOOLCHAIN_FILE="../cmake/AvrGcc.cmake" \
+    -DCMAKE_BUILD_TYPE=Release \
+    -G Ninja
+
+# ignore all failures in order to show as much output as possible
+ninja -k0 check_lang || true

+ 8 - 0
.github/travis/cmake-test.sh

@@ -0,0 +1,8 @@
+#!/bin/sh
+set -xe
+rm -rf build
+mkdir build
+cd build
+cmake .. -G Ninja
+ninja tests
+ctest

+ 22 - 0
.github/travis/legacy-build.sh

@@ -0,0 +1,22 @@
+#!/bin/sh
+set -xe
+cp Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK3S-EINSy10a-E3Dv6full variant failed" && false; }
+bash -x build.sh EN_FARM || { echo "1_75mm_MK3S-EINSy10a-E3Dv6full EN_FARM failed" && false; }
+rm Firmware/Configuration_prusa.h
+cp Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK3-EINSy10a-E3Dv6full variant failed" && false; }
+bash -x build.sh EN_FARM || { echo "1_75mm_MK3-EINSy10a-E3Dv6full EN_FARM failed" && false; }
+rm Firmware/Configuration_prusa.h
+cp Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK25S-RAMBo13a-E3Dv6full variant failed" && false; }
+rm Firmware/Configuration_prusa.h
+cp Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK25S-RAMBo10a-E3Dv6full variant failed" && false; }
+rm Firmware/Configuration_prusa.h
+cp Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK25-RAMBo13a-E3Dv6full variant failed" && false; }
+rm Firmware/Configuration_prusa.h
+cp Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h Firmware/Configuration_prusa.h
+bash -x build.sh || { echo "1_75mm_MK25-RAMBo10a-E3Dv6full variant failed" && false; }
+rm Firmware/Configuration_prusa.h

+ 6 - 1
.gitignore

@@ -2,7 +2,12 @@
 /.settings
 /.settings
 /.project
 /.project
 /.cproject
 /.cproject
-/.vscode
+
+# cmake
+/build/
+/build_gen/
+/.dependencies
+/compile_commands.json
 
 
 # Temporary configuration
 # Temporary configuration
 /Firmware/Configuration_prusa.h
 /Firmware/Configuration_prusa.h

+ 40 - 23
.travis.yml

@@ -1,31 +1,48 @@
 dist: focal
 dist: focal
+language: minimal
+
 before_install:
 before_install:
-  - sudo apt-get install -y ninja-build python3-polib python3-pyelftools
-  # Arduino IDE adds a lot of noise caused by network traffic, trying to firewall it off
+  # Prepare the dependencies for the old build environment
+  - sudo apt-get install -y python3-polib python3-pyelftools python3-regex
+
+  # Undo whatever *GARBAGE* travis is doing with python and restore the system version
+  - mkdir -p .dependencies/python3
+  - ln -sf /usr/bin/python3 .dependencies/python3/python3
+  - PATH=$PWD/.dependencies/python3:$PATH
+
+  # Bootstrap cmake/ninja for the new build environment
+  - ./utils/bootstrap.py
+  - PATH=$(./utils/bootstrap.py --print-dependency-directory "cmake")/bin:$PATH
+  - PATH=$(./utils/bootstrap.py --print-dependency-directory "ninja"):$PATH
+
+  # Arduino IDE adds a lot of noise caused by network traffic, firewall it off
   - sudo iptables -P INPUT DROP
   - sudo iptables -P INPUT DROP
   - sudo iptables -P FORWARD DROP
   - sudo iptables -P FORWARD DROP
   - sudo iptables -P OUTPUT ACCEPT
   - sudo iptables -P OUTPUT ACCEPT
   - sudo iptables -A INPUT -i lo -j ACCEPT
   - sudo iptables -A INPUT -i lo -j ACCEPT
   - sudo iptables -A OUTPUT -o lo -j ACCEPT
   - sudo iptables -A OUTPUT -o lo -j ACCEPT
   - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
   - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-script:
-  - cp Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK3S-EINSy10a-E3Dv6full variant failed" && false; }
-  - bash -x build.sh EN_ONLY || { echo "1_75mm_MK3S-EINSy10a-E3Dv6full EN_ONLY failed" && false; }
-  - rm Firmware/Configuration_prusa.h
-  - cp Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK3-EINSy10a-E3Dv6full variant failed" && false; }
-  - bash -x build.sh EN_ONLY || { echo "1_75mm_MK3-EINSy10a-E3Dv6full EN_ONLY failed" && false; }
-  - rm Firmware/Configuration_prusa.h
-  - cp Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK25S-RAMBo13a-E3Dv6full variant failed" && false; }
-  - rm Firmware/Configuration_prusa.h
-  - cp Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK25S-RAMBo10a-E3Dv6full variant failed" && false; }
-  - rm Firmware/Configuration_prusa.h
-  - cp Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK25-RAMBo13a-E3Dv6full variant failed" && false; }
-  - rm Firmware/Configuration_prusa.h
-  - cp Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h Firmware/Configuration_prusa.h
-  - bash -x build.sh || { echo "1_75mm_MK25-RAMBo10a-E3Dv6full variant failed" && false; }
-  - rm Firmware/Configuration_prusa.h
+
+jobs:
+  include:
+    # legacy build.sh environment
+    - stage: legacy
+      script: ./.github/travis/legacy-build.sh
+
+    # cmake-based build
+    - stage: cmake
+      script: ./.github/travis/cmake-build.sh
+
+    # cmake tests
+    - stage: tests
+      script: ./.github/travis/cmake-test.sh
+
+    # language checks
+    - stage: lang
+      script: ./.github/travis/cmake-lang.sh
+
+stages:
+  - cmake
+  - lang
+  - legacy
+  - tests

+ 10 - 0
.vscode/cmake-kits.json

@@ -0,0 +1,10 @@
+[
+    {
+        "name": "avr-gcc",
+        "toolchainFile": "${workspaceFolder}/cmake/AvrGcc.cmake",
+        "cmakeSettings": {
+            "CMAKE_MAKE_PROGRAM": "${workspaceFolder}/.dependencies/ninja-1.10.2/ninja",
+            "CMAKE_BUILD_TYPE": "Release"
+        }
+    }
+]

+ 11 - 0
.vscode/cmake-variants.yaml

@@ -0,0 +1,11 @@
+buildType:
+  default: debug
+  choices:
+    debug:
+      short: Debug
+      long: Emit debug information
+      buildType: Debug
+    release:
+      short: Release
+      long: Optimize generated code
+      buildType: Release

+ 10 - 0
.vscode/settings.json

@@ -0,0 +1,10 @@
+{
+    "cmake.configureOnOpen": true,
+    "cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json",
+    "cmake.cmakePath": "${workspaceFolder}/.dependencies/cmake-3.22.5/bin/cmake",
+    "cmake.generator": "Ninja",
+    "files.insertFinalNewline": true,
+    "files.associations": {
+        "xlocale": "cpp"
+    }
+}

+ 530 - 23
CMakeLists.txt

@@ -1,23 +1,530 @@
-cmake_minimum_required(VERSION 3.1)
-
-set (CMAKE_CXX_STANDARD 11)
-
-project(cmake_test)
-
-# Prepare "Catch" library for other executables
-set(CATCH_INCLUDE_DIR Catch2)
-add_library(Catch INTERFACE)
-target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})
-
-# Make test executable
-set(TEST_SOURCES 
-	Tests/tests.cpp
-	Tests/Example_test.cpp
-	Tests/Timer_test.cpp
-	Tests/AutoDeplete_test.cpp
-	Tests/PrusaStatistics_test.cpp
-	Firmware/Timer.cpp
-)
-add_executable(tests ${TEST_SOURCES})
-target_include_directories(tests PRIVATE Tests)
-target_link_libraries(tests Catch)
+cmake_minimum_required(VERSION 3.19)
+include(cmake/Utilities.cmake)
+include(cmake/GetGitRevisionDescription.cmake)
+include(cmake/ReproducibleBuild.cmake)
+
+set(PROJECT_VERSION_SUFFIX
+    "<auto>"
+    CACHE
+      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>'."
+    )
+set(PROJECT_VERSION_SUFFIX_SHORT
+    "<auto>"
+    CACHE
+      STRING
+      "Short version suffix to be shown on splash screen. Defaults to '+<BUILD_NUMBER>' if set to '<auto>'."
+    )
+set(BUILD_NUMBER
+    ""
+    CACHE STRING "Build number of the firmware. Resolved automatically if not specified."
+    )
+
+include(cmake/ProjectVersion.cmake)
+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
+message(STATUS "Project version: ${PROJECT_VERSION}")
+message(
+  STATUS "Project version with short suffix: ${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}"
+  )
+
+set(FN_PREFIX "FW${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}")
+
+message(
+  WARNING
+    "
+***************** YOUR ATTENTION PLEASE *****************
+CMake support is experimental. There is no guarantee at this time. If you have problems you are encouraged to fall back to the tried-and-true methods.
+*********************** THANK YOU **********************
+We now return to your regularly scheduled Firmware Build."
+  )
+
+option(SECONDARY_LANGUAGES "Secondary language support in the firmware" ON)
+
+# Language configuration
+set(MAIN_LANGUAGES
+    cs de es fr it pl
+    CACHE STRING "The list of 'main' languages to be included, in the correct order"
+    )
+set(COMMUNITY_LANGUAGES
+    nl
+    ro
+    hu
+    hr
+    sk
+    sv
+    no
+    CACHE STRING "The list of community languages to be included, in the correct order"
+    )
+set(SELECTED_LANGUAGES ${MAIN_LANGUAGES} ${COMMUNITY_LANGUAGES})
+
+get_dependency_directory(prusa3dboards PRUSA_BOARDS_DIR)
+project(Prusa-Firmware)
+add_subdirectory(lib)
+
+# Get LANG_MAX_SIZE from sources
+file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/config.h MAX_SIZE_LINE
+     REGEX "^#define \+LANG_SIZE_RESERVED \+"
+     )
+string(REGEX MATCH "0x[0-9]+" MAX_SIZE_HEX "${MAX_SIZE_LINE}")
+math(EXPR LANG_MAX_SIZE "${MAX_SIZE_HEX}" OUTPUT_FORMAT DECIMAL)
+message("Language maximum size (from config.h): ${LANG_MAX_SIZE} bytes")
+
+# Ditto, this in xflash_layout.h but needs invocation of the preprocessor... :-/
+set(LANG_BIN_MAX 249856)
+
+# Check GCC Version
+get_recommended_gcc_version(RECOMMENDED_TOOLCHAIN_VERSION)
+if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL
+                            ${RECOMMENDED_TOOLCHAIN_VERSION}
+   )
+  message(WARNING "Recommended AVR toolchain is ${RECOMMENDED_TOOLCHAIN_VERSION}"
+                  ", but you have ${CMAKE_CXX_COMPILER_VERSION}"
+          )
+
+elseif(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  message(
+    WARNING
+      "Recommended compiler for host tools and unittests is GCC, you have ${CMAKE_CXX_COMPILER_ID}."
+    )
+endif()
+
+# append custom C/C++ flags
+if(CUSTOM_COMPILE_OPTIONS)
+  string(REPLACE " " ";" CUSTOM_COMPILE_OPTIONS "${CUSTOM_COMPILE_OPTIONS}")
+  add_compile_options(${CUSTOM_COMPILE_OPTIONS})
+endif()
+
+#
+# Global Compiler & Linker Configuration
+#
+
+# enable warnings
+add_compile_options(-Wall -Wextra -Wno-expansion-to-defined -Wsign-compare)
+
+# default standards for all targets
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
+
+# support _DEBUG macro (some code uses to recognize debug builds)
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+  add_compile_definitions(_DEBUG)
+endif()
+
+#
+# Firmware - get file lists.
+#
+set(FW_SOURCES
+    adc.cpp
+    backlight.cpp
+    BlinkM.cpp
+    bootapp.c
+    cardreader.cpp
+    cmdqueue.cpp
+    Configuration.cpp
+    ConfigurationStore.cpp
+    conv2str.cpp
+    Dcodes.cpp
+    eeprom.cpp
+    fancheck.cpp
+    Filament_sensor.cpp
+    first_lay_cal.cpp
+    heatbed_pwm.cpp
+    la10compat.cpp
+    language.c
+    lcd.cpp
+    Marlin_main.cpp
+    MarlinSerial.cpp
+    menu.cpp
+    mesh_bed_calibration.cpp
+    mesh_bed_leveling.cpp
+    messages.cpp
+    mmu2.cpp
+    mmu2_crc.cpp
+    mmu2_error_converter.cpp
+    mmu2_fsensor.cpp
+    mmu2_log.cpp
+    mmu2_power.cpp
+    mmu2_progress_converter.cpp
+    mmu2_protocol.cpp
+    mmu2_protocol_logic.cpp
+    mmu2_reporting.cpp
+    mmu2_serial.cpp
+    motion_control.cpp
+    optiboot_xflash.cpp
+    pat9125.cpp
+    planner.cpp
+    Prusa_farm.cpp
+    qr_solve.cpp
+    rbuf.c
+    Sd2Card.cpp
+    SdBaseFile.cpp
+    SdFatUtil.cpp
+    SdFile.cpp
+    SdVolume.cpp
+    Servo.cpp
+    sm4.c
+    sound.cpp
+    speed_lookuptable.cpp
+    spi.c
+    SpoolJoin.cpp
+    stepper.cpp
+    swi2c.c
+    swspi.cpp
+    Tcodes.cpp
+    temperature.cpp
+    timer02.c
+    Timer.cpp
+    tmc2130.cpp
+    tone04.c
+    twi.cpp
+    uart2.c
+    ultralcd.cpp
+    util.cpp
+    vector_3.cpp
+    xflash.c
+    xflash_dump.cpp
+    xyzcal.cpp
+    )
+list(TRANSFORM FW_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/)
+
+set(AVR_SOURCES
+    wiring_digital.c
+    WInterrupts.c
+    wiring_pulse.c
+    hooks.c
+    wiring.c
+    wiring_analog.c
+    wiring_shift.c
+    CDC.cpp
+    PluggableUSB.cpp
+    HardwareSerial.cpp
+    HardwareSerial0.cpp
+    HardwareSerial1.cpp
+    HardwareSerial3.cpp
+    IPAddress.cpp
+    HardwareSerial2.cpp
+    Print.cpp
+    Stream.cpp
+    Tone.cpp
+    USBCore.cpp
+    WMath.cpp
+    WString.cpp
+    abi.cpp
+    main.cpp
+    )
+list(TRANSFORM AVR_SOURCES PREPEND ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/)
+
+#
+# Target configuration
+#
+if(CMAKE_CROSSCOMPILING)
+  # TODO: get date from the last git commit to set as epoch
+  set_source_epoch(0)
+
+  # default optimization flags
+  set(CMAKE_CXX_FLAGS_DEBUG "-Og -g")
+  set(CMAKE_CXX_FLAGS_RELEASE "-Os -g -DNDEBUG")
+  set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
+  set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
+
+  # mcu and target-related settings
+  add_compile_options(
+    -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_PRUSA_EINSY_RAMBO
+    -DARDUINO_ARCH_AVR
+    )
+  add_link_options(-mmcu=atmega2560 -Wl,-u,vfprintf -lprintf_flt -lm)
+
+  # disable some C++ language features
+  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>)
+  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
+
+  # disable exceptions
+  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>)
+  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables>)
+
+  # split and gc sections
+  add_compile_options(-ffunction-sections -fdata-sections)
+  add_link_options(-ffunction-sections -fdata-sections -Wl,--gc-sections)
+
+  # LTO (with custom options)
+  add_compile_options(-flto -fno-fat-lto-objects)
+  add_link_options(-flto)
+
+  # Create this target before we apply the GC options
+  add_library(avr_core STATIC ${AVR_SOURCES})
+  set_reproducible_target(avr_core)
+  target_include_directories(
+    avr_core PRIVATE ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/
+                     ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/
+    )
+endif()
+
+# Meta targets to build absolutely everything
+add_custom_target(ALL_FIRMWARE)
+add_custom_target(ALL_ENGLISH)
+add_custom_target(ALL_MULTILANG)
+add_dependencies(ALL_FIRMWARE ALL_ENGLISH ALL_MULTILANG)
+set_target_properties(ALL_MULTILANG PROPERTIES EXCLUDE_FROM_ALL FALSE)
+
+function(add_base_binary variant_name)
+  add_executable(${variant_name} ${FW_SOURCES} ${FW_HEADERS} ${VARIANT_CFG_DST})
+  set_target_properties(${variant_name} PROPERTIES EXCLUDE_FROM_ALL TRUE)
+  set_reproducible_target(${variant_name})
+
+  target_include_directories(
+    ${variant_name}
+    PRIVATE ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/
+            ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/ ${CMAKE_SOURCE_DIR}/Firmware
+    )
+
+  target_link_libraries(${variant_name} avr_core)
+
+  # configure linker script
+  set(LINKER_SCRIPT ${PRUSA_BOARDS_DIR}/ldscripts/avr6.xn)
+  target_link_options(${variant_name} PUBLIC -Wl,-T,${LINKER_SCRIPT})
+
+  # limit the text section to 248K (256K - 8k reserved for the bootloader)
+  target_link_options(${variant_name} PUBLIC -Wl,--defsym=__TEXT_REGION_LENGTH__=248K)
+
+  # produce ASM listing. Note we also specify the .map as a byproduct so it gets cleaned because
+  # link_options doesn't have a "generated outputs" feature.
+  add_custom_command(
+    TARGET ${variant_name}
+    POST_BUILD
+    COMMAND ${CMAKE_OBJDUMP} --prefix ${CMAKE_SOURCE_DIR} -CSd ${variant_name} > ${variant_name}.asm
+    BYPRODUCTS ${variant_name}.asm ${variant_name}.map
+    )
+
+  # inform about the firmware's size in terminal
+  add_custom_command(
+    TARGET ${variant_name}
+    POST_BUILD
+    COMMAND ${CMAKE_SIZE_UTIL} -C --mcu=atmega2560 ${variant_name}
+    )
+  report_size(${variant_name})
+
+  # generate linker map file
+  target_link_options(
+    ${variant_name} PUBLIC -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${variant_name}.map
+    )
+
+  target_compile_definitions(${variant_name} PRIVATE CMAKE_CONTROL)
+endfunction()
+
+function(fw_add_variant variant_name)
+  set(variant_header "variants/${variant_name}.h")
+  string(REPLACE "1_75mm_" "" variant_name "${variant_name}")
+  string(REPLACE "-E3Dv6full" "" variant_name "${variant_name}")
+
+  # Single-language build
+  set(FW_EN "${variant_name}_EN-only")
+  set(FW_HEX ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${FW_EN}.hex)
+
+  add_base_binary(${FW_EN})
+  target_compile_definitions(${FW_EN} PUBLIC LANG_MODE=0 FW_VARIANT="${variant_header}")
+  add_custom_command(
+    TARGET ${FW_EN}
+    POST_BUILD
+    COMMAND ${CMAKE_OBJCOPY} -O ihex ${FW_EN} ${FW_EN}.hex
+    COMMAND ${CMAKE_COMMAND} -E create_hardlink ${FW_EN}.hex ${FW_HEX}
+    BYPRODUCTS ${FW_EN}.hex ${FW_HEX}
+    COMMENT "Generating ${FW_EN}.hex"
+    )
+  add_dependencies(ALL_ENGLISH ${FW_EN})
+
+  # Multi-language build/s
+  set(FW_LANG_BASE "${variant_name}_Multilang_base")
+  set(FW_LANG_PATCH "${variant_name}_Multilang_patch")
+  add_base_binary(${FW_LANG_BASE})
+  target_compile_definitions(${FW_LANG_BASE} PUBLIC LANG_MODE=1 FW_VARIANT="${variant_header}")
+
+  # Construct language map
+  set(LANG_TMP_DIR lang)
+  set(LANG_MAP ${LANG_TMP_DIR}/${variant_name}_lang.map)
+
+  add_custom_command(
+    OUTPUT ${LANG_MAP}
+    COMMAND ${CMAKE_OBJCOPY} -O binary ${FW_LANG_BASE} ${FW_LANG_PATCH}.bin
+    COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-map.py ${FW_LANG_BASE} ${FW_LANG_PATCH}.bin > ${LANG_MAP}
+    COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex ${FW_LANG_PATCH}.bin ${FW_LANG_PATCH}.hex
+    DEPENDS ${FW_LANG_BASE}
+    BYPRODUCTS ${FW_LANG_PATCH}.bin ${FW_LANG_PATCH}.hex
+    COMMENT "Generating ${variant_name} language map"
+    )
+
+  # Base targets for language checks
+  add_custom_target(check_lang_${variant_name})
+  add_dependencies(check_lang check_lang_${variant_name})
+
+  # Build language catalogs
+  set(LANG_BINS "")
+  foreach(LANG IN LISTS SELECTED_LANGUAGES)
+    set(LANG_BIN ${LANG_TMP_DIR}/${variant_name}_${LANG}.bin)
+    set(PO_FILE "${CMAKE_SOURCE_DIR}/lang/po/Firmware_${LANG}.po")
+
+    # Full language checks
+    add_custom_target(
+      check_lang_${variant_name}_${LANG}
+      COMMENT "Checking ${variant_name} language ${LANG}"
+      COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-check.py --map ${LANG_MAP} ${PO_FILE}
+      DEPENDS ${LANG_MAP} ${PO_FILE}
+      USES_TERMINAL
+      )
+    add_dependencies(check_lang_${variant_name} check_lang_${variant_name}_${LANG})
+    add_dependencies(check_lang_${LANG} check_lang_${variant_name}_${LANG})
+
+    add_custom_command(
+      OUTPUT ${LANG_BIN}
+      # Check po file for errors _only_
+      COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-check.py --errors-only --map ${LANG_MAP} ${PO_FILE}
+      # Build the catalog
+      COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-build.py ${LANG_MAP} ${PO_FILE} ${LANG_BIN}
+      # Check bin size
+      COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_MAX_SIZE} -DLANG_FILE=${LANG_BIN} -P
+              ${PROJECT_CMAKE_DIR}/Check_lang_size.cmake
+      DEPENDS ${LANG_MAP} ${PO_FILE}
+      COMMENT "Generating ${variant_name}_${LANG}.bin"
+      )
+    list(APPEND LANG_BINS ${LANG_BIN})
+  endforeach()
+
+  string(FIND ${variant_name} "MK3" HAS_XFLASH)
+  if(${HAS_XFLASH} GREATER_EQUAL 0)
+    # X-Flash based build (catalogs appended to patched binary)
+    set(FW_LANG_FINAL "${variant_name}_Multilang")
+    set(LANG_HEX ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${FW_LANG_FINAL}.hex)
+    set(LANG_CATBIN ${LANG_TMP_DIR}/${variant_name}_cat.bin)
+    set(LANG_CATHEX ${LANG_TMP_DIR}/${variant_name}_cat.hex)
+
+    add_custom_command(
+      OUTPUT ${LANG_CATBIN}
+      COMMAND ${CMAKE_COMMAND} -E cat ${LANG_BINS} > ${LANG_CATBIN}
+      DEPENDS ${LANG_BINS}
+      COMMENT "Merging language catalogs"
+      )
+    #[[
+    #add_custom_command(OUTPUT ${LANG_FINAL_BIN}
+    #  COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_BIN_MAX} -DLANG_FILE=${LANG_FINAL_BIN}
+    #                           -P ${PROJECT_CMAKE_DIR}/Check_final_lang_bin_size.cmake
+    #  APPEND)
+    #]]
+    add_custom_command(
+      OUTPUT ${LANG_CATHEX}
+      COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex ${LANG_CATBIN} ${LANG_CATHEX}
+      DEPENDS ${LANG_CATBIN}
+      COMMENT "Generating Hex for language data"
+      )
+
+    add_custom_command(
+      OUTPUT ${FW_LANG_FINAL}.hex
+      COMMAND ${CMAKE_COMMAND} -E cat ${FW_LANG_PATCH}.hex ${LANG_CATHEX} > ${FW_LANG_FINAL}.hex
+      COMMAND ${CMAKE_COMMAND} -E create_hardlink ${FW_LANG_FINAL}.hex ${LANG_HEX}
+      BYPRODUCTS ${LANG_HEX}
+      DEPENDS ${FW_LANG_PATCH}.hex ${LANG_CATHEX}
+      COMMENT "Generating final ${FW_LANG_FINAL}.hex"
+      )
+
+    add_custom_target(${FW_LANG_FINAL} DEPENDS ${FW_LANG_FINAL}.hex)
+    add_dependencies(ALL_MULTILANG ${FW_LANG_FINAL})
+  else()
+    set(ALL_VARIANT_HEXES "")
+    # Non-xflash, e.g. MK2.5
+    foreach(LANG IN LISTS SELECTED_LANGUAGES)
+      set(FW_LANG_FINAL ${variant_name}-en_${LANG})
+      set(LANG_HEX ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${FW_LANG_FINAL}.hex)
+      set(LANG_BIN ${LANG_TMP_DIR}/${variant_name}_${LANG}.bin)
+
+      # Patched binary with pre-baked secondary language
+      add_custom_command(
+        OUTPUT ${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}
+                ${FW_LANG_FINAL}.bin
+        DEPENDS ${FW_LANG_BASE} ${LANG_BIN}
+        COMMENT "Generating ${FW_LANG_FINAL}.bin"
+        )
+
+      # Final hex files
+      add_custom_command(
+        OUTPUT ${FW_LANG_FINAL}.hex
+        COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex ${FW_LANG_FINAL}.bin ${FW_LANG_FINAL}.hex
+        COMMAND ${CMAKE_COMMAND} -E create_hardlink ${FW_LANG_FINAL}.hex ${LANG_HEX}
+        BYPRODUCTS ${LANG_HEX}
+        DEPENDS ${FW_LANG_FINAL}.bin
+        COMMENT "Creating ${FW_LANG_FINAL}.hex"
+        )
+
+      add_custom_target(${FW_LANG_FINAL} DEPENDS ${FW_LANG_FINAL}.hex)
+      list(APPEND ALL_VARIANT_HEXES ${FW_LANG_FINAL})
+    endforeach()
+    add_custom_target("${variant_name}-All-Languages" DEPENDS ${ALL_VARIANT_HEXES})
+    add_dependencies(ALL_MULTILANG "${variant_name}-All-Languages")
+  endif()
+endfunction()
+
+if(CMAKE_CROSSCOMPILING)
+
+  # Main target for language checks
+  add_custom_target(check_lang)
+  foreach(LANG IN LISTS SELECTED_LANGUAGES)
+    add_custom_target(check_lang_${LANG})
+    add_dependencies(check_lang check_lang_${LANG})
+  endforeach()
+
+  # build a list of all supported variants
+  file(
+    GLOB ALL_VARIANTS
+    RELATIVE ${PROJECT_SOURCE_DIR}/Firmware/variants
+    ${PROJECT_SOURCE_DIR}/Firmware/variants/*.h
+    )
+  list(TRANSFORM ALL_VARIANTS REPLACE "\.h$" "")
+  set(FW_VARIANTS
+      ${ALL_VARIANTS}
+      CACHE STRING "Firmware variants to be built"
+      )
+
+  foreach(THIS_VAR IN LISTS FW_VARIANTS)
+    if(NOT ${THIS_VAR} IN_LIST ALL_VARIANTS)
+      message(FATAL_ERROR "Variant ${THIS_VAR} does not exist")
+    endif()
+
+    message("Variant added: ${THIS_VAR}")
+    string(REPLACE "-E3Dv6full" "" DIR_NAME "${THIS_VAR}")
+    string(REPLACE "1_75mm_" "" DIR_NAME "${DIR_NAME}")
+
+    # Generate a file in a subfolder so that we can organize things a little more neatly in VS code
+    file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
+    file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}/CMakeLists.txt
+         "project(${DIR_NAME})\nfw_add_variant(${THIS_VAR})"
+         )
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
+  endforeach(THIS_VAR IN LISTS FW_VARIANTS)
+endif()
+
+#
+# Tests
+#
+if(NOT CMAKE_CROSSCOMPILING)
+  enable_testing()
+  add_subdirectory(tests)
+endif()

+ 1 - 1
Firmware/Configuration.cpp

@@ -1,5 +1,5 @@
 #include "Configuration.h"
 #include "Configuration.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 
 
 const uint16_t _nPrinterType PROGMEM=PRINTER_TYPE;
 const uint16_t _nPrinterType PROGMEM=PRINTER_TYPE;
 const char _sPrinterName[] PROGMEM=PRINTER_NAME;
 const char _sPrinterName[] PROGMEM=PRINTER_NAME;

+ 9 - 4
Firmware/Configuration.h

@@ -63,7 +63,14 @@ extern PGM_P sPrinterName;
 #undef DEBUG_BUILD
 #undef DEBUG_BUILD
 #endif
 #endif
 
 
-#include "Configuration_prusa.h"
+#ifndef SOURCE_DATE_EPOCH
+#define SOURCE_DATE_EPOCH __DATE__
+#endif
+#ifndef SOURCE_TIME_EPOCH
+#define SOURCE_TIME_EPOCH __TIME__
+#endif
+
+#include "Configuration_var.h"
 
 
 #define FW_PRUSA3D_MAGIC "PRUSA3DFW"
 #define FW_PRUSA3D_MAGIC "PRUSA3DFW"
 #define FW_PRUSA3D_MAGIC_LEN 10
 #define FW_PRUSA3D_MAGIC_LEN 10
@@ -78,9 +85,7 @@ extern PGM_P sPrinterName;
 // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
 // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
 // build by the user have been successfully uploaded into firmware.
 // build by the user have been successfully uploaded into firmware.
 
 
-//#define STRING_VERSION "1.0.2"
-
-#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ // build date and time
+#define STRING_VERSION_CONFIG_H SOURCE_DATE_EPOCH " " SOURCE_TIME_EPOCH // build date and time
 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
 
 
 // SERIAL_PORT selects which serial port should be used for communication with the host.
 // SERIAL_PORT selects which serial port should be used for communication with the host.

+ 1 - 1
Firmware/ConfigurationStore.cpp

@@ -5,7 +5,7 @@
 #include "temperature.h"
 #include "temperature.h"
 #include "ultralcd.h"
 #include "ultralcd.h"
 #include "ConfigurationStore.h"
 #include "ConfigurationStore.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 
 
 #ifdef MESH_BED_LEVELING
 #ifdef MESH_BED_LEVELING
 #include "mesh_bed_leveling.h"
 #include "mesh_bed_leveling.h"

+ 10 - 0
Firmware/Configuration_var.h

@@ -0,0 +1,10 @@
+// Include the printer's variant configuration header
+#pragma once
+
+// This is set by the cmake build to be able to take control of
+// the variant header without breaking existing build mechanisms.
+#ifndef CMAKE_CONTROL
+#include "Configuration_prusa.h"
+#else
+#include FW_VARIANT
+#endif

+ 9 - 3
Firmware/Filament_sensor.cpp

@@ -278,7 +278,9 @@ void IR_sensor_analog::voltUpdate(uint16_t raw) { // to be called from the ADC I
 }
 }
 
 
 uint16_t IR_sensor_analog::getVoltRaw() {
 uint16_t IR_sensor_analog::getVoltRaw() {
-    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { return voltRaw; }
+    uint16_t ret;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = voltRaw; }
+    return ret;
 }
 }
 
 
 const char *IR_sensor_analog::getIRVersionText() {
 const char *IR_sensor_analog::getIRVersionText() {
@@ -339,7 +341,9 @@ bool IR_sensor_analog::checkVoltage(uint16_t raw) {
 }
 }
 
 
 bool IR_sensor_analog::getVoltReady() const {
 bool IR_sensor_analog::getVoltReady() const {
-    ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ return voltReady; }
+    bool ret;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ ret = voltReady; }
+    return ret;
 }
 }
 
 
 void IR_sensor_analog::clearVoltReady(){
 void IR_sensor_analog::clearVoltReady(){
@@ -462,7 +466,9 @@ void PAT9125_sensor::settings_init() {
 }
 }
 
 
 int16_t PAT9125_sensor::getStepCount() {
 int16_t PAT9125_sensor::getStepCount() {
-    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { return stepCount; }
+    int16_t ret;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; }
+    return ret;
 }
 }
 
 
 void PAT9125_sensor::resetStepCount() {
 void PAT9125_sensor::resetStepCount() {

+ 2 - 0
Firmware/Marlin.h

@@ -386,7 +386,9 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
 void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y);
 void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y);
 #endif //HEATBED_ANALYSIS
 #endif //HEATBED_ANALYSIS
 float temp_comp_interpolation(float temperature);
 float temp_comp_interpolation(float temperature);
+#if 0
 void show_fw_version_warnings();
 void show_fw_version_warnings();
+#endif
 uint8_t check_printer_version();
 uint8_t check_printer_version();
 
 
 #ifdef PINDA_THERMISTOR
 #ifdef PINDA_THERMISTOR

+ 18 - 17
Firmware/Marlin_main.cpp

@@ -828,30 +828,31 @@ void factory_reset()
 	}
 	}
 	KEEPALIVE_STATE(IN_HANDLER);
 	KEEPALIVE_STATE(IN_HANDLER);
 }
 }
-
+#if 0
 void show_fw_version_warnings() {
 void show_fw_version_warnings() {
 	if (FW_DEV_VERSION == FW_VERSION_GOLD || FW_DEV_VERSION == FW_VERSION_RC) return;
 	if (FW_DEV_VERSION == FW_VERSION_GOLD || FW_DEV_VERSION == FW_VERSION_RC) return;
 	switch (FW_DEV_VERSION) {
 	switch (FW_DEV_VERSION) {
-	case(FW_VERSION_ALPHA):   lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware alpha version. This is development version. Using this version is not recommended and may cause printer damage."));   break;////MSG_FW_VERSION_ALPHA c=20 r=8
-	case(FW_VERSION_BETA):    lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware beta version. This is development version. Using this version is not recommended and may cause printer damage."));    break;////MSG_FW_VERSION_BETA c=20 r=8
+	case(FW_VERSION_BETA):    lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_BETA);   break;
+	case(FW_VERSION_ALPHA):
   case(FW_VERSION_DEVEL):
   case(FW_VERSION_DEVEL):
 	case(FW_VERSION_DEBUG):
 	case(FW_VERSION_DEBUG):
     lcd_update_enable(false);
     lcd_update_enable(false);
     lcd_clear();
     lcd_clear();
-  #if FW_DEV_VERSION == FW_VERSION_DEVEL
+  #if (FW_DEV_VERSION == FW_VERSION_DEVEL || FW_DEV_VERSION == FW_VERSION_ALPHA)
     lcd_puts_at_P(0, 0, PSTR("Development build !!"));
     lcd_puts_at_P(0, 0, PSTR("Development build !!"));
   #else
   #else
     lcd_puts_at_P(0, 0, PSTR("Debbugging build !!!"));
     lcd_puts_at_P(0, 0, PSTR("Debbugging build !!!"));
   #endif
   #endif
     lcd_puts_at_P(0, 1, PSTR("May destroy printer!"));
     lcd_puts_at_P(0, 1, PSTR("May destroy printer!"));
-    lcd_puts_at_P(0, 2, PSTR("ver ")); lcd_puts_P(PSTR(FW_VERSION_FULL));
-    lcd_puts_at_P(0, 3, PSTR(FW_REPOSITORY));
+    lcd_puts_at_P(0, 2, PSTR("FW")); lcd_puts_P(PSTR(FW_VERSION_FULL));
+    lcd_puts_at_P(0, 3, PSTR("Repo: ")); lcd_puts_P(PSTR(FW_REPOSITORY));
     lcd_wait_for_click();
     lcd_wait_for_click();
     break;
     break;
 //	default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8
 //	default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8
 	}
 	}
 	lcd_update_enable(true);
 	lcd_update_enable(true);
 }
 }
+#endif
 
 
 #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 //! @brief try to check if firmware is on right type of printer
 //! @brief try to check if firmware is on right type of printer
@@ -1216,8 +1217,6 @@ void setup()
 	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
 	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
 	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR
 	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR
 	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
 	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
-	SERIAL_ECHOPGM("Compiled: ");
-	SERIAL_ECHOLNPGM(__DATE__);
 #endif
 #endif
 #endif
 #endif
 
 
@@ -1487,7 +1486,9 @@ void setup()
 #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
     check_if_fw_is_on_right_printer();
     check_if_fw_is_on_right_printer();
 #endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 #endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
+#if 0
     show_fw_version_warnings();    
     show_fw_version_warnings();    
+#endif
   }
   }
 
 
   switch (hw_changed) { 
   switch (hw_changed) { 
@@ -1593,17 +1594,17 @@ void setup()
       manage_heater(); // Update temperatures 
       manage_heater(); // Update temperatures 
 #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
 #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
 		printf_P(_N("Power panic detected!\nCurrent bed temp:%d\nSaved bed temp:%d\n"), (int)degBed(), eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED));
 		printf_P(_N("Power panic detected!\nCurrent bed temp:%d\nSaved bed temp:%d\n"), (int)degBed(), eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED));
-#endif 
+#endif
      if ( degBed() > ( (float)eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED) - AUTOMATIC_UVLO_BED_TEMP_OFFSET) ){ 
      if ( degBed() > ( (float)eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED) - AUTOMATIC_UVLO_BED_TEMP_OFFSET) ){ 
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
         puts_P(_N("Automatic recovery!")); 
         puts_P(_N("Automatic recovery!")); 
-          #endif 
+          #endif
          recover_print(1); 
          recover_print(1); 
       } 
       } 
       else{ 
       else{ 
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
         puts_P(_N("Normal recovery!")); 
         puts_P(_N("Normal recovery!")); 
-          #endif 
+          #endif
           if ( lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false) == LCD_LEFT_BUTTON_CHOICE) {
           if ( lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false) == LCD_LEFT_BUTTON_CHOICE) {
               recover_print(0); 
               recover_print(0); 
           } else { 
           } else { 
@@ -4570,7 +4571,7 @@ eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF);
         retract(false,retracted_swap[active_extruder]);
         retract(false,retracted_swap[active_extruder]);
        #else
        #else
         retract(false);
         retract(false);
-       #endif 
+       #endif
       break;
       break;
 #endif //FWRETRACT
 #endif //FWRETRACT
 
 
@@ -11345,11 +11346,11 @@ void restore_print_from_ram_and_continue(float e_move)
     // restore bed temperature (bed can be disabled during a thermal warning)
     // restore bed temperature (bed can be disabled during a thermal warning)
     if (degBed() != saved_bed_temperature)
     if (degBed() != saved_bed_temperature)
         setTargetBed(saved_bed_temperature);
         setTargetBed(saved_bed_temperature);
-	fanSpeed = saved_fan_speed;
-	restore_extruder_temperature_from_ram();
-	axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
-	float e = saved_pos[E_AXIS] - e_move;
-	plan_set_e_position(e);
+    fanSpeed = saved_fan_speed;
+    restore_extruder_temperature_from_ram();
+    axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
+    float e = saved_pos[E_AXIS] - e_move;
+    plan_set_e_position(e);
   
   
   #ifdef FANCHECK
   #ifdef FANCHECK
     fans_check_enabled = false;
     fans_check_enabled = false;

+ 3 - 0
Firmware/Sd2Card.cpp

@@ -311,13 +311,16 @@ bool Sd2Card::init(uint8_t sckRateID) {
   // must supply min of 74 clock cycles with CS high.
   // must supply min of 74 clock cycles with CS high.
   for (uint8_t i = 0; i < 10; i++) spiSend(0XFF);
   for (uint8_t i = 0; i < 10; i++) spiSend(0XFF);
 
 
+  WRITE(MISO, 1); // temporarily enable the MISO line pullup
   // command to go idle in SPI mode
   // command to go idle in SPI mode
   while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) {
   while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) {
     if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
     if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
+      WRITE(MISO, 0); // disable the MISO line pullup
       error(SD_CARD_ERROR_CMD0);
       error(SD_CARD_ERROR_CMD0);
       goto fail;
       goto fail;
     }
     }
   }
   }
+  WRITE(MISO, 0); // disable the MISO line pullup
 
 
   // send 0xFF until 0xFF received to give card some clock cycles
   // send 0xFF until 0xFF received to give card some clock cycles
   t0 = (uint16_t)_millis();
   t0 = (uint16_t)_millis();

+ 5 - 1
Firmware/config.h

@@ -2,7 +2,7 @@
 #define _CONFIG_H
 #define _CONFIG_H
 
 
 
 
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #include "pins.h"
 #include "pins.h"
 
 
 #if (defined(VOLT_IR_PIN) && defined(IR_SENSOR))
 #if (defined(VOLT_IR_PIN) && defined(IR_SENSOR))
@@ -60,9 +60,13 @@
 #define TMC2130_SPCR           SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0)
 #define TMC2130_SPCR           SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0)
 #define TMC2130_SPSR           SPI_SPSR(TMC2130_SPI_RATE)
 #define TMC2130_SPSR           SPI_SPSR(TMC2130_SPI_RATE)
 
 
+// This is set by the cmake build to be able to take control of
+// the language flag, without breaking existing build mechanisms.
+#ifndef CMAKE_CONTROL
 //LANG - Multi-language support
 //LANG - Multi-language support
 //#define LANG_MODE              0 // primary language only
 //#define LANG_MODE              0 // primary language only
 #define LANG_MODE              1 // sec. language support
 #define LANG_MODE              1 // sec. language support
+#endif
 
 
 #define LANG_SIZE_RESERVED     0x3500 // reserved space for secondary language (13568 bytes).
 #define LANG_SIZE_RESERVED     0x3500 // reserved space for secondary language (13568 bytes).
                                       // 0x3D00 Maximum 15616 bytes as it depends on xflash_layout.h
                                       // 0x3D00 Maximum 15616 bytes as it depends on xflash_layout.h

+ 308 - 300
Firmware/eeprom.h

@@ -4,7 +4,7 @@
  * @author 3d-gussner
  * @author 3d-gussner
  */
  */
  /** \ingroup eeprom_table */
  /** \ingroup eeprom_table */
- 
+
  //! _This is a EEPROM table of currently implemented in Prusa firmware (dynamically generated from doxygen)._
  //! _This is a EEPROM table of currently implemented in Prusa firmware (dynamically generated from doxygen)._
 
 
 
 
@@ -37,29 +37,29 @@ typedef struct
 static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEPROM_SHEETS_SIZEOF.");
 static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEPROM_SHEETS_SIZEOF.");
 #endif
 #endif
 /** @defgroup eeprom_table EEPROM Table
 /** @defgroup eeprom_table EEPROM Table
- *  
- 
+ *
+
   ---------------------------------------------------------------------------------
   ---------------------------------------------------------------------------------
   EEPROM 8-bit Empty value = 0xFFh 255
   EEPROM 8-bit Empty value = 0xFFh 255
-  
+
   EEPROM 16-bit Empty value = 0xFFFFh 65535
   EEPROM 16-bit Empty value = 0xFFFFh 65535
-  
+
   _Italic = unused or default_
   _Italic = unused or default_
-  
+
   __Bold = Status__
   __Bold = Status__
-  
-  In Default/FactoryReset column the 
-  
-   - __L__		Language
-   - __S__ 		Statistics
-   - __P__ 		Shipping prep
-   - __M__ 		Service/Maintenance prep
-   - __S/P__	Statistics and Shipping prep
-   
+
+  In Default/FactoryReset column the
+
+   - __L__      Language
+   - __S__      Statistics
+   - __P__      Shipping prep
+   - __M__      Service/Maintenance prep
+   - __S/P__    Statistics and Shipping prep
+
   will overwrite existing values to 0 or default.
   will overwrite existing values to 0 or default.
   A FactoryReset All Data will overwrite the whole EEPROM with ffh and some values will be initialized automatically,
   A FactoryReset All Data will overwrite the whole EEPROM with ffh and some values will be initialized automatically,
   others need a reset / reboot.
   others need a reset / reboot.
-  
+
   ---------------------------------------------------------------------------------
   ---------------------------------------------------------------------------------
   How can you use the debug codes?
   How can you use the debug codes?
   - Serial terminal like Putty.
   - Serial terminal like Putty.
@@ -67,283 +67,291 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
   - _Pronterface_ does __not__ support D-codes
   - _Pronterface_ does __not__ support D-codes
 
 
   ### !!! D-codes are case sensitive so please don't use upper case A,C or X in the address you want to read !!!
   ### !!! D-codes are case sensitive so please don't use upper case A,C or X in the address you want to read !!!
-   
+
   #### Useful tools/links:
   #### Useful tools/links:
-  To convert hex to ascii 		https://www.rapidtables.com/convert/number/hex-to-ascii.html
-  
-  To convert hex to dec 		https://www.rapidtables.com/convert/number/hex-to-decimal.html
-  
-  Version: 1.0.1
-  
+  To convert hex to ascii       https://www.rapidtables.com/convert/number/hex-to-ascii.html
+
+  To convert hex to dec         https://www.rapidtables.com/convert/number/hex-to-decimal.html
+
+  Version: 1.0.2
+
   ---------------------------------------------------------------------------------
   ---------------------------------------------------------------------------------
-  
-  
-| Address begin		| Bit/Type 	| Name 									| Valid values	| Default/FactoryReset	| Description 										| Gcode/Function| Debug code
-| :--				| :-- 		| :-- 									| :--:			| :--:					| :--												| :--:			| :--:
-| 0x0FFFh 4095		| uchar    	| EEPROM_SILENT 						| 00h 0			| ffh 255				| TMC Stealth mode: __off__ / miniRambo Power mode	| LCD menu		| D3 Ax0fff C1
-| ^ 				| ^ 		| ^										| 01h 1			| ^						| TMC Stealth mode: __on__ / miniRambo Silent mode	| ^				| ^ 
-| ^ 				| ^ 		| ^										| 02h 2			| ^						| miniRambo Auto mode								| ^				| ^ 
-| 0x0FFEh 4094		| uchar    	| EEPROM_LANG 							| 00h 0			| ffh 255		__L__	| English / LANG_ID_PRI								| LCD menu		| D3 Ax0ffe C1 
-| ^ 				| ^ 		| ^										| 01h 1			| ^						| Other language LANG_ID_SEC						| ^ 			| ^
-| 0x0FFCh 4092		| uint16	| EEPROM_BABYSTEP_X						| ???			| ff ffh 65535			| Babystep for X axis _unsued_						| ??? 			| D3 Ax0ffc C2
-| 0x0FFAh 4090		| uint16	| EEPROM_BABYSTEP_Y						| ???			| ff ffh 65535			| Babystep for Y axis _unsued_						| ^ 			| D3 Ax0ffa C2
-| 0x0FF8h 4088		| uint16	| EEPROM_BABYSTEP_Z						| ???			| ff ffh 65535			| Babystep for Z axis _lagacy_						| ^ 			| D3 Ax0ff8 C2
-| ^ 				| ^ 		| ^										| ^				| ^						| multiple values stored now in EEPROM_Sheets_base	| ^ 			| ^
-| 0x0FF7h 4087		| uint8		| EEPROM_CALIBRATION_STATUS				| ffh 255		| ffh 255				| Assembled _default_								| ??? 			| D3 Ax0ff7 C1
-| ^ 				| ^ 		| ^										| 01h 1			| ^						| Calibrated										| ^ 			| ^
-| ^ 				| ^ 		| ^										| e6h 230		| ^						| needs Live Z adjustment							| ^ 			| ^
-| ^ 				| ^ 		| ^										| f0h 240		| ^				__P__	| needs Z calibration								| ^ 			| ^
-| ^ 				| ^ 		| ^										| fah 250		| ^						| needs XYZ calibration								| ^ 			| ^ 
-| ^ 				| ^ 		| ^										| 00h 0			| ^						| Unknown											| ^ 			| ^
-| 0x0FF5h 4085		| uint16	| EEPROM_BABYSTEP_Z0					| ???			| ff ffh 65535			| Babystep for Z ???								| ??? 			| D3 Ax0ff5 C2
-| 0x0FF1h 4081		| uint32	| EEPROM_FILAMENTUSED					| ???			| 00 00 00 00h 0 __S/P__| Filament used in meters							| ??? 			| D3 Ax0ff1 C4
-| 0x0FEDh 4077		| uint32	| EEPROM_TOTALTIME						| ???			| 00 00 00 00h 0 __S/P__| Total print time									| ??? 			| D3 Ax0fed C4
-| 0x0FE5h 4069		| float		| EEPROM_BED_CALIBRATION_CENTER			| ???			| ff ff ff ffh			| ???											 	| ??? 			| D3 Ax0fe5 C8
-| 0x0FDDh 4061		| float		| EEPROM_BED_CALIBRATION_VEC_X			| ???			| ff ff ff ffh			| ???											 	| ??? 			| D3 Ax0fdd C8
-| 0x0FD5h 4053		| float		| EEPROM_BED_CALIBRATION_VEC_Y			| ???			| ff ff ff ffh			| ???											 	| ??? 			| D3 Ax0fd5 C8
-| 0x0FC5h 4037		| int16		| EEPROM_BED_CALIBRATION_Z_JITTER		| ???			| ff ffh 65535			| ???											 	| ??? 			| D3 Ax0fc5 C16
-| 0x0FC4h 4036		| bool		| EEPROM_FARM_MODE						| 00h 0			| ffh 255 		__P__	| Prusa farm mode: __off__							| G99 			| D3 Ax0fc4 C1
-| ^					| ^			| ^										| 01h 1			| ^						| Prusa farm mode: __on__							| G98			| ^
-| 0x0FC3h 4035		| free		| _EEPROM_FREE_NR1_						| ???			| ffh 255				| _Free EEPROM space_								| _free space_	| D3 Ax0fc3 C1
-| 0x0FC1h 4033		| ???		| EEPROM_FARM_NUMBER					| 000-999		| ff ffh / 000	__P__	| Prusa farm number	_only 0-9 are allowed: 000-999_	| LCD menu		| D3 Ax0fc1 C2
-| 0x0FC0h 4032		| bool		| EEPROM_BED_CORRECTION_VALID			| 00h 0			| 00h 0					| Bed correction invalid							| ??? 			| D3 Ax0fc0 C1
-| ^					| ^			| ^										| ffh 255		| 						| Bed correction valid								| ??? 			| ^
-| 0x0FBFh 4031		| char		| EEPROM_BED_CORRECTION_LEFT			| 00h ffh		| 00h 0					| Bed manual correction left						| LCD menu 		| D3 Ax0fbf C1
-| ^					| ^			| ^										| ^				| ^						| At this moment limited to +-100um					| G80 Lxxx 			| ^
-| 0x0FBEh 4030		| char		| EEPROM_BED_CORRECTION_RIGHT			| 00h ffh		| 00h 0					| Bed manual correction right						| LCD menu 		| D3 Ax0fbe C1
-| ^					| ^			| ^										| ^				| ^						| At this moment limited to +-100um					| G80 Rxxx 			| ^
-| 0x0FBDh 4029		| char		| EEPROM_BED_CORRECTION_FRONT			| 00h ffh		| 00h 0					| Bed manual correction front						| LCD menu 		| D3 Ax0fbd C1
-| ^					| ^			| ^										| ^				| ^						| At this moment limited to +-100um					| G80 Fxxx 			| ^
-| 0x0FBCh 4028		| char		| EEPROM_BED_CORRECTION_BACK			| 00h ffh		| 00h 0					| Bed manual correction back						| LCD menu 		| D3 Ax0fbc C1
-| ^					| ^			| ^										| ^				| ^						| At this moment limited to +-100um					| G80 Bxxx 			| ^
-| 0x0FBBh 4027		| bool		| EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY	| 00h 0			| ffh 255				| Toshiba Air: __off__								| LCD menu 		| D3 Ax0fbb C1
-| ^					| ^			| ^										| 01h 1			| ^						| Toshiba Air: __on__								| ^ 			| ^	
-| 0x0FBAh 4026		| uchar		| EEPROM_PRINT_FLAG						| ???			| ???					| _unsued_											| ??? 			| D3 Ax0fba C1
-| 0x0FB0h 4016		| int16		| EEPROM_PROBE_TEMP_SHIFT				| ???			| ???					| ???												| ??? 			| D3 Ax0fb0 C10
-| 0x0FAFh 4015		| bool		| EEPROM_TEMP_CAL_ACTIVE				| 00h 0			| 00h 0					| PINDA Temp cal.: __inactive__						| LCD menu		| D3 Ax0faf C1
-| ^					| ^			| ^										| ffh 255		| ^						| PINDA Temp cal.: __active__						| ^ 			| ^
-| 0x0FA7h 4007		| ???		| _EEPROM_FREE_NR6_						| ???			| 						| _Free EEPROM space_								| ??? 			| D3 Ax0fae C8
-| ^					| ^			| ^										| ^				| 00 00 00 00h			| ^													| ^ 			| ^
-| 0x0FA6h 4006		| uint8		| EEPROM_CALIBRATION_STATUS_PINDA		| 00h 0			| ffh 255				| PINDA Temp: __not calibrated__					| ??? 			| D3 Ax0fa6 C1
-| ^					| ^			| ^										| 01h 1			| ^						| PINDA Temp: __calibrated__						| ^ 			| ^
-| 0x0FA5h 4005		| uint8		| EEPROM_UVLO							| 00h 0			| ffh 255				| Power Panic flag: __inactive__					| ??? 			| D3 Ax0fa5 C1
-| ^					| ^			| ^										| 01h 1			| ^						| Power Panic flag: __active__						| ^ 			| ^
-| ^					| ^			| ^										| 02h 2			| ^						| Power Panic flag: __???__							| ^ 			| ^
-| 0x0F9Dh 3997		| float		| EEPROM_UVLO_CURRENT_POSITION			| ???			| ffh 255				| Power Panic position 								| ??? 			| D3 Ax0f9d C8
-| 0x0F95h 3989		| char		| EEPROM_FILENAME						| ???			| ffh 255				| Power Panic Filename 								| ??? 			| D3 Ax0f95 C8
-| 0x0F91h 3985		| uint32	| EEPROM_FILE_POSITION					| ???			| ff ff ff ffh			| Power Panic File Position							| ??? 			| D3 Ax0f91 C4
-| 0x0F8Dh 3981		| float		| EEPROM_UVLO_CURRENT_POSITION_Z		| ???			| ff ff ff ffh			| Power Panic Z Position	 						| ^ 			| D3 Ax0f8d C4
-| 0x0F8Ch 3980		| ???		| EEPROM_UVLO_UNUSED_001				| ??? 			| ffh 255				| Power Panic _unused_								| ^ 			| D3 Ax0f8c C1
-| 0x0F8Bh 3979		| uint8		| EEPROM_UVLO_TARGET_BED				| ???			| ffh 255				| Power Panic Bed temperature						| ^ 			| D3 Ax0f8b C1
-| 0x0F89h 3977		| uint16	| EEPROM_UVLO_FEEDRATE					| ???			| ff ffh 65535			| Power Panic Feedrate								| ^ 			| D3 Ax0f89 C2
-| 0x0F88h 3976		| uint8		| EEPROM_UVLO_FAN_SPEED					| ???			| ffh 255				| Power Panic Fan speed								| ^ 			| D3 Ax0f88 C1
-| 0x0F87h 3975		| uint8		| EEPROM_FAN_CHECK_ENABLED				| 00h 0			| ???					| Fan Check __disabled__							| LCD menu		| D3 Ax0f87 C1
-| ^					| ^			| ^										| 01h 1			| ffh 255				| Fan Check __enabled__ 							| ^ 			| ^
-| 0x0F75h 3957		| uint16	| EEPROM_UVLO_MESH_BED_LEVELING			| ???			| ff ffh 65535			| Power Panic Mesh Bed Leveling						| ???			| D3 Ax0f75 C18 
-| 0x0F73h 3955		| uint16	| EEPROM_UVLO_Z_MICROSTEPS				| ???			| ff ffh 65535			| Power Panic Z microsteps							| ???			| D3 Ax0f73 C2 
-| 0x0F72h 3954		| uint8		| EEPROM_UVLO_E_ABS						| ???			| ffh 255				| Power Panic ??? position							| ???			| D3 Ax0f72 C1
-| 0x0F6Eh 3950		| float		| EEPROM_UVLO_CURRENT_POSITION_E		| ???			| ff ff ff ffh			| Power Panic E position							| ???			| D3 Ax0f6e C4
-| 0x0F6Ch 3948		| uint16_t	| EEPROM_UVLO_SAVED_SEGMENT_IDX			| all			| ff ffh 65535			| Power Panic index of multi-segment move			| ???			| D3 Ax0f6c C2
-| 0x0F6Bh 3947		| ???		| _EEPROM_FREE_NR4_						| ???			| ffh 255				| _Free EEPROM space_								| _free space_	| D3 Ax0f6b C1
-| 0x0F6Ah 3946		| ???		| _EEPROM_FREE_NR5_						| ???			| ffh 255				| _Free EEPROM space_								| _free space_	| D3 Ax0f6a C1
-| 0x0F69h 3945		| uint8		| EEPROM_CRASH_DET						| ffh 255		| ffh 255				| Crash detection: __enabled__						| LCD menu		| D3 Ax0f69 C1
-| ^					| ^			| ^										| 00h 0			| ^						| Crash detection: __disabled__						| LCD menu		| ^
-| 0x0F68h 3944		| uint8		| EEPROM_CRASH_COUNT_Y					| 00h-ffh 0-255	| ffh 255		__S/P__	| Crashes detected on y axis						| ???			| D3 Ax0f68 C1
-| 0x0F67h 3943		| uint8		| EEPROM_FSENSOR						| 01h 1			| ffh 255		__P__	| Filament sensor: __enabled__						| LCD menu		| D3 Ax0f67 C1
-| ^					| ^			| ^										| 00h 0			| ^						| Filament sensor: __disabled__						| LCD menu		| ^
-| 0x0F65h 3942		| uint8		| EEPROM_CRASH_COUNT_X					| 00h-ffh 0-255	| ffh 255		__S/P__	| Crashes detected on x axis						| ???			| D3 Ax0f66 C1
-| 0x0F65h 3941		| uint8		| EEPROM_FERROR_COUNT					| 00h-ffh 0-255	| ffh 255		__S/P__	| Filament sensor error counter						| ???			| D3 Ax0f65 C1
-| 0x0F64h 3940		| uint8		| EEPROM_POWER_COUNT					| 00h-ffh 0-255	| ffh 255		__S/P__	| Power failure counter								| ???			| D3 Ax0f64 C1
-| 0x0F60h 3936		| float		| EEPROM_XYZ_CAL_SKEW					| ???			| ff ff ff ffh			| XYZ skew value									| ???			| D3 Ax0f60 C4
-| 0x0F5Fh 3935		| uint8		| EEPROM_WIZARD_ACTIVE					| 01h 1			| 01h 1			__P__	| Wizard __active__									| ???			| D3 Ax0f5f C1
-| ^					| ^			| ^										| 00h 0			| ^						| Wizard __inactive__								| ^ 			| ^
-| ^					| ^			| ^										| 02h 2			| 02h 2			__M__	| Wizard active - Z cal after shipping/service prep | ^ 			| ^
-| 0x0F5Dh 3933		| uint16	| EEPROM_BELTSTATUS_X					| ???			| ff ffh				| X Beltstatus 										| ???			| D3 Ax0f5d C2
-| 0x0F5Bh 3931		| uint16	| EEPROM_BELTSTATUS_Y					| ???			| ff ffh				| Y Beltstatus 										| ???			| D3 Ax0f5b C2
-| 0x0F5Ah 3930		| uint8		| EEPROM_DIR_DEPTH						| 00h-ffh 0-255	| ffh 255				| Directory depth									| ???			| D3 Ax0f5a C1
-| 0x0F0Ah 3850		| uint8		| EEPROM_DIRS							| ???			| ffh 255				| Directories ???									| ???			| D3 Ax0f0a C80
-| 0x0F09h 3849		| uint8		| EEPROM_SD_SORT						| 00h 0			| ffh 255				| SD card sort by: 	__time__						| LCD menu		| D3 Ax0f09 C1
-| ^					| ^			| ^										| 01h 1			| ^						| SD card sort by: 	__alphabet__					| LCD menu		| ^
-| ^					| ^			| ^										| 02h 1			| ^						| SD card:			__not sorted__					| LCD menu		| ^
-| 0x0F08h 3848		| uint8		| EEPROM_SECOND_SERIAL_ACTIVE			| 00h 0			| ffh 255				| RPi Port: __disabled__							| LCD menu		| D3 Ax0f08 C1
-| ^					| ^			| ^										| 01h 1			| ^						| RPi Port: __enabled__								| LCD menu		| ^
-| 0x0F07h 3847		| uint8		| EEPROM_FSENS_AUTOLOAD_ENABLED			| 01h 1			| ffh 255		__P__	| Filament autoload: __enabled__					| LCD menu		| D3 Ax0f07 C1
-| ^					| ^			| ^										| 00h 0			| ^						| Filament autoload: __disabled__					| LCD menu		| ^
-| 0x0F05h 3845		| uint16	| EEPROM_CRASH_COUNT_X_TOT				| 0000-fffe		| ff ffh		__S/P__	| Total crashes on x axis	  						| ???			| D3 Ax0f05 C2
-| 0x0F03h 3843		| uint16	| EEPROM_CRASH_COUNT_Y_TOT				| 0000-fffe		| ff ffh		__S/P__	| Total crashes on y axis  							| ???			| D3 Ax0f03 C2
-| 0x0F01h 3841		| uint16	| EEPROM_FERROR_COUNT_TOT				| 0000-fffe		| ff ffh		__S/P__	| Total filament sensor errors 						| ???			| D3 Ax0f01 C2
-| 0x0EFFh 3839		| uint16	| EEPROM_POWER_COUNT_TOT				| 0000-fffe		| ff ffh		__S/P__	| Total power failures		  						| ???			| D3 Ax0eff C2
-| 0x0EFEh 3838		| uint8		| EEPROM_TMC2130_HOME_X_ORIGIN			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0efe C1
-| 0x0EFDh 3837		| uint8		| EEPROM	MC2130_HOME_X_BSTEPS		| ???			| ffh 255		    	| ???						  						| ???			| D3 Ax0efd C1
-| 0x0EFCh 3836		| uint8		| EEPROM_TMC2130_HOME_X_FSTEPS			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0efc C1
-| 0x0EFBh 3835		| uint8		| EEPROM_TMC2130_HOME_Y_ORIGIN			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0efb C1
-| 0x0EFAh 3834		| uint8		| EEPROM_TMC2130_HOME_Y_BSTEPS			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0efa C1
-| 0x0EF9h 3833		| uint8		| EEPROM_TMC2130_HOME_Y_FSTEPS			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef9 C1
-| 0x0EF8h 3832		| uint8		| EEPROM_TMC2130_HOME_ENABLED			| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef8 C1
-| 0x0EF7h 3831		| uint8		| EEPROM_TMC2130_WAVE_X_FAC				| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef7 C1
-| 0x0EF6h 3830		| uint8		| EEPROM_TMC2130_WAVE_Y_FAC				| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef6 C1
-| 0x0EF5h 3829		| uint8		| EEPROM_TMC2130_WAVE_Z_FAC				| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef5 C1
-| 0x0EF4h 3828		| uint8		| EEPROM_TMC2130_WAVE_E_FAC				| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef4 C1
-| 0x0EF3h 3827		| uint8		| EEPROM_TMC2130_X_MRES					| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef3 C1
-| 0x0EF2h 3826		| uint8		| EEPROM_TMC2130_Y_MRES					| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef2 C1
-| 0x0EF1h 3825		| uint8		| EEPROM_TMC2130_Z_MRES					| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef1 C1
-| 0x0EF0h 3824		| uint8		| EEPROM_TMC2130_E_MRES					| ???			| ffh 255				| ???						  						| ???			| D3 Ax0ef0 C1
-| 0x0EEE 3822		| uint16 	| EEPROM_PRINTER_TYPE					| ???			| ff ffh 65535			| Printer Type										| ???			| D3 Ax0eee C2
-| ^					| ^			| ^										| 64 00h 100	| ^						| PRINTER_MK1										| ???			| ^
-| ^					| ^			| ^										| c8 00h 200	| ^						| PRINTER_MK2										| ???			| ^
-| ^					| ^			| ^										| c9 00h 201	| ^						| PRINTER_MK2 with MMU1								| ???			| ^
-| ^					| ^			| ^										| ca 00h 202	| ^						| PRINTER_MK2S										| ???			| ^
-| ^					| ^			| ^										| cb 00h 203	| ^						| PRINTER_MK2S with MMU1							| ???			| ^
-| ^					| ^			| ^										| fa 00h 250	| ^						| PRINTER_MK2.5										| ???			| ^
-| ^					| ^			| ^										| 1a 4fh 20250	| ^						| PRINTER_MK2.5 with MMU2							| ???			| ^
-| ^					| ^			| ^										| fc 00h 252	| ^						| PRINTER_MK2.5S									| ???			| ^
-| ^					| ^			| ^										| 1c 4fh 20252	| ^						| PRINTER_MK2.5S with MMU2S							| ???			| ^
-| ^					| ^			| ^										| 2c 01h 300	| ^						| PRINTER_MK3										| ???			| ^
-| ^					| ^			| ^										| 4c 4fh 20300	| ^						| PRINTER_MK3 with MMU2								| ???			| ^
-| ^					| ^			| ^										| 2e 01h 302	| ^						| PRINTER_MK3S										| ???			| ^
-| ^					| ^			| ^										| 4e 4fh 20302	| ^						| PRINTER_MK3S with MMU2S							| ???			| ^
-| 0x0EEC 3820		| uint16	| EEPROM_BOARD_TYPE						| ???			| ff ffh 65535			| Board Type										| ???			| D3 Ax0eec C2
-| ^					| ^			| ^										| c8 00h 200	| ^						| BOARD_RAMBO_MINI_1_0								| ???			| ^
-| ^					| ^			| ^										| cb 00h 203	| ^						| BOARD_RAMBO_MINI_1_3								| ???			| ^
-| ^					| ^			| ^										| 36 01h 310	| ^						| BOARD_EINSY_1_0a									| ???			| ^
-| 0x0EE8 3816		| float		| EEPROM_EXTRUDER_MULTIPLIER_0			| ???			| ff ff ff ffh			| Power panic Extruder 0 multiplier					| ???			| D3 Ax0ee8 C4
-| 0x0EE4 3812		| float		| EEPROM_EXTRUDER_MULTIPLIER_1			| ???			| ff ff ff ffh			| Power panic Extruder 1 multiplier					| ???			| D3 Ax0ee4 C4
-| 0x0EE0 3808		| float		| EEPROM_EXTRUDER_MULTIPLIER_2			| ???			| ff ff ff ffh			| Power panic Extruder 2 multiplier					| ???			| D3 Ax0ee0 C4
-| 0x0EDE 3806		| uint16	| EEPROM_EXTRUDEMULTIPLY				| ???			| ff ffh 65535			| Power panic Extruder multiplier					| ???			| D3 Ax0ede C2
-| 0x0EDA 3802		| float		| EEPROM_UVLO_TINY_CURRENT_POSITION_Z	| ???			| ff ff ff ffh			| Power panic Z position							| ???			| D3 Ax0eda C4
-| 0x0ED8 3800		| uint16	| EEPROM_UVLO_TARGET_HOTEND				| ???			| ff ffh 65535			| Power panic target Hotend temperature				| ???			| D3 Ax0ed8 C2
-| 0x0ED7 3799		| uint8		| EEPROM_SOUND_MODE						| 00h 0			| ffh 255				| Sound mode: __loud__								| ???			| D3 Ax0ed7 C1
-| ^					| ^			| ^										| 01h 1			| ^						| Sound mode: __once__								| ^				| ^
-| ^					| ^			| ^										| 02h 1			| ^						| Sound mode: __silent__							| ^				| ^
-| ^					| ^			| ^										| 03h 1			| ^						| Sound mode: __assist__							| ^				| ^
-| 0x0ED6 3798		| bool		| EEPROM_SPOOL_JOIN					| 01h 1			| ffh 255				| MMU2/s autodeplete: __on__						| ???			| D3 Ax0ed6 C1
-| ^					| ^			| ^										| 00h 0			| ^						| MMU2/s autodeplete: __off__						| ^				| ^
-| 0x0ED5 3797		| bool		| EEPROM_FSENS_RUNOUT_ENABLED			| 01h 1			| ffh 255		__P__	| Filament runout: __enabled__						| LCD menu		| D3 Ax0ed5 C1
-| ^					| ^			| ^										| 00h 0			| ^						| Filament runout: __disabled__						| LCD menu		| ^
-| 0x0ED3 3795		| uint16	| EEPROM_MMU_FAIL_TOT					| ???			| ff ffh 65535	__S/P__	| MMU2/s total failures								| ???			| D3 Ax0ed3 C2
-| 0x0ED2 3794		| uint8		| EEPROM_MMU_FAIL						| ???			| ffh 255		__S/P__	| MMU2/s fails during print							| ???			| D3 Ax0ed2 C1
-| 0x0ED0 3792		| uint16	| EEPROM_MMU_LOAD_FAIL_TOT				| ???			| ff ffh 65535	__S/P__	| MMU2/s total load failures						| ???			| D3 Ax0ed0 C2
-| 0x0ECF 3791		| uint8		| EEPROM_MMU_LOAD_FAIL					| ???			| ffh 255		__S/P__	| MMU2/s load failures during print					| ???			| D3 Ax0ecf C1
-| 0x0ECE 3790		| uint8		| EEPROM_MMU_CUTTER_ENABLED				| 00h 0			| ffh 255				| MMU2/s cutter: __disabled__						| LCD menu		| D3 Ax0ece C1
-| ^					| ^			| ^										| 01h 1			| ^						| MMU2/s cutter: __enabled__						| ^				| ^
-| ^					| ^			| ^										| 02h 2			| ^						| MMU2/s cutter: __always__							| ^				| ^
-| 0x0DAE 3502		| uint16	| EEPROM_UVLO_MESH_BED_LEVELING_FULL	| ???			| ff ffh 65535			| Power panic Mesh bed leveling points 				| ???			| D3 Ax0dae C288
-| 0x0DAD 3501		| uint8		| EEPROM_MBL_TYPE						| ???			| ffh 255				| Mesh bed leveling precision 		_unused atm_	| ???			| D3 Ax0dad C1
-| 0x0DAC 3500		| bool		| EEPROM_MBL_MAGNET_ELIMINATION			| 01h 1			| ffh 255				| Mesh bed leveling does: __ignores__ magnets		| LCD menu		| D3 Ax0dac C1
-| ^					| ^			| ^										| 00h 0			| ^						| Mesh bed leveling does: __NOT ignores__ magnets	| ^				| ^
-| 0x0DAB 3499		| uint8		| EEPROM_MBL_POINTS_NR					| 03h 3			| ffh 255				| Mesh bed leveling points: __3x3__					| LCD menu		| D3 Ax0dab C1
-| ^					| ^			| ^										| 07h 7			| ^						| Mesh bed leveling points: __7x7__					| ^				| ^
-| 0x0DAA 3498		| uint8		| EEPROM_MBL_PROBE_NR					| 03h 3			| ffh 255				| MBL times measurements for each point: __3__ 		| LCD menu		| D3 Ax0daa C1
-| ^					| ^			| ^										| 05h 5			| ^						| MBL times measurements for each point: __5__		| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| MBL times measurements for each point: __1__		| ^				| ^
-| 0x0DA9 3497		| uint8		| EEPROM_MMU_STEALTH					| 01h 1			| ffh 255				| MMU2/s Silent mode: __on__						| ???			| D3 Ax0da9 C1
-| ^					| ^			| ^										| 00h 0			| ^						| MMU2/s Silent mode: __off__						| ^				| ^
-| 0x0DA8 3496		| uint8		| EEPROM_CHECK_MODE						| 01h 1			| ffh 255				| Check mode for nozzle is: __warn__				| LCD menu		| D3 Ax0da8 C1
-| ^					| ^			| ^										| 02h 0			| ^						| Check mode for nozzle is: __strict__				| ^				| ^
-| ^					| ^			| ^										| 00h 0			| ^						| Check mode for nozzle is: __none__				| ^				| ^
-| 0x0DA7 3495		| uint8		| EEPROM_NOZZLE_DIAMETER				| 28h 40		| ffh 255				| Nozzle diameter is: __40 or 0.40mm__				| LCD menu		| D3 Ax0da7 C1
-| ^					| ^			| ^										| 3ch 60		| ^						| Nozzle diameter is: __60 or 0.60mm__				| ^				| ^
-| ^					| ^			| ^										| 3ch 80		| ^						| Nozzle diameter is: __80 or 0.80mm__				| ^				| ^
-| ^					| ^			| ^										| 19h 25		| ^						| Nozzle diameter is: __25 or 0.25mm__				| ^				| ^
-| 0x0DA5 3493		| uint16	| EEPROM_NOZZLE_DIAMETER_uM				| 9001h			| ff ffh 65535			| Nozzle diameter is: __400um__						| LCD menu		| D3 Ax0da5 C2
-| ^					| ^			| ^										| 5802h			| ^						| Nozzle diameter is: __600um__						| ^				| ^
-| ^					| ^			| ^										| 2003h			| ^						| Nozzle diameter is: __800um__						| ^				| ^
-| ^					| ^			| ^										| fa00h			| ^						| Nozzle diameter is: __250um__						| ^				| ^
-| 0x0DA4 3492		| uint8		| EEPROM_CHECK_MODEL					| 01h 1			| ffh 255				| Check mode for printer model is: __warn__			| LCD menu		| D3 Ax0da4 C1
-| ^					| ^			| ^										| 02h 0			| ^						| Check mode for printer model is: __strict__		| ^				| ^
-| ^					| ^			| ^										| 00h 0			| ^						| Check mode for printer model is: __none__			| ^				| ^
-| 0x0DA3 3491		| uint8		| EEPROM_CHECK_VERSION					| 01h 1			| ffh 255				| Check mode for firmware is: __warn__				| LCD menu		| D3 Ax0da3 C1
-| ^					| ^			| ^										| 02h 0			| ^						| Check mode for firmware is: __strict__			| ^				| ^
-| ^					| ^			| ^										| 00h 0			| ^						| Check mode for firmware is: __none__				| ^				| ^
-| 0x0DA2 3490		| uint8		| EEPROM_CHECK_GCODE					| 01h 1			| ffh 255				| Check mode for gcode is: __warn__ _unused atm_	| LCD menu		| D3 Ax0da2 C1
-| ^					| ^			| ^										| 02h 0			| ^						| Check mode for gcode is: __strict__ _unused atm_	| ^				| ^
-| ^					| ^			| ^										| 00h 0			| ^						| Check mode for gcode is: __none__ _unused atm_	| ^				| ^
-| 0x0D49 3401		| uint16	| EEPROM_SHEETS_BASE					| ???			| ffh 255				| ???												| LCD menu		| D3 Ax0d49 C89
-| 0x0D49 3401		| char		| _1st Sheet block_						| 536d6f6f746831| ffffffffffffff		| 1st sheet - Name: 	_Smooth1_					| ^				| D3 Ax0d49 C7
-| 0x0D50 3408		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 1st sheet - Z offset 								| ^				| D3 Ax0d50 C2	
-| 0x0D52 3410		| uint8		| ^										| 00h 0			| ffh 255				| 1st sheet - bed temp 								| ^				| D3 Ax0d52 C1	
-| 0x0D53 3411		| uint8		| ^										| 00h 0			| ffh 255				| 1st sheet - PINDA temp 							| ^				| D3 Ax0d53 C1	
-| 0x0D54 3412		| char		| _2nd Sheet block_						| 536d6f6f746832| ffffffffffffff		| 2nd sheet - Name: 	_Smooth2_					| ^				| D3 Ax0d54 C7
-| 0x0D5B 3419		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 2nd sheet - Z offset 								| ^				| D3 Ax0d5b C2	
-| 0x0D5D 3421		| uint8		| ^										| 00h 0			| ffh 255				| 2nd sheet - bed temp 								| ^				| D3 Ax0d5d C1	
-| 0x0D5E 3422		| uint8		| ^										| 00h 0			| ffh 255				| 2nd sheet - PINDA temp 							| ^				| D3 Ax0d5e C1	
-| 0x0D5F 3423		| char		| _3rd Sheet block_						| 54657874757231| ffffffffffffff		| 3rd sheet - Name: 	_Textur1_					| ^				| D3 Ax0d5f C7
-| 0x0D66 3430		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 3rd sheet - Z offset 								| ^				| D3 Ax0d66 C2	
-| 0x0D68 3432		| uint8		| ^										| 00h 0			| ffh 255				| 3rd sheet - bed temp 								| ^				| D3 Ax0d68 C1	
-| 0x0D69 3433		| uint8		| ^										| 00h 0			| ffh 255				| 3rd sheet - PINDA temp 							| ^				| D3 Ax0d69 C1	
-| 0x0D6A 3434		| char		| _4th Sheet block_						| 54657874757232| ffffffffffffff		| 4th sheet - Name: 	_Textur2_					| ^				| D3 Ax0d6a C7
-| 0x0D71 3441		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 4th sheet - Z offset 								| ^				| D3 Ax0d71 C2	
-| 0x0D73 3443		| uint8		| ^										| 00h 0			| ffh 255				| 4th sheet - bed temp 								| ^				| D3 Ax0d73 C1	
-| 0x0D74 3444		| uint8		| ^										| 00h 0			| ffh 255				| 4th sheet - PINDA temp 							| ^				| D3 Ax0d74 C1	
-| 0x0D75 3445		| char		| _5th Sheet block_						| 536174696e2031| ffffffffffffff		| 5th sheet - Name: 	_Satin 1_					| ^				| D3 Ax0d75 C7
-| 0x0D7C 3452		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 5th sheet - Z offset 								| ^				| D3 Ax0d7c C2	
-| 0x0D7E 3454		| uint8		| ^										| 00h 0			| ffh 255				| 5th sheet - bed temp 								| ^				| D3 Ax0d7e C1	
-| 0x0D7F 3455		| uint8		| ^										| 00h 0			| ffh 255				| 5th sheet - PINDA temp 							| ^				| D3 Ax0d7f C1	
-| 0x0D80 3456		| char		| _6th Sheet block_						| 536174696e2032| ffffffffffffff		| 6th sheet - Name: 	_Satin 2_					| ^				| D3 Ax0d80 C7
-| 0x0D87 3463		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 6th sheet - Z offset 								| ^				| D3 Ax0d87 C2	
-| 0x0D89 3465		| uint8		| ^										| 00h 0			| ffh 255				| 6th sheet - bed temp 								| ^				| D3 Ax0d89 C1	
-| 0x0D8A 3466		| uint8		| ^										| 00h 0			| ffh 255				| 6th sheet - PINDA temp 							| ^				| D3 Ax0d8a C1	
-| 0x0D8B 3467		| char		| _7th Sheet block_						| 437573746f6d31| ffffffffffffff		| 7th sheet - Name: 	_Custom1_					| ^				| D3 Ax0d8b C7
-| 0x0D92 3474		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 7th sheet - Z offset 								| ^				| D3 Ax0d92 C2	
-| 0x0D94 3476		| uint8		| ^										| 00h 0			| ffh 255				| 7th sheet - bed temp 								| ^				| D3 Ax0d94 C1	
-| 0x0D95 3477		| uint8		| ^										| 00h 0			| ffh 255				| 7th sheet - PINDA temp 							| ^				| D3 Ax0d95 C1	
-| 0x0D96 3478		| char		| _8th Sheet block_						| 437573746f6d32| ffffffffffffff		| 8th sheet - Name: 	_Custom2_					| ^				| D3 Ax0d96 C7
-| 0x0D9D 3485		| uint16	| ^										| 00 00h 0		| ff ffh 65535			| 8th sheet - Z offset 								| ^				| D3 Ax0d9d C2	
-| 0x0D9F 3487		| uint8		| ^										| 00h 0			| ffh 255				| 8th sheet - bed temp 								| ^				| D3 Ax0d9f C1	
-| 0x0DA0 3488		| uint8		| ^										| 00h 0			| ffh 255				| 8th sheet - PINDA temp 							| ^				| D3 Ax0da0 C1	
-| 0x0DA1 3489		| uint8		| ???									| 00h 0			| ffh 255				| ???												| ???			| D3 Ax0da1 C1
-| 0x0D48 3400		| uint8		| EEPROM_FSENSOR_PCB					| ffh 255		| ffh 255				| Filament Sensor type IR unknown					| LCD Support	| D3 Ax0d48 C1
-| ^					| ^			| ^										| 00h 0			| ^						| Filament Sensor type IR 0.3 or older				| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| Filament Sensor type IR 0.4 or newer				| ^				| ^
-| 0x0D47 3399		| uint8		| EEPROM_FSENSOR_ACTION_NA				| 00h 0			| ffh 255				| Filament Sensor action: __Continue__				| LCD menu		| D3 Ax0d47 C1
-| ^					| ^			| ^										| 01h 1			| ^						| Filament Sensor action: __Pause__					| ^				| ^
-| 0x0D37 3383		| float		| EEPROM_UVLO_SAVED_START_POSITION		| ???			| ff ff ff ffh			| Power panic saved start position all-axis			| ???			| D3 Ax0d37 C16
-| ^					| ^			| ^										| ???			| ^						| Power panic saved start position e-axis			| ^				| D3 Ax0d43 C4
-| ^					| ^			| ^										| ???			| ^						| Power panic saved start position z-axis			| ^				| D3 Ax0d3f C4
-| ^					| ^			| ^										| ???			| ^						| Power panic saved start position y-axis			| ^				| D3 Ax0d3b C4
-| ^					| ^			| ^										| ???			| ^						| Power panic saved start position x-axis			| ^				| D3 Ax0d37 C4
-| 0x0D35 3381		| uint16	| EEPROM_UVLO_FEEDMULTIPLY				| ???			| ff ffh 65355			| Power panic saved feed multiplier					| ???			| D3 Ax0d35 C2
-| 0x0D34 3380		| uint8		| EEPROM_BACKLIGHT_LEVEL_HIGH			| 00h - ffh 	| 82h 130				| LCD backlight bright:	__128__	Dim value to 255	| LCD menu		| D3 Ax0d34 C1
-| 0x0D33 3379		| uint8		| EEPROM_BACKLIGHT_LEVEL_LOW			| 00h - ffh		| 32h 50				| LCD backlight dim:	__50__ 	0 to Bright value	| LCD menu		| D3 Ax0d33 C1
-| 0x0D32 3378		| uint8		| EEPROM_BACKLIGHT_MODE					| 02h 2			| ffh 255				| LCD backlight mode: __Auto__						| LCD menu		| D3 Ax0d32 C1
-| ^					| ^			| ^										| 01h 1			| ^						| LCD backlight mode: __Bright__					| ^				| ^
-| ^					| ^			| ^										| 00h 0			| ^						| LCD backlight mode: __Dim__						| ^				| ^
-| 0x0D30 3376		| uint16	| EEPROM_BACKLIGHT_TIMEOUT				| 01 00 - ff ff | 0a 00h 65535			| LCD backlight timeout: __10__ seconds				| LCD menu		| D3 Ax0d30 C2
-| 0x0D2C 3372		| float		| EEPROM_UVLO_LA_K						| ???			| ff ff ff ffh			| Power panic saved Linear Advanced K value			| ???			| D3 Ax0d2c C4
-| 0x0D2B 3371		| uint8		| EEPROM_ALTFAN_OVERRIDE				| ffh 255		| ffh 255				| ALTFAN override unknown state						| LCD menu		| D3 Ax0d2b C1
-| ^					| ^			| ^										| 00h 0			| ^						| ALTFAN override deactivated						| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| ALTFAN override activated 						| ^				| ^
-| 0x0D2A 3370		| uint8		| EEPROM_EXPERIMENTAL_VISIBILITY		| ffh 255		| ffh 255				| Experimental menu visibility unknown state		| LCD menu		| D3 Ax0d2a C1
-| ^					| ^			| ^										| 00h 0			| ^						| Experimental menu visibility hidden				| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| Experimental menu visibility visible				| ^				| ^
-| 0x0D29 3369		| uint8		| EEPROM_PINDA_TEMP_COMPENSATION   		| ffh 255		| ffh 255				| PINDA temp compensation unknown state	            | LCD menu		| D3 Ax0d29 C1
-| ^					| ^			| ^										| 00h 0			| ^						| PINDA has no temp compensation PINDA v1/2    		| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| PINDA has temp compensation aka SuperPINDA       	| ^				| ^
-| 0x0D15 3349		| char[20]	| EEPROM_PRUSA_SN						| SN[19] == 0	| ffffffffffffffff...	| PRUSA Serial number string						| PRUSA SN		| D3 Ax0d15 C20
-| 0x0D11 3345		| float		| EEPROM_UVLO_ACCELL                	| ???			| ff ff ff ffh			| Power panic saved normal acceleration     		| ???			| D3 Ax0d11 C4
-| 0x0D0D 3341		| float		| EEPROM_UVLO_RETRACT_ACCELL			| ???			| ff ff ff ffh			| Power panic saved retract acceleration     		| ???			| D3 Ax0d0d C4
-| 0x0D09 3337		| float		| EEPROM_UVLO_TRAVEL_ACCELL				| ???			| ff ff ff ffh			| Power panic saved travel acceleration     		| ???			| D3 Ax0d09 C4
-| 0x0D05 3333		| uint32_t	| EEPROM_JOB_ID							| ???			| 00 00 00 00h			| Job ID used by host software						| D3 only		| D3 Ax0d05 C4
-| 0x0D04 3332		| uint8_t	| EEPROM_ECOOL_ENABLE					| ffh 255		| ^						| Disable extruder motor scaling for non-farm print	| LCD menu		| D3 Ax0d04 C1
-| ^					| ^			| ^										| 2ah 42		| ^						| Enable extruder motor scaling for non-farm print	| ^				| D3 Ax0d04 C1
-| 0x0D03 3321		| uint8_t	| EEPROM_FW_CRASH_FLAG					| ffh 255   	| ffh 255				| Last FW crash reason (dump_crash_reason)			| D21/D22		| D3 Ax0d03 C1
-| ^					| ^			| ^										| 00h 0			| ^						| manual											| ^				| ^
-| ^					| ^			| ^										| 01h 1			| ^						| stack_error										| ^				| ^
-| ^					| ^			| ^										| 02h 2			| ^						| watchdog											| ^				| ^
-| ^					| ^			| ^										| 03h 3			| ^						| bad_isr											| ^				| ^
-| ^					| ^			| ^										| 04h 4			| ^						| bad_pullup_temp_isr								| ^				| ^
-| ^					| ^			| ^										| 05h 5			| ^						| bad_pullup_step_isr								| ^				| ^
-| 0x0D02 3320		| uint8_t	| EEPROM_FSENSOR_JAM_DETECTION			| 01h 1			| ff/01					| fsensor pat9125 jam detection feature				| LCD menu		| D3 Ax0d02 C1
-| 0x0D01 3319		| uint8_t	| EEPROM_MMU_ENABLED        			| 01h 1			| ff/01					| MMU enabled                       				| LCD menu		| D3 Ax0d01 C1
-
-| Address begin		| Bit/Type 	| Name 									| Valid values	| Default/FactoryReset	| Description 										| Gcode/Function| Debug code
-| :--:				| :--: 		| :--: 									| :--:			| :--:					| :--:												| :--:			| :--:
-| 0x0012 18			| uint16	| EEPROM_FIRMWARE_VERSION_END			| ???			| ff ffh 65535			| ???												| ???			| D3 Ax0012 C2
-| 0x0010 16			| uint16	| EEPROM_FIRMWARE_VERSION_FLAVOR		| ???			| ff ffh 65535			| ???												| ???			| D3 Ax0010 C2
-| 0x000E 14			| uint16	| EEPROM_FIRMWARE_VERSION_REVISION		| ???			| ff ffh 65535			| Firmware version revision number DEV/ALPHA/BETA/RC| ???			| D3 Ax000e C2
-| 0x000C 12			| uint16	| EEPROM_FIRMWARE_VERSION_MINOR			| ???			| ff ffh 65535			| Firmware version minor number						| ???			| D3 Ax000c C2
-| 0x000A 10			| uint16	| EEPROM_FIRMWARE_VERSION_MAJOR			| ???			| ff ffh 65535			| Firmware version major number 					| ???			| D3 Ax000a C2
-| 0x0000 0			| char		| FW_PRUSA3D_MAGIC						| ???			| ffffffffffffffffffff	| __`PRUSA3DFW`__				 					| ???			| D3 Ax0000 C10
+
+
+|Address begin|Bit/Type | Name                                  | Valid values | Default/FactoryReset  | Description                                       |Gcode/Function| Debug code
+| :--         | :--     | :--                                   | :--:         | :--:                  | :--                                               | :--:         | :--:
+| 0x0FFF 4095 | uchar   | EEPROM_SILENT                         | 00h 0        | ffh 255               | TMC Stealth mode: __off__ / miniRambo Power mode  | LCD menu     | D3 Ax0fff C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | TMC Stealth mode: __on__ / miniRambo Silent mode  | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | miniRambo Auto mode                               | ^            | ^
+| 0x0FFE 4094 | uchar   | EEPROM_LANG                           | 00h 0        | ffh 255         __L__ | English / LANG_ID_PRI                             | LCD menu     | D3 Ax0ffe C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Other language LANG_ID_SEC                        | ^            | ^
+| 0x0FFC 4092 | uint16  | EEPROM_BABYSTEP_X                     | ???          | ff ffh 65535          | Babystep for X axis _unsued_                      | ???          | D3 Ax0ffc C2
+| 0x0FFA 4090 | uint16  | EEPROM_BABYSTEP_Y                     | ???          | ff ffh 65535          | Babystep for Y axis _unsued_                      | ^            | D3 Ax0ffa C2
+| 0x0FF8 4088 | uint16  | EEPROM_BABYSTEP_Z                     | ???          | ff ffh 65535          | Babystep for Z axis _lagacy_                      | ^            | D3 Ax0ff8 C2
+| ^           | ^       | ^                                     | ^            | ^                     | multiple values stored now in EEPROM_Sheets_base  | ^            | ^
+| 0x0FF7 4087 | uint8   | EEPROM_CALIBRATION_STATUS             | ffh 255      | ffh 255               | Assembled _default_                               | ???          | D3 Ax0ff7 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Calibrated                                        | ^            | ^
+| ^           | ^       | ^                                     | e6h 230      | ^                     | needs Live Z adjustment                           | ^            | ^
+| ^           | ^       | ^                                     | f0h 240      | ^               __P__ | needs Z calibration                               | ^            | ^
+| ^           | ^       | ^                                     | fah 250      | ^                     | needs XYZ calibration                             | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Unknown                                           | ^            | ^
+| 0x0FF5 4085 | uint16  | EEPROM_BABYSTEP_Z0                    | ???          | ff ffh 65535          | Babystep for Z ???                                | ???          | D3 Ax0ff5 C2
+| 0x0FF1 4081 | unint32 | EEPROM_FILAMENTUSED                   | ???          | 00 00 00 00h 0 __S/P__| Filament used in meters                           | ???          | D3 Ax0ff1 C4
+| 0x0FED 4077 | unint32 | EEPROM_TOTALTIME                      | ???          | 00 00 00 00h 0 __S/P__| Total print time                                  | ???          | D3 Ax0fed C4
+| 0x0FE5 4069 | float   | EEPROM_BED_CALIBRATION_CENTER         | ???          | ff ff ff ffh          | ???                                               | ???          | D3 Ax0fe5 C8
+| 0x0FDD 4061 | float   | EEPROM_BED_CALIBRATION_VEC_X          | ???          | ff ff ff ffh          | ???                                               | ???          | D3 Ax0fdd C8
+| 0x0FD5 4053 | float   | EEPROM_BED_CALIBRATION_VEC_Y          | ???          | ff ff ff ffh          | ???                                               | ???          | D3 Ax0fd5 C8
+| 0x0FC5 4037 | int16   | EEPROM_BED_CALIBRATION_Z_JITTER       | ???          | ff ffh 65535          | ???                                               | ???          | D3 Ax0fc5 C16
+| 0x0FC4 4036 | bool    | EEPROM_FARM_MODE                      | 00h 0        | ffh 255         __P__ | Prusa farm mode: __off__                          | G99          | D3 Ax0fc4 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Prusa farm mode: __on__                           | G98          | ^
+| 0x0FC3 4035 | free    | _EEPROM_FREE_NR1_                     | ???          | ffh 255               | _Free EEPROM space_                               | _free space_ | D3 Ax0fc3 C1
+| 0x0FC1 4033 | ???     | EEPROM_FARM_NUMBER                    | 000-999      | ff ffh / 000    __P__ | Prusa farm number _only 0-9 are allowed: 000-999_ | LCD menu     | D3 Ax0fc1 C2
+| 0x0FC0 4032 | bool    | EEPROM_BED_CORRECTION_VALID           | 00h 0        | 00h 0                 | Bed correction invalid                            | ???          | D3 Ax0fc0 C1
+| ^           | ^       | ^                                     | ffh 255      | ^                     | Bed correction valid                              | ???          | ^
+| 0x0FBF 4031 | char    | EEPROM_BED_CORRECTION_LEFT            | 00h ffh      | 00h 0                 | Bed manual correction left                        | LCD menu     | D3 Ax0fbf C1
+| ^           | ^       | ^                                     | ^            | ^                     | At this moment limited to +-100um                 | G80 Lxxx     | ^
+| 0x0FBE 4030 | char    | EEPROM_BED_CORRECTION_RIGHT           | 00h ffh      | 00h 0                 | Bed manual correction right                       | LCD menu     | D3 Ax0fbe C1
+| ^           | ^       | ^                                     | ^            | ^                     | At this moment limited to +-100um                 | G80 Rxxx     | ^
+| 0x0FBD 4029 | char    | EEPROM_BED_CORRECTION_FRONT           | 00h ffh      | 00h 0                 | Bed manual correction front                       | LCD menu     | D3 Ax0fbd C1
+| ^           | ^       | ^                                     | ^            | ^                     | At this moment limited to +-100um                 | G80 Fxxx     | ^
+| 0x0FBC 4028 | char    | EEPROM_BED_CORRECTION_BACK            | 00h ffh      | 00h 0                 | Bed manual correction back                        | LCD menu     | D3 Ax0fbc C1
+| ^           | ^       | ^                                     | ^            | ^                     | At this moment limited to +-100um                 | G80 Bxxx     | ^
+| 0x0FBB 4027 | bool    | EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY | 00h 0        | ffh 255               | Toshiba Air: __off__                              | LCD menu     | D3 Ax0fbb C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Toshiba Air: __on__                               | ^            | ^
+| 0x0FBA 4026 | uchar   | EEPROM_PRINT_FLAG                     | ???          | ???                   | _unsued_                                          | ???          | D3 Ax0fba C1
+| 0x0FB0 4016 | int16   | EEPROM_PROBE_TEMP_SHIFT               | ???          | ???                   | ???                                               | ???          | D3 Ax0fb0 C10
+| 0x0FAF 4015 | bool    | EEPROM_TEMP_CAL_ACTIVE                | 00h 0        | 00h 0                 | PINDA Temp cal.: __inactive__                     | LCD menu     | D3 Ax0faf C1
+| ^           | ^       | ^                                     | ffh 255      | ^                     | PINDA Temp cal.: __active__                       | ^            | ^
+| 0x0FA7 4007 | ???     | _EEPROM_FREE_NR6_                     | ???          | ffh 255               | _Free EEPROM space_                               | ???          | D3 Ax0fae C8
+| ^           | ^       | ^                                     | ^            | 00 00 00 00h          | ^                                                 | ^            | ^
+| 0x0FA6 4006 | uint8   | EEPROM_CALIBRATION_STATUS_PINDA       | 00h 0        | ffh 255               | PINDA Temp: __not calibrated__                    | ???          | D3 Ax0fa6 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | PINDA Temp: __calibrated__                        | ^            | ^
+| 0x0FA5 4005 | uint8   | EEPROM_UVLO                           | 00h 0        | ffh 255               | Power Panic flag: __inactive__                    | ???          | D3 Ax0fa5 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Power Panic flag: __active__                      | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Power Panic flag: __???__                         | ^            | ^
+| 0x0F9D 3997 | float   | EEPROM_UVLO_CURRENT_POSITION          | ???          | ffh 255               | Power Panic position                              | ???          | D3 Ax0f9d C8
+| 0x0F95 3989 | char    | EEPROM_FILENAME                       | ???          | ffh 255               | Power Panic Filename                              | ???          | D3 Ax0f95 C8
+| 0x0F91 3985 | unint32 | EEPROM_FILE_POSITION                  | ???          | ff ff ff ffh          | Power Panic File Position                         | ???          | D3 Ax0f91 C4
+| 0x0F8D 3981 | float   | EEPROM_UVLO_CURRENT_POSITION_Z        | ???          | ff ff ff ffh          | Power Panic Z Position                            | ^            | D3 Ax0f8d C4
+| 0x0F8C 3980 | ???     | EEPROM_UVLO_UNUSED_001                | ???          | ffh 255               | Power Panic _unused_                              | ^            | D3 Ax0f8c C1
+| 0x0F8B 3979 | uint8   | EEPROM_UVLO_TARGET_BED                | ???          | ffh 255               | Power Panic Bed temperature                       | ^            | D3 Ax0f8b C1
+| 0x0F89 3977 | uint16  | EEPROM_UVLO_FEEDRATE                  | ???          | ff ffh 65535          | Power Panic Feedrate                              | ^            | D3 Ax0f89 C2
+| 0x0F88 3976 | uint8   | EEPROM_UVLO_FAN_SPEED                 | ???          | ffh 255               | Power Panic Fan speed                             | ^            | D3 Ax0f88 C1
+| 0x0F87 3975 | uint8   | EEPROM_FAN_CHECK_ENABLED              | 00h 0        | ???                   | Fan Check __disabled__                            | LCD menu     | D3 Ax0f87 C1
+| ^           | ^       | ^                                     | 01h 1        | ffh 255               | Fan Check __enabled__                             | ^            | ^
+| 0x0F75 3957 | uint16  | EEPROM_UVLO_MESH_BED_LEVELING         | ???          | ff ffh 65535          | Power Panic Mesh Bed Leveling                     | ???          | D3 Ax0f75 C18
+| 0x0F73 3955 | uint16  | EEPROM_UVLO_Z_MICROSTEPS              | ???          | ff ffh 65535          | Power Panic Z microsteps                          | ???          | D3 Ax0f73 C2
+| 0x0F72 3954 | uint8   | EEPROM_UVLO_E_ABS                     | ???          | ffh 255               | Power Panic ??? position                          | ???          | D3 Ax0f72 C1
+| 0x0F6E 3950 | float   | EEPROM_UVLO_CURRENT_POSITION_E        | ???          | ff ff ff ffh          | Power Panic E position                            | ???          | D3 Ax0f6e C4
+| 0x0F6C 3948 | uint16  | EEPROM_UVLO_SAVED_SEGMENT_IDX         | all          | ff ffh 65535          | Power Panic index of multi-segment move           | ???          | D3 Ax0f6c C2
+| 0x0F6B 3947 | ???     | _EEPROM_FREE_NR4_                     | ???          | ffh 255               | _Free EEPROM space_                               | _free space_ | D3 Ax0f6b C1
+| 0x0F6A 3946 | ???     | _EEPROM_FREE_NR5_                     | ???          | ffh 255               | _Free EEPROM space_                               | _free space_ | D3 Ax0f6a C1
+| 0x0F69 3945 | uint8   | EEPROM_CRASH_DET                      | ffh 255      | ffh 255               | Crash detection: __enabled__                      | LCD menu     | D3 Ax0f69 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Crash detection: __disabled__                     | LCD menu     | ^
+| 0x0F68 3944 | uint8   | EEPROM_CRASH_COUNT_Y                  | 00h-ffh 0-255| ffh 255       __S/P__ | Crashes detected on y axis                        | ???          | D3 Ax0f68 C1
+| 0x0F67 3943 | uint8   | EEPROM_FSENSOR                        | 01h 1        | ffh 255         __P__ | Filament sensor: __enabled__                      | LCD menu     | D3 Ax0f67 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Filament sensor: __disabled__                     | LCD menu     | ^
+| 0x0F65 3942 | uint8   | EEPROM_CRASH_COUNT_X                  | 00h-ffh 0-255| ffh 255       __S/P__ | Crashes detected on x axis                        | ???          | D3 Ax0f66 C1
+| 0x0F65 3941 | uint8   | EEPROM_FERROR_COUNT                   | 00h-ffh 0-255| ffh 255       __S/P__ | Filament sensor error counter                     | ???          | D3 Ax0f65 C1
+| 0x0F64 3940 | uint8   | EEPROM_POWER_COUNT                    | 00h-ffh 0-255| ffh 255       __S/P__ | Power failure counter                             | ???          | D3 Ax0f64 C1
+| 0x0F60 3936 | float   | EEPROM_XYZ_CAL_SKEW                   | ???          | ff ff ff ffh          | XYZ skew value                                    | ???          | D3 Ax0f60 C4
+| 0x0F5F 3935 | uint8   | EEPROM_WIZARD_ACTIVE                  | 01h 1        | 01h 1           __P__ | Wizard __active__                                 | ???          | D3 Ax0f5f C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Wizard __inactive__                               | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | 02h 2           __M__ | Wizard active - Z cal after shipping/service prep | ^            | ^
+| 0x0F5D 3933 | uint16  | EEPROM_BELTSTATUS_X                   | ???          | ff ffh                | X Beltstatus                                      | ???          | D3 Ax0f5d C2
+| 0x0F5B 3931 | uint16  | EEPROM_BELTSTATUS_Y                   | ???          | ff ffh                | Y Beltstatus                                      | ???          | D3 Ax0f5b C2
+| 0x0F5A 3930 | uint8   | EEPROM_DIR_DEPTH                      | 00h-ffh 0-255| ffh 255               | Directory depth                                   | ???          | D3 Ax0f5a C1
+| 0x0F0A 3850 | uint8   | EEPROM_DIRS                           | ???          | ffh 255               | Directories ???                                   | ???          | D3 Ax0f0a C80
+| 0x0F09 3849 | uint8   | EEPROM_SD_SORT                        | 00h 0        | ffh 255               | SD card sort by:     __time__                     | LCD menu     | D3 Ax0f09 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | SD card sort by:     __alphabet__                 | LCD menu     | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | SD card:            __not sorted__                | LCD menu     | ^
+| 0x0F08 3848 | uint8   | EEPROM_SECOND_SERIAL_ACTIVE           | 00h 0        | ffh 255               | RPi Port: __disabled__                            | LCD menu     | D3 Ax0f08 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | RPi Port: __enabled__                             | LCD menu     | ^
+| 0x0F07 3847 | uint8   | EEPROM_FSENS_AUTOLOAD_ENABLED         | 01h 1        | ffh 255         __P__ | Filament autoload: __enabled__                    | LCD menu     | D3 Ax0f07 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Filament autoload: __disabled__                   | LCD menu     | ^
+| 0x0F05 3845 | uint16  | EEPROM_CRASH_COUNT_X_TOT              | 0000-fffe    | ff ffh        __S/P__ | Total crashes on x axis                           | ???          | D3 Ax0f05 C2
+| 0x0F03 3843 | uint16  | EEPROM_CRASH_COUNT_Y_TOT              | 0000-fffe    | ff ffh        __S/P__ | Total crashes on y axis                           | ???          | D3 Ax0f03 C2
+| 0x0F01 3841 | uint16  | EEPROM_FERROR_COUNT_TOT               | 0000-fffe    | ff ffh        __S/P__ | Total filament sensor errors                      | ???          | D3 Ax0f01 C2
+| 0x0EFF 3839 | uint16  | EEPROM_POWER_COUNT_TOT                | 0000-fffe    | ff ffh        __S/P__ | Total power failures                              | ???          | D3 Ax0eff C2
+| 0x0EFE 3838 | uint8   | EEPROM_TMC2130_HOME_X_ORIGIN          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0efe C1
+| 0x0EFD 3837 | uint8   | EEPROM_TMC2130_HOME_X_BSTEPS          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0efd C1
+| 0x0EFC 3836 | uint8   | EEPROM_TMC2130_HOME_X_FSTEPS          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0efc C1
+| 0x0EFB 3835 | uint8   | EEPROM_TMC2130_HOME_Y_ORIGIN          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0efb C1
+| 0x0EFA 3834 | uint8   | EEPROM_TMC2130_HOME_Y_BSTEPS          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0efa C1
+| 0x0EF9 3833 | uint8   | EEPROM_TMC2130_HOME_Y_FSTEPS          | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef9 C1
+| 0x0EF8 3832 | uint8   | EEPROM_TMC2130_HOME_ENABLED           | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef8 C1
+| 0x0EF7 3831 | uint8   | EEPROM_TMC2130_WAVE_X_FAC             | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef7 C1
+| 0x0EF6 3830 | uint8   | EEPROM_TMC2130_WAVE_Y_FAC             | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef6 C1
+| 0x0EF5 3829 | uint8   | EEPROM_TMC2130_WAVE_Z_FAC             | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef5 C1
+| 0x0EF4 3828 | uint8   | EEPROM_TMC2130_WAVE_E_FAC             | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef4 C1
+| 0x0EF3 3827 | uint8   | EEPROM_TMC2130_X_MRES                 | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef3 C1
+| 0x0EF2 3826 | uint8   | EEPROM_TMC2130_Y_MRES                 | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef2 C1
+| 0x0EF1 3825 | uint8   | EEPROM_TMC2130_Z_MRES                 | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef1 C1
+| 0x0EF0 3824 | uint8   | EEPROM_TMC2130_E_MRES                 | ???          | ffh 255               | ???                                               | ???          | D3 Ax0ef0 C1
+| 0x0EEE 3822 | uint16  | EEPROM_PRINTER_TYPE                   | ???          | ff ffh 65535          | Printer Type                                      | ???          | D3 Ax0eee C2
+| ^           | ^       | ^                                     | 64 00h 100   | ^                     | PRINTER_MK1                                       | ???          | ^
+| ^           | ^       | ^                                     | c8 00h 200   | ^                     | PRINTER_MK2                                       | ???          | ^
+| ^           | ^       | ^                                     | c9 00h 201   | ^                     | PRINTER_MK2 with MMU1                             | ???          | ^
+| ^           | ^       | ^                                     | ca 00h 202   | ^                     | PRINTER_MK2S                                      | ???          | ^
+| ^           | ^       | ^                                     | cb 00h 203   | ^                     | PRINTER_MK2S with MMU1                            | ???          | ^
+| ^           | ^       | ^                                     | fa 00h 250   | ^                     | PRINTER_MK2.5                                     | ???          | ^
+| ^           | ^       | ^                                     | 1a 4fh 20250 | ^                     | PRINTER_MK2.5 with MMU2                           | ???          | ^
+| ^           | ^       | ^                                     | fc 00h 252   | ^                     | PRINTER_MK2.5S                                    | ???          | ^
+| ^           | ^       | ^                                     | 1c 4fh 20252 | ^                     | PRINTER_MK2.5S with MMU2S                         | ???          | ^
+| ^           | ^       | ^                                     | 2c 01h 300   | ^                     | PRINTER_MK3                                       | ???          | ^
+| ^           | ^       | ^                                     | 4c 4fh 20300 | ^                     | PRINTER_MK3 with MMU2                             | ???          | ^
+| ^           | ^       | ^                                     | 2e 01h 302   | ^                     | PRINTER_MK3S                                      | ???          | ^
+| ^           | ^       | ^                                     | 4e 4fh 20302 | ^                     | PRINTER_MK3S with MMU2S                           | ???          | ^
+| 0x0EEC 3820 | uint16  | EEPROM_BOARD_TYPE                     | ???          | ff ffh 65535          | Board Type                                        | ???          | D3 Ax0eec C2
+| ^           | ^       | ^                                     | c8 00h 200   | ^                     | BOARD_RAMBO_MINI_1_0                              | ???          | ^
+| ^           | ^       | ^                                     | cb 00h 203   | ^                     | BOARD_RAMBO_MINI_1_3                              | ???          | ^
+| ^           | ^       | ^                                     | 36 01h 310   | ^                     | BOARD_EINSY_1_0a                                  | ???          | ^
+| 0x0EE8 3816 | float   | EEPROM_EXTRUDER_MULTIPLIER_0          | ???          | ff ff ff ffh          | Power panic Extruder 0 multiplier                 | ???          | D3 Ax0ee8 C4
+| 0x0EE4 3812 | float   | EEPROM_EXTRUDER_MULTIPLIER_1          | ???          | ff ff ff ffh          | Power panic Extruder 1 multiplier                 | ???          | D3 Ax0ee4 C4
+| 0x0EE0 3808 | float   | EEPROM_EXTRUDER_MULTIPLIER_2          | ???          | ff ff ff ffh          | Power panic Extruder 2 multiplier                 | ???          | D3 Ax0ee0 C4
+| 0x0EDE 3806 | uint16  | EEPROM_EXTRUDEMULTIPLY                | ???          | ff ffh 65535          | Power panic Extruder multiplier                   | ???          | D3 Ax0ede C2
+| 0x0EDA 3802 | float   | EEPROM_UVLO_TINY_CURRENT_POSITION_Z   | ???          | ff ff ff ffh          | Power panic Z position                            | ???          | D3 Ax0eda C4
+| 0x0ED8 3800 | uint16  | EEPROM_UVLO_TARGET_HOTEND             | ???          | ff ffh 65535          | Power panic target Hotend temperature             | ???          | D3 Ax0ed8 C2
+| 0x0ED7 3799 | uint8   | EEPROM_SOUND_MODE                     | 00h 0        | ffh 255               | Sound mode: __loud__                              | ???          | D3 Ax0ed7 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Sound mode: __once__                              | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Sound mode: __silent__                            | ^            | ^
+| ^           | ^       | ^                                     | 03h 3        | ^                     | Sound mode: __assist__                            | ^            | ^
+| 0x0ED6 3798 | bool    | EEPROM_SPOOL_JOIN                     | 01h 1        | ffh 255               | MMU2/s autodeplete: __on__                        | ???          | D3 Ax0ed6 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | MMU2/s autodeplete: __off__                       | ^            | ^
+| 0x0ED5 3797 | bool    | EEPROM_FSENS_RUNOUT_ENABLED           | 01h 1        | ffh 255         __P__ | Filament runout: __enabled__                      | LCD menu     | D3 Ax0ed5 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Filament runout: __disabled__                     | LCD menu     | ^
+| 0x0ED3 3795 | uint16  | EEPROM_MMU_FAIL_TOT                   | ???          | ff ffh 65535  __S/P__ | MMU2/s total failures                             | ???          | D3 Ax0ed3 C2
+| 0x0ED2 3794 | uint8   | EEPROM_MMU_FAIL                       | ???          | ffh 255       __S/P__ | MMU2/s fails during print                         | ???          | D3 Ax0ed2 C1
+| 0x0ED0 3792 | uint16  | EEPROM_MMU_LOAD_FAIL_TOT              | ???          | ff ffh 65535  __S/P__ | MMU2/s total load failures                        | ???          | D3 Ax0ed0 C2
+| 0x0ECF 3791 | uint8   | EEPROM_MMU_LOAD_FAIL                  | ???          | ffh 255       __S/P__ | MMU2/s load failures during print                 | ???          | D3 Ax0ecf C1
+| 0x0ECE 3790 | uint8   | EEPROM_MMU_CUTTER_ENABLED             | 00h 0        | ffh 255               | MMU2/s cutter: __disabled__                       | LCD menu     | D3 Ax0ece C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | MMU2/s cutter: __enabled__                        | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | MMU2/s cutter: __always__                         | ^            | ^
+| 0x0DAE 3502 | uint16  | EEPROM_UVLO_MESH_BED_LEVELING_FULL    | ???          | ff ffh 65535          | Power panic Mesh bed leveling points              | ???          | D3 Ax0dae C288
+| 0x0DAD 3501 | uint8   | EEPROM_MBL_TYPE                       | ???          | ffh 255               | Mesh bed leveling precision _unused atm_          | ???          | D3 Ax0dad C1
+| 0x0DAC 3500 | bool    | EEPROM_MBL_MAGNET_ELIMINATION         | 01h 1        | ffh 255               | Mesh bed leveling does: __ignores__ magnets       | LCD menu     | D3 Ax0dac C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Mesh bed leveling does: __NOT ignores__ magnets   | ^            | ^
+| 0x0DAB 3499 | uint8   | EEPROM_MBL_POINTS_NR                  | 03h 3        | ffh 255               | Mesh bed leveling points: __3x3__                 | LCD menu     | D3 Ax0dab C1
+| ^           | ^       | ^                                     | 07h 7        | ^                     | Mesh bed leveling points: __7x7__                 | ^            | ^
+| 0x0DAA 3498 | uint8   | EEPROM_MBL_PROBE_NR                   | 03h 3        | ffh 255               | MBL times measurements for each point: __3__      | LCD menu     | D3 Ax0daa C1
+| ^           | ^       | ^                                     | 05h 5        | ^                     | MBL times measurements for each point: __5__      | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | MBL times measurements for each point: __1__      | ^            | ^
+| 0x0DA9 3497 | uint8   | EEPROM_MMU_STEALTH                    | 01h 1        | ffh 255               | MMU2/s Silent mode: __on__                        | ???          | D3 Ax0da9 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | MMU2/s Silent mode: __off__                       | ^            | ^
+| 0x0DA8 3496 | uint8   | EEPROM_CHECK_MODE                     | 01h 1        | ffh 255               | Check mode for nozzle is: __warn__                | LCD menu     | D3 Ax0da8 C1
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Check mode for nozzle is: __strict__              | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Check mode for nozzle is: __none__                | ^            | ^
+| 0x0DA7 3495 | uint8   | EEPROM_NOZZLE_DIAMETER                | 28h 40       | ffh 255               | Nozzle diameter is: __40 or 0.40mm__              | LCD menu     | D3 Ax0da7 C1
+| ^           | ^       | ^                                     | 3ch 60       | ^                     | Nozzle diameter is: __60 or 0.60mm__              | ^            | ^
+| ^           | ^       | ^                                     | 3ch 80       | ^                     | Nozzle diameter is: __80 or 0.80mm__              | ^            | ^
+| ^           | ^       | ^                                     | 19h 25       | ^                     | Nozzle diameter is: __25 or 0.25mm__              | ^            | ^
+| 0x0DA5 3493 | uint16  | EEPROM_NOZZLE_DIAMETER_uM             | 9001h        | ff ffh 65535          | Nozzle diameter is: __400um__                     | LCD menu     | D3 Ax0da5 C2
+| ^           | ^       | ^                                     | 5802h        | ^                     | Nozzle diameter is: __600um__                     | ^            | ^
+| ^           | ^       | ^                                     | 2003h        | ^                     | Nozzle diameter is: __800um__                     | ^            | ^
+| ^           | ^       | ^                                     | fa00h        | ^                     | Nozzle diameter is: __250um__                     | ^            | ^
+| 0x0DA4 3492 | uint8   | EEPROM_CHECK_MODEL                    | 01h 1        | ffh 255               | Check mode for printer model is: __warn__         | LCD menu     | D3 Ax0da4 C1
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Check mode for printer model is: __strict__       | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Check mode for printer model is: __none__         | ^            | ^
+| 0x0DA3 3491 | uint8   | EEPROM_CHECK_VERSION                  | 01h 1        | ffh 255               | Check mode for firmware is: __warn__              | LCD menu     | D3 Ax0da3 C1
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Check mode for firmware is: __strict__            | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Check mode for firmware is: __none__              | ^            | ^
+| 0x0DA2 3490 | uint8   | EEPROM_CHECK_GCODE                    | 01h 1        | ffh 255               | Check mode for gcode is: __warn__ _unused atm_    | LCD menu     | D3 Ax0da2 C1
+| ^           | ^       | ^                                     | 02h 2        | ^                     | Check mode for gcode is: __strict__ _unused atm_  | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Check mode for gcode is: __none__ _unused atm_    | ^            | ^
+| 0x0D49 3401 | uint16  | EEPROM_SHEETS_BASE                    | ???          | ffh 255               | ???                                               | LCD menu     | D3 Ax0d49 C89
+| 0x0D49 3401 | char    | _1st Sheet block_                     |536d6f6f746831| ffffffffffffff        | 1st sheet - Name: _Smooth1_                       | ^            | D3 Ax0d49 C7
+| 0x0D50 3408 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 1st sheet - Z offset                              | ^            | D3 Ax0d50 C2
+| 0x0D52 3410 | uint8   | ^                                     | 00h 0        | ffh 255               | 1st sheet - bed temp                              | ^            | D3 Ax0d52 C1
+| 0x0D53 3411 | uint8   | ^                                     | 00h 0        | ffh 255               | 1st sheet - PINDA temp                            | ^            | D3 Ax0d53 C1
+| 0x0D54 3412 | char    | _2nd Sheet block_                     |536d6f6f746832| ffffffffffffff        | 2nd sheet - Name: _Smooth2_                       | ^            | D3 Ax0d54 C7
+| 0x0D5B 3419 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 2nd sheet - Z offset                              | ^            | D3 Ax0d5b C2
+| 0x0D5D 3421 | uint8   | ^                                     | 00h 0        | ffh 255               | 2nd sheet - bed temp                              | ^            | D3 Ax0d5d C1
+| 0x0D5E 3422 | uint8   | ^                                     | 00h 0        | ffh 255               | 2nd sheet - PINDA temp                            | ^            | D3 Ax0d5e C1
+| 0x0D5F 3423 | char    | _3rd Sheet block_                     |54657874757231| ffffffffffffff        | 3rd sheet - Name: _Textur1_                       | ^            | D3 Ax0d5f C7
+| 0x0D66 3430 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 3rd sheet - Z offset                              | ^            | D3 Ax0d66 C2
+| 0x0D68 3432 | uint8   | ^                                     | 00h 0        | ffh 255               | 3rd sheet - bed temp                              | ^            | D3 Ax0d68 C1
+| 0x0D69 3433 | uint8   | ^                                     | 00h 0        | ffh 255               | 3rd sheet - PINDA temp                            | ^            | D3 Ax0d69 C1
+| 0x0D6A 3434 | char    | _4th Sheet block_                     |54657874757232| ffffffffffffff        | 4th sheet - Name: _Textur2_                       | ^            | D3 Ax0d6a C7
+| 0x0D71 3441 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 4th sheet - Z offset                              | ^            | D3 Ax0d71 C2
+| 0x0D73 3443 | uint8   | ^                                     | 00h 0        | ffh 255               | 4th sheet - bed temp                              | ^            | D3 Ax0d73 C1
+| 0x0D74 3444 | uint8   | ^                                     | 00h 0        | ffh 255               | 4th sheet - PINDA temp                            | ^            | D3 Ax0d74 C1
+| 0x0D75 3445 | char    | _5th Sheet block_                     |536174696e2031| ffffffffffffff        | 5th sheet - Name: _Satin 1_                       | ^            | D3 Ax0d75 C7
+| 0x0D7C 3452 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 5th sheet - Z offset                              | ^            | D3 Ax0d7c C2
+| 0x0D7E 3454 | uint8   | ^                                     | 00h 0        | ffh 255               | 5th sheet - bed temp                              | ^            | D3 Ax0d7e C1
+| 0x0D7F 3455 | uint8   | ^                                     | 00h 0        | ffh 255               | 5th sheet - PINDA temp                            | ^            | D3 Ax0d7f C1
+| 0x0D80 3456 | char    | _6th Sheet block_                     |536174696e2032| ffffffffffffff        | 6th sheet - Name: _Satin 2_                       | ^            | D3 Ax0d80 C7
+| 0x0D87 3463 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 6th sheet - Z offset                              | ^            | D3 Ax0d87 C2
+| 0x0D89 3465 | uint8   | ^                                     | 00h 0        | ffh 255               | 6th sheet - bed temp                              | ^            | D3 Ax0d89 C1
+| 0x0D8A 3466 | uint8   | ^                                     | 00h 0        | ffh 255               | 6th sheet - PINDA temp                            | ^            | D3 Ax0d8a C1
+| 0x0D8B 3467 | char    | _7th Sheet block_                     |437573746f6d31| ffffffffffffff        | 7th sheet - Name: _Custom1_                       | ^            | D3 Ax0d8b C7
+| 0x0D92 3474 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 7th sheet - Z offset                              | ^            | D3 Ax0d92 C2
+| 0x0D94 3476 | uint8   | ^                                     | 00h 0        | ffh 255               | 7th sheet - bed temp                              | ^            | D3 Ax0d94 C1
+| 0x0D95 3477 | uint8   | ^                                     | 00h 0        | ffh 255               | 7th sheet - PINDA temp                            | ^            | D3 Ax0d95 C1
+| 0x0D96 3478 | char    | _8th Sheet block_                     |437573746f6d32| ffffffffffffff        | 8th sheet - Name: _Custom2_                       | ^            | D3 Ax0d96 C7
+| 0x0D9D 3485 | uint16  | ^                                     | 00 00h 0     | ff ffh 65535          | 8th sheet - Z offset                              | ^            | D3 Ax0d9d C2
+| 0x0D9F 3487 | uint8   | ^                                     | 00h 0        | ffh 255               | 8th sheet - bed temp                              | ^            | D3 Ax0d9f C1
+| 0x0DA0 3488 | uint8   | ^                                     | 00h 0        | ffh 255               | 8th sheet - PINDA temp                            | ^            | D3 Ax0da0 C1
+| 0x0DA1 3489 | uint8   | active_sheet                          | 00h 0        | ffh 255               | Active sheet index                                | ^            | D3 Ax0da1 C1
+| 0x0D48 3400 | uint8   | EEPROM_FSENSOR_PCB                    | ffh 255      | ffh 255               | Filament Sensor type IR unknown                   | LCD Support  | D3 Ax0d48 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Filament Sensor type IR 0.3 or older              | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Filament Sensor type IR 0.4 or newer              | ^            | ^
+| 0x0D47 3399 | uint8   | EEPROM_FSENSOR_ACTION_NA              | 00h 0        | ffh 255               | Filament Sensor action: __Continue__              | LCD menu     | D3 Ax0d47 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Filament Sensor action: __Pause__                 | ^            | ^
+| 0x0D37 3383 | float   | EEPROM_UVLO_SAVED_START_POSITION      | ???          | ff ff ff ffh          | Power panic saved start position all-axis         | ???          | D3 Ax0d37 C16
+| ^           | ^       | ^                                     | ???          | ^                     | Power panic saved start position e-axis           | ^            | D3 Ax0d43 C4
+| ^           | ^       | ^                                     | ???          | ^                     | Power panic saved start position z-axis           | ^            | D3 Ax0d3f C4
+| ^           | ^       | ^                                     | ???          | ^                     | Power panic saved start position y-axis           | ^            | D3 Ax0d3b C4
+| ^           | ^       | ^                                     | ???          | ^                     | Power panic saved start position x-axis           | ^            | D3 Ax0d37 C4
+| 0x0D35 3381 | uint16  | EEPROM_UVLO_FEEDMULTIPLY              | ???          | ff ffh 65355          | Power panic saved feed multiplier                 | ???          | D3 Ax0d35 C2
+| 0x0D34 3380 | uint8   | EEPROM_BACKLIGHT_LEVEL_HIGH           | 00h - ffh    | 82h 130               | LCD backlight bright: __128__ Dim value to 255    | LCD menu     | D3 Ax0d34 C1
+| 0x0D33 3379 | uint8   | EEPROM_BACKLIGHT_LEVEL_LOW            | 00h - ffh    | 32h 50                | LCD backlight dim: __50__ 0 to Bright value       | LCD menu     | D3 Ax0d33 C1
+| 0x0D32 3378 | uint8   | EEPROM_BACKLIGHT_MODE                 | 02h 2        | ffh 255               | LCD backlight mode: __Auto__                      | LCD menu     | D3 Ax0d32 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | LCD backlight mode: __Bright__                    | ^            | ^
+| ^           | ^       | ^                                     | 00h 0        | ^                     | LCD backlight mode: __Dim__                       | ^            | ^
+| 0x0D30 3376 | uint16  | EEPROM_BACKLIGHT_TIMEOUT              | 01 00 - ff ff| 0a 00h 65535          | LCD backlight timeout: __10__ seconds             | LCD menu     | D3 Ax0d30 C2
+| 0x0D2C 3372 | float   | EEPROM_UVLO_LA_K                      | ???          | ff ff ff ffh          | Power panic saved Linear Advanced K value         | ???          | D3 Ax0d2c C4
+| 0x0D2B 3371 | uint8   | EEPROM_ALTFAN_OVERRIDE                | ffh 255      | ffh 255               | ALTFAN override unknown state                     | LCD menu     | D3 Ax0d2b C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | ALTFAN override deactivated                       | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | ALTFAN override activated                         | ^            | ^
+| 0x0D2A 3370 | uint8   | EEPROM_EXPERIMENTAL_VISIBILITY        | ffh 255      | ffh 255               | Experimental menu visibility unknown state        | LCD menu     | D3 Ax0d2a C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | Experimental menu visibility hidden               | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Experimental menu visibility visible              | ^            | ^
+| 0x0D29 3369 | uint8   | EEPROM_PINDA_TEMP_COMPENSATION        | ffh 255      | ffh 255               | PINDA temp compensation unknown state             | LCD menu     | D3 Ax0d29 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | PINDA has no temp compensation PINDA v1/2         | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | PINDA has temp compensation aka SuperPINDA        | ^            | ^
+| 0x0D15 3349 | char[20]| EEPROM_PRUSA_SN                       | SN[19] == 0  | ffffffffffffffff...   | PRUSA Serial number string                        | PRUSA SN     | D3 Ax0d15 C20
+| 0x0D11 3345 | float   | EEPROM_UVLO_ACCELL                    | ???          | ff ff ff ffh          | Power panic saved normal acceleration             | ???          | D3 Ax0d11 C4
+| 0x0D0D 3341 | float   | EEPROM_UVLO_RETRACT_ACCELL            | ???          | ff ff ff ffh          | Power panic saved retract acceleration            | ???          | D3 Ax0d0d C4
+| 0x0D09 3337 | float   | EEPROM_UVLO_TRAVEL_ACCELL             | ???          | ff ff ff ffh          | Power panic saved travel acceleration             | ???          | D3 Ax0d09 C4
+| 0x0D05 3333 | unint32 | EEPROM_JOB_ID                         | ???          | 00 00 00 00h            | Job ID used by host software                    | D3 only      | D3 Ax0d05 C4
+| 0x0D04 3332 | uint8   | EEPROM_ECOOL_ENABLE                   | ffh 255      | ^                     | Disable extruder motor scaling for non-farm print | LCD menu     | D3 Ax0d04 C1
+| ^           | ^       | ^                                     | 2ah 42       | ^                     | Enable extruder motor scaling for non-farm print  | ^            | D3 Ax0d04 C1
+| 0x0D03 3331 | uint8   | EEPROM_FW_CRASH_FLAG                  | ffh 255      | ffh 255               | Last FW crash reason (dump_crash_reason)          | D21/D22      | D3 Ax0d03 C1
+| ^           | ^       | ^                                     | 00h 0        | ^                     | manual                                            | ^            | ^
+| ^           | ^       | ^                                     | 01h 1        | ^                     | stack_error                                       | ^            | ^
+| ^           | ^       | ^                                     | 02h 2        | ^                     | watchdog                                          | ^            | ^
+| ^           | ^       | ^                                     | 03h 3        | ^                     | bad_isr                                           | ^            | ^
+| ^           | ^       | ^                                     | 04h 4        | ^                     | bad_pullup_temp_isr                               | ^            | ^
+| ^           | ^       | ^                                     | 05h 5        | ^                     | bad_pullup_step_isr                               | ^            | ^
+| 0x0D02 3330 | uint8   | EEPROM_TEMP_MODEL_ENABLE              | 00h 0        | ff/00                 | Temp model deactivated                            | Temp model   | D3 Ax0d02 C1
+| ^           | ^       | ^                                     | 01h 1        | ^                     | Temp model activated                              | ^            | ^
+| 0x0CFE 3326 | float   | EEPROM_TEMP_MODEL_P                   | ???          | ff ff ff ffh          | Temp model power (W)                              | Temp model   | D3 Ax0cfe C4
+| 0x0CFA 3322 | float   | EEPROM_TEMP_MODEL_C                   | ???          | ff ff ff ffh          | Temp model capacitance (J/K)                      | Temp model   | D3 Ax0cfa C4
+| 0x0CBA 3258 |float[16]| EEPROM_TEMP_MODEL_R                   | ???          | ff ff ff ffh          | Temp model resistance (K/W)                       | Temp model   | D3 Ax0cba C64
+| 0x0CB6 3254 | float   | EEPROM_TEMP_MODEL_Ta_corr             | ???          | ff ff ff ffh          | Temp model ambient temperature correction (K)     | Temp model   | D3 Ax0cb6 C4
+| 0x0CB2 3250 | float   | EEPROM_TEMP_MODEL_W                   | ???          | ff ff ff ffh          | Temp model warning threshold (K/s)                | Temp model   | D3 Ax0cb2 C4
+| 0x0CAE 3246 | float   | EEPROM_TEMP_MODEL_E                   | ???          | ff ff ff ffh          | Temp model error threshold (K/s)                  | Temp model   | D3 Ax0cae C4
+| 0x0CAD 3245 | uint8   | EEPROM_FSENSOR_JAM_DETECTION          | 01h 1        | ff/01                 | fsensor pat9125 jam detection feature             | LCD menu     | D3 Ax0cad C1
+| 0x0CAC 3244 | uint8   | EEPROM_MMU_ENABLED                    | 01h 1        | ff/01                 | MMU enabled                                       | LCD menu     | D3 Ax0cac C1
+
+|Address begin|Bit/Type | Name                                  | Valid values | Default/FactoryReset  | Description                                       |Gcode/Function| Debug code
+| :--:        | :--:    | :--:                                  | :--:         | :--:                  | :--:                                              | :--:         | :--:
+| 0x0012 18   | uint16  | EEPROM_FIRMWARE_VERSION_END           | ???          | ff ffh 65535          | ???                                               | ???          | D3 Ax0012 C2
+| 0x0010 16   | uint16  | EEPROM_FIRMWARE_VERSION_FLAVOR        | ???          | ff ffh 65535          | ???                                               | ???          | D3 Ax0010 C2
+| 0x000E 14   | uint16  | EEPROM_FIRMWARE_VERSION_REVISION      | ???          | ff ffh 65535          | Firmware version revision number DEV/ALPHA/BETA/RC| ???          | D3 Ax000e C2
+| 0x000C 12   | uint16  | EEPROM_FIRMWARE_VERSION_MINOR         | ???          | ff ffh 65535          | Firmware version minor number                     | ???          | D3 Ax000c C2
+| 0x000A 10   | uint16  | EEPROM_FIRMWARE_VERSION_MAJOR         | ???          | ff ffh 65535          | Firmware version major number                     | ???          | D3 Ax000a C2
+| 0x0000 0    | char    | FW_PRUSA3D_MAGIC                      | ???          | ffffffffffffffffffff  | __`PRUSA3DFW`__                                   | ???          | D3 Ax0000 C10
 */
 */
 
 
 #define EEPROM_EMPTY_VALUE 0xFF
 #define EEPROM_EMPTY_VALUE 0xFF
@@ -384,19 +392,19 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 #define EEPROM_BED_CORRECTION_REAR  (EEPROM_BED_CORRECTION_FRONT-1)
 #define EEPROM_BED_CORRECTION_REAR  (EEPROM_BED_CORRECTION_FRONT-1)
 #define EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY (EEPROM_BED_CORRECTION_REAR-1)
 #define EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY (EEPROM_BED_CORRECTION_REAR-1)
 #define EEPROM_PRINT_FLAG (EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY-1)
 #define EEPROM_PRINT_FLAG (EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY-1)
-#define EEPROM_PROBE_TEMP_SHIFT (EEPROM_PRINT_FLAG - 2*5) //5 x int for storing pinda probe temp shift relative to 50 C; unit: motor steps 
+#define EEPROM_PROBE_TEMP_SHIFT (EEPROM_PRINT_FLAG - 2*5) //5 x int for storing pinda probe temp shift relative to 50 C; unit: motor steps
 #define EEPROM_TEMP_CAL_ACTIVE (EEPROM_PROBE_TEMP_SHIFT - 1)
 #define EEPROM_TEMP_CAL_ACTIVE (EEPROM_PROBE_TEMP_SHIFT - 1)
 #define _EEPROM_FREE_NR6_ (EEPROM_TEMP_CAL_ACTIVE - 2*4) //4 x int (used to be for bowden lengths for SNMM)
 #define _EEPROM_FREE_NR6_ (EEPROM_TEMP_CAL_ACTIVE - 2*4) //4 x int (used to be for bowden lengths for SNMM)
 #define EEPROM_CALIBRATION_STATUS_PINDA (_EEPROM_FREE_NR6_ - 1) //0 - not calibrated; 1 - calibrated
 #define EEPROM_CALIBRATION_STATUS_PINDA (_EEPROM_FREE_NR6_ - 1) //0 - not calibrated; 1 - calibrated
 #define EEPROM_UVLO						(EEPROM_CALIBRATION_STATUS_PINDA - 1) //1 - uvlo during print
 #define EEPROM_UVLO						(EEPROM_CALIBRATION_STATUS_PINDA - 1) //1 - uvlo during print
 #define EEPROM_UVLO_CURRENT_POSITION	(EEPROM_UVLO-2*4) // 2 x float for current_position in X and Y axes
 #define EEPROM_UVLO_CURRENT_POSITION	(EEPROM_UVLO-2*4) // 2 x float for current_position in X and Y axes
 #define EEPROM_FILENAME (EEPROM_UVLO_CURRENT_POSITION - 8) //8chars to store filename without extension
 #define EEPROM_FILENAME (EEPROM_UVLO_CURRENT_POSITION - 8) //8chars to store filename without extension
-#define EEPROM_FILE_POSITION (EEPROM_FILENAME - 4) //32 bit for uint32_t file position 
+#define EEPROM_FILE_POSITION (EEPROM_FILENAME - 4) //32 bit for uint32_t file position
 #define EEPROM_UVLO_CURRENT_POSITION_Z	(EEPROM_FILE_POSITION - 4) //float for current position in Z
 #define EEPROM_UVLO_CURRENT_POSITION_Z	(EEPROM_FILE_POSITION - 4) //float for current position in Z
 #define EEPROM_UVLO_UNUSED_001		(EEPROM_UVLO_CURRENT_POSITION_Z - 1) // uint8_t (unused)
 #define EEPROM_UVLO_UNUSED_001		(EEPROM_UVLO_CURRENT_POSITION_Z - 1) // uint8_t (unused)
 #define EEPROM_UVLO_TARGET_BED			(EEPROM_UVLO_UNUSED_001 - 1)
 #define EEPROM_UVLO_TARGET_BED			(EEPROM_UVLO_UNUSED_001 - 1)
 #define EEPROM_UVLO_FEEDRATE			(EEPROM_UVLO_TARGET_BED - 2) //uint16_t
 #define EEPROM_UVLO_FEEDRATE			(EEPROM_UVLO_TARGET_BED - 2) //uint16_t
-#define EEPROM_UVLO_FAN_SPEED			(EEPROM_UVLO_FEEDRATE - 1) 
+#define EEPROM_UVLO_FAN_SPEED			(EEPROM_UVLO_FEEDRATE - 1)
 #define EEPROM_FAN_CHECK_ENABLED		(EEPROM_UVLO_FAN_SPEED - 1)
 #define EEPROM_FAN_CHECK_ENABLED		(EEPROM_UVLO_FAN_SPEED - 1)
 #define EEPROM_UVLO_MESH_BED_LEVELING     (EEPROM_FAN_CHECK_ENABLED - 9*2)
 #define EEPROM_UVLO_MESH_BED_LEVELING     (EEPROM_FAN_CHECK_ENABLED - 9*2)
 #define EEPROM_UVLO_Z_MICROSTEPS     (EEPROM_UVLO_MESH_BED_LEVELING - 2) // uint16_t (could be removed)
 #define EEPROM_UVLO_Z_MICROSTEPS     (EEPROM_UVLO_MESH_BED_LEVELING - 2) // uint16_t (could be removed)
@@ -407,12 +415,12 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 #define EEPROM_FREE_NR4         (EEPROM_UVLO_SAVED_SEGMENT_IDX - 1)							// FREE EEPROM SPACE
 #define EEPROM_FREE_NR4         (EEPROM_UVLO_SAVED_SEGMENT_IDX - 1)							// FREE EEPROM SPACE
 #define EEPROM_FREE_NR5         (EEPROM_FREE_NR4 - 1)							// FREE EEPROM SPACE
 #define EEPROM_FREE_NR5         (EEPROM_FREE_NR4 - 1)							// FREE EEPROM SPACE
 
 
-// Crash detection mode EEPROM setting 
-#define EEPROM_CRASH_DET         (EEPROM_FREE_NR5 - 1)       				    // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-12) 
+// Crash detection mode EEPROM setting
+#define EEPROM_CRASH_DET         (EEPROM_FREE_NR5 - 1)       				    // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-12)
 // Crash detection counter Y (last print)
 // Crash detection counter Y (last print)
 #define EEPROM_CRASH_COUNT_Y       (EEPROM_CRASH_DET - 1)                       // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-15)
 #define EEPROM_CRASH_COUNT_Y       (EEPROM_CRASH_DET - 1)                       // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-15)
-// Filament sensor on/off EEPROM setting 
-#define EEPROM_FSENSOR           (EEPROM_CRASH_COUNT_Y - 1)                     // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-14) 
+// Filament sensor on/off EEPROM setting
+#define EEPROM_FSENSOR           (EEPROM_CRASH_COUNT_Y - 1)                     // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-14)
 // Crash detection counter X (last print)
 // Crash detection counter X (last print)
 #define EEPROM_CRASH_COUNT_X       (EEPROM_FSENSOR - 1)                         // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-15)
 #define EEPROM_CRASH_COUNT_X       (EEPROM_FSENSOR - 1)                         // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-15)
 // Filament runout/error coutner (last print)
 // Filament runout/error coutner (last print)
@@ -442,7 +450,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 #define EEPROM_POWER_COUNT_TOT       (EEPROM_FERROR_COUNT_TOT - 2)             // uint16
 #define EEPROM_POWER_COUNT_TOT       (EEPROM_FERROR_COUNT_TOT - 2)             // uint16
 
 
 ////////////////////////////////////////
 ////////////////////////////////////////
-// TMC2130 Accurate sensorless homing 
+// TMC2130 Accurate sensorless homing
 
 
 // X-axis home origin (stepper phase in microsteps, 0..63 for 16ustep resolution)
 // X-axis home origin (stepper phase in microsteps, 0..63 for 16ustep resolution)
 #define EEPROM_TMC2130_HOME_X_ORIGIN           (EEPROM_POWER_COUNT_TOT - 1)                    // uint8
 #define EEPROM_TMC2130_HOME_X_ORIGIN           (EEPROM_POWER_COUNT_TOT - 1)                    // uint8
@@ -507,7 +515,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 #define EEPROM_UVLO_MESH_BED_LEVELING_FULL     (EEPROM_MMU_CUTTER_ENABLED - 12*12*2) //allow 12 calibration points for future expansion
 #define EEPROM_UVLO_MESH_BED_LEVELING_FULL     (EEPROM_MMU_CUTTER_ENABLED - 12*12*2) //allow 12 calibration points for future expansion
 
 
 #define EEPROM_MBL_TYPE	(EEPROM_UVLO_MESH_BED_LEVELING_FULL-1) //uint8_t for mesh bed leveling precision
 #define EEPROM_MBL_TYPE	(EEPROM_UVLO_MESH_BED_LEVELING_FULL-1) //uint8_t for mesh bed leveling precision
-#define EEPROM_MBL_MAGNET_ELIMINATION (EEPROM_MBL_TYPE -1)  
+#define EEPROM_MBL_MAGNET_ELIMINATION (EEPROM_MBL_TYPE -1)
 #define EEPROM_MBL_POINTS_NR (EEPROM_MBL_MAGNET_ELIMINATION -1) //uint8_t number of points in one exis for mesh bed leveling
 #define EEPROM_MBL_POINTS_NR (EEPROM_MBL_MAGNET_ELIMINATION -1) //uint8_t number of points in one exis for mesh bed leveling
 #define EEPROM_MBL_PROBE_NR (EEPROM_MBL_POINTS_NR-1) //number of measurements for each point
 #define EEPROM_MBL_PROBE_NR (EEPROM_MBL_POINTS_NR-1) //number of measurements for each point
 
 

+ 3 - 3
Firmware/first_lay_cal.cpp

@@ -4,7 +4,7 @@
 //! @brief First layer (Z offset) calibration
 //! @brief First layer (Z offset) calibration
 
 
 #include "first_lay_cal.h"
 #include "first_lay_cal.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #include "language.h"
 #include "language.h"
 #include "Marlin.h"
 #include "Marlin.h"
 #include "cmdqueue.h"
 #include "cmdqueue.h"
@@ -48,8 +48,8 @@ void lay1cal_load_filament(char *cmd_buffer, uint8_t filament)
 //! @brief Print intro line
 //! @brief Print intro line
 void lay1cal_intro_line()
 void lay1cal_intro_line()
 {
 {
-    static const char cmd_intro_mmu_3[] PROGMEM = "G1 X55.0 E32.0 F1073.0";
-    static const char cmd_intro_mmu_4[] PROGMEM = "G1 X5.0 E32.0 F1800.0";
+    static const char cmd_intro_mmu_3[] PROGMEM = "G1 X55.0 E29.0 F1073.0";
+    static const char cmd_intro_mmu_4[] PROGMEM = "G1 X5.0 E29.0 F1800.0";
     static const char cmd_intro_mmu_5[] PROGMEM = "G1 X55.0 E8.0 F2000.0";
     static const char cmd_intro_mmu_5[] PROGMEM = "G1 X55.0 E8.0 F2000.0";
     static const char cmd_intro_mmu_6[] PROGMEM = "G1 Z0.3 F1000.0";
     static const char cmd_intro_mmu_6[] PROGMEM = "G1 Z0.3 F1000.0";
     static const char cmd_intro_mmu_7[] PROGMEM = "G92 E0.0";
     static const char cmd_intro_mmu_7[] PROGMEM = "G92 E0.0";

+ 2 - 1
Firmware/lcd.h

@@ -204,11 +204,12 @@ private:
 extern void lcd_set_custom_characters(void);
 extern void lcd_set_custom_characters(void);
 extern void lcd_set_custom_characters_nextpage(void);
 extern void lcd_set_custom_characters_nextpage(void);
 
 
-//! @brief Consume click event
+//! @brief Consume click and longpress event
 inline void lcd_consume_click()
 inline void lcd_consume_click()
 {
 {
     lcd_button_pressed = 0;
     lcd_button_pressed = 0;
     lcd_buttons &= 0xff^EN_C;
     lcd_buttons &= 0xff^EN_C;
+    lcd_longpress_trigger = 0;
 }
 }
 
 
 
 

+ 5 - 2
Firmware/messages.cpp

@@ -1,8 +1,8 @@
 //messages.c
 //messages.c
 #include "language.h"
 #include "language.h"
 
 
-//this is because we need include Configuration_prusa.h (CUSTOM_MENDEL_NAME)
-#include "Configuration_prusa.h"
+//this is because we need CUSTOM_MENDEL_NAME
+#include "Configuration_var.h"
 
 
 //internationalized messages
 //internationalized messages
 const char MSG_ALWAYS[] PROGMEM_I1 = ISTR("Always"); ////MSG_ALWAYS c=6
 const char MSG_ALWAYS[] PROGMEM_I1 = ISTR("Always"); ////MSG_ALWAYS c=6
@@ -172,6 +172,9 @@ extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");///
 extern const char MSG_LOAD_ALL[] PROGMEM_I1 = ISTR("Load All"); ////MSG_LOAD_ALL c=18
 extern const char MSG_LOAD_ALL[] PROGMEM_I1 = ISTR("Load All"); ////MSG_LOAD_ALL c=18
 
 
 //not internationalized messages
 //not internationalized messages
+#if 0
+const char MSG_FW_VERSION_BETA[] PROGMEM_N1 = "You are using a BETA firmware version! It is in a development state! Use this version with CAUTION as it may DAMAGE the printer!"; ////MSG_FW_VERSION_BETA c=20 r=8
+#endif
 const char MSG_SPOOL_JOIN[] PROGMEM_N1 = "SpoolJoin"; ////MSG_SPOOL_JOIN c=13
 const char MSG_SPOOL_JOIN[] PROGMEM_N1 = "SpoolJoin"; ////MSG_SPOOL_JOIN c=13
 const char MSG_FIRMWARE[] PROGMEM_N1 = "Firmware"; ////MSG_FIRMWARE c=8
 const char MSG_FIRMWARE[] PROGMEM_N1 = "Firmware"; ////MSG_FIRMWARE c=8
 const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[] PROGMEM_N1 = "FlashAir"; ////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY c=8
 const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[] PROGMEM_N1 = "FlashAir"; ////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY c=8

+ 9 - 6
Firmware/messages.h

@@ -76,7 +76,6 @@ extern const char MSG_NO[];
 extern const char MSG_NOZZLE[];
 extern const char MSG_NOZZLE[];
 extern const char MSG_PAPER[];
 extern const char MSG_PAPER[];
 extern const char MSG_PAUSE_PRINT[];
 extern const char MSG_PAUSE_PRINT[];
-extern const char MSG_PINDA[];
 extern const char MSG_PLACE_STEEL_SHEET[];
 extern const char MSG_PLACE_STEEL_SHEET[];
 extern const char MSG_PLEASE_WAIT[];
 extern const char MSG_PLEASE_WAIT[];
 extern const char MSG_POWER_FAILURES[];
 extern const char MSG_POWER_FAILURES[];
@@ -90,7 +89,6 @@ extern const char MSG_REMOVE_STEEL_SHEET[];
 extern const char MSG_RESET[];
 extern const char MSG_RESET[];
 extern const char MSG_RESUME_PRINT[];
 extern const char MSG_RESUME_PRINT[];
 extern const char MSG_RESUMING_PRINT[];
 extern const char MSG_RESUMING_PRINT[];
-extern const char MSG_SD_WORKDIR_FAIL[];
 extern const char MSG_SELFTEST_PART_FAN[];
 extern const char MSG_SELFTEST_PART_FAN[];
 extern const char MSG_SELFTEST_EXTRUDER_FAN[];
 extern const char MSG_SELFTEST_EXTRUDER_FAN[];
 extern const char MSG_SELFTEST_FAILED[];
 extern const char MSG_SELFTEST_FAILED[];
@@ -130,24 +128,20 @@ extern const char MSG_WIZARD_WELCOME[];
 extern const char MSG_WIZARD_WELCOME_SHIPPING[];
 extern const char MSG_WIZARD_WELCOME_SHIPPING[];
 extern const char MSG_YES[];
 extern const char MSG_YES[];
 extern const char MSG_V2_CALIBRATION[];
 extern const char MSG_V2_CALIBRATION[];
-extern const char MSG_WELCOME[];
 extern const char MSG_OFF[];
 extern const char MSG_OFF[];
 extern const char MSG_ON[];
 extern const char MSG_ON[];
 extern const char MSG_NA[];
 extern const char MSG_NA[];
-extern const char MSG_SPOOL_JOIN[];
 extern const char MSG_CUTTER[];
 extern const char MSG_CUTTER[];
 extern const char MSG_NONE[];
 extern const char MSG_NONE[];
 extern const char MSG_WARN[];
 extern const char MSG_WARN[];
 extern const char MSG_STRICT[];
 extern const char MSG_STRICT[];
 extern const char MSG_MODEL[];
 extern const char MSG_MODEL[];
-extern const char MSG_FIRMWARE[];
 extern const char MSG_GCODE[];
 extern const char MSG_GCODE[];
 extern const char MSG_GCODE_DIFF_PRINTER_CONTINUE[];
 extern const char MSG_GCODE_DIFF_PRINTER_CONTINUE[];
 extern const char MSG_GCODE_DIFF_PRINTER_CANCELLED[];
 extern const char MSG_GCODE_DIFF_PRINTER_CANCELLED[];
 extern const char MSG_NOZZLE_DIAMETER[];
 extern const char MSG_NOZZLE_DIAMETER[];
 extern const char MSG_MMU_MODE[];
 extern const char MSG_MMU_MODE[];
 extern const char MSG_SD_CARD[];
 extern const char MSG_SD_CARD[];
-extern const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[];
 extern const char MSG_SORT[];
 extern const char MSG_SORT[];
 extern const char MSG_SORT_TIME[];
 extern const char MSG_SORT_TIME[];
 extern const char MSG_SORT_ALPHA[];
 extern const char MSG_SORT_ALPHA[];
@@ -182,6 +176,15 @@ extern const char MSG_THERMAL_ANOMALY[];
 extern const char MSG_LOAD_ALL[];
 extern const char MSG_LOAD_ALL[];
 
 
 //not internationalized messages
 //not internationalized messages
+#if 0
+extern const char MSG_FW_VERSION_BETA[];
+#endif
+extern const char MSG_SPOOL_JOIN[];
+extern const char MSG_FIRMWARE[];
+extern const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[];
+extern const char MSG_PINDA[];
+extern const char MSG_WELCOME[];
+extern const char MSG_SD_WORKDIR_FAIL[];
 extern const char MSG_BROWNOUT_RESET[];
 extern const char MSG_BROWNOUT_RESET[];
 extern const char MSG_EXTERNAL_RESET[];
 extern const char MSG_EXTERNAL_RESET[];
 extern const char MSG_FILE_SAVED[];
 extern const char MSG_FILE_SAVED[];

+ 27 - 12
Firmware/mmu2.cpp

@@ -39,7 +39,10 @@ static constexpr float MMU2_LOAD_TO_NOZZLE_LENGTH = 87.0F + 5.0F;
 // - ToolChange shall not try to push filament into the very tip of the nozzle
 // - ToolChange shall not try to push filament into the very tip of the nozzle
 // to have some space for additional G-code to tune the extruded filament length
 // to have some space for additional G-code to tune the extruded filament length
 // in the profile
 // in the profile
-static constexpr float MMU2_TOOL_CHANGE_LOAD_LENGTH = 30.0F;
+// Beware - this value is used to initialize the MMU logic layer - it will be sent to the MMU upon line up (written into its 8bit register 0x0b)
+// However - in the G-code we can get a request to set the extra load distance at runtime to something else (M708 A0xb Xsomething).
+// The printer intercepts such a call and sets its extra load distance to match the new value as well.
+static constexpr uint8_t MMU2_TOOL_CHANGE_LOAD_LENGTH = 5; // mm
 
 
 static constexpr float MMU2_LOAD_TO_NOZZLE_FEED_RATE = 20.0F; // mm/s
 static constexpr float MMU2_LOAD_TO_NOZZLE_FEED_RATE = 20.0F; // mm/s
 static constexpr float MMU2_UNLOAD_TO_FINDA_FEED_RATE = 120.0F; // mm/s
 static constexpr float MMU2_UNLOAD_TO_FINDA_FEED_RATE = 120.0F; // mm/s
@@ -102,7 +105,7 @@ MMU2 mmu2;
 
 
 MMU2::MMU2()
 MMU2::MMU2()
     : is_mmu_error_monitor_active(false)
     : is_mmu_error_monitor_active(false)
-    , logic(&mmu2Serial)
+    , logic(&mmu2Serial, MMU2_TOOL_CHANGE_LOAD_LENGTH)
     , extruder(MMU2_NO_TOOL)
     , extruder(MMU2_NO_TOOL)
     , tool_change_extruder(MMU2_NO_TOOL)
     , tool_change_extruder(MMU2_NO_TOOL)
     , resume_position()
     , resume_position()
@@ -197,6 +200,12 @@ bool MMU2::ReadRegister(uint8_t address){
 bool MMU2::WriteRegister(uint8_t address, uint16_t data){
 bool MMU2::WriteRegister(uint8_t address, uint16_t data){
     if( ! WaitForMMUReady())
     if( ! WaitForMMUReady())
         return false;
         return false;
+
+    // special case - intercept requests of extra loading distance and perform the change even on the printer's side
+    if( address == 0x0b ){
+        logic.PlanExtraLoadDistance(data);
+    }
+
     logic.WriteRegister(address, data); // we may signal the accepted/rejected status of the response as return value of this function
     logic.WriteRegister(address, data); // we may signal the accepted/rejected status of the response as return value of this function
     manage_response(false, false);
     manage_response(false, false);
     return true;
     return true;
@@ -216,7 +225,7 @@ void MMU2::mmu_loop() {
     if (is_mmu_error_monitor_active){
     if (is_mmu_error_monitor_active){
         // Call this every iteration to keep the knob rotation responsive
         // Call this every iteration to keep the knob rotation responsive
         // This includes when mmu_loop is called within manage_response
         // This includes when mmu_loop is called within manage_response
-        ReportErrorHook((uint16_t)lastErrorCode, mmu2.MMUCurrentErrorCode() == ErrorCode::OK ? ErrorSourcePrinter : ErrorSourceMMU);
+        ReportErrorHook((uint16_t)lastErrorCode);
     }
     }
 
 
     avoidRecursion = false;
     avoidRecursion = false;
@@ -380,6 +389,8 @@ bool MMU2::set_filament_type(uint8_t index, uint8_t type) {
         return false;
         return false;
     
     
     // @@TODO - this is not supported in the new MMU yet
     // @@TODO - this is not supported in the new MMU yet
+    index = index; // @@TODO
+    type = type; // @@TODO
     // cmd_arg = filamentType;
     // cmd_arg = filamentType;
     // command(MMU_CMD_F0 + index);
     // command(MMU_CMD_F0 + index);
 
 
@@ -571,10 +582,13 @@ void MMU2::SaveAndPark(bool move_axes, bool turn_off_nozzle) {
             raise_z(MMU_ERR_Z_PAUSE_LIFT);
             raise_z(MMU_ERR_Z_PAUSE_LIFT);
 
 
             // move XY aside
             // move XY aside
-            current_position[X_AXIS] = MMU_ERR_X_PAUSE_POS;
-            current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
-            plan_buffer_line_curposXYZE(NOZZLE_PARK_XY_FEEDRATE);
-            st_synchronize();
+            if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS])
+            {
+                current_position[X_AXIS] = MMU_ERR_X_PAUSE_POS;
+                current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
+                plan_buffer_line_curposXYZE(NOZZLE_PARK_XY_FEEDRATE);
+                st_synchronize();
+            }
         }
         }
 
 
         if (turn_off_nozzle){
         if (turn_off_nozzle){
@@ -793,7 +807,7 @@ void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t steps) {
     }
     }
 }
 }
 
 
-void MMU2::ReportError(ErrorCode ec, uint8_t res) {
+void MMU2::ReportError(ErrorCode ec, ErrorSource res) {
     // Due to a potential lossy error reporting layers linked to this hook
     // Due to a potential lossy error reporting layers linked to this hook
     // we'd better report everything to make sure especially the error states
     // we'd better report everything to make sure especially the error states
     // do not get lost. 
     // do not get lost. 
@@ -819,13 +833,14 @@ void MMU2::ReportError(ErrorCode ec, uint8_t res) {
         break;
         break;
     }
     }
 
 
-    ReportErrorHook((uint16_t)ec, res);
-
     if( ec != lastErrorCode ){ // deduplicate: only report changes in error codes into the log
     if( ec != lastErrorCode ){ // deduplicate: only report changes in error codes into the log
         lastErrorCode = ec;
         lastErrorCode = ec;
+        lastErrorSource = res;
         LogErrorEvent_P( _O(PrusaErrorTitle(PrusaErrorCodeIndex((uint16_t)ec))) );
         LogErrorEvent_P( _O(PrusaErrorTitle(PrusaErrorCodeIndex((uint16_t)ec))) );
     }
     }
 
 
+    ReportErrorHook((uint16_t)ec);
+
     static_assert(mmu2Magic[0] == 'M' 
     static_assert(mmu2Magic[0] == 'M' 
         && mmu2Magic[1] == 'M' 
         && mmu2Magic[1] == 'M' 
         && mmu2Magic[2] == 'U' 
         && mmu2Magic[2] == 'U' 
@@ -900,8 +915,8 @@ void MMU2::OnMMUProgressMsgSame(ProgressCode pc){
                 loadFilamentStarted = false;
                 loadFilamentStarted = false;
                 // After the MMU knows the FSENSOR is triggered it will:
                 // After the MMU knows the FSENSOR is triggered it will:
                 // 1. Push the filament by additional 30mm (see fsensorToNozzle)
                 // 1. Push the filament by additional 30mm (see fsensorToNozzle)
-                // 2. Disengage the idler and push another 5mm.
-                current_position[E_AXIS] += 30.0f + 2.0f;
+                // 2. Disengage the idler and push another 2mm.
+                current_position[E_AXIS] += logic.ExtraLoadDistance() + 2;
                 plan_buffer_line_curposXYZE(MMU2_LOAD_TO_NOZZLE_FEED_RATE);
                 plan_buffer_line_curposXYZE(MMU2_LOAD_TO_NOZZLE_FEED_RATE);
                 break;
                 break;
             case FilamentState::NOT_PRESENT:
             case FilamentState::NOT_PRESENT:

+ 8 - 4
Firmware/mmu2.h

@@ -70,9 +70,10 @@ public:
     };
     };
 
 
     /// Source of operation error
     /// Source of operation error
-    enum ReportErrorSource: uint8_t {
+    enum ErrorSource: uint8_t {
         ErrorSourcePrinter = 0,
         ErrorSourcePrinter = 0,
         ErrorSourceMMU = 1,
         ErrorSourceMMU = 1,
+        ErrorSourceNone = 0xFF,
     };
     };
 
 
     /// Perform a reset of the MMU
     /// Perform a reset of the MMU
@@ -164,6 +165,9 @@ public:
     /// @returns Current error code
     /// @returns Current error code
     inline ErrorCode MMUCurrentErrorCode() const { return logic.Error(); }
     inline ErrorCode MMUCurrentErrorCode() const { return logic.Error(); }
 
 
+    /// @returns Last error source
+    inline ErrorSource MMULastErrorSource() const { return lastErrorSource; }
+
     /// @returns the version of the connected MMU FW.
     /// @returns the version of the connected MMU FW.
     /// In the future we'll return the trully detected FW version
     /// In the future we'll return the trully detected FW version
     Version GetMMUFWVersion()const {
     Version GetMMUFWVersion()const {
@@ -218,7 +222,7 @@ private:
     /// Reports an error into attached ExtUIs
     /// Reports an error into attached ExtUIs
     /// @param ec error code, see ErrorCode
     /// @param ec error code, see ErrorCode
     /// @param res reporter error source, is either Printer (0) or MMU (1)
     /// @param res reporter error source, is either Printer (0) or MMU (1)
-    void ReportError(ErrorCode ec, uint8_t res);
+    void ReportError(ErrorCode ec, ErrorSource res);
 
 
     /// Reports progress of operations into attached ExtUIs
     /// Reports progress of operations into attached ExtUIs
     /// @param pc progress code, see ProgressCode
     /// @param pc progress code, see ProgressCode
@@ -264,6 +268,7 @@ private:
     
     
     ProgressCode lastProgressCode = ProgressCode::OK;
     ProgressCode lastProgressCode = ProgressCode::OK;
     ErrorCode lastErrorCode = ErrorCode::MMU_NOT_RESPONDING;
     ErrorCode lastErrorCode = ErrorCode::MMU_NOT_RESPONDING;
+    ErrorSource lastErrorSource = ErrorSource::ErrorSourceNone;
     Buttons lastButton = Buttons::NoButton;
     Buttons lastButton = Buttons::NoButton;
 
 
     StepStatus logicStepLastStatus;
     StepStatus logicStepLastStatus;
@@ -279,9 +284,8 @@ private:
     /// unlike the mid-print ToolChange commands, which only load the first ~30mm and then the G-code takes over.
     /// unlike the mid-print ToolChange commands, which only load the first ~30mm and then the G-code takes over.
     bool loadingToNozzle;
     bool loadingToNozzle;
     
     
-    uint8_t retryAttempts;
-
     bool inAutoRetry;
     bool inAutoRetry;
+    uint8_t retryAttempts;
 };
 };
 
 
 /// following Marlin's way of doing stuff - one and only instance of MMU implementation in the code base
 /// following Marlin's way of doing stuff - one and only instance of MMU implementation in the code base

+ 11 - 4
Firmware/mmu2/error_codes.h

@@ -37,11 +37,11 @@ enum class ErrorCode : uint_fast16_t {
     HOMING_FAILED = 0x8007, ///< generic homing failed error - always reported with the corresponding axis bit set (Idler or Selector) as follows:
     HOMING_FAILED = 0x8007, ///< generic homing failed error - always reported with the corresponding axis bit set (Idler or Selector) as follows:
     HOMING_SELECTOR_FAILED = HOMING_FAILED | TMC_SELECTOR_BIT, ///< E32903 the Selector was unable to home properly - that means something is blocking its movement
     HOMING_SELECTOR_FAILED = HOMING_FAILED | TMC_SELECTOR_BIT, ///< E32903 the Selector was unable to home properly - that means something is blocking its movement
     HOMING_IDLER_FAILED = HOMING_FAILED | TMC_IDLER_BIT, ///< E33031 the Idler was unable to home properly - that means something is blocking its movement
     HOMING_IDLER_FAILED = HOMING_FAILED | TMC_IDLER_BIT, ///< E33031 the Idler was unable to home properly - that means something is blocking its movement
-    STALLED_PULLEY = HOMING_FAILED | TMC_PULLEY_BIT, ///< E32839 for the Pulley "homing" means just stallguard detected during Pulley's operation (Pulley doesn't home)
+    STALLED_PULLEY = HOMING_FAILED | TMC_PULLEY_BIT, ///< E32839 for the Pulley "homing" means just StallGuard detected during Pulley's operation (Pulley doesn't home)
 
 
     FINDA_VS_EEPROM_DISREPANCY = 0x8008, ///< E32776 FINDA is pressed but we have no such record in EEPROM - this can only happen at the start of the MMU and can be resolved by issuing an Unload command
     FINDA_VS_EEPROM_DISREPANCY = 0x8008, ///< E32776 FINDA is pressed but we have no such record in EEPROM - this can only happen at the start of the MMU and can be resolved by issuing an Unload command
 
 
-    FSENSOR_TOO_EARLY = 0x8009, ///< E32777 FSensor triggered while doing FastFeedToExtruder - that means either:
+    FSENSOR_TOO_EARLY = 0x8009, ///< E32777 FSensor triggered while doing FastFeedToBondtech - that means either:
     ///< - the PTFE is too short
     ///< - the PTFE is too short
     ///< - a piece of filament was left inside - pushed in front of the loaded filament causing the fsensor trigger too early
     ///< - a piece of filament was left inside - pushed in front of the loaded filament causing the fsensor trigger too early
     ///< - fsensor is faulty producing bogus triggers
     ///< - fsensor is faulty producing bogus triggers
@@ -60,7 +60,7 @@ enum class ErrorCode : uint_fast16_t {
 
 
     /// TMC driver init error - TMC dead or bad communication
     /// TMC driver init error - TMC dead or bad communication
     /// - E33344 Pulley TMC driver
     /// - E33344 Pulley TMC driver
-    /// - E33404 Selector TMC driver
+    /// - E33408 Selector TMC driver
     /// - E33536 Idler TMC driver
     /// - E33536 Idler TMC driver
     /// - E33728 All 3 TMC driver
     /// - E33728 All 3 TMC driver
     TMC_IOIN_MISMATCH = 0x8200,
     TMC_IOIN_MISMATCH = 0x8200,
@@ -105,5 +105,12 @@ enum class ErrorCode : uint_fast16_t {
     /// - E49280 Selector TMC driver
     /// - E49280 Selector TMC driver
     /// - E49408 Idler TMC driver
     /// - E49408 Idler TMC driver
     /// - E49600 All 3 TMC driver
     /// - E49600 All 3 TMC driver
-    TMC_OVER_TEMPERATURE_ERROR = 0xC000
+    TMC_OVER_TEMPERATURE_ERROR = 0xC000,
+
+    /// TMC driver - IO pins are unreliable. While in theory it's recoverable, in practice it most likely
+    /// means your hardware is borked (we can't command the drivers reliably via STEP/EN/DIR due to electrical
+    /// issues or hardware fault. Possible "fixable" cause is undervoltage on the 5v logic line.
+    /// Unfixable possible cause: bad or cracked solder joints on the PCB, failed shift register, failed driver.
+    MMU_SOLDERING_NEEDS_ATTENTION = 0xC200,
+
 };
 };

+ 24 - 7
Firmware/mmu2/errors_list.h

@@ -54,6 +54,9 @@ typedef enum : uint16_t {
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED = 314,
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED = 314,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED = 324,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED = 324,
 
 
+    ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED = 305,
+    ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED = 315,
+    ERR_ELECTRICAL_IDLER_SELFTEST_FAILED = 325,
 
 
     ERR_CONNECT = 400,
     ERR_CONNECT = 400,
     ERR_CONNECT_MMU_NOT_RESPONDING = 401,
     ERR_CONNECT_MMU_NOT_RESPONDING = 401,
@@ -104,6 +107,9 @@ static const constexpr uint16_t errorCodes[] PROGMEM = {
     ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED,
+    ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED,
+    ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED,
+    ERR_ELECTRICAL_IDLER_SELFTEST_FAILED,
     ERR_CONNECT_MMU_NOT_RESPONDING,
     ERR_CONNECT_MMU_NOT_RESPONDING,
     ERR_CONNECT_COMMUNICATION_ERROR,
     ERR_CONNECT_COMMUNICATION_ERROR,
     ERR_SYSTEM_FILAMENT_ALREADY_LOADED, 
     ERR_SYSTEM_FILAMENT_ALREADY_LOADED, 
@@ -143,6 +149,7 @@ static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1  = ISTR("TMC UND
 static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1      = ISTR("TMC DRIVER SHORTED"); ////MSG_TITLE_TMC_DRIVER_SHORTED c=20
 static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1      = ISTR("TMC DRIVER SHORTED"); ////MSG_TITLE_TMC_DRIVER_SHORTED c=20
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
+static const char MSG_TITLE_SELFTEST_FAILED[] PROGMEM_I1      = ISTR("MMU SELFTEST FAILED"); ////MSG_TITLE_SELFTEST_FAILED c=20
 static const char MSG_TITLE_MMU_NOT_RESPONDING[] PROGMEM_I1      = ISTR("MMU NOT RESPONDING"); ////MSG_TITLE_MMU_NOT_RESPONDING c=20
 static const char MSG_TITLE_MMU_NOT_RESPONDING[] PROGMEM_I1      = ISTR("MMU NOT RESPONDING"); ////MSG_TITLE_MMU_NOT_RESPONDING c=20
 static const char MSG_TITLE_COMMUNICATION_ERROR[] PROGMEM_I1     = ISTR("COMMUNICATION ERROR"); ////MSG_TITLE_COMMUNICATION_ERROR c=20
 static const char MSG_TITLE_COMMUNICATION_ERROR[] PROGMEM_I1     = ISTR("COMMUNICATION ERROR"); ////MSG_TITLE_COMMUNICATION_ERROR c=20
 static const char MSG_TITLE_FIL_ALREADY_LOADED[] PROGMEM_I1      = ISTR("FILAMENT ALREADY LOA"); ////MSG_TITLE_FIL_ALREADY_LOADED c=20
 static const char MSG_TITLE_FIL_ALREADY_LOADED[] PROGMEM_I1      = ISTR("FILAMENT ALREADY LOA"); ////MSG_TITLE_FIL_ALREADY_LOADED c=20
@@ -181,6 +188,9 @@ static const char * const errorTitles [] PROGMEM = {
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
     _R(MSG_TITLE_MMU_NOT_RESPONDING),
     _R(MSG_TITLE_MMU_NOT_RESPONDING),
     _R(MSG_TITLE_COMMUNICATION_ERROR),
     _R(MSG_TITLE_COMMUNICATION_ERROR),
     _R(MSG_TITLE_FIL_ALREADY_LOADED),
     _R(MSG_TITLE_FIL_ALREADY_LOADED),
@@ -261,6 +271,9 @@ static const char * const errorDescs[] PROGMEM = {
     _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_SHORTED
+    _R(MSG_DESC_TMC), // descPULLEY_SELFTEST_FAILED
+    _R(MSG_DESC_TMC), // descSELECTOR_SELFTEST_FAILED
+    _R(MSG_DESC_TMC), // descIDLER_SELFTEST_FAILED
     _R(MSG_DESC_MMU_NOT_RESPONDING),
     _R(MSG_DESC_MMU_NOT_RESPONDING),
     _R(MSG_DESC_COMMUNICATION_ERROR),
     _R(MSG_DESC_COMMUNICATION_ERROR),
     _R(MSG_DESC_FILAMENT_ALREADY_LOADED),
     _R(MSG_DESC_FILAMENT_ALREADY_LOADED),
@@ -273,18 +286,19 @@ static const char * const errorDescs[] PROGMEM = {
 
 
 // we have max 3 buttons/operations to select from
 // we have max 3 buttons/operations to select from
 // one of them is "More" to show the explanation text normally hidden in the next screens.
 // one of them is "More" to show the explanation text normally hidden in the next screens.
+// It is displayed with W (Double down arrow, special character from CGRAM)
 // 01234567890123456789
 // 01234567890123456789
-// >bttxt >bttxt>MoreW
-// Therefore at least some of the buttons, which can occur on the screen together, need to be 5-chars long max @@TODO.
+// >bttxt   >bttxt   >W
+// Therefore at least some of the buttons, which can occur on the screen together, can only be 8-chars long max @@TODO.
 // Beware - we only have space for 2 buttons on the LCD while the MMU has 3 buttons
 // Beware - we only have space for 2 buttons on the LCD while the MMU has 3 buttons
 // -> the left button on the MMU is not used/rendered on the LCD (it is also almost unused on the MMU side)
 // -> the left button on the MMU is not used/rendered on the LCD (it is also almost unused on the MMU side)
-static const char MSG_BTN_RETRY[] PROGMEM_I1 = ISTR("Retry"); ////MSG_BTN_RETRY c=5
-static const char MSG_BTN_CONTINUE[] PROGMEM_I1 = ISTR("Done"); ////MSG_BTN_CONTINUE c=5
+static const char MSG_BTN_RETRY[] PROGMEM_I1 = ISTR("Retry"); ////MSG_BTN_RETRY c=8
+static const char MSG_BTN_CONTINUE[] PROGMEM_I1 = ISTR("Done"); ////MSG_BTN_CONTINUE c=8
 static const char MSG_BTN_RESTART_MMU[] PROGMEM_I1 = ISTR("Reset MMU"); ////MSG_BTN_RESTART_MMU c=9
 static const char MSG_BTN_RESTART_MMU[] PROGMEM_I1 = ISTR("Reset MMU"); ////MSG_BTN_RESTART_MMU c=9
-static const char MSG_BTN_UNLOAD[] PROGMEM_I1 = ISTR("Unload"); ////MSG_BTN_UNLOAD c=6
-static const char MSG_BTN_STOP[] PROGMEM_I1 = ISTR("Stop"); ////MSG_BTN_STOP c=5
+static const char MSG_BTN_UNLOAD[] PROGMEM_I1 = ISTR("Unload"); ////MSG_BTN_UNLOAD c=8
+static const char MSG_BTN_STOP[] PROGMEM_I1 = ISTR("Stop"); ////MSG_BTN_STOP c=8
 static const char MSG_BTN_DISABLE_MMU[] PROGMEM_I1 = ISTR("Disable"); ////MSG_BTN_DISABLE_MMU c=9
 static const char MSG_BTN_DISABLE_MMU[] PROGMEM_I1 = ISTR("Disable"); ////MSG_BTN_DISABLE_MMU c=9
-static const char MSG_BTN_MORE[] PROGMEM_I1 = ISTR("More\x06"); ////MSG_BTN_MORE c=5
+static const char MSG_BTN_MORE[] PROGMEM_N1 = ISTR("\x06"); ////MSG_BTN_MORE c=8
 
 
 // Used to parse the buttons from Btns().
 // Used to parse the buttons from Btns().
 static const char * const btnOperation[] PROGMEM = {
 static const char * const btnOperation[] PROGMEM = {
@@ -335,6 +349,9 @@ static const uint8_t errorButtons[] PROGMEM = {
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_SHORTED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_SELFTEST_FAILED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_SELFTEST_FAILED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_SELFTEST_FAILED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//MMU_NOT_RESPONDING
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//MMU_NOT_RESPONDING
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//COMMUNICATION_ERROR
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//COMMUNICATION_ERROR
 
 

+ 21 - 7
Firmware/mmu2_error_converter.cpp

@@ -79,6 +79,20 @@ uint8_t PrusaErrorCodeIndex(uint16_t ec) {
     case (uint16_t)ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
     case (uint16_t)ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
         return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
         return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
     }
     }
+    
+    // Electrical issues which can be detected somehow.
+    // Need to be placed before TMC-related errors in order to process couples of error bits between single ones
+    // and to keep the code size down.
+    if (ec & (uint16_t)ErrorCode::TMC_PULLEY_BIT) {
+        if ((ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED);
+    } else if (ec & (uint16_t)ErrorCode::TMC_SELECTOR_BIT) {
+        if ((ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED);
+    } else if (ec & (uint16_t)ErrorCode::TMC_IDLER_BIT) {
+        if ((ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_SELFTEST_FAILED);
+    }
 
 
     // TMC-related errors - multiple of these can occur at once
     // TMC-related errors - multiple of these can occur at once
     // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)
     // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)
@@ -132,24 +146,24 @@ uint16_t PrusaErrorCode(uint8_t i){
     return pgm_read_word(errorCodes + i);
     return pgm_read_word(errorCodes + i);
 }
 }
 
 
-const char * const PrusaErrorTitle(uint8_t i){
-    return (const char * const)pgm_read_ptr(errorTitles + i);
+const char * PrusaErrorTitle(uint8_t i){
+    return (const char *)pgm_read_ptr(errorTitles + i);
 }
 }
 
 
-const char * const PrusaErrorDesc(uint8_t i){
-    return (const char * const)pgm_read_ptr(errorDescs + i);
+const char * PrusaErrorDesc(uint8_t i){
+    return (const char *)pgm_read_ptr(errorDescs + i);
 }
 }
 
 
 uint8_t PrusaErrorButtons(uint8_t i){
 uint8_t PrusaErrorButtons(uint8_t i){
     return pgm_read_byte(errorButtons + i);
     return pgm_read_byte(errorButtons + i);
 }
 }
 
 
-const char * const PrusaErrorButtonTitle(uint8_t bi){
+const char * PrusaErrorButtonTitle(uint8_t bi){
     // -1 represents the hidden NoOperation button which is not drawn in any way
     // -1 represents the hidden NoOperation button which is not drawn in any way
-    return (const char * const)pgm_read_ptr(btnOperation + bi - 1);
+    return (const char *)pgm_read_ptr(btnOperation + bi - 1);
 }
 }
 
 
-const char * const PrusaErrorButtonMore(){
+const char * PrusaErrorButtonMore(){
     return _R(MSG_BTN_MORE);
     return _R(MSG_BTN_MORE);
 }
 }
 
 

+ 4 - 4
Firmware/mmu2_error_converter.h

@@ -11,11 +11,11 @@ uint8_t PrusaErrorCodeIndex(uint16_t ec);
 
 
 /// @returns pointer to a PROGMEM string representing the Title of the Prusa-Error-Codes error
 /// @returns pointer to a PROGMEM string representing the Title of the Prusa-Error-Codes error
 /// @param i index of the error - obtained by calling ErrorCodeIndex
 /// @param i index of the error - obtained by calling ErrorCodeIndex
-const char * const PrusaErrorTitle(uint8_t i);
+const char * PrusaErrorTitle(uint8_t i);
 
 
 /// @returns pointer to a PROGMEM string representing the multi-page Description of the Prusa-Error-Codes error
 /// @returns pointer to a PROGMEM string representing the multi-page Description of the Prusa-Error-Codes error
 /// @param i index of the error - obtained by calling ErrorCodeIndex
 /// @param i index of the error - obtained by calling ErrorCodeIndex
-const char * const PrusaErrorDesc(uint8_t i);
+const char * PrusaErrorDesc(uint8_t i);
 
 
 /// @returns the actual numerical value of the Prusa-Error-Codes error
 /// @returns the actual numerical value of the Prusa-Error-Codes error
 /// @param i index of the error - obtained by calling ErrorCodeIndex
 /// @param i index of the error - obtained by calling ErrorCodeIndex
@@ -27,10 +27,10 @@ uint8_t PrusaErrorButtons(uint8_t i);
 
 
 /// @returns pointer to a PROGMEM string representing the Title of a button
 /// @returns pointer to a PROGMEM string representing the Title of a button
 /// @param i index of the error - obtained by calling PrusaErrorButtons + extracting low or high nibble from the Btns pair
 /// @param i index of the error - obtained by calling PrusaErrorButtons + extracting low or high nibble from the Btns pair
-const char * const PrusaErrorButtonTitle(uint8_t bi);
+const char * PrusaErrorButtonTitle(uint8_t bi);
 
 
 /// @returns pointer to a PROGMEM string representing the "More" button
 /// @returns pointer to a PROGMEM string representing the "More" button
-const char * const PrusaErrorButtonMore();
+const char * PrusaErrorButtonMore();
 
 
 /// Sets the selected button for later pick-up by the MMU state machine.
 /// Sets the selected button for later pick-up by the MMU state machine.
 /// Used to save the GUI selection/decoupling
 /// Used to save the GUI selection/decoupling

+ 1 - 1
Firmware/mmu2_power.cpp

@@ -1,5 +1,5 @@
 #include "mmu2_power.h"
 #include "mmu2_power.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #include "pins.h"
 #include "pins.h"
 #include "fastio.h"
 #include "fastio.h"
 #include <util/delay.h>
 #include <util/delay.h>

+ 3 - 3
Firmware/mmu2_progress_converter.cpp

@@ -62,11 +62,11 @@ static const char * const progressTexts[] PROGMEM = {
     _R(MSG_PROGRESS_FEED_FSENSOR)
     _R(MSG_PROGRESS_FEED_FSENSOR)
 };
 };
 
 
-const char * const ProgressCodeToText(uint16_t pc){
+const char * ProgressCodeToText(uint16_t pc){
     // @@TODO ?? a better fallback option?
     // @@TODO ?? a better fallback option?
     return ( pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])) )
     return ( pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])) )
-       ? static_cast<const char * const>(pgm_read_ptr(&progressTexts[pc]))
-       : static_cast<const char * const>(pgm_read_ptr(&progressTexts[0]));
+       ? static_cast<const char *>(pgm_read_ptr(&progressTexts[pc]))
+       : static_cast<const char *>(pgm_read_ptr(&progressTexts[0]));
 }
 }
 
 
 } // namespace MMU2
 } // namespace MMU2

+ 1 - 1
Firmware/mmu2_progress_converter.h

@@ -4,6 +4,6 @@
 
 
 namespace MMU2 {
 namespace MMU2 {
 
 
-const char * const ProgressCodeToText(uint16_t pc);
+const char * ProgressCodeToText(uint16_t pc);
 
 
 }
 }

+ 4 - 0
Firmware/mmu2_protocol.cpp

@@ -112,6 +112,10 @@ DecodeStatus Protocol::DecodeRequest(uint8_t c) {
                 rqState = RequestStates::Code;
                 rqState = RequestStates::Code;
                 return DecodeStatus::MessageCompleted;
                 return DecodeStatus::MessageCompleted;
             }
             }
+        } else {
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
         }
         }
     default: //case error:
     default: //case error:
         if (IsNewLine(c)) {
         if (IsNewLine(c)) {

+ 86 - 27
Firmware/mmu2_protocol_logic.cpp

@@ -6,7 +6,22 @@
 
 
 namespace MMU2 {
 namespace MMU2 {
 
 
-static const uint8_t supportedMmuFWVersion[3] PROGMEM = { 2, 1, 3 };
+static const uint8_t supportedMmuFWVersion[3] PROGMEM = { 2, 1, 4 };
+
+const uint8_t ProtocolLogic::regs8Addrs[ProtocolLogic::regs8Count] PROGMEM = {
+    8, // FINDA state
+    0x1b, // Selector slot
+    0x1c, // Idler slot
+};
+
+const uint8_t ProtocolLogic::regs16Addrs[ProtocolLogic::regs16Count] PROGMEM = {
+    4, // MMU errors - aka statistics
+    0x1a, // Pulley position [mm]
+};
+
+const uint8_t ProtocolLogic::initRegs8Addrs[ProtocolLogic::initRegs8Count] PROGMEM = {
+    0x0b, // extra load distance
+};
 
 
 void ProtocolLogic::CheckAndReportAsyncEvents() {
 void ProtocolLogic::CheckAndReportAsyncEvents() {
     // even when waiting for a query period, we need to report a change in filament sensor's state
     // even when waiting for a query period, we need to report a change in filament sensor's state
@@ -22,9 +37,51 @@ void ProtocolLogic::SendQuery() {
     scopeState = ScopeState::QuerySent;
     scopeState = ScopeState::QuerySent;
 }
 }
 
 
-void ProtocolLogic::SendFINDAQuery() {
-    SendMsg(RequestMsg(RequestMsgCodes::Finda, 0));
-    scopeState = ScopeState::FINDAReqSent;
+void ProtocolLogic::StartReading8bitRegisters() {
+    regIndex = 0;
+    SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
+}
+
+void ProtocolLogic::ProcessRead8bitRegister(){
+    regs8[regIndex] = rsp.paramValue;
+    ++regIndex;
+    if(regIndex >= regs8Count){
+        // proceed with reading 16bit registers
+        StartReading16bitRegisters();
+    } else {
+        SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
+    }
+}
+
+void ProtocolLogic::StartReading16bitRegisters() {
+    regIndex = 0;
+    SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
+}
+
+ProtocolLogic::ScopeState __attribute__((noinline)) ProtocolLogic::ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd){
+    regs16[regIndex] = rsp.paramValue;
+    ++regIndex;
+    if(regIndex >= regs16Count){
+        return stateAtEnd;
+    } else {
+        SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
+    }
+    return ScopeState::Reading16bitRegisters;
+}
+
+void ProtocolLogic::StartWritingInitRegisters() {
+    regIndex = 0;
+    SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
+}
+
+bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister(){
+    ++regIndex;
+    if(regIndex >= initRegs8Count){
+        return true;
+    } else {
+        SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
+    }
+    return false;
 }
 }
 
 
 void ProtocolLogic::SendAndUpdateFilamentSensor() {
 void ProtocolLogic::SendAndUpdateFilamentSensor() {
@@ -224,9 +281,12 @@ StepStatus ProtocolLogic::StartSeqStep() {
             SendVersion(3);
             SendVersion(3);
         } else {
         } else {
             mmuFwVersionBuild = rsp.paramValue; // just register the build number
             mmuFwVersionBuild = rsp.paramValue; // just register the build number
-            // Start General Interrogation after line up.
-            // For now we just send the state of the filament sensor, but we may request
-            // data point states from the MMU as well. TBD in the future, especially with another protocol
+            // Start General Interrogation after line up - initial parametrization is started
+            StartWritingInitRegisters();
+        }
+        return Processing;
+    case ScopeState::WritingInitRegisters:
+        if( ProcessWritingInitRegister() ){
             SendAndUpdateFilamentSensor();
             SendAndUpdateFilamentSensor();
         }
         }
         return Processing;
         return Processing;
@@ -313,14 +373,13 @@ StepStatus ProtocolLogic::CommandStep() {
     case ScopeState::QuerySent:
     case ScopeState::QuerySent:
         return ProcessCommandQueryResponse();
         return ProcessCommandQueryResponse();
     case ScopeState::FilamentSensorStateSent:
     case ScopeState::FilamentSensorStateSent:
-        SendFINDAQuery();
+        StartReading8bitRegisters();
         return Processing;
         return Processing;
-    case ScopeState::FINDAReqSent:
-        findaPressed = rsp.paramValue;
-        SendReadRegister(4, ScopeState::StatisticsSent);
+    case ScopeState::Reading8bitRegisters:
+        ProcessRead8bitRegister();
         return Processing;
         return Processing;
-    case ScopeState::StatisticsSent:
-        scopeState = ScopeState::Wait;
+    case ScopeState::Reading16bitRegisters:
+        scopeState = ProcessRead16bitRegister(ScopeState::Wait);
         return Processing;
         return Processing;
     case ScopeState::ButtonSent:
     case ScopeState::ButtonSent:
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
@@ -371,7 +430,7 @@ StepStatus ProtocolLogic::IdleStep() {
                 // The user pushed a button on the MMU. Save it, do what we need to do
                 // The user pushed a button on the MMU. Save it, do what we need to do
                 // to prepare, then pass it back to the MMU so it can work its magic.
                 // to prepare, then pass it back to the MMU so it can work its magic.
                 buttonCode = static_cast<Buttons>(rsp.paramValue);
                 buttonCode = static_cast<Buttons>(rsp.paramValue);
-                SendFINDAQuery();
+                StartReading8bitRegisters();
                 return ButtonPushed;
                 return ButtonPushed;
             case ResponseMsgParamCodes::Processing:
             case ResponseMsgParamCodes::Processing:
                 // @@TODO we may actually use this branch to report progress of manual operation on the MMU
                 // @@TODO we may actually use this branch to report progress of manual operation on the MMU
@@ -382,29 +441,27 @@ StepStatus ProtocolLogic::IdleStep() {
                 break;
                 break;
             default:
             default:
                 errorCode = static_cast<ErrorCode>(rsp.paramValue);
                 errorCode = static_cast<ErrorCode>(rsp.paramValue);
-                SendFINDAQuery(); // continue Idle state without restarting the communication
+                StartReading8bitRegisters(); // continue Idle state without restarting the communication
                 return CommandError;
                 return CommandError;
             }
             }
             break;
             break;
         default:
         default:
             return ProtocolError;
             return ProtocolError;
         }
         }
-        SendFINDAQuery();
+        StartReading8bitRegisters();
         return Processing;
         return Processing;
-    case ScopeState::FINDAReqSent:
-        findaPressed = rsp.paramValue;
-        SendReadRegister(4, ScopeState::StatisticsSent);
+    case ScopeState::Reading8bitRegisters:
+        ProcessRead8bitRegister();
         return Processing;
         return Processing;
-    case ScopeState::StatisticsSent:
-        failStatistics = rsp.paramValue;
-        scopeState = ScopeState::Ready;
-        return Finished;
+    case ScopeState::Reading16bitRegisters:
+        scopeState = ProcessRead16bitRegister(ScopeState::Ready);
+        return scopeState == ScopeState::Ready ? Finished : Processing;
     case ScopeState::ButtonSent:
     case ScopeState::ButtonSent:
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
             // Button was accepted, decrement the retry.
             // Button was accepted, decrement the retry.
             mmu2.DecrementRetryAttempts();
             mmu2.DecrementRetryAttempts();
         }
         }
-        SendFINDAQuery();
+        StartReading8bitRegisters();
         return Processing;
         return Processing;
     case ScopeState::ReadRegisterSent:
     case ScopeState::ReadRegisterSent:
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
         if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
@@ -430,7 +487,7 @@ StepStatus ProtocolLogic::IdleStep() {
     return Finished;
     return Finished;
 }
 }
 
 
-ProtocolLogic::ProtocolLogic(MMU2Serial *uart)
+ProtocolLogic::ProtocolLogic(MMU2Serial *uart, uint8_t extraLoadDistance)
     : currentScope(Scope::Stopped)
     : currentScope(Scope::Stopped)
     , scopeState(ScopeState::Ready)
     , scopeState(ScopeState::Ready)
     , plannedRq(RequestMsgCodes::unknown, 0)
     , plannedRq(RequestMsgCodes::unknown, 0)
@@ -444,8 +501,10 @@ ProtocolLogic::ProtocolLogic(MMU2Serial *uart)
     , progressCode(ProgressCode::OK)
     , progressCode(ProgressCode::OK)
     , buttonCode(NoButton)
     , buttonCode(NoButton)
     , lastFSensor((uint8_t)WhereIsFilament())
     , lastFSensor((uint8_t)WhereIsFilament())
-    , findaPressed(false)
-    , failStatistics(0)
+    , regs8 { 0, 0, 0 }
+    , regs16 { 0, 0 }
+    , initRegs8 { extraLoadDistance }
+    , regIndex(0)
     , mmuFwVersion { 0, 0, 0 }
     , mmuFwVersion { 0, 0, 0 }
 {}
 {}
 
 

+ 46 - 10
Firmware/mmu2_protocol_logic.h

@@ -1,5 +1,6 @@
 #pragma once
 #pragma once
 #include <stdint.h>
 #include <stdint.h>
+#include <avr/pgmspace.h>
 // #include <array> //@@TODO Don't we have STL for AVR somewhere?
 // #include <array> //@@TODO Don't we have STL for AVR somewhere?
 template<typename T, uint8_t N>
 template<typename T, uint8_t N>
 class array {
 class array {
@@ -70,7 +71,7 @@ public:
 /// Logic layer of the MMU vs. printer communication protocol
 /// Logic layer of the MMU vs. printer communication protocol
 class ProtocolLogic {
 class ProtocolLogic {
 public:
 public:
-    ProtocolLogic(MMU2Serial *uart);
+    ProtocolLogic(MMU2Serial *uart, uint8_t extraLoadDistance);
 
 
     /// Start/Enable communication with the MMU
     /// Start/Enable communication with the MMU
     void Start();
     void Start();
@@ -91,6 +92,17 @@ public:
     void ReadRegister(uint8_t address);
     void ReadRegister(uint8_t address);
     void WriteRegister(uint8_t address, uint16_t data);
     void WriteRegister(uint8_t address, uint16_t data);
 
 
+    /// Sets the extra load distance to be reported to the MMU.
+    /// Beware - this call doesn't send anything to the MMU.
+    /// The MMU gets the newly set value either by a communication restart or via an explicit WriteRegister call
+    inline void PlanExtraLoadDistance(uint8_t eld_mm){
+        initRegs8[0] = eld_mm;
+    }
+    /// @returns the currently preset extra load distance
+    inline uint8_t ExtraLoadDistance()const {
+        return initRegs8[0];
+    }
+
     /// Step the state machine
     /// Step the state machine
     StepStatus Step();
     StepStatus Step();
 
 
@@ -110,11 +122,11 @@ public:
     }
     }
 
 
     inline bool FindaPressed() const {
     inline bool FindaPressed() const {
-        return findaPressed;
+        return regs8[0];
     }
     }
 
 
     inline uint16_t FailStatistics() const {
     inline uint16_t FailStatistics() const {
-        return failStatistics;
+        return regs16[0];
     }
     }
 
 
     inline uint8_t MmuFwVersionMajor() const {
     inline uint8_t MmuFwVersionMajor() const {
@@ -187,10 +199,11 @@ private:
         QuerySent,
         QuerySent,
         CommandSent,
         CommandSent,
         FilamentSensorStateSent,
         FilamentSensorStateSent,
-        FINDAReqSent,
-        StatisticsSent,
+        Reading8bitRegisters,
+        Reading16bitRegisters,
+        WritingInitRegisters,
         ButtonSent,
         ButtonSent,
-        ReadRegisterSent,
+        ReadRegisterSent, // standalone requests for reading registers - from higher layers
         WriteRegisterSent,
         WriteRegisterSent,
 
 
         // States which do not expect a message - MSb set
         // States which do not expect a message - MSb set
@@ -217,7 +230,13 @@ private:
     /// So far, the only such a case is the filament sensor, but there can be more like this in the future.
     /// So far, the only such a case is the filament sensor, but there can be more like this in the future.
     void CheckAndReportAsyncEvents();
     void CheckAndReportAsyncEvents();
     void SendQuery();
     void SendQuery();
-    void SendFINDAQuery();
+    void StartReading8bitRegisters();
+    void ProcessRead8bitRegister();
+    void StartReading16bitRegisters();
+    ScopeState ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd);
+    void StartWritingInitRegisters();
+    /// @returns true when all registers have been written into the MMU
+    bool ProcessWritingInitRegister();
     void SendAndUpdateFilamentSensor();
     void SendAndUpdateFilamentSensor();
     void SendButton(uint8_t btn);
     void SendButton(uint8_t btn);
     void SendVersion(uint8_t stage);
     void SendVersion(uint8_t stage);
@@ -278,7 +297,7 @@ private:
     State state; ///< internal state of ProtocolLogic
     State state; ///< internal state of ProtocolLogic
 
 
     Protocol protocol; ///< protocol codec
     Protocol protocol; ///< protocol codec
-    
+
     array<uint8_t, 16> lastReceivedBytes; ///< remembers the last few bytes of incoming communication for diagnostic purposes
     array<uint8_t, 16> lastReceivedBytes; ///< remembers the last few bytes of incoming communication for diagnostic purposes
     uint8_t lrb;
     uint8_t lrb;
 
 
@@ -290,8 +309,25 @@ private:
 
 
     uint8_t lastFSensor; ///< last state of filament sensor
     uint8_t lastFSensor; ///< last state of filament sensor
 
 
-    bool findaPressed;
-    uint16_t failStatistics;
+    // 8bit registers
+    static constexpr uint8_t regs8Count = 3;
+    static_assert(regs8Count > 0); // code is not ready for empty lists of registers
+    static const uint8_t regs8Addrs[regs8Count] PROGMEM;
+    uint8_t regs8[regs8Count];
+
+    // 16bit registers
+    static constexpr uint8_t regs16Count = 2;
+    static_assert(regs16Count > 0); // code is not ready for empty lists of registers
+    static const uint8_t regs16Addrs[regs16Count] PROGMEM;
+    uint16_t regs16[regs16Count];
+
+    // 8bit init values to be sent to the MMU after line up
+    static constexpr uint8_t initRegs8Count = 1;
+    static_assert(initRegs8Count > 0); // code is not ready for empty lists of registers
+    static const uint8_t initRegs8Addrs[initRegs8Count] PROGMEM;
+    uint8_t initRegs8[initRegs8Count];
+
+    uint8_t regIndex;
 
 
     uint8_t mmuFwVersion[3];
     uint8_t mmuFwVersion[3];
     uint16_t mmuFwVersionBuild;
     uint16_t mmuFwVersionBuild;

+ 12 - 11
Firmware/mmu2_reporting.cpp

@@ -11,14 +11,14 @@
 
 
 namespace MMU2 {
 namespace MMU2 {
 
 
-const char * const ProgressCodeToText(uint16_t pc); // we may join progress convertor and reporter together
+const char * ProgressCodeToText(uint16_t pc); // we may join progress convertor and reporter together
 
 
-void BeginReport(CommandInProgress cip, uint16_t ec) {
+void BeginReport(CommandInProgress /*cip*/, uint16_t ec) {
     custom_message_type = CustomMsg::MMUProgress;
     custom_message_type = CustomMsg::MMUProgress;
     lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
     lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
 }
 }
 
 
-void EndReport(CommandInProgress cip, uint16_t ec) {
+void EndReport(CommandInProgress /*cip*/, uint16_t /*ec*/) {
     // clear the status msg line - let the printed filename get visible again
     // clear the status msg line - let the printed filename get visible again
     custom_message_type = CustomMsg::Status;
     custom_message_type = CustomMsg::Status;
 }
 }
@@ -52,7 +52,7 @@ static void ReportErrorHookStaticRender(uint8_t ei) {
     //! |MMU FW update needed|     <- title/header of the error: max 20 characters
     //! |MMU FW update needed|     <- title/header of the error: max 20 characters
     //! |prusa3d.com/ERR04504|     <- URL 20 characters
     //! |prusa3d.com/ERR04504|     <- URL 20 characters
     //! |FI:1 FS:1  5>3 t201°|     <- status line, t is thermometer symbol
     //! |FI:1 FS:1  5>3 t201°|     <- status line, t is thermometer symbol
-    //! |>Retry >Done >MoreW |     <- buttons
+    //! |>Retry   >Done    >W|     <- buttons
     bool two_choices = false;
     bool two_choices = false;
 
 
     // Read and determine what operations should be shown on the menu
     // Read and determine what operations should be shown on the menu
@@ -74,9 +74,9 @@ static void ReportErrorHookStaticRender(uint8_t ei) {
     lcd_printf_P(PSTR("%.20S\nprusa3d.com/ERR04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );
     lcd_printf_P(PSTR("%.20S\nprusa3d.com/ERR04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );
 
 
     ReportErrorHookSensorLineRender();
     ReportErrorHookSensorLineRender();
-    
+
     // Render the choices
     // Render the choices
-    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), _T(two_choices ? PrusaErrorButtonMore() : PrusaErrorButtonTitle(button_op_right)), two_choices ? 10 : 7, two_choices ? nullptr : _T(PrusaErrorButtonMore()));
+    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), _T(two_choices ? PrusaErrorButtonMore() : PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : _T(PrusaErrorButtonMore()));
 }
 }
 
 
 extern void ReportErrorHookSensorLineRender()
 extern void ReportErrorHookSensorLineRender()
@@ -166,12 +166,13 @@ static uint8_t ReportErrorHookMonitor(uint8_t ei) {
         lcd_print(current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
         lcd_print(current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
         if (two_choices == false)
         if (two_choices == false)
         {
         {
-            lcd_set_cursor(7, 3);
+            lcd_set_cursor(9, 3);
             lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
             lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
-            lcd_set_cursor(13, 3);
+            lcd_set_cursor(18, 3);
             lcd_print(current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
             lcd_print(current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
         } else {
         } else {
-            lcd_set_cursor(10, 3);
+            // More button for two button screen
+            lcd_set_cursor(18, 3);
             lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
             lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
         }
         }
         // Consume rotation event and make feedback sound
         // Consume rotation event and make feedback sound
@@ -216,8 +217,8 @@ enum class ReportErrorHookStates : uint8_t {
 
 
 enum ReportErrorHookStates ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
 enum ReportErrorHookStates ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
 
 
-void ReportErrorHook(uint16_t ec, uint8_t res) {
-    if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && res == MMU2::ErrorSourceMMU)
+void ReportErrorHook(uint16_t ec) {
+    if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && mmu2.MMULastErrorSource() == MMU2::ErrorSourceMMU)
     {
     {
         // If the error code suddenly changes to OK, that means
         // If the error code suddenly changes to OK, that means
         // a button was pushed on the MMU and the LCD should
         // a button was pushed on the MMU and the LCD should

+ 1 - 2
Firmware/mmu2_reporting.h

@@ -27,9 +27,8 @@ void EndReport(CommandInProgress cip, uint16_t ec);
  * Render MMU error screen on the LCD. This must be non-blocking
  * Render MMU error screen on the LCD. This must be non-blocking
  * and allow the MMU and printer to communicate with each other.
  * and allow the MMU and printer to communicate with each other.
  * @param[in] ec error code
  * @param[in] ec error code
- * @param[in] res reporter error source, is either Printer (0) or MMU (1)
  */
  */
-void ReportErrorHook(uint16_t ec, uint8_t res);
+void ReportErrorHook(uint16_t ec);
 
 
 /// Called when the MMU sends operation progress update
 /// Called when the MMU sends operation progress update
 void ReportProgressHook(CommandInProgress cip, uint16_t ec);
 void ReportProgressHook(CommandInProgress cip, uint16_t ec);

+ 1 - 1
Firmware/mmu2_serial.cpp

@@ -19,7 +19,7 @@ void MMU2Serial::flush() {
     // @@TODO - clear the output buffer
     // @@TODO - clear the output buffer
 }
 }
 
 
-size_t MMU2Serial::write(const uint8_t *buffer, size_t size) {
+void MMU2Serial::write(const uint8_t *buffer, size_t size) {
     while(size--){
     while(size--){
         fputc(*buffer, uart2io);
         fputc(*buffer, uart2io);
         ++buffer;
         ++buffer;

+ 1 - 1
Firmware/mmu2_serial.h

@@ -12,7 +12,7 @@ public:
     void close();
     void close();
     int read();
     int read();
     void flush();
     void flush();
-    size_t write(const uint8_t *buffer, size_t size);
+    void write(const uint8_t *buffer, size_t size);
 };
 };
 
 
 extern MMU2Serial mmu2Serial;
 extern MMU2Serial mmu2Serial;

+ 1 - 1
Firmware/pat9125.cpp

@@ -4,7 +4,7 @@
 #include <avr/pgmspace.h>
 #include <avr/pgmspace.h>
 #include "config.h"
 #include "config.h"
 #include <stdio.h>
 #include <stdio.h>
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 
 
 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 

+ 1 - 1
Firmware/sm4.c

@@ -9,7 +9,7 @@
 #include "boards.h"
 #include "boards.h"
 #define false 0
 #define false 0
 #define true 1
 #define true 1
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 
 
 
 
 #ifdef NEW_XYZCAL
 #ifdef NEW_XYZCAL

+ 1 - 1
Firmware/swi2c.c

@@ -4,7 +4,7 @@
 #include <util/delay.h>
 #include <util/delay.h>
 #include <avr/pgmspace.h>
 #include <avr/pgmspace.h>
 #include "stdbool.h"
 #include "stdbool.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #include "pins.h"
 #include "pins.h"
 #include "fastio.h"
 #include "fastio.h"
 
 

+ 6 - 5
Firmware/temperature.cpp

@@ -44,7 +44,7 @@
 #include "adc.h"
 #include "adc.h"
 #include "ConfigurationStore.h"
 #include "ConfigurationStore.h"
 #include "Timer.h"
 #include "Timer.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #include "Prusa_farm.h"
 #include "Prusa_farm.h"
 
 
 #if (ADC_OVRSAMPL != OVERSAMPLENR)
 #if (ADC_OVRSAMPL != OVERSAMPLENR)
@@ -1210,27 +1210,27 @@ FORCE_INLINE static void soft_pwm_core()
   static unsigned char slow_pwm_count = 0;
   static unsigned char slow_pwm_count = 0;
   static unsigned char state_heater_0 = 0;
   static unsigned char state_heater_0 = 0;
   static unsigned char state_timer_heater_0 = 0;
   static unsigned char state_timer_heater_0 = 0;
-#endif 
+#endif
 #if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL)
 #if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL)
   static unsigned char soft_pwm_1;
   static unsigned char soft_pwm_1;
 #ifdef SLOW_PWM_HEATERS
 #ifdef SLOW_PWM_HEATERS
   static unsigned char state_heater_1 = 0;
   static unsigned char state_heater_1 = 0;
   static unsigned char state_timer_heater_1 = 0;
   static unsigned char state_timer_heater_1 = 0;
-#endif 
+#endif
 #endif
 #endif
 #if EXTRUDERS > 2
 #if EXTRUDERS > 2
   static unsigned char soft_pwm_2;
   static unsigned char soft_pwm_2;
 #ifdef SLOW_PWM_HEATERS
 #ifdef SLOW_PWM_HEATERS
   static unsigned char state_heater_2 = 0;
   static unsigned char state_heater_2 = 0;
   static unsigned char state_timer_heater_2 = 0;
   static unsigned char state_timer_heater_2 = 0;
-#endif 
+#endif
 #endif
 #endif
 #if HEATER_BED_PIN > -1
 #if HEATER_BED_PIN > -1
   // @@DR static unsigned char soft_pwm_b;
   // @@DR static unsigned char soft_pwm_b;
 #ifdef SLOW_PWM_HEATERS
 #ifdef SLOW_PWM_HEATERS
   static unsigned char state_heater_b = 0;
   static unsigned char state_heater_b = 0;
   static unsigned char state_timer_heater_b = 0;
   static unsigned char state_timer_heater_b = 0;
-#endif 
+#endif
 #endif
 #endif
   
   
 #if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
 #if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
@@ -2904,6 +2904,7 @@ void temp_model_autotune(int16_t temp, bool selftest)
         temp_model_report_settings();
         temp_model_report_settings();
     }
     }
 
 
+    lcd_consume_click();
     menu_unset_block(MENU_BLOCK_TEMP_MODEL_AUTOTUNE);
     menu_unset_block(MENU_BLOCK_TEMP_MODEL_AUTOTUNE);
 }
 }
 
 

+ 1 - 1
Firmware/tone04.c

@@ -3,7 +3,7 @@
 // timer2 is used for System timer.
 // timer2 is used for System timer.
 
 
 #include "system_timer.h"
 #include "system_timer.h"
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 
 
 #ifdef SYSTEM_TIMER_2
 #ifdef SYSTEM_TIMER_2
 
 

+ 20 - 42
Firmware/ultralcd.cpp

@@ -297,32 +297,19 @@ const char STR_SEPARATOR[] PROGMEM = "------------";
 
 
 static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename)
 static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename)
 {
 {
-    char c;
-    uint8_t n = LCD_WIDTH - 1;
+    uint8_t len = LCD_WIDTH - 1;
     lcd_set_cursor(0, row);
     lcd_set_cursor(0, row);
-	lcd_print((lcd_encoder == menu_item)?'>':' ');
-    while( ((c = *longFilename) != '\0') && (n>0) )
-    {
-        lcd_print(c);
-        longFilename++;
-        n--;
-    }
-    lcd_space(n);
+    lcd_print((lcd_encoder == menu_item)?'>':' ');
+    lcd_print_pad(longFilename, len);
 }
 }
+
 static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* longFilename)
 static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* longFilename)
 {
 {
-    char c;
-    uint8_t n = LCD_WIDTH - 2;
+    uint8_t len = LCD_WIDTH - 2;
     lcd_set_cursor(0, row);
     lcd_set_cursor(0, row);
-	lcd_print((lcd_encoder == menu_item)?'>':' ');
-	lcd_print(LCD_STR_FOLDER[0]);
-    while( ((c = *longFilename) != '\0') && (n>0) )
-    {
-        lcd_print(c);
-        longFilename++;
-        n--;
-    }
-    lcd_space(n);
+    lcd_print((lcd_encoder == menu_item)?'>':' ');
+    lcd_print(LCD_STR_FOLDER[0]);
+    lcd_print_pad(longFilename, len);
 }
 }
 
 
 
 
@@ -621,6 +608,8 @@ void lcdui_print_status_line(void) {
         case CustomMsg::M117:   // M117 Set the status line message on the LCD
         case CustomMsg::M117:   // M117 Set the status line message on the LCD
         case CustomMsg::Status: // Nothing special, print status message normally
         case CustomMsg::Status: // Nothing special, print status message normally
         case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD
         case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD
+        case CustomMsg::FilamentLoading: // If loading filament, print status
+        case CustomMsg::MMUProgress: // MMU Progress Codes
             lcd_print_pad(lcd_status_message, LCD_WIDTH);
             lcd_print_pad(lcd_status_message, LCD_WIDTH);
         break;
         break;
         case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
         case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
@@ -643,9 +632,6 @@ void lcdui_print_status_line(void) {
                 }
                 }
             }
             }
             break;
             break;
-        case CustomMsg::FilamentLoading: // If loading filament, print status
-            lcd_print_pad(lcd_status_message, LCD_WIDTH);
-            break;
         case CustomMsg::PidCal: // PID tuning in progress
         case CustomMsg::PidCal: // PID tuning in progress
             lcd_print_pad(lcd_status_message, LCD_WIDTH);
             lcd_print_pad(lcd_status_message, LCD_WIDTH);
             if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
             if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
@@ -670,10 +656,6 @@ void lcdui_print_status_line(void) {
         case CustomMsg::Resuming: // Resuming
         case CustomMsg::Resuming: // Resuming
             lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
             lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
             break;
             break;
-        case CustomMsg::MMUProgress:
-            // set up at mmu2_reporting.cpp, just do nothing here
-            lcd_print(lcd_status_message);
-            break;
         }
         }
     }
     }
 }
 }
@@ -1657,7 +1639,7 @@ static void lcd_support_menu()
   MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE));
   MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE));
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(_i("Date:"));////MSG_DATE c=17
   MENU_ITEM_BACK_P(_i("Date:"));////MSG_DATE c=17
-  MENU_ITEM_BACK_P(PSTR(__DATE__));
+  MENU_ITEM_BACK_P(PSTR(SOURCE_DATE_EPOCH));
 
 
 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(STR_SEPARATOR);
@@ -3165,25 +3147,21 @@ uint8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool all
 //! @param selected Show first choice as selected if true, the second otherwise
 //! @param selected Show first choice as selected if true, the second otherwise
 //! @param first_choice text caption of first possible choice
 //! @param first_choice text caption of first possible choice
 //! @param second_choice text caption of second possible choice
 //! @param second_choice text caption of second possible choice
-//! @param second_col column on LCD where second choice is rendered. If third choice is set, this value is hardcoded to 7
+//! @param second_col column on LCD where second choice is rendered.
 //! @param third_choice text caption of third, optional, choice.
 //! @param third_choice text caption of third, optional, choice.
 void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice)
 void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice)
 {
 {
     lcd_set_cursor(0, 3);
     lcd_set_cursor(0, 3);
     lcd_print(selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
     lcd_print(selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
     lcd_puts_P(first_choice);
     lcd_puts_P(first_choice);
+    lcd_set_cursor(second_col, 3);
+    lcd_print(selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
+    lcd_puts_P(second_choice);
     if (third_choice)
     if (third_choice)
     {
     {
-        lcd_set_cursor(7, 3);
-        lcd_print(selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
-        lcd_puts_P(second_choice);
-        lcd_set_cursor(13, 3);
+        lcd_set_cursor(18, 3);
         lcd_print(selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
         lcd_print(selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
         lcd_puts_P(third_choice);
         lcd_puts_P(third_choice);
-    } else {
-        lcd_set_cursor(second_col, 3);
-        lcd_print(selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
-        lcd_puts_P(second_choice);
     }
     }
 }
 }
 
 
@@ -7525,12 +7503,12 @@ static void lcd_updatestatus(const char *message, bool progmem = false)
     else
     else
         strncpy(lcd_status_message, message, LCD_WIDTH);
         strncpy(lcd_status_message, message, LCD_WIDTH);
 
 
-	lcd_status_message[LCD_WIDTH] = 0;
+    lcd_status_message[LCD_WIDTH] = 0;
 
 
-	SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED);
+    SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED);
 
 
-	// hack lcd_draw_update to 1, i.e. without clear
-	lcd_draw_update = 1;
+    // hack lcd_draw_update to 1, i.e. without clear
+    lcd_draw_update = 1;
 }
 }
 
 
 void lcd_setstatus(const char* message)
 void lcd_setstatus(const char* message)

+ 2 - 2
Firmware/xyzcal.cpp

@@ -1,6 +1,6 @@
 //xyzcal.cpp - xyz calibration with image processing
 //xyzcal.cpp - xyz calibration with image processing
 
 
-#include "Configuration_prusa.h"
+#include "Configuration_var.h"
 #ifdef NEW_XYZCAL
 #ifdef NEW_XYZCAL
 
 
 #include "xyzcal.h"
 #include "xyzcal.h"
@@ -551,7 +551,7 @@ void go_manhattan(int16_t x, int16_t y, int16_t z, int16_t acc, uint16_t min_del
 	// DBG(_n("\n"));
 	// DBG(_n("\n"));
 }
 }
 
 
-void xyzcal_scan_pixels_32x32_Zhop(int16_t cx, int16_t cy, int16_t min_z, int16_t max_z, uint16_t delay_us, uint8_t *pixels){
+void __attribute__((noinline)) xyzcal_scan_pixels_32x32_Zhop(int16_t cx, int16_t cy, int16_t min_z, int16_t max_z, uint16_t delay_us, uint8_t *pixels){
 	if (!pixels)
 	if (!pixels)
 		return;
 		return;
 	int16_t z_trig;
 	int16_t z_trig;

+ 21 - 35
PF-build.sh

@@ -85,7 +85,7 @@
 # 15 Feb 2019, 3d-gussner, troubleshooting and minor fixes
 # 15 Feb 2019, 3d-gussner, troubleshooting and minor fixes
 # 16 Feb 2019, 3d-gussner, Script can be run using arguments
 # 16 Feb 2019, 3d-gussner, Script can be run using arguments
 #                          $1 = variant, example "1_75mm_MK3-EINSy10a-E3Dv6full.h" at this moment it is not possible to use ALL
 #                          $1 = variant, example "1_75mm_MK3-EINSy10a-E3Dv6full.h" at this moment it is not possible to use ALL
-#                          $2 = multi language OR English only [ALL/EN_ONLY]
+#                          $2 = multi language OR English only [ALL/EN_FARM]
 #                          $3 = development status [GOLD/RC/BETA/ALPHA/DEVEL/DEBUG]
 #                          $3 = development status [GOLD/RC/BETA/ALPHA/DEVEL/DEBUG]
 #                          If one argument is wrong a list of valid one will be shown
 #                          If one argument is wrong a list of valid one will be shown
 # 13 Mar 2019, 3d-gussner, MKbel updated the Linux build environment to version 1.0.2 with an Fix maximum firmware flash size.
 # 13 Mar 2019, 3d-gussner, MKbel updated the Linux build environment to version 1.0.2 with an Fix maximum firmware flash size.
@@ -124,7 +124,7 @@
 #                          After compiling All multi-language variants it makes it easier to find missing or unused translations.
 #                          After compiling All multi-language variants it makes it easier to find missing or unused translations.
 # 12 May 2020, DRracer   , Cleanup double MK2/s MK25/s `not_tran` and `not_used` files
 # 12 May 2020, DRracer   , Cleanup double MK2/s MK25/s `not_tran` and `not_used` files
 # 13 May 2020, leptun    , If cleanup files do not exist don't try to.
 # 13 May 2020, leptun    , If cleanup files do not exist don't try to.
-# 01 Oct 2020, 3d-gussner, Bug fix if using argument EN_ONLY. Thank to @leptun for pointing out.
+# 01 Oct 2020, 3d-gussner, Bug fix if using argument EN_FARM. Thank to @leptun for pointing out.
 #                          Change Build number to script commits 'git rev-list --count HEAD PF-build.sh'
 #                          Change Build number to script commits 'git rev-list --count HEAD PF-build.sh'
 # 02 Oct 2020, 3d-gussner, Add UNKNOWN as argument option
 # 02 Oct 2020, 3d-gussner, Add UNKNOWN as argument option
 # 05 Oct 2020, 3d-gussner, Disable pause and warnings using command line with all needed arguments
 # 05 Oct 2020, 3d-gussner, Disable pause and warnings using command line with all needed arguments
@@ -268,7 +268,7 @@ echo "  -d : '$(tput setaf 2)GOLD$(tput sgr0)', '$(tput setaf 2)RC$(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"
-echo "  -l : '$(tput setaf 2)ALL$(tput sgr0)' for multi language or '$(tput setaf 2)EN_ONLY$(tput sgr0)' for English only"
+echo "  -l : '$(tput setaf 2)ALL$(tput sgr0)' for multi language or '$(tput setaf 2)EN_FARM$(tput sgr0)' for English only"
 echo "  -m : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes '$(tput setaf 2)2$(tput sgr0)' with MMU2"
 echo "  -m : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes '$(tput setaf 2)2$(tput sgr0)' with MMU2"
 echo "  -n : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes"
 echo "  -n : '$(tput setaf 2)0$(tput sgr0)' no, '$(tput setaf 2)1$(tput sgr0)' yes"
 echo "  -o : '$(tput setaf 2)1$(tput sgr0)' force or '$(tput setaf 2)0$(tput sgr0)' block output and delays"
 echo "  -o : '$(tput setaf 2)1$(tput sgr0)' force or '$(tput setaf 2)0$(tput sgr0)' block output and delays"
@@ -530,19 +530,6 @@ fi
 }
 }
 # End: Check python ... needed during language build
 # End: Check python ... needed during language build
 
 
-#Start: Check gawk ... needed during language build
-check_gawk()
-{
-if ! type gawk > /dev/null; then
-    if [ $TARGET_OS == "linux" ]; then
-        echo "$(tput setaf 1)Missing 'gawk' which is important to run this script"
-        echo "install it with the command $(tput setaf 2)'sudo apt-get install gawk'."
-        #sudo apt-get update && apt-get install gawk
-        failures 4
-    fi
-fi
-}
-#End: Check gawk ... needed during language build
 
 
 #### Start: Set build environment 
 #### Start: Set build environment 
 set_build_env_variables()
 set_build_env_variables()
@@ -551,20 +538,20 @@ BUILD_ENV="1.0.8"
 BOARD="prusa_einsy_rambo"
 BOARD="prusa_einsy_rambo"
 BOARD_PACKAGE_NAME="PrusaResearch"
 BOARD_PACKAGE_NAME="PrusaResearch"
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
-    BOARD_VERSION="1.0.5-2"
+    BOARD_VERSION="1.0.6"
 else
 else
     BOARD_VERSION="1.0.4"
     BOARD_VERSION="1.0.4"
 fi
 fi
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
-    BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/devel/IDE_Board_Manager/package_prusa3d_index.json"
-    #BOARD_URL="https://raw.githubusercontent.com/3d-gussner/Arduino_Boards/devel/IDE_Board_Manager/package_prusa3d_index.json"
+    BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json"
+    #BOARD_URL="https://raw.githubusercontent.com/3d-gussner/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json"
 else
 else
     BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json"
     BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json"
 fi
 fi
 BOARD_FILENAME="prusa3dboards"
 BOARD_FILENAME="prusa3dboards"
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
 if [ "$ARDUINO_ENV" == "1.8.19" ]; then
-    BOARD_FILE_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/devel/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
-    #BOARD_FILE_URL="https://raw.githubusercontent.com/3d-gussner/Arduino_Boards/devel/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
+    BOARD_FILE_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
+    #BOARD_FILE_URL="https://raw.githubusercontent.com/3d-gussner/Arduino_Boards/master/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
 else
 else
     BOARD_FILE_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
     BOARD_FILE_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/prusa3dboards-$BOARD_VERSION.tar.bz2"
 fi
 fi
@@ -882,7 +869,7 @@ else
     fi
     fi
 fi
 fi
 
 
-#'-l' argument defines if it is an English only version. Known values EN_ONLY / ALL
+#'-l' argument defines if it is an English only version. Known values EN_FARM / ALL
 #Check default language mode
 #Check default language mode
 MULTI_LANGUAGE_CHECK=$(grep --max-count=1 "^#define LANG_MODE *" $SCRIPT_PATH/Firmware/config.h|sed -e's/  */ /g'|cut -d ' ' -f3)
 MULTI_LANGUAGE_CHECK=$(grep --max-count=1 "^#define LANG_MODE *" $SCRIPT_PATH/Firmware/config.h|sed -e's/  */ /g'|cut -d ' ' -f3)
 
 
@@ -897,7 +884,7 @@ if [ -z "$language_flag" ] ; then
                 break
                 break
                 ;;
                 ;;
             "English only") 
             "English only") 
-                LANGUAGES="EN_ONLY"
+                LANGUAGES="EN_FARM"
                 break
                 break
                 ;;
                 ;;
             *)
             *)
@@ -906,11 +893,11 @@ if [ -z "$language_flag" ] ; then
         esac
         esac
     done
     done
 else
 else
-    if [[ "$language_flag" == "ALL" || "$language_flag" == "EN_ONLY" ]] ; then
+    if [[ "$language_flag" == "ALL" || "$language_flag" == "EN_FARM" ]] ; then
         LANGUAGES=$language_flag
         LANGUAGES=$language_flag
     else
     else
         echo "$(tput setaf 1)Language argument is wrong!$(tput sgr0)"
         echo "$(tput setaf 1)Language argument is wrong!$(tput sgr0)"
-        echo "Only $(tput setaf 2)'ALL'$(tput sgr0) or $(tput setaf 2)'EN_ONLY'$(tput sgr0) are allowed as language '-l' argument!"
+        echo "Only $(tput setaf 2)'ALL'$(tput sgr0) or $(tput setaf 2)'EN_FARM'$(tput sgr0) are allowed as language '-l' argument!"
         failures 5
         failures 5
     fi
     fi
 fi
 fi
@@ -1110,9 +1097,9 @@ prepare_hex_folders()
         if [ $OUTPUT == "1" ] ; then
         if [ $OUTPUT == "1" ] ; then
             read -t 10 -p "Press Enter to continue..."
             read -t 10 -p "Press Enter to continue..."
         fi
         fi
-    elif [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_ONLY.hex"  &&  "$LANGUAGES" == "EN_ONLY" ]]; then
+    elif [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_FARM.hex"  &&  "$LANGUAGES" == "EN_FARM" ]]; then
         echo ""
         echo ""
-        ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_ONLY.hex | xargs -n1 basename
+        ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_FARM.hex | xargs -n1 basename
         echo "$(tput setaf 6)This hex file to be compiled already exists! To cancel this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
         echo "$(tput setaf 6)This hex file to be compiled already exists! To cancel this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
         if [ $OUTPUT == "1" ] ; then
         if [ $OUTPUT == "1" ] ; then
             read -t 10 -p "Press Enter to continue..."
             read -t 10 -p "Press Enter to continue..."
@@ -1171,7 +1158,7 @@ prepare_variant_for_compiling()
     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
 
 
     #Prepare English only or multi-language version to be build
     #Prepare English only or multi-language version to be build
-    if [ $LANGUAGES == "EN_ONLY" ]; then
+    if [ $LANGUAGES == "EN_FARM" ]; then
         echo " "
         echo " "
         echo "English only language firmware will be built"
         echo "English only language firmware will be built"
         sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE              0/g" $SCRIPT_PATH/Firmware/config.h
         sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE              0/g" $SCRIPT_PATH/Firmware/config.h
@@ -1379,17 +1366,17 @@ create_multi_firmware()
 }
 }
 #### End: Create and save Multi Language Prusa Firmware
 #### End: Create and save Multi Language Prusa Firmware
 
 
-#### Start: Save EN_ONLY language Prusa Firmware
+#### Start: Save EN_FARM language Prusa Firmware
 save_en_firmware()
 save_en_firmware()
 {
 {
     #else
     #else
         echo "$(tput setaf 2)Copying English only firmware to PF-build-hex folder$(tput sgr 0)"
         echo "$(tput setaf 2)Copying English only firmware to PF-build-hex folder$(tput sgr 0)"
-        cp -f $BUILD_PATH/Firmware.ino.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_ONLY.hex || failures 12
+        cp -f $BUILD_PATH/Firmware.ino.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_FARM.hex || failures 12
         echo "$(tput setaf 2)Copying English only elf file to PF-build-hex folder$(tput sgr 0)"
         echo "$(tput setaf 2)Copying English only elf file to PF-build-hex folder$(tput sgr 0)"
-        cp -f $BUILD_PATH/Firmware.ino.elf $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_ONLY.elf || failures 12
+        cp -f $BUILD_PATH/Firmware.ino.elf $SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_FARM.elf || failures 12
     #fi
     #fi
 }
 }
-#### End: Save EN_ONLY language Prusa Firmware
+#### End: Save EN_FARM language Prusa Firmware
 
 
 #### Start: Cleanup Firmware
 #### Start: Cleanup Firmware
 cleanup_firmware()
 cleanup_firmware()
@@ -1562,7 +1549,7 @@ if [[ ! -z "$mk404_flag" && "$variant_flag" != "All " ]]; then
     #cd ../MK404/master/build
     #cd ../MK404/master/build
 
 
 
 
-#Decide which hex file to use EN_ONLY or Multi language
+#Decide which hex file to use EN_FARM or Multi language
     if [ "$LANGUAGES" == "ALL" ]; then
     if [ "$LANGUAGES" == "ALL" ]; then
         if [[ "$MK404_PRINTER" == "MK3" || "$MK404_PRINTER" == "MK3S" ]]; then
         if [[ "$MK404_PRINTER" == "MK3" || "$MK404_PRINTER" == "MK3S" ]]; then
             MK404_firmware_file=$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME.hex
             MK404_firmware_file=$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME.hex
@@ -1575,7 +1562,7 @@ if [[ ! -z "$mk404_flag" && "$variant_flag" != "All " ]]; then
             done
             done
         fi
         fi
     else
     else
-        MK404_firmware_file=$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_ONLY.hex
+        MK404_firmware_file=$SCRIPT_PATH/../$OUTPUT_FOLDER/$OUTPUT_FILENAME-EN_FARM.hex
     fi
     fi
 
 
 # Start MK404
 # Start MK404
@@ -1601,7 +1588,6 @@ check_OS
 check_wget
 check_wget
 check_zip
 check_zip
 check_python
 check_python
-check_gawk
 
 
 #### Check for options/flags
 #### Check for options/flags
 echo "Check for options"
 echo "Check for options"

+ 1 - 1
build.sh

@@ -32,7 +32,7 @@ if [ ! -f "$SCRIPT_PATH/Firmware/Configuration_prusa.h" ]; then
     cp $SCRIPT_PATH/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 8
     cp $SCRIPT_PATH/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 8
 fi
 fi
 
 
-if [[ ! -z $LANGUAGES && $LANGUAGES == "EN_ONLY" ]]; then
+if [[ ! -z $LANGUAGES && $LANGUAGES == "EN_FARM" ]]; then
     echo "English only language firmware will be built"
     echo "English only language firmware will be built"
     sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE              0/g" $SCRIPT_PATH/Firmware/config.h
     sed -i -- "s/^#define LANG_MODE *1/#define LANG_MODE              0/g" $SCRIPT_PATH/Firmware/config.h
 else
 else

+ 101 - 0
cmake/AnyAvrGcc.cmake

@@ -0,0 +1,101 @@
+get_filename_component(PROJECT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
+include("${PROJECT_CMAKE_DIR}/Utilities.cmake")
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMAKE_SYSTEM_PROCESSOR avr)
+
+#
+# Utilities
+
+if(MINGW
+   OR CYGWIN
+   OR WIN32
+   )
+  set(UTIL_SEARCH_CMD where)
+  set(EXECUTABLE_SUFFIX ".exe")
+elseif(UNIX OR APPLE)
+  set(UTIL_SEARCH_CMD which)
+  set(EXECUTABLE_SUFFIX "")
+endif()
+
+set(TOOLCHAIN_PREFIX avr-)
+
+#
+# Looking up the toolchain
+#
+
+if(AVR_TOOLCHAIN_DIR)
+  # using toolchain set by AvrGcc.cmake (locked version)
+  message("ToolChain dir is ${AVR_TOOLCHAIN_DIR}")
+  set(BINUTILS_PATH "${AVR_TOOLCHAIN_DIR}/bin")
+else()
+  # search for ANY avr-gcc toolchain
+  execute_process(
+    COMMAND ${UTIL_SEARCH_CMD} ${TOOLCHAIN_PREFIX}gcc
+    OUTPUT_VARIABLE AVR_GCC_PATH
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    RESULT_VARIABLE FIND_RESULT
+    )
+  # found?
+  if(NOT "${FIND_RESULT}" STREQUAL "0")
+    message(FATAL_ERROR "avr-gcc not found")
+  endif()
+  get_filename_component(BINUTILS_PATH "${AVR_GCC_PATH}" DIRECTORY)
+  get_filename_component(AVR_TOOLCHAIN_DIR ${BINUTILS_PATH} DIRECTORY)
+endif()
+
+#
+# Setup CMake
+#
+
+# Without that flag CMake is not able to pass test compilation check
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+set(CMAKE_C_COMPILER
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}gcc${EXECUTABLE_SUFFIX}"
+    CACHE FILEPATH "" FORCE
+    )
+set(CMAKE_ASM_COMPILER
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}gcc${EXECUTABLE_SUFFIX}"
+    CACHE FILEPATH "" FORCE
+    )
+set(CMAKE_CXX_COMPILER
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}g++${EXECUTABLE_SUFFIX}"
+    CACHE FILEPATH "" FORCE
+    )
+set(CMAKE_EXE_LINKER_FLAGS_INIT
+    ""
+    CACHE STRING "" FORCE
+    )
+
+set(CMAKE_ASM_COMPILE_OBJECT
+    "<CMAKE_ASM_COMPILER> <DEFINES> <FLAGS> -o <OBJECT> -c <SOURCE>"
+    CACHE STRING "" FORCE
+    )
+
+set(CMAKE_AR
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}gcc-ar${EXECUTABLE_SUFFIX}"
+    CACHE FILEPATH "ar" FORCE
+    )
+
+set(CMAKE_RANLIB
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}gcc-ranlib${EXECUTABLE_SUFFIX}"
+    CACHE FILEPATH "ranlib" FORCE
+    )
+
+set(CMAKE_OBJCOPY
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}objcopy${EXECUTABLE_SUFFIX}"
+    CACHE INTERNAL "objcopy tool"
+    )
+set(CMAKE_OBJDUMP
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}objdump${EXECUTABLE_SUFFIX}"
+    CACHE INTERNAL "objdump tool"
+    )
+set(CMAKE_SIZE_UTIL
+    "${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}size${EXECUTABLE_SUFFIX}"
+    CACHE INTERNAL "size tool"
+    )
+
+set(CMAKE_FIND_ROOT_PATH "${AVR_TOOLCHAIN_DIR}")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

+ 4 - 0
cmake/AvrGcc.cmake

@@ -0,0 +1,4 @@
+get_filename_component(PROJECT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
+include("${PROJECT_CMAKE_DIR}/Utilities.cmake")
+get_dependency_directory("avr-gcc" AVR_TOOLCHAIN_DIR)
+include("${PROJECT_CMAKE_DIR}/AnyAvrGcc.cmake")

+ 11 - 0
cmake/Check_final_lang_bin_size.cmake

@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.18)
+FILE(SIZE ${LANG_FILE} FILE_SIZE)
+get_filename_component(FILE_BASE ${LANG_FILE} NAME)
+MATH(EXPR PADDED_SIZE "((${FILE_SIZE}+4096-1) / 4096 * 4096 )")
+message(STATUS "${FILE_BASE} raw size ${FILE_SIZE} bytes (${PADDED_SIZE} b padded)")
+if(${PADDED_SIZE} GREATER ${LANG_MAX_SIZE})
+    message(FATAL_ERROR "Language file ${FILE_BASE} (${PADDED_SIZE}b) exceeds maximum allowed size of ${LANG_MAX_SIZE} bytes - Aborting!")
+else()
+    MATH(EXPR SIZE_PCT "( ${PADDED_SIZE} * 100) / ${LANG_MAX_SIZE} " )
+    message(STATUS "Language file ${FILE_BASE} is ${PADDED_SIZE} bytes, ${SIZE_PCT}% of allowed space - OK")
+endif()

+ 11 - 0
cmake/Check_lang_size.cmake

@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.18)
+FILE(SIZE ${LANG_FILE} FILE_SIZE)
+get_filename_component(FILE_BASE ${LANG_FILE} NAME)
+MATH(EXPR PADDED_SIZE "((${FILE_SIZE}+256-1) / 256 * 256 )")
+MATH(EXPR FREE_SPACE "(${LANG_MAX_SIZE}-${FILE_SIZE})") 
+if(${PADDED_SIZE} GREATER ${LANG_MAX_SIZE})
+    message(FATAL_ERROR "Language file ${FILE_BASE} (${PADDED_SIZE}b) exceeds maximum allowed size of ${LANG_MAX_SIZE} bytes - Aborting!")
+else()
+    MATH(EXPR SIZE_PCT "( ${PADDED_SIZE} * 100) / ${LANG_MAX_SIZE} " )
+    message(STATUS "Language file ${FILE_BASE} is ${PADDED_SIZE} (${FILE_SIZE}) bytes, ${SIZE_PCT}% of allowed space. Free bytes ${FREE_SPACE} - OK")
+endif()

+ 232 - 0
cmake/GetGitRevisionDescription.cmake

@@ -0,0 +1,232 @@
+# * 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
+# variables in your build system.
+#
+# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+# 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
+# false if an error occurs.
+#
+# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe --exact-match on the source tree, and adjusting the output so
+# that it tests false if there was no exact matching tag.
+#
+# git_local_changes(<var>)
+#
+# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. Uses the return code of
+# "git diff-index --quiet HEAD --". Does not regard untracked files.
+#
+# git_count_parent_commits(<var>)
+#
+# Returns number of commits preceeding current commit -1 if git rev-list --count HEAD failed or
+# "GIT-NOTFOUND" if git executable was not found or "HEAD-HASH-NOTFOUND" if head hash was not found.
+# I don't know if get_git_head_revision() must be called internally or not, as reason of calling it
+# is not clear for me also in git_local_changes().
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author: 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
+# 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)
+  return()
+endif()
+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
+# module rather than the path to a calling list file
+get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+function(get_git_head_revision _refspecvar _hashvar)
+  set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+  set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+  while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
+    set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
+    get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
+    if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
+      # We have reached the root directory, we are not in git
+      set(${_refspecvar}
+          "GITDIR-NOTFOUND"
+          PARENT_SCOPE
+          )
+      set(${_hashvar}
+          "GITDIR-NOTFOUND"
+          PARENT_SCOPE
+          )
+      return()
+    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")
+    return()
+  endif()
+  set(HEAD_FILE "${GIT_DATA}/HEAD")
+  configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
+
+  configure_file(
+    "${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY
+    )
+  include("${GIT_DATA}/grabRef.cmake")
+
+  set(${_refspecvar}
+      "${HEAD_REF}"
+      PARENT_SCOPE
+      )
+  set(${_hashvar}
+      "${HEAD_HASH}"
+      PARENT_SCOPE
+      )
+endfunction()
+
+function(git_describe _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()
+
+  # 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()
+
+function(git_get_exact_tag _var)
+  git_describe(out --exact-match ${ARGN})
+  set(${_var}
+      "${out}"
+      PARENT_SCOPE
+      )
+endfunction()
+
+function(git_local_changes _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}" 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()
+
+endfunction()

+ 37 - 0
cmake/GetGitRevisionDescription.cmake.in

@@ -0,0 +1,37 @@
+#
+# Internal file for GetGitRevisionDescription.cmake
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author: 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
+# 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+set(HEAD_HASH)
+
+file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
+
+string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
+if(HEAD_CONTENTS MATCHES "ref")
+  # named branch
+  string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
+  if(EXISTS "@GIT_DIR@/${HEAD_REF}")
+    configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+  else()
+    configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
+    file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
+    if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
+      set(HEAD_HASH "${CMAKE_MATCH_1}")
+    endif()
+  endif()
+else()
+  # detached HEAD
+  configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
+endif()
+
+if(NOT HEAD_HASH)
+  file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
+  string(STRIP "${HEAD_HASH}" HEAD_HASH)
+endif()

+ 70 - 0
cmake/ProjectVersion.cmake

@@ -0,0 +1,70 @@
+#
+# This file is responsible for setting the following variables:
+#
+# ~~~
+# BUILD_NUMBER (1035)
+# PROJECT_VERSION (4.0.3)
+# PROJECT_VERSION_FULL (4.0.3-BETA+1035.PR111.B4)
+# PROJECT_VERSION_SUFFIX (-BETA+1035.PR111.B4)
+# PROJECT_VERSION_SUFFIX_SHORT (+1035)
+#
+# 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.
+#
+# ~~~
+
+FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/Configuration.h CFG_VER_DATA REGEX "#define FW_[A-Z]+ ([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)
+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})
+
+SET(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_REV}")
+
+
+function(resolve_version_variables)
+  # BUILD_NUMBER
+  if(NOT BUILD_NUMBER)
+    git_count_parent_commits(BUILD_NUMBER)
+    set(ERRORS "GIT-NOTFOUND" "HEAD-HASH-NOTFOUND")
+    if(BUILD_NUMBER IN_LIST ERRORS)
+      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()
+
+  # PROJECT_VERSION_SUFFIX
+  if(PROJECT_VERSION_SUFFIX STREQUAL "<auto>")
+    # 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
+  if(PROJECT_VERSION_SUFFIX_SHORT STREQUAL "<auto>")
+    set(PROJECT_VERSION_SUFFIX_SHORT
+        "+${BUILD_NUMBER}"
+        PARENT_SCOPE
+        )
+  endif()
+
+  # PROJECT_VERSION_FULL
+  set(PROJECT_VERSION_FULL
+      "${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX}"
+      PARENT_SCOPE
+      )
+endfunction()

+ 66 - 0
cmake/ReproducibleBuild.cmake

@@ -0,0 +1,66 @@
+#
+# Functions and utilities for build reproducibility
+#
+
+# Set a target to be reproducible
+function(set_reproducible_target target)
+  # properties for static libraries
+  set_target_properties(${target} PROPERTIES STATIC_LIBRARY_OPTIONS "-D")
+
+  # properties on executables
+  target_link_options(${target} PRIVATE -fdebug-prefix-map=${CMAKE_SOURCE_DIR}=)
+  target_link_options(${target} PRIVATE -fdebug-prefix-map=${CMAKE_BINARY_DIR}=)
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "8")
+    target_compile_options(${target} PRIVATE -ffile-prefix-map=${CMAKE_SOURCE_DIR}=)
+  endif()
+
+  # properties on sources
+  get_target_property(sources ${target} SOURCES)
+  get_target_property(source_dir ${target} SOURCE_DIR)
+  foreach(file IN LISTS sources)
+    cmake_path(ABSOLUTE_PATH file BASE_DIRECTORY ${source_dir})
+    cmake_path(RELATIVE_PATH file BASE_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE rpath)
+    set_property(
+      SOURCE ${file}
+      DIRECTORY ${source_dir}
+      APPEND
+      PROPERTY COMPILE_OPTIONS "-frandom-seed=${rpath}"
+      )
+  endforeach()
+endfunction()
+
+# Get the list of targets for all directories
+function(get_all_targets _result _dir)
+  get_property(
+    _subdirs
+    DIRECTORY "${_dir}"
+    PROPERTY SUBDIRECTORIES
+    )
+  foreach(_subdir IN LISTS _subdirs)
+    get_all_targets(${_result} "${_subdir}")
+  endforeach()
+  get_directory_property(_sub_targets DIRECTORY "${_dir}" BUILDSYSTEM_TARGETS)
+  set(${_result}
+      ${${_result}} ${_sub_targets}
+      PARENT_SCOPE
+      )
+endfunction()
+
+# Make every target reproducible
+function(set_all_targets_reproducible)
+  get_all_targets(targets ${CMAKE_SOURCE_DIR})
+  foreach(target IN LISTS targets)
+    set_reproducible_target(${target})
+  endforeach()
+endfunction()
+
+# Set source epoch
+function(set_source_epoch epoch)
+  set(ENV{SOURCE_DATE_EPOCH} ${epoch})
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8")
+    string(TIMESTAMP SOURCE_DATE_EPOCH "%Y-%m-%d")
+    add_compile_definitions(SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH}")
+    string(TIMESTAMP SOURCE_TIME_EPOCH "%H:%M:%S")
+    add_compile_definitions(SOURCE_TIME_EPOCH="${SOURCE_TIME_EPOCH}")
+  endif()
+endfunction()

+ 65 - 0
cmake/Utilities.cmake

@@ -0,0 +1,65 @@
+get_filename_component(PROJECT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
+get_filename_component(PROJECT_ROOT_DIR "${PROJECT_CMAKE_DIR}" DIRECTORY)
+
+find_package(Python3 COMPONENTS Interpreter)
+if(NOT Python3_FOUND)
+  message(FATAL_ERROR "Python3 not found.")
+endif()
+
+function(get_recommended_gcc_version var)
+  execute_process(
+    COMMAND "${Python3_EXECUTABLE}" "${PROJECT_ROOT_DIR}/utils/bootstrap.py"
+            "--print-dependency-version" "avr-gcc"
+    OUTPUT_VARIABLE RECOMMENDED_VERSION
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    RESULT_VARIABLE RETVAL
+    )
+
+  if(NOT "${RETVAL}" STREQUAL "0")
+    message(FATAL_ERROR "Failed to obtain recommended gcc version from utils/bootstrap.py")
+  endif()
+
+  set(${var}
+      ${RECOMMENDED_VERSION}
+      PARENT_SCOPE
+      )
+endfunction()
+
+function(get_dependency_directory dependency var)
+  execute_process(
+    COMMAND "${Python3_EXECUTABLE}" "${PROJECT_ROOT_DIR}/utils/bootstrap.py"
+            "--print-dependency-directory" "${dependency}"
+    OUTPUT_VARIABLE DEPENDENCY_DIRECTORY
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    RESULT_VARIABLE RETVAL
+    )
+
+  if(NOT "${RETVAL}" STREQUAL "0")
+    message(FATAL_ERROR "Failed to find directory with ${dependency}")
+  endif()
+
+  file(TO_CMAKE_PATH "${DEPENDENCY_DIRECTORY}" DEPENDENCY_DIRECTORY)
+  set(${var}
+      ${DEPENDENCY_DIRECTORY}
+      PARENT_SCOPE
+      )
+endfunction()
+
+function(objcopy target format suffix)
+  add_custom_command(
+    TARGET ${target} POST_BUILD
+    COMMAND "${CMAKE_OBJCOPY}" -O ${format} -S "$<TARGET_FILE:${target}>"
+            "${CMAKE_CURRENT_BINARY_DIR}/${target}${suffix}"
+    COMMENT "Generating ${format} from ${target}..."
+    BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${target}${suffix}"
+    )
+endfunction()
+
+function(report_size target)
+  add_custom_command(
+    TARGET ${target} POST_BUILD
+    COMMAND echo "" # visually separate the output
+    COMMAND "${CMAKE_SIZE_UTIL}" -B "$<TARGET_FILE:${target}>"
+    USES_TERMINAL
+    )
+endfunction()

+ 8 - 1
lang/lang-check.py

@@ -211,7 +211,7 @@ def check_translation(entry, msgids, is_pot, no_warning, no_suggest, warn_empty,
         return (errors == 0)
         return (errors == 0)
 
 
     # Missing translation
     # Missing translation
-    if len(translation) == 0 and (known_msgid or warn_empty):
+    if len(translation) == 0 and (warn_empty or (not no_warning and known_msgid)):
         errors += 1
         errors += 1
         if rows == 1:
         if rows == 1:
             print(yellow("[W]: Empty translation for \"%s\" on line %d" % (source, line)))
             print(yellow("[W]: Empty translation for \"%s\" on line %d" % (source, line)))
@@ -307,6 +307,9 @@ def main():
     parser.add_argument(
     parser.add_argument(
         "--no-suggest", action="store_true",
         "--no-suggest", action="store_true",
         help="Disable suggestions")
         help="Disable suggestions")
+    parser.add_argument(
+        "--errors-only", action="store_true",
+        help="Only check errors")
     parser.add_argument(
     parser.add_argument(
         "--pot", action="store_true",
         "--pot", action="store_true",
         help="Do not check translations")
         help="Do not check translations")
@@ -331,6 +334,10 @@ def main():
         print("{}: file does not exist or is not a regular file".format(args.po), file=stderr)
         print("{}: file does not exist or is not a regular file".format(args.po), file=stderr)
         return 1
         return 1
 
 
+    if args.errors_only:
+        args.no_warning = True
+        args.no_suggest = True
+
     # load the symbol map to supress empty (but unused) translation warnings
     # load the symbol map to supress empty (but unused) translation warnings
     msgids = None
     msgids = None
     if args.map:
     if args.map:

+ 4 - 10
lang/po/Firmware.pot

@@ -434,7 +434,7 @@ msgid ""
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1176,12 +1176,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1713,7 +1707,7 @@ msgstr ""
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -1969,7 +1963,7 @@ msgstr ""
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2140,7 +2134,7 @@ msgid ""
 " is free. Check FINDA connection."
 " is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_cs.po

@@ -455,7 +455,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1210,12 +1210,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1761,7 +1755,7 @@ msgstr "Obnoveni tisku"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2025,7 +2019,7 @@ msgstr "Tichy"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Tiskove platy"
 msgstr "Tiskove platy"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2200,7 +2194,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_da.po

@@ -442,7 +442,7 @@ msgid ""
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1185,12 +1185,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1722,7 +1716,7 @@ msgstr ""
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -1978,7 +1972,7 @@ msgstr ""
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2149,7 +2143,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_de.po

@@ -459,7 +459,7 @@ msgstr ""
 "Möchten Sie den letzten Schritt wiederholen, um den Abstand zwischen Düse "
 "Möchten Sie den letzten Schritt wiederholen, um den Abstand zwischen Düse "
 "und Druckbett neu einzustellen?"
 "und Druckbett neu einzustellen?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr "Klar"
 msgstr "Klar"
@@ -1240,12 +1240,6 @@ msgstr "Modell"
 msgid "More details online."
 msgid "More details online."
 msgstr "Weiter Details online."
 msgstr "Weiter Details online."
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr "Mehr⏬"
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1801,7 +1795,7 @@ msgstr "Druck fortgesetzt"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr "Einziehen von FINDA"
 msgstr "Einziehen von FINDA"
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr "Wdh."
 msgstr "Wdh."
@@ -2067,7 +2061,7 @@ msgstr "Leise"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Stahlbleche"
 msgstr "Stahlbleche"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr "Stop"
 msgstr "Stop"
@@ -2252,7 +2246,7 @@ msgstr ""
 "Unerwarteter FINDA-Wert. Stellen Sie sicher, dass sich kein Filament unter "
 "Unerwarteter FINDA-Wert. Stellen Sie sicher, dass sich kein Filament unter "
 "FINDA befindet und der Selektor frei ist. Prüfen Sie die FINDA-Verbindung."
 "FINDA befindet und der Selektor frei ist. Prüfen Sie die FINDA-Verbindung."
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr "Entla."
 msgstr "Entla."

+ 4 - 10
lang/po/Firmware_es.po

@@ -455,7 +455,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1212,12 +1212,6 @@ msgstr "Modelo"
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1773,7 +1767,7 @@ msgstr "Continuan. impresion"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2044,7 +2038,7 @@ msgstr "Sigilo"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Lamina de acero"
 msgstr "Lamina de acero"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2220,7 +2214,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_fr.po

@@ -458,7 +458,7 @@ msgstr ""
 "Voulez-vous refaire l'etape pour reajuster la hauteur entre la buse et le "
 "Voulez-vous refaire l'etape pour reajuster la hauteur entre la buse et le "
 "plateau chauffant?"
 "plateau chauffant?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1219,12 +1219,6 @@ msgstr "Modele"
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1776,7 +1770,7 @@ msgstr "Reprise de l'impr."
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2045,7 +2039,7 @@ msgstr "Furtif"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Plaques en acier"
 msgstr "Plaques en acier"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2221,7 +2215,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_hr.po

@@ -453,7 +453,7 @@ msgstr ""
 "Zelite li ponoviti zadnji korak za ponovno podesavanje udaljenosti izmedu "
 "Zelite li ponoviti zadnji korak za ponovno podesavanje udaljenosti izmedu "
 "mlaznice i grijace podloge?"
 "mlaznice i grijace podloge?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1210,12 +1210,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1762,7 +1756,7 @@ msgstr "Nastavak printa"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2032,7 +2026,7 @@ msgstr "Tiho"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Celicna ploca"
 msgstr "Celicna ploca"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2207,7 +2201,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_hu.po

@@ -456,7 +456,7 @@ msgstr ""
 "Meg szeretned ismetelni az utolso lepest, hogy finomhangold a fuvoka es az "
 "Meg szeretned ismetelni az utolso lepest, hogy finomhangold a fuvoka es az "
 "asztal kozotti tavolsagot?"
 "asztal kozotti tavolsagot?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1214,12 +1214,6 @@ msgstr "Modell"
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1769,7 +1763,7 @@ msgstr "Nyomtatas folytatasa"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2036,7 +2030,7 @@ msgstr "Halk"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Acellapok"
 msgstr "Acellapok"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2212,7 +2206,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 579 - 587
lang/po/Firmware_it.po

@@ -4,7 +4,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: Prusa-Firmware\n"
 "Project-Id-Version: Prusa-Firmware\n"
 "POT-Creation-Date: Wed 16 Mar 2022 09:24:52 AM CET\n"
 "POT-Creation-Date: Wed 16 Mar 2022 09:24:52 AM CET\n"
-"PO-Revision-Date: 2022-05-23 13:09+0200\n"
+"PO-Revision-Date: 2022-10-13 22:49+0200\n"
 "Last-Translator: \n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "Language-Team: \n"
 "Language: it\n"
 "Language: it\n"
@@ -16,94 +16,94 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/Filament_sensor.cpp:287
-#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:366 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgid " 0.3 or older"
 msgstr " 0.3 o inferiore"
 msgstr " 0.3 o inferiore"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/Filament_sensor.cpp:289
-#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Filament_sensor.cpp:291
+#: ../../Firmware/Filament_sensor.cpp:369 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgid " 0.4 or newer"
 msgstr " 0.4 o superiore"
 msgstr " 0.4 o superiore"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/ultralcd.cpp:7018
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "atteso livello %s"
 msgstr "atteso livello %s"
 
 
 #. MSG_CANCEL c=10
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
-#: ../../Firmware/ultralcd.cpp:3806
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1967
+#: ../../Firmware/ultralcd.cpp:3789
 msgid ">Cancel"
 msgid ">Cancel"
 msgstr ">Annulla"
 msgstr ">Annulla"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2668
+#: ../../Firmware/ultralcd.cpp:2655
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Compensaz. Z:"
 msgstr "Compensaz. Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/ultralcd.cpp:7294
 msgid "All correct"
 msgid "All correct"
 msgstr "Nessun errore"
 msgstr "Nessun errore"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
-#: ../../Firmware/ultralcd.cpp:4142
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4116
+#: ../../Firmware/ultralcd.cpp:4125
 msgid "All is done. Happy printing!"
 msgid "All is done. Happy printing!"
 msgstr "Tutto fatto. Buona stampa!"
 msgstr "Tutto fatto. Buona stampa!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4385
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Alfabeti"
 msgstr "Alfabeti"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4270
 msgid "Always"
 msgid "Always"
-msgstr ""
+msgstr "Sempre"
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1406
+#: ../../Firmware/ultralcd.cpp:1393
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Ambiente"
 msgstr "Ambiente"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2981
+#: ../../Firmware/ultralcd.cpp:2968
 msgid "Are left and right Z~carriages all up?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "I carrelli Z sin/des sono altezza max?"
 msgstr "I carrelli Z sin/des sono altezza max?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4440
 msgid "Assist"
 msgid "Assist"
 msgstr "Assist."
 msgstr "Assist."
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5845
 msgid "Auto"
 msgid "Auto"
 msgstr "Auto"
 msgstr "Auto"
 
 
 #. MSG_AUTO_HOME c=18
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4871
+#: ../../Firmware/Marlin_main.cpp:3262 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4854
 msgid "Auto home"
 msgid "Auto home"
 msgstr "Trova origine"
 msgstr "Trova origine"
 
 
 #. MSG_AUTO_POWER c=10
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
-#: ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4345
+#: ../../Firmware/ultralcd.cpp:5760
 msgid "Auto power"
 msgid "Auto power"
 msgstr "Automatico"
 msgstr "Automatico"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/ultralcd.cpp:5567
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Autocaric. filam."
 msgstr "Autocaric. filam."
 
 
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/ultralcd.cpp:2288
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Caricamento automatico attivo, premi la manopola e inserisci il filam."
 msgstr "Caricamento automatico attivo, premi la manopola e inserisci il filam."
@@ -115,50 +115,50 @@ msgid "Avoiding grind"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_AXIS c=16
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7014
+#: ../../Firmware/ultralcd.cpp:6997
 msgid "Axis"
 msgid "Axis"
 msgstr "Assi"
 msgstr "Assi"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7013
+#: ../../Firmware/ultralcd.cpp:6996
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Lunghezza dell'asse"
 msgstr "Lunghezza dell'asse"
 
 
 #. MSG_BACK c=18
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
-#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
-#: ../../Firmware/ultralcd.cpp:7826
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2736
+#: ../../Firmware/ultralcd.cpp:4206 ../../Firmware/ultralcd.cpp:5842
+#: ../../Firmware/ultralcd.cpp:7806
 msgid "Back"
 msgid "Back"
 msgstr "Indietro"
 msgstr "Indietro"
 
 
 #. MSG_BED c=13
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
-#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
-#: ../../Firmware/ultralcd.cpp:5889
+#: ../../Firmware/Marlin_main.cpp:2030 ../../Firmware/Marlin_main.cpp:4793
+#: ../../Firmware/Marlin_main.cpp:4845 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1391 ../../Firmware/ultralcd.cpp:5717
+#: ../../Firmware/ultralcd.cpp:5872
 msgid "Bed"
 msgid "Bed"
 msgstr "Piano"
 msgstr "Piano"
 
 
 #. MSG_BED_HEATING c=20
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:585
+#: ../../Firmware/Marlin_main.cpp:6294 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:582
 msgid "Bed Heating"
 msgid "Bed Heating"
 msgstr "Riscald. piano"
 msgstr "Riscald. piano"
 
 
 #. MSG_BED_DONE c=20
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:588
+#: ../../Firmware/Marlin_main.cpp:6332 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed done"
 msgid "Bed done"
 msgstr "Piano fatto."
 msgstr "Piano fatto."
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4883
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Correz. liv.piano"
 msgstr "Correz. liv.piano"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
-#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/Marlin_main.cpp:2210 ../../Firmware/Marlin_main.cpp:2986
+#: ../../Firmware/Marlin_main.cpp:2996
 #: ../../Firmware/mesh_bed_calibration.cpp:2858
 #: ../../Firmware/mesh_bed_calibration.cpp:2858
 #: ../../Firmware/mesh_bed_calibration.cpp:2866
 #: ../../Firmware/mesh_bed_calibration.cpp:2866
 #: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 #: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
@@ -170,55 +170,55 @@ msgstr ""
 "reset."
 "reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6954
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Piano/Riscald."
 msgstr "Piano/Riscald."
 
 
 #. MSG_BELT_STATUS c=18
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
-#: ../../Firmware/ultralcd.cpp:1726
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1444
+#: ../../Firmware/ultralcd.cpp:1713
 msgid "Belt status"
 msgid "Belt status"
 msgstr "Stato cinghie"
 msgstr "Stato cinghie"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4873
+#: ../../Firmware/ultralcd.cpp:4856
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Test cinghie"
 msgstr "Test cinghie"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/Marlin_main.cpp:1586 ../../Firmware/Marlin_main.cpp:1608
 #: ../../Firmware/messages.cpp:81
 #: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Blackout rilevato. Recuperare stampa?"
 msgstr "Blackout rilevato. Recuperare stampa?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5845
 msgid "Bright"
 msgid "Bright"
 msgstr "Chiaro"
 msgstr "Chiaro"
 
 
 #. MSG_BRIGHTNESS c=18
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4804
+#: ../../Firmware/ultralcd.cpp:5770
 msgid "Brightness"
 msgid "Brightness"
 msgstr "Luminosita'"
 msgstr "Luminosita'"
 
 
 #. MSG_TITLE_COMMUNICATION_ERROR c=20
 #. MSG_TITLE_COMMUNICATION_ERROR c=20
-#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+#: ../../Firmware/mmu2/errors_list.h:154 ../../Firmware/mmu2/errors_list.h:195
 msgid "COMMUNICATION ERROR"
 msgid "COMMUNICATION ERROR"
-msgstr ""
+msgstr "ERRORE COMUNICAZIONE"
 
 
 #. MSG_CALIBRATE_BED c=18
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4877
+#: ../../Firmware/ultralcd.cpp:4860
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Calibra XYZ"
 msgstr "Calibra XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4862
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Calibra Z"
 msgstr "Calibra Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2944
+#: ../../Firmware/ultralcd.cpp:2931
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -227,13 +227,13 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 "all'altezza massima. Click per terminare."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:633
+#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:632
 msgid "Calibrating Z"
 msgid "Calibrating Z"
 msgstr "Calibrando Z"
 msgstr "Calibrando Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2943
+#: ../../Firmware/ultralcd.cpp:2930
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -242,141 +242,141 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 "all'altezza massima. Click per terminare."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/ultralcd.cpp:7296
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Calibrazione Home"
 msgstr "Calibrazione Home"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5577
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Calibrazione"
 msgstr "Calibrazione"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:644
+#: ../../Firmware/ultralcd.cpp:643
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Calibr. completa"
 msgstr "Calibr. completa"
 
 
 #. MSG_DESC_CANNOT_MOVE c=20 r=4
 #. MSG_DESC_CANNOT_MOVE c=20 r=4
-#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
-#: ../../Firmware/mmu2/errors_list.h:245
+#: ../../Firmware/mmu2/errors_list.h:213 ../../Firmware/mmu2/errors_list.h:253
+#: ../../Firmware/mmu2/errors_list.h:255
 msgid "Can't move Selector or Idler."
 msgid "Can't move Selector or Idler."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
 #. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+#: ../../Firmware/mmu2/errors_list.h:238 ../../Firmware/mmu2/errors_list.h:279
 msgid "Cannot perform the action, filament is already loaded. Unload it first."
 msgid "Cannot perform the action, filament is already loaded. Unload it first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SD_REMOVED c=20
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7700
+#: ../../Firmware/ultralcd.cpp:7680
 msgid "Card removed"
 msgid "Card removed"
 msgstr "SD rimossa"
 msgstr "SD rimossa"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5547
+#: ../../Firmware/ultralcd.cpp:5530
 msgid "Change SD card"
 msgid "Change SD card"
-msgstr ""
+msgstr "Cambia scheda SD"
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
-#: ../../Firmware/ultralcd.cpp:5743
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5489
+#: ../../Firmware/ultralcd.cpp:5726
 msgid "Change filament"
 msgid "Change filament"
 msgstr "Cambia filamento"
 msgstr "Cambia filamento"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2179
+#: ../../Firmware/ultralcd.cpp:2166
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Cambio riuscito!"
 msgstr "Cambio riuscito!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2227
+#: ../../Firmware/ultralcd.cpp:2214
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Cambio corretto?"
 msgstr "Cambio corretto?"
 
 
 #. MSG_CHECKING_X c=20
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
-#: ../../Firmware/ultralcd.cpp:7303
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6170
+#: ../../Firmware/ultralcd.cpp:7286
 msgid "Checking X axis"
 msgid "Checking X axis"
 msgstr "Verifica asse X"
 msgstr "Verifica asse X"
 
 
 #. MSG_CHECKING_Y c=20
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
-#: ../../Firmware/ultralcd.cpp:7304
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6179
+#: ../../Firmware/ultralcd.cpp:7287
 msgid "Checking Y axis"
 msgid "Checking Y axis"
 msgstr "Verifica asse Y"
 msgstr "Verifica asse Y"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7305
+#: ../../Firmware/ultralcd.cpp:7288
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Verifica asse Z"
 msgstr "Verifica asse Z"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7289
 msgid "Checking bed"
 msgid "Checking bed"
 msgstr "Verifica piano"
 msgstr "Verifica piano"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7302
+#: ../../Firmware/ultralcd.cpp:7285
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Verifica finecorsa"
 msgstr "Verifica finecorsa"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7401
+#: ../../Firmware/ultralcd.cpp:7384
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Verifica file"
 msgstr "Verifica file"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7308
+#: ../../Firmware/ultralcd.cpp:7291
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Verifica ugello"
 msgstr "Verifica ugello"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
-#: ../../Firmware/ultralcd.cpp:7310
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7292
+#: ../../Firmware/ultralcd.cpp:7293
 msgid "Checking sensors"
 msgid "Checking sensors"
 msgstr "Controllo sensori"
 msgstr "Controllo sensori"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4728
+#: ../../Firmware/ultralcd.cpp:4711
 msgid "Checks"
 msgid "Checks"
 msgstr "Controlli"
 msgstr "Controlli"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2230
+#: ../../Firmware/ultralcd.cpp:2217
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Colore non puro"
 msgstr "Colore non puro"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3679
 msgid "Community made"
 msgid "Community made"
 msgstr "Contribuiti"
 msgstr "Contribuiti"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4228
 msgid "Cont."
 msgid "Cont."
 msgstr "Cont."
 msgstr "Cont."
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2125
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Raffredda"
 msgstr "Raffredda"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3634
+#: ../../Firmware/ultralcd.cpp:3617
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Copiare la lingua selezionata?"
 msgstr "Copiare la lingua selezionata?"
 
 
 #. MSG_CRASH c=7
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
-#: ../../Firmware/ultralcd.cpp:1276
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1234
+#: ../../Firmware/ultralcd.cpp:1263
 msgid "Crash"
 msgid "Crash"
 msgstr "Impatto"
 msgstr "Impatto"
 
 
 #. MSG_CRASHDETECT c=13
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
-#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
-#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
-#: ../../Firmware/ultralcd.cpp:5769
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4322
+#: ../../Firmware/ultralcd.cpp:4323 ../../Firmware/ultralcd.cpp:4325
+#: ../../Firmware/ultralcd.cpp:5746 ../../Firmware/ultralcd.cpp:5748
+#: ../../Firmware/ultralcd.cpp:5752
 msgid "Crash det."
 msgid "Crash det."
 msgstr "Rileva.crash"
 msgstr "Rileva.crash"
 
 
@@ -386,7 +386,7 @@ msgid "Crash detected."
 msgstr "Rilevato impatto."
 msgstr "Rilevato impatto."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3538
+#: ../../Firmware/ultralcd.cpp:3521
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -397,36 +397,36 @@ msgstr ""
 "in Modalita normale"
 "in Modalita normale"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
-#: ../../Firmware/ultralcd.cpp:5578
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5138
+#: ../../Firmware/ultralcd.cpp:5561
 msgid "Cut filament"
 msgid "Cut filament"
 msgstr "Taglia filamento"
 msgstr "Taglia filamento"
 
 
 #. MSG_CUTTER c=9
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
-#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4265
+#: ../../Firmware/ultralcd.cpp:4270 ../../Firmware/ultralcd.cpp:4275
 msgid "Cutter"
 msgid "Cutter"
 msgstr "Tagliatr."
 msgstr "Tagliatr."
 
 
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1667
+#: ../../Firmware/ultralcd.cpp:1654
 msgid "Date:"
 msgid "Date:"
 msgstr "Data:"
 msgstr "Data:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5845
 msgid "Dim"
 msgid "Dim"
 msgstr "Scuro"
 msgstr "Scuro"
 
 
 #. MSG_BTN_DISABLE_MMU c=9
 #. MSG_BTN_DISABLE_MMU c=9
-#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+#: ../../Firmware/mmu2/errors_list.h:300 ../../Firmware/mmu2/errors_list.h:310
 msgid "Disable"
 msgid "Disable"
-msgstr ""
+msgstr "Disattiva"
 
 
 #. MSG_DISABLE_STEPPERS c=18
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4764
+#: ../../Firmware/ultralcd.cpp:4747
 msgid "Disable steppers"
 msgid "Disable steppers"
-msgstr "Disabilita motori"
+msgstr "Disattiva motori"
 
 
 #. MSG_PROGRESS_DISENGAGE_IDLER c=20
 #. MSG_PROGRESS_DISENGAGE_IDLER c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:10
 #: ../../Firmware/mmu2_progress_converter.cpp:10
@@ -436,7 +436,7 @@ msgid "Disengaging idler"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
+#: ../../Firmware/Marlin_main.cpp:1531 ../../Firmware/Marlin_main.cpp:3401
 #: ../../Firmware/messages.cpp:11
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -448,7 +448,7 @@ msgstr ""
 "Calibrazione primo strato."
 "Calibrazione primo strato."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4107
+#: ../../Firmware/ultralcd.cpp:4090
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -456,13 +456,13 @@ msgstr ""
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e "
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e "
 "piatto?"
 "piatto?"
 
 
-#. MSG_BTN_CONTINUE c=5
-#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+#. MSG_BTN_CONTINUE c=8
+#: ../../Firmware/mmu2/errors_list.h:296 ../../Firmware/mmu2/errors_list.h:306
 msgid "Done"
 msgid "Done"
-msgstr ""
+msgstr "Fatto"
 
 
 #. MSG_EXTRUDER_CORRECTION c=13
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4176
+#: ../../Firmware/ultralcd.cpp:4159
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "Correzione-E:"
 msgstr "Correzione-E:"
 
 
@@ -491,13 +491,13 @@ msgid "ERR Wait for User"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ERROR c=10
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2269
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "ERRORE:"
 msgstr "ERRORE:"
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5120
+#: ../../Firmware/ultralcd.cpp:5558
 msgid "Eject filament"
 msgid "Eject filament"
 msgstr "Espelli fil."
 msgstr "Espelli fil."
 
 
@@ -509,17 +509,17 @@ msgid "Ejecting filament"
 msgstr "Espellendo filamento"
 msgstr "Espellendo filamento"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Finecorsa"
 msgstr "Finecorsa"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6989
+#: ../../Firmware/ultralcd.cpp:6972
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Finec. fuori portata"
 msgstr "Finec. fuori portata"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6975
+#: ../../Firmware/ultralcd.cpp:6958
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Finecorsa"
 msgstr "Finecorsa"
 
 
@@ -531,127 +531,127 @@ msgid "Engaging idler"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER c=17
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Marlin_main.cpp:3520 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3512
+#: ../../Firmware/ultralcd.cpp:3495
 msgid "Extruder"
 msgid "Extruder"
 msgstr "Estrusore"
 msgstr "Estrusore"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
-#: ../../Firmware/ultralcd.cpp:7319
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1131
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Extruder fan:"
 msgid "Extruder fan:"
 msgstr "Vent. estrusore:"
 msgstr "Vent. estrusore:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1722
+#: ../../Firmware/ultralcd.cpp:1709
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Info estrusore"
 msgstr "Info estrusore"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
-#: ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4213
+#: ../../Firmware/ultralcd.cpp:4220
 msgid "F. autoload"
 msgid "F. autoload"
 msgstr "Autocar.fil."
 msgstr "Autocar.fil."
 
 
 #. MSG_FSENSOR_JAM_DETECTION c=13
 #. MSG_FSENSOR_JAM_DETECTION c=13
-#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
-#: ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4215
+#: ../../Firmware/ultralcd.cpp:4222
 msgid "F. jam detect"
 msgid "F. jam detect"
-msgstr ""
+msgstr "Ril. blocco"
 
 
 #. MSG_FSENSOR_RUNOUT c=13
 #. MSG_FSENSOR_RUNOUT c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
-#: ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4212
+#: ../../Firmware/ultralcd.cpp:4219
 msgid "F. runout"
 msgid "F. runout"
-msgstr ""
+msgstr "Ril. fine fil"
 
 
 #. MSG_TITLE_FIL_ALREADY_LOADED c=20
 #. MSG_TITLE_FIL_ALREADY_LOADED c=20
-#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+#: ../../Firmware/mmu2/errors_list.h:155 ../../Firmware/mmu2/errors_list.h:196
 msgid "FILAMENT ALREADY LOA"
 msgid "FILAMENT ALREADY LOA"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
 #. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
-#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
 msgid "FINDA DIDNT TRIGGER"
 msgid "FINDA DIDNT TRIGGER"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
 #. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:247
 msgid ""
 msgid ""
 "FINDA didn't switch off while unloading filament. Try unloading manually. "
 "FINDA didn't switch off while unloading filament. Try unloading manually. "
 "Ensure filament can move and FINDA works."
 "Ensure filament can move and FINDA works."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
 #. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+#: ../../Firmware/mmu2/errors_list.h:206 ../../Firmware/mmu2/errors_list.h:246
 msgid ""
 msgid ""
 "FINDA didn't trigger while loading the filament. Ensure the filament can "
 "FINDA didn't trigger while loading the filament. Ensure the filament can "
 "move and FINDA works."
 "move and FINDA works."
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
 #. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
-#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:164
 msgid "FINDA: FILAM. STUCK"
 msgid "FINDA: FILAM. STUCK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FS_ACTION c=10
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
-#: ../../Firmware/ultralcd.cpp:4248
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4228
+#: ../../Firmware/ultralcd.cpp:4231
 msgid "FS Action"
 msgid "FS Action"
 msgstr "Azione FS"
 msgstr "Azione FS"
 
 
 #. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
 #. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
-#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
 msgid "FSENSOR DIDNT TRIGG."
 msgid "FSENSOR DIDNT TRIGG."
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_FSENSOR_TOO_EARLY c=20
 #. MSG_TITLE_FSENSOR_TOO_EARLY c=20
-#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+#: ../../Firmware/mmu2/errors_list.h:129 ../../Firmware/mmu2/errors_list.h:168
 msgid "FSENSOR TOO EARLY"
 msgid "FSENSOR TOO EARLY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
 #. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
-#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:166
 msgid "FSENSOR: FIL. STUCK"
 msgid "FSENSOR: FIL. STUCK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_FW_RUNTIME_ERROR c=20
 #. MSG_TITLE_FW_RUNTIME_ERROR c=20
-#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+#: ../../Firmware/mmu2/errors_list.h:159 ../../Firmware/mmu2/errors_list.h:200
 msgid "FW RUNTIME ERROR"
 msgid "FW RUNTIME ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5585
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Stat. fallimenti"
 msgstr "Stat. fallimenti"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5605
+#: ../../Firmware/ultralcd.cpp:5588
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Stat.fall. MMU"
 msgstr "Stat.fall. MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7030
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Falso innesco"
 msgstr "Falso innesco"
 
 
 #. MSG_FAN_SPEED c=14
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
-#: ../../Firmware/ultralcd.cpp:5891
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5719
+#: ../../Firmware/ultralcd.cpp:5874
 msgid "Fan speed"
 msgid "Fan speed"
 msgstr "Velocita vent."
 msgstr "Velocita vent."
 
 
 #. MSG_SELFTEST_FAN c=20
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
-#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
-#: ../../Firmware/ultralcd.cpp:7301
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7124
+#: ../../Firmware/ultralcd.cpp:7282 ../../Firmware/ultralcd.cpp:7283
+#: ../../Firmware/ultralcd.cpp:7284
 msgid "Fan test"
 msgid "Fan test"
 msgstr "Test ventola"
 msgstr "Test ventola"
 
 
 #. MSG_FANS_CHECK c=13
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
-#: ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4765
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Fans check"
 msgid "Fans check"
 msgstr "Control.vent"
 msgstr "Control.vent"
 
 
@@ -680,111 +680,111 @@ msgid "Feeding to nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIL_RUNOUTS c=15
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
-#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
-#: ../../Firmware/ultralcd.cpp:1331
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1233
+#: ../../Firmware/ultralcd.cpp:1262 ../../Firmware/ultralcd.cpp:1316
+#: ../../Firmware/ultralcd.cpp:1318
 msgid "Fil. runouts"
 msgid "Fil. runouts"
 msgstr "Fil. esauriti"
 msgstr "Fil. esauriti"
 
 
 #. MSG_FSENSOR c=12
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
-#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
-#: ../../Firmware/ultralcd.cpp:5747
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3456
+#: ../../Firmware/ultralcd.cpp:4208 ../../Firmware/ultralcd.cpp:4751
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Fil. sensor"
 msgid "Fil. sensor"
 msgstr "Sensore fil."
 msgstr "Sensore fil."
 
 
 #. MSG_FILAMENT c=17
 #. MSG_FILAMENT c=17
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
-#: ../../Firmware/ultralcd.cpp:3806
+#: ../../Firmware/ultralcd.cpp:3789
 msgid "Filament"
 msgid "Filament"
 msgstr "Filamento"
 msgstr "Filamento"
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
-#: ../../Firmware/ultralcd.cpp:2294
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2277
+#: ../../Firmware/ultralcd.cpp:2281
 msgid "Filament extruding & with correct color?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filamento estruso e con colore corretto?"
 msgstr "Filamento estruso e con colore corretto?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2229
+#: ../../Firmware/ultralcd.cpp:2216
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. non caricato"
 msgstr "Fil. non caricato"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
-#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
-#: ../../Firmware/ultralcd.cpp:7328
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7008
+#: ../../Firmware/ultralcd.cpp:7012 ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "Filament sensor"
 msgid "Filament sensor"
 msgstr "Sensore filam."
 msgstr "Sensore filam."
 
 
 #. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
 #. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+#: ../../Firmware/mmu2/errors_list.h:209 ../../Firmware/mmu2/errors_list.h:249
 msgid ""
 msgid ""
 "Filament sensor didn't switch off while unloading filament. Ensure filament "
 "Filament sensor didn't switch off while unloading filament. Ensure filament "
 "can move and the sensor works."
 "can move and the sensor works."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
 #. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+#: ../../Firmware/mmu2/errors_list.h:208 ../../Firmware/mmu2/errors_list.h:248
 msgid ""
 msgid ""
 "Filament sensor didn't trigger while loading the filament. Ensure the "
 "Filament sensor didn't trigger while loading the filament. Ensure the "
 "filament reached the fsensor and the sensor works."
 "filament reached the fsensor and the sensor works."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
 #. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+#: ../../Firmware/mmu2/errors_list.h:211 ../../Firmware/mmu2/errors_list.h:251
 msgid ""
 msgid ""
 "Filament sensor triggered too early while loading to extruder. Check there "
 "Filament sensor triggered too early while loading to extruder. Check there "
 "isn't anything stuck in PTFE tube. Check that sensor reads properly."
 "isn't anything stuck in PTFE tube. Check that sensor reads properly."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_USED c=19
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2363
+#: ../../Firmware/ultralcd.cpp:2350
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Fil. utilizzato"
 msgstr "Fil. utilizzato"
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7460
+#: ../../Firmware/ultralcd.cpp:7442
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "File incompleto. Continuare comunque?"
 msgstr "File incompleto. Continuare comunque?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. MSG_FINISHING_MOVEMENTS c=20
 #: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
 #: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
-#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
+#: ../../Firmware/ultralcd.cpp:5306 ../../Firmware/ultralcd.cpp:5626
 msgid "Finishing movements"
 msgid "Finishing movements"
 msgstr "Finaliz. spostamenti"
 msgstr "Finaliz. spostamenti"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
-#: ../../Firmware/ultralcd.cpp:5433
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4852
+#: ../../Firmware/ultralcd.cpp:5416
 msgid "First layer cal."
 msgid "First layer cal."
 msgstr "Cal. primo strato"
 msgstr "Cal. primo strato"
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4032
+#: ../../Firmware/ultralcd.cpp:4015
 msgid "First, I will run the selftest to check most common assembly problems."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Per primo avviero l'autotest per controllare gli errori di assemblaggio piu "
 "Per primo avviero l'autotest per controllare gli errori di assemblaggio piu "
 "comuni."
 "comuni."
 
 
 #. MSG_FLOW c=15
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5737
+#: ../../Firmware/ultralcd.cpp:5720
 msgid "Flow"
 msgid "Flow"
 msgstr "Flusso"
 msgstr "Flusso"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
-#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6978
+#: ../../Firmware/ultralcd.cpp:7130 ../../Firmware/ultralcd.cpp:7135
 msgid "Front print fan?"
 msgid "Front print fan?"
 msgstr "Ventola frontale?"
 msgstr "Ventola frontale?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2752
+#: ../../Firmware/ultralcd.cpp:2739
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Fronte [μm]"
 msgstr "Fronte [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7019
+#: ../../Firmware/ultralcd.cpp:7002
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Ventola frontale/sin"
 msgstr "Ventola frontale/sin"
 
 
@@ -833,42 +833,42 @@ msgstr ""
 "firmware. Stampa annullata."
 "firmware. Stampa annullata."
 
 
 #. MSG_GCODE c=8
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
-#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
-#: ../../Firmware/ultralcd.cpp:4662
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4636
+#: ../../Firmware/ultralcd.cpp:4639 ../../Firmware/ultralcd.cpp:4642
+#: ../../Firmware/ultralcd.cpp:4645
 msgid "Gcode"
 msgid "Gcode"
-msgstr ""
+msgstr "Gcode"
 
 
 #. MSG_HW_SETUP c=18
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
-#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4672 ../../Firmware/ultralcd.cpp:4772
 msgid "HW Setup"
 msgid "HW Setup"
 msgstr "Impostazioni HW"
 msgstr "Impostazioni HW"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6967
+#: ../../Firmware/ultralcd.cpp:6950
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Riscald./Termist."
 msgstr "Riscald./Termist."
 
 
 #. MSG_HEATING c=20
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
-#: ../../Firmware/ultralcd.cpp:577
+#: ../../Firmware/Marlin_main.cpp:6237 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:574
 msgid "Heating"
 msgid "Heating"
 msgstr "Riscaldamento..."
 msgstr "Riscaldamento..."
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9477
+#: ../../Firmware/Marlin_main.cpp:9478
 msgid "Heating disabled by safety timer."
 msgid "Heating disabled by safety timer."
 msgstr "Riscaldamento fermato dal timer di sicurezza."
 msgstr "Riscaldamento fermato dal timer di sicurezza."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
-#: ../../Firmware/ultralcd.cpp:580
+#: ../../Firmware/Marlin_main.cpp:6268 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating done."
 msgid "Heating done."
 msgstr "Riscald. completo"
 msgstr "Riscald. completo"
 
 
 #. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
 #. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:3991
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -879,7 +879,7 @@ msgstr ""
 "stampare."
 "stampare."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:3994
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -888,9 +888,9 @@ msgstr ""
 "processo di configurazione?"
 "processo di configurazione?"
 
 
 #. MSG_HIGH_POWER c=10
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
-#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4348 ../../Firmware/ultralcd.cpp:5758
+#: ../../Firmware/ultralcd.cpp:5761
 msgid "High power"
 msgid "High power"
 msgstr "Forte"
 msgstr "Forte"
 
 
@@ -898,35 +898,35 @@ msgstr "Forte"
 #: ../../Firmware/mmu2_progress_converter.cpp:29
 #: ../../Firmware/mmu2_progress_converter.cpp:29
 #: ../../Firmware/mmu2_progress_converter.cpp:60
 #: ../../Firmware/mmu2_progress_converter.cpp:60
 msgid "Homing"
 msgid "Homing"
-msgstr ""
+msgstr "Homing"
 
 
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4041
+#: ../../Firmware/ultralcd.cpp:4024
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Adesso avviero una Calibrazione XYZ. Puo durare circa 12 min."
 msgstr "Adesso avviero una Calibrazione XYZ. Puo durare circa 12 min."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4049
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Adesso avviero la Calibrazione Z."
 msgstr "Adesso avviero la Calibrazione Z."
 
 
 #. MSG_TITLE_IDLER_CANNOT_HOME c=20
 #. MSG_TITLE_IDLER_CANNOT_HOME c=20
-#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+#: ../../Firmware/mmu2/errors_list.h:133 ../../Firmware/mmu2/errors_list.h:171
 msgid "IDLER CANNOT HOME"
 msgid "IDLER CANNOT HOME"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_IDLER_CANNOT_MOVE c=20
 #. MSG_TITLE_IDLER_CANNOT_MOVE c=20
-#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+#: ../../Firmware/mmu2/errors_list.h:132 ../../Firmware/mmu2/errors_list.h:172
 msgid "IDLER CANNOT MOVE"
 msgid "IDLER CANNOT MOVE"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_INVALID_TOOL c=20
 #. MSG_TITLE_INVALID_TOOL c=20
-#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+#: ../../Firmware/mmu2/errors_list.h:156 ../../Firmware/mmu2/errors_list.h:197
 msgid "INVALID TOOL"
 msgid "INVALID TOOL"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4115
+#: ../../Firmware/ultralcd.cpp:4098
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -937,25 +937,25 @@ msgstr ""
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #: ../../Firmware/mesh_bed_calibration.cpp:2530
 #: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgid "Improving bed calibration point"
-msgstr ""
+msgstr "Miglioramento punto di calibrazione del piatto"
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5470
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Schermata info"
 msgstr "Schermata info"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5554
+#: ../../Firmware/ultralcd.cpp:5537
 msgid "Init. SD card"
 msgid "Init. SD card"
-msgstr ""
+msgstr "Inizial. scheda SD"
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2165
+#: ../../Firmware/ultralcd.cpp:2152
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Inserire filamento"
 msgstr "Inserire filamento"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6233
+#: ../../Firmware/ultralcd.cpp:6216
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
@@ -963,21 +963,21 @@ msgstr ""
 "Inserire filamento (senza caricarlo) nell'estrusore e premere la manopola."
 "Inserire filamento (senza caricarlo) nell'estrusore e premere la manopola."
 
 
 #. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
 #. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
-#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+#: ../../Firmware/mmu2/errors_list.h:242 ../../Firmware/mmu2/errors_list.h:283
 msgid ""
 msgid ""
 "Internal runtime error. Try resetting the MMU unit or updating the firmware. "
 "Internal runtime error. Try resetting the MMU unit or updating the firmware. "
 "If the issue persists, contact support."
 "If the issue persists, contact support."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_LOADED c=20 r=2
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3810
+#: ../../Firmware/ultralcd.cpp:4057
 msgid "Is filament loaded?"
 msgid "Is filament loaded?"
 msgstr "Il filamento e' stato caricato?"
 msgstr "Il filamento e' stato caricato?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
-#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
+#: ../../Firmware/Marlin_main.cpp:3302 ../../Firmware/Marlin_main.cpp:4912
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4033
 msgid "Is steel sheet on heatbed?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Piastra d'acciaio su piano riscaldato?"
 msgstr "Piastra d'acciaio su piano riscaldato?"
 
 
@@ -987,261 +987,262 @@ msgid "Iteration"
 msgstr "Iterazione"
 msgstr "Iterazione"
 
 
 #. MSG_LAST_PRINT c=18
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
-#: ../../Firmware/ultralcd.cpp:1299
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1153
+#: ../../Firmware/ultralcd.cpp:1286
 msgid "Last print"
 msgid "Last print"
 msgstr "Ultima stampa"
 msgstr "Ultima stampa"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
-#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1173
+#: ../../Firmware/ultralcd.cpp:1260 ../../Firmware/ultralcd.cpp:1315
 msgid "Last print failures"
 msgid "Last print failures"
 msgstr "Errori ultima stampa"
 msgstr "Errori ultima stampa"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2494
+#: ../../Firmware/ultralcd.cpp:2481
 msgid "Left"
 msgid "Left"
 msgstr "Sinistra"
 msgstr "Sinistra"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
-#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:7130 ../../Firmware/ultralcd.cpp:7135
 msgid "Left hotend fan?"
 msgid "Left hotend fan?"
 msgstr "Vent SX hotend?"
 msgstr "Vent SX hotend?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2750
+#: ../../Firmware/ultralcd.cpp:2737
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Sinistra [μm]"
 msgstr "Sinistra [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5843
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Liv. Chiaro"
 msgstr "Liv. Chiaro"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5844
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Liv. Scuro"
 msgstr "Liv. Scuro"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4797
+#: ../../Firmware/ultralcd.cpp:4780
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Correzione lineare"
 msgstr "Correzione lineare"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
-#: ../../Firmware/ultralcd.cpp:5502
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4792
+#: ../../Firmware/ultralcd.cpp:5485
 msgid "Live adjust Z"
 msgid "Live adjust Z"
 msgstr "Compensazione Z"
 msgstr "Compensazione Z"
 
 
 #. MSG_LOAD_ALL c=18
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
-#: ../../Firmware/ultralcd.cpp:5178
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5081
+#: ../../Firmware/ultralcd.cpp:5161
 msgid "Load All"
 msgid "Load All"
-msgstr ""
+msgstr "Carica tutti"
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
-#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
-#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5083
+#: ../../Firmware/ultralcd.cpp:5102 ../../Firmware/ultralcd.cpp:5163
+#: ../../Firmware/ultralcd.cpp:5554 ../../Firmware/ultralcd.cpp:5572
 msgid "Load filament"
 msgid "Load filament"
 msgstr "Carica filamento"
 msgstr "Carica filamento"
 
 
 #. MSG_LOAD_TO_EXTRUDER c=18
 #. MSG_LOAD_TO_EXTRUDER c=18
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5555
 msgid "Load to extruder"
 msgid "Load to extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOAD_TO_NOZZLE c=18
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/ultralcd.cpp:5556
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Carica ugello"
 msgstr "Carica ugello"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2201
+#: ../../Firmware/ultralcd.cpp:2188
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Caricando colore"
 msgstr "Caricando colore"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
-#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/Marlin_main.cpp:3652 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:456 ../../Firmware/mmu2.cpp:486
 #: ../../Firmware/mmu2_progress_converter.cpp:51
 #: ../../Firmware/mmu2_progress_converter.cpp:51
-#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
+#: ../../Firmware/ultralcd.cpp:2199 ../../Firmware/ultralcd.cpp:3902
 msgid "Loading filament"
 msgid "Loading filament"
 msgstr "Caricando filamento"
 msgstr "Caricando filamento"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7007
+#: ../../Firmware/ultralcd.cpp:6990
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Puleggia lenta"
 msgstr "Puleggia lenta"
 
 
 #. MSG_SOUND_LOUD c=7
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
-#: ../../Firmware/ultralcd.cpp:4460
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4431
+#: ../../Firmware/ultralcd.cpp:4443
 msgid "Loud"
 msgid "Loud"
 msgstr "Forte"
 msgstr "Forte"
 
 
 #. MSG_TITLE_FW_UPDATE_NEEDED c=20
 #. MSG_TITLE_FW_UPDATE_NEEDED c=20
-#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+#: ../../Firmware/mmu2/errors_list.h:158 ../../Firmware/mmu2/errors_list.h:199
 msgid "MMU FW UPDATE NEEDED"
 msgid "MMU FW UPDATE NEEDED"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_QUEUE_FULL c=20 r=8
 #. MSG_DESC_QUEUE_FULL c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+#: ../../Firmware/mmu2/errors_list.h:240 ../../Firmware/mmu2/errors_list.h:281
 msgid "MMU Firmware internal error, please reset the MMU."
 msgid "MMU Firmware internal error, please reset the MMU."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_MODE c=8
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
-#: ../../Firmware/ultralcd.cpp:4380
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4363
 msgid "MMU Mode"
 msgid "MMU Mode"
 msgstr "Mod. MMU"
 msgstr "Mod. MMU"
 
 
 #. MSG_TITLE_MMU_NOT_RESPONDING c=20
 #. MSG_TITLE_MMU_NOT_RESPONDING c=20
-#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:194
 msgid "MMU NOT RESPONDING"
 msgid "MMU NOT RESPONDING"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_RESTORE_TEMP c=20 r=4
 #. MSG_MMU_RESTORE_TEMP c=20 r=4
-#: ../../Firmware/mmu2.cpp:598
+#: ../../Firmware/mmu2.cpp:619
 msgid "MMU Retry: Restoring temperature..."
 msgid "MMU Retry: Restoring temperature..."
 msgstr ""
 msgstr ""
 
 
+#. MSG_TITLE_SELFTEST_FAILED c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:191
+#: ../../Firmware/mmu2/errors_list.h:192 ../../Firmware/mmu2/errors_list.h:193
+msgid "MMU SELFTEST FAILED"
+msgstr ""
+
 #. MSG_MMU_FAILS c=15
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
-#: ../../Firmware/ultralcd.cpp:1215
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1174
+#: ../../Firmware/ultralcd.cpp:1202
 msgid "MMU fails"
 msgid "MMU fails"
 msgstr "Fallimenti MMU"
 msgstr "Fallimenti MMU"
 
 
 #. MSG_MMU_LOAD_FAILS c=15
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1175
 msgid "MMU load fails"
 msgid "MMU load fails"
 msgstr "Car MMU falliti"
 msgstr "Car MMU falliti"
 
 
 #. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
 #. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
-#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+#: ../../Firmware/mmu2/errors_list.h:237 ../../Firmware/mmu2/errors_list.h:278
 msgid ""
 msgid ""
 "MMU unit not responding correctly. Check the wiring and connectors. If the "
 "MMU unit not responding correctly. Check the wiring and connectors. If the "
 "issue persists, contact support."
 "issue persists, contact support."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
 #. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+#: ../../Firmware/mmu2/errors_list.h:236 ../../Firmware/mmu2/errors_list.h:277
 msgid ""
 msgid ""
 "MMU unit not responding. Check the wiring and connectors. If the issue "
 "MMU unit not responding. Check the wiring and connectors. If the issue "
 "persists, contact support."
 "persists, contact support."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1679
+#: ../../Firmware/ultralcd.cpp:1666
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 connessa"
 msgstr "MMU2 connessa"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5817
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Comp. Magneti"
 msgstr "Comp. Magneti"
 
 
 #. MSG_MAIN c=18
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
-#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
-#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
-#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
-#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
-#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
-#: ../../Firmware/ultralcd.cpp:5730
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1152
+#: ../../Firmware/ultralcd.cpp:1285 ../../Firmware/ultralcd.cpp:1327
+#: ../../Firmware/ultralcd.cpp:1631 ../../Firmware/ultralcd.cpp:4740
+#: ../../Firmware/ultralcd.cpp:4846 ../../Firmware/ultralcd.cpp:5080
+#: ../../Firmware/ultralcd.cpp:5100 ../../Firmware/ultralcd.cpp:5118
+#: ../../Firmware/ultralcd.cpp:5136 ../../Firmware/ultralcd.cpp:5160
+#: ../../Firmware/ultralcd.cpp:5713
 msgid "Main"
 msgid "Main"
 msgstr "Menu principale"
 msgstr "Menu principale"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2535
+#: ../../Firmware/ultralcd.cpp:2522
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Dev. misurata"
 msgstr "Dev. misurata"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/Marlin_main.cpp:3283
 #: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 #: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgid "Measuring reference height of calibration point"
 msgstr "Misura altezza di rif. del punto di calib."
 msgstr "Misura altezza di rif. del punto di calib."
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5813
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Griglia"
 msgstr "Griglia"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
-#: ../../Firmware/ultralcd.cpp:4881
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4777
+#: ../../Firmware/ultralcd.cpp:4864
 msgid "Mesh Bed Leveling"
 msgid "Mesh Bed Leveling"
 msgstr "Liv. griglia piano"
 msgstr "Liv. griglia piano"
 
 
 #. MSG_MODE c=6
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
-#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
-#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
-#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
-#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4317
+#: ../../Firmware/ultralcd.cpp:4319 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4342 ../../Firmware/ultralcd.cpp:4345
+#: ../../Firmware/ultralcd.cpp:4348 ../../Firmware/ultralcd.cpp:5744
+#: ../../Firmware/ultralcd.cpp:5751 ../../Firmware/ultralcd.cpp:5758
+#: ../../Firmware/ultralcd.cpp:5759 ../../Firmware/ultralcd.cpp:5760
+#: ../../Firmware/ultralcd.cpp:5761 ../../Firmware/ultralcd.cpp:5845
 msgid "Mode"
 msgid "Mode"
 msgstr "Mod."
 msgstr "Mod."
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3587
+#: ../../Firmware/ultralcd.cpp:3570
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Cambio modalita in corso..."
 msgstr "Cambio modalita in corso..."
 
 
 #. MSG_MODEL c=8
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
-#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
-#: ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4556
+#: ../../Firmware/ultralcd.cpp:4559 ../../Firmware/ultralcd.cpp:4562
+#: ../../Firmware/ultralcd.cpp:4565
 msgid "Model"
 msgid "Model"
 msgstr "Modello"
 msgstr "Modello"
 
 
 #. MSG_DESC_TMC c=20 r=8
 #. MSG_DESC_TMC c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
-#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
-#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
-#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
-#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
-#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:217 ../../Firmware/mmu2/errors_list.h:256
 #: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
 #: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
 #: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
 #: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
 #: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
 #: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
-#: ../../Firmware/mmu2/errors_list.h:263
+#: ../../Firmware/mmu2/errors_list.h:263 ../../Firmware/mmu2/errors_list.h:264
+#: ../../Firmware/mmu2/errors_list.h:265 ../../Firmware/mmu2/errors_list.h:266
+#: ../../Firmware/mmu2/errors_list.h:267 ../../Firmware/mmu2/errors_list.h:268
+#: ../../Firmware/mmu2/errors_list.h:269 ../../Firmware/mmu2/errors_list.h:270
+#: ../../Firmware/mmu2/errors_list.h:271 ../../Firmware/mmu2/errors_list.h:272
+#: ../../Firmware/mmu2/errors_list.h:273 ../../Firmware/mmu2/errors_list.h:274
+#: ../../Firmware/mmu2/errors_list.h:275 ../../Firmware/mmu2/errors_list.h:276
 msgid "More details online."
 msgid "More details online."
-msgstr ""
-
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
+msgstr "Piu dettagli online."
 
 
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6964
+#: ../../Firmware/ultralcd.cpp:6973 ../../Firmware/ultralcd.cpp:6991
 msgid "Motor"
 msgid "Motor"
 msgstr "Motore"
 msgstr "Motore"
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3509
+#: ../../Firmware/ultralcd.cpp:3492
 msgid "Move X"
 msgid "Move X"
 msgstr "Sposta X"
 msgstr "Sposta X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3510
+#: ../../Firmware/ultralcd.cpp:3493
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Sposta Y"
 msgstr "Sposta Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3511
+#: ../../Firmware/ultralcd.cpp:3494
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Sposta Z"
 msgstr "Sposta Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4763
+#: ../../Firmware/ultralcd.cpp:4746
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Muovi asse"
 msgstr "Muovi asse"
 
 
@@ -1253,10 +1254,10 @@ msgstr ""
 
 
 #. MSG_NA c=3
 #. MSG_NA c=3
 #: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
 #: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
-#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
-#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
-#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
-#: ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:2487 ../../Firmware/ultralcd.cpp:2532
+#: ../../Firmware/ultralcd.cpp:3417 ../../Firmware/ultralcd.cpp:4212
+#: ../../Firmware/ultralcd.cpp:4213 ../../Firmware/ultralcd.cpp:4215
+#: ../../Firmware/ultralcd.cpp:5817
 msgid "N/A"
 msgid "N/A"
 msgstr "N/D"
 msgstr "N/D"
 
 
@@ -1266,75 +1267,75 @@ msgid "New firmware version available:"
 msgstr "Nuova vers. firmware disponibile:"
 msgstr "Nuova vers. firmware disponibile:"
 
 
 #. MSG_NO c=4
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
-#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
-#: ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2789
+#: ../../Firmware/ultralcd.cpp:3157 ../../Firmware/ultralcd.cpp:4730
+#: ../../Firmware/ultralcd.cpp:5980
 msgid "No"
 msgid "No"
 msgstr "No"
 msgstr "No"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5552
+#: ../../Firmware/ultralcd.cpp:5535
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Nessuna SD"
 msgstr "Nessuna SD"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5402
+#: ../../Firmware/Marlin_main.cpp:5403
 msgid "No move."
 msgid "No move."
 msgstr "Nessun movimento."
 msgstr "Nessun movimento."
 
 
 #. MSG_NONE c=8
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
-#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
-#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
-#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4386
+#: ../../Firmware/ultralcd.cpp:4474 ../../Firmware/ultralcd.cpp:4483
+#: ../../Firmware/ultralcd.cpp:4556 ../../Firmware/ultralcd.cpp:4565
+#: ../../Firmware/ultralcd.cpp:4595 ../../Firmware/ultralcd.cpp:4604
+#: ../../Firmware/ultralcd.cpp:4636 ../../Firmware/ultralcd.cpp:4645
 msgid "None"
 msgid "None"
 msgstr "Nessuno"
 msgstr "Nessuno"
 
 
 #. MSG_NORMAL c=7
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
-#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
-#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4317
+#: ../../Firmware/ultralcd.cpp:4362 ../../Firmware/ultralcd.cpp:4378
+#: ../../Firmware/ultralcd.cpp:4397 ../../Firmware/ultralcd.cpp:5744
 msgid "Normal"
 msgid "Normal"
 msgstr "Normale"
 msgstr "Normale"
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6968
+#: ../../Firmware/ultralcd.cpp:6951
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Non connesso"
 msgstr "Non connesso"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
-#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7149
+#: ../../Firmware/ultralcd.cpp:7164 ../../Firmware/ultralcd.cpp:7172
 msgid "Not spinning"
 msgid "Not spinning"
 msgstr "Non gira"
 msgstr "Non gira"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3928
+#: ../../Firmware/ultralcd.cpp:3911
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr "Adesso calibro la distanza fra ugello e superfice del piatto."
 msgstr "Adesso calibro la distanza fra ugello e superfice del piatto."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4059
+#: ../../Firmware/ultralcd.cpp:4042
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Adesso preriscaldero l'ugello per PLA."
 msgstr "Adesso preriscaldero l'ugello per PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4048
+#: ../../Firmware/ultralcd.cpp:4031
 msgid "Now remove the test print from steel sheet."
 msgid "Now remove the test print from steel sheet."
 msgstr "Ora rimuovete la stampa di prova dalla piastra in acciaio."
 msgstr "Ora rimuovete la stampa di prova dalla piastra in acciaio."
 
 
 #. MSG_NOZZLE c=10
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
-#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
-#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
-#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1390
+#: ../../Firmware/ultralcd.cpp:4474 ../../Firmware/ultralcd.cpp:4477
+#: ../../Firmware/ultralcd.cpp:4480 ../../Firmware/ultralcd.cpp:4483
+#: ../../Firmware/ultralcd.cpp:5716 ../../Firmware/ultralcd.cpp:5863
 msgid "Nozzle"
 msgid "Nozzle"
 msgstr "Ugello"
 msgstr "Ugello"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4527
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Dia.Ugello"
 msgstr "Dia.Ugello"
 
 
@@ -1342,24 +1343,24 @@ msgstr "Dia.Ugello"
 #: ../../Firmware/mmu2_progress_converter.cpp:8
 #: ../../Firmware/mmu2_progress_converter.cpp:8
 #: ../../Firmware/mmu2_progress_converter.cpp:34
 #: ../../Firmware/mmu2_progress_converter.cpp:34
 msgid "OK"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 
 #. MSG_OFF c=3
 #. MSG_OFF c=3
 #: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
 #: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
-#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
-#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
-#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
-#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
-#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4208
+#: ../../Firmware/ultralcd.cpp:4219 ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4222 ../../Firmware/ultralcd.cpp:4247
+#: ../../Firmware/ultralcd.cpp:4275 ../../Firmware/ultralcd.cpp:4323
+#: ../../Firmware/ultralcd.cpp:4758 ../../Firmware/ultralcd.cpp:4765
+#: ../../Firmware/ultralcd.cpp:4784 ../../Firmware/ultralcd.cpp:4788
+#: ../../Firmware/ultralcd.cpp:5640 ../../Firmware/ultralcd.cpp:5737
+#: ../../Firmware/ultralcd.cpp:5748 ../../Firmware/ultralcd.cpp:5817
+#: ../../Firmware/ultralcd.cpp:7809 ../../Firmware/ultralcd.cpp:7813
 msgid "Off"
 msgid "Off"
 msgstr "Off"
 msgstr "Off"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1513
+#: ../../Firmware/Marlin_main.cpp:1514
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 "Sono state trovate impostazioni vecchie. Verranno impostati i valori "
 "Sono state trovate impostazioni vecchie. Verranno impostati i valori "
@@ -1367,62 +1368,62 @@ msgstr ""
 
 
 #. MSG_ON c=3
 #. MSG_ON c=3
 #: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
 #: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
-#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
-#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
-#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
-#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
-#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
-#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
-#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
+#: ../../Firmware/ultralcd.cpp:4208 ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4220 ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4247 ../../Firmware/ultralcd.cpp:4265
+#: ../../Firmware/ultralcd.cpp:4322 ../../Firmware/ultralcd.cpp:4758
+#: ../../Firmware/ultralcd.cpp:4765 ../../Firmware/ultralcd.cpp:4784
+#: ../../Firmware/ultralcd.cpp:4788 ../../Firmware/ultralcd.cpp:5737
+#: ../../Firmware/ultralcd.cpp:5746 ../../Firmware/ultralcd.cpp:5817
+#: ../../Firmware/ultralcd.cpp:7809 ../../Firmware/ultralcd.cpp:7813
 msgid "On"
 msgid "On"
 msgstr "On"
 msgstr "On"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4434
 msgid "Once"
 msgid "Once"
 msgstr "Singolo"
 msgstr "Singolo"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
+#: ../../Firmware/Marlin_main.cpp:9678 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgid "PAUSED THERMAL ERROR"
-msgstr ""
+msgstr "PAUSA ERRORE TERMICO"
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1036
+#: ../../Firmware/ultralcd.cpp:1023
 msgid "PID cal."
 msgid "PID cal."
 msgstr "Calibrazione PID"
 msgstr "Calibrazione PID"
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1041
+#: ../../Firmware/ultralcd.cpp:1028
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "Calib. PID completa"
 msgstr "Calib. PID completa"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4884
+#: ../../Firmware/ultralcd.cpp:4867
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "Calibrazione PID"
 msgstr "Calibrazione PID"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:666
+#: ../../Firmware/ultralcd.cpp:662
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "Riscaldamento PINDA"
 msgstr "Riscaldamento PINDA"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
-#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
+#: ../../Firmware/Marlin_main.cpp:4958 ../../Firmware/Marlin_main.cpp:5061
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:659
+#: ../../Firmware/ultralcd.cpp:4784 ../../Firmware/ultralcd.cpp:4874
 msgid "PINDA cal."
 msgid "PINDA cal."
 msgstr "Calib. PINDA"
 msgstr "Calib. PINDA"
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3384
+#: ../../Firmware/ultralcd.cpp:3367
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "Calibrazione temperatura fallita"
 msgstr "Calibrazione temperatura fallita"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
-#: ../../Firmware/ultralcd.cpp:3378
+#: ../../Firmware/Marlin_main.cpp:5138 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3361
 msgid ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1431,7 +1432,7 @@ msgstr ""
 "Impostazioni ->Calib. PINDA"
 "Impostazioni ->Calib. PINDA"
 
 
 #. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
 #. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
-#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:167
 msgid "PULLEY CANNOT MOVE"
 msgid "PULLEY CANNOT MOVE"
 msgstr ""
 msgstr ""
 
 
@@ -1442,13 +1443,13 @@ msgid "Parking selector"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE c=5
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4231
 msgid "Pause"
 msgid "Pause"
 msgstr "Pausa"
 msgstr "Pausa"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
-#: ../../Firmware/ultralcd.cpp:5518
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5499
+#: ../../Firmware/ultralcd.cpp:5501
 msgid "Pause print"
 msgid "Pause print"
 msgstr "Metti in pausa"
 msgstr "Metti in pausa"
 
 
@@ -1459,7 +1460,7 @@ msgid "Performing cut"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAPER c=20 r=10
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
+#: ../../Firmware/Marlin_main.cpp:3307 ../../Firmware/messages.cpp:72
 msgid ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1468,7 +1469,7 @@ msgstr ""
 "punti. In caso l'ugello muova il foglio spegnere subito la stampante."
 "punti. In caso l'ugello muova il foglio spegnere subito la stampante."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4121
 msgid ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1477,34 +1478,34 @@ msgstr ""
 "riprendi il Wizard dopo aver riavviato la stampante."
 "riprendi il Wizard dopo aver riavviato la stampante."
 
 
 #. MSG_CHECK_IR_CONNECTION c=20 r=4
 #. MSG_CHECK_IR_CONNECTION c=20 r=4
-#: ../../Firmware/ultralcd.cpp:6258
+#: ../../Firmware/ultralcd.cpp:6241
 msgid "Please check the IR sensor connection, unload filament if present."
 msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Controllare il collegamento al sensore e rimuovere il filamento."
 msgstr "Controllare il collegamento al sensore e rimuovere il filamento."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6962
+#: ../../Firmware/ultralcd.cpp:6945
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Verifica:"
 msgstr "Verifica:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4110
+#: ../../Firmware/ultralcd.cpp:4093
 msgid "Please clean heatbed and then press the knob."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Per favore pulisci il piatto, poi premi la manopola."
 msgstr "Per favore pulisci il piatto, poi premi la manopola."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3281 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Pulire l'ugello per la calibrazione, poi fare click."
 msgstr "Pulire l'ugello per la calibrazione, poi fare click."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3915
+#: ../../Firmware/ultralcd.cpp:3898
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 "Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
 "Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3912
+#: ../../Firmware/ultralcd.cpp:3895
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1513,50 +1514,50 @@ msgstr ""
 "manopola per caricarlo."
 "manopola per caricarlo."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3835
+#: ../../Firmware/ultralcd.cpp:3818
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Per favore prima carica il filamento."
 msgstr "Per favore prima carica il filamento."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3581
+#: ../../Firmware/Marlin_main.cpp:3582
 msgid "Please open idler and remove filament manually."
 msgid "Please open idler and remove filament manually."
 msgstr "Aprire la guida filam. e rimuovere il filam. a mano"
 msgstr "Aprire la guida filam. e rimuovere il filam. a mano"
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
 #: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
-#: ../../Firmware/ultralcd.cpp:4052
+#: ../../Firmware/ultralcd.cpp:4035
 msgid "Please place steel sheet on heatbed."
 msgid "Please place steel sheet on heatbed."
 msgstr "Per favore posizionate la piastra d'acciaio sul piano riscaldato."
 msgstr "Per favore posizionate la piastra d'acciaio sul piano riscaldato."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/Marlin_main.cpp:11533 ../../Firmware/Marlin_main.cpp:11586
 #: ../../Firmware/messages.cpp:78
 #: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgid "Please press the knob to unload filament"
 msgstr "Premete la manopola per scaricare il filamento"
 msgstr "Premete la manopola per scaricare il filamento"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5204
 msgid "Please pull out filament immediately"
 msgid "Please pull out filament immediately"
 msgstr "Estrarre il filamento immediatamente"
 msgstr "Estrarre il filamento immediatamente"
 
 
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4047
+#: ../../Firmware/ultralcd.cpp:4030
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Per favore rimuovete i materiali da spedizione"
 msgstr "Per favore rimuovete i materiali da spedizione"
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/Marlin_main.cpp:3304 ../../Firmware/Marlin_main.cpp:4922
 #: ../../Firmware/messages.cpp:83
 #: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Rimuovete la piastra di acciaio dal piano riscaldato"
 msgstr "Rimuovete la piastra di acciaio dal piano riscaldato"
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4897
+#: ../../Firmware/Marlin_main.cpp:4898
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Esegui la calibrazione XYZ prima."
 msgstr "Esegui la calibrazione XYZ prima."
 
 
 #. MSG_UNLOAD_FILAMENT_REPEAT c=20 r=4
 #. MSG_UNLOAD_FILAMENT_REPEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:6255
+#: ../../Firmware/ultralcd.cpp:6238
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Scaricare prima il filamento, poi ripetere l'operazione."
 msgstr "Scaricare prima il filamento, poi ripetere l'operazione."
 
 
@@ -1566,51 +1567,51 @@ msgid "Please upgrade."
 msgstr "Prego aggiornare."
 msgstr "Prego aggiornare."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
-#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
-#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
+#: ../../Firmware/Marlin_main.cpp:3578 ../../Firmware/Marlin_main.cpp:3596
+#: ../../Firmware/Marlin_main.cpp:7958 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2189 ../../Firmware/ultralcd.cpp:2200
 msgid "Please wait"
 msgid "Please wait"
 msgstr "Attendere"
 msgstr "Attendere"
 
 
 #. MSG_POWER_FAILURES c=15
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
-#: ../../Firmware/ultralcd.cpp:1274
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1232
+#: ../../Firmware/ultralcd.cpp:1261
 msgid "Power failures"
 msgid "Power failures"
 msgstr "Interr. corr."
 msgstr "Interr. corr."
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5511
+#: ../../Firmware/ultralcd.cpp:5494
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Preriscalda"
 msgstr "Preriscalda"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2270
 msgid "Preheat the nozzle!"
 msgid "Preheat the nozzle!"
 msgstr "Prerisc. ugello!"
 msgstr "Prerisc. ugello!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
-#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2885
+#: ../../Firmware/ultralcd.cpp:3880 ../../Firmware/ultralcd.cpp:3882
 msgid "Preheating nozzle. Please wait."
 msgid "Preheating nozzle. Please wait."
 msgstr "Preriscaldando l'ugello. Attendere prego."
 msgstr "Preriscaldando l'ugello. Attendere prego."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:2001
+#: ../../Firmware/ultralcd.cpp:1988
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Preriscalda. taglio"
 msgstr "Preriscalda. taglio"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1998
+#: ../../Firmware/ultralcd.cpp:1985
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Preriscalda. espuls."
 msgstr "Preriscalda. espuls."
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1976
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Preriscald. carico"
 msgstr "Preriscald. carico"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1994
+#: ../../Firmware/ultralcd.cpp:1981
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Preriscald. scarico"
 msgstr "Preriscald. scarico"
 
 
@@ -1621,48 +1622,48 @@ msgid "Preparing blade"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_KNOB c=20
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1809
+#: ../../Firmware/ultralcd.cpp:1796
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Premere la manopola"
 msgstr "Premere la manopola"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11563
+#: ../../Firmware/Marlin_main.cpp:11564
 msgid "Press the knob to preheat nozzle and continue."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Premete la manopola per preriscaldare l'ugello e continuare."
 msgstr "Premete la manopola per preriscaldare l'ugello e continuare."
 
 
 #. MSG_PRINT_ABORTED c=20
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:858
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Stampa interrotta"
 msgstr "Stampa interrotta"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
-#: ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1131
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Print fan:"
 msgid "Print fan:"
 msgstr "Vent.stam:"
 msgstr "Vent.stam:"
 
 
 #. MSG_CARD_MENU c=18
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5527
 msgid "Print from SD"
 msgid "Print from SD"
 msgstr "Stampa da SD"
 msgstr "Stampa da SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:885
+#: ../../Firmware/ultralcd.cpp:872
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Stampa in pausa"
 msgstr "Stampa in pausa"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2364
+#: ../../Firmware/ultralcd.cpp:2351
 msgid "Print time"
 msgid "Print time"
 msgstr "Tempo di stampa"
 msgstr "Tempo di stampa"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1711
+#: ../../Firmware/ultralcd.cpp:1698
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Ind. IP stampante:"
 msgstr "Ind. IP stampante:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1527 ../../Firmware/messages.cpp:42
 msgid ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1685,7 +1686,7 @@ msgstr ""
 "Stampa annullata."
 "Stampa annullata."
 
 
 #. MSG_DESC_PULLEY_STALLED c=20 r=8
 #. MSG_DESC_PULLEY_STALLED c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+#: ../../Firmware/mmu2/errors_list.h:210 ../../Firmware/mmu2/errors_list.h:250
 msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
 msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
 msgstr ""
 msgstr ""
 
 
@@ -1696,68 +1697,68 @@ msgid "Pushing filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_QUEUE_FULL c=20
 #. MSG_TITLE_QUEUE_FULL c=20
-#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+#: ../../Firmware/mmu2/errors_list.h:157 ../../Firmware/mmu2/errors_list.h:198
 msgid "QUEUE FULL"
 msgid "QUEUE FULL"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RPI_PORT c=13
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4788
 msgid "RPi port"
 msgid "RPi port"
 msgstr "Porta RPi"
 msgstr "Porta RPi"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2753
+#: ../../Firmware/ultralcd.cpp:2740
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Retro [μm]"
 msgstr "Retro [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10899
+#: ../../Firmware/Marlin_main.cpp:10900
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Recupero stampa"
 msgstr "Recupero stampa"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3461
+#: ../../Firmware/Marlin_main.cpp:3462
 msgid "Remove old filament and press the knob to start loading new filament."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Rimuovi il filamento precedente e premi la manopola per caricare il nuovo "
 "Rimuovi il filamento precedente e premi la manopola per caricare il nuovo "
 "filamento."
 "filamento."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/ultralcd.cpp:5418
 msgid "Rename"
 msgid "Rename"
 msgstr "Rinomina"
 msgstr "Rinomina"
 
 
 #. MSG_DESC_INVALID_TOOL c=20 r=8
 #. MSG_DESC_INVALID_TOOL c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+#: ../../Firmware/mmu2/errors_list.h:239 ../../Firmware/mmu2/errors_list.h:280
 msgid ""
 msgid ""
 "Requested filament tool is not available on this hardware. Check the G-code "
 "Requested filament tool is not available on this hardware. Check the G-code "
 "for tool index out of range (T0-T4)."
 "for tool index out of range (T0-T4)."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESET c=14
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
-#: ../../Firmware/ultralcd.cpp:5436
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2741
+#: ../../Firmware/ultralcd.cpp:5419
 msgid "Reset"
 msgid "Reset"
 msgstr "Reset"
 msgstr "Reset"
 
 
 #. MSG_BTN_RESTART_MMU c=9
 #. MSG_BTN_RESTART_MMU c=9
-#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+#: ../../Firmware/mmu2/errors_list.h:297 ../../Firmware/mmu2/errors_list.h:307
 msgid "Reset MMU"
 msgid "Reset MMU"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATE_BED_RESET c=18
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4888
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reset calibr. XYZ."
 msgstr "Reset calibr. XYZ."
 
 
 #. MSG_RESUME_PRINT c=18
 #. MSG_RESUME_PRINT c=18
 #: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
 #: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
-#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
+#: ../../Firmware/ultralcd.cpp:5513 ../../Firmware/ultralcd.cpp:5515
 msgid "Resume print"
 msgid "Resume print"
 msgstr "Riprendi stampa"
 msgstr "Riprendi stampa"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:670
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Riprendi stampa"
 msgstr "Riprendi stampa"
 
 
@@ -1767,10 +1768,10 @@ msgstr "Riprendi stampa"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
-#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+#. MSG_BTN_RETRY c=8
+#: ../../Firmware/mmu2/errors_list.h:295 ../../Firmware/mmu2/errors_list.h:305
 msgid "Retry"
 msgid "Retry"
-msgstr ""
+msgstr "Riprova"
 
 
 #. MSG_PROGRESS_RETURN_SELECTOR c=20
 #. MSG_PROGRESS_RETURN_SELECTOR c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:25
 #: ../../Firmware/mmu2_progress_converter.cpp:25
@@ -1779,17 +1780,17 @@ msgid "Returning selector"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RIGHT c=10
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2495
+#: ../../Firmware/ultralcd.cpp:2482
 msgid "Right"
 msgid "Right"
 msgstr "Destra"
 msgstr "Destra"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2751
+#: ../../Firmware/ultralcd.cpp:2738
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Destra [μm]"
 msgstr "Destra [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3857
+#: ../../Firmware/ultralcd.cpp:3840
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1798,40 +1799,40 @@ msgstr ""
 "ricominciare dall'inizio. Continuare?"
 "ricominciare dall'inizio. Continuare?"
 
 
 #. MSG_SD_CARD c=8
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
-#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
-#: ../../Firmware/ultralcd.cpp:4414
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4376
+#: ../../Firmware/ultralcd.cpp:4378 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4397
 msgid "SD card"
 msgid "SD card"
 msgstr "Mem. SD"
 msgstr "Mem. SD"
 
 
 #. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
 #. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
-#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
 msgid "SELECTOR CANNOT HOME"
 msgid "SELECTOR CANNOT HOME"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
 #. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
-#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+#: ../../Firmware/mmu2/errors_list.h:130 ../../Firmware/mmu2/errors_list.h:170
 msgid "SELECTOR CANNOT MOVE"
 msgid "SELECTOR CANNOT MOVE"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STOPPED c=20
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
+#: ../../Firmware/Marlin_main.cpp:9707 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "ARRESTATO."
 msgstr "ARRESTATO."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/Marlin_main.cpp:3287 ../../Firmware/Marlin_main.cpp:3309
 #: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 #: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgid "Searching bed calibration point"
 msgstr "Ricerca punti calibrazione piano"
 msgstr "Ricerca punti calibrazione piano"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5428
+#: ../../Firmware/ultralcd.cpp:5411
 msgid "Select"
 msgid "Select"
 msgstr "Seleziona"
 msgstr "Seleziona"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3932
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1840,32 +1841,32 @@ msgstr ""
 "menu sullo schermo."
 "menu sullo schermo."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Marlin_main.cpp:3520 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgid "Select extruder:"
 msgstr "Seleziona estrusore:"
 msgstr "Seleziona estrusore:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. MSG_SELECT_FILAMENT c=20
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
-#: ../../Firmware/ultralcd.cpp:3805
+#: ../../Firmware/ultralcd.cpp:3788
 msgid "Select filament:"
 msgid "Select filament:"
 msgstr "Seleziona il filam.:"
 msgstr "Seleziona il filam.:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
-#: ../../Firmware/ultralcd.cpp:4812
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3633
+#: ../../Firmware/ultralcd.cpp:4795
 msgid "Select language"
 msgid "Select language"
 msgstr "Seleziona lingua"
 msgstr "Seleziona lingua"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4084
+#: ../../Firmware/ultralcd.cpp:4067
 msgid "Select nozzle preheat temperature which matches your material."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Selezionate la temperatura per il preriscaldamento dell'ugello adatta al "
 "Selezionate la temperatura per il preriscaldamento dell'ugello adatta al "
 "vostro materiale."
 "vostro materiale."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3937
+#: ../../Firmware/ultralcd.cpp:3920
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Seleziona la temperatura appropriata per il tuo materiale."
 msgstr "Seleziona la temperatura appropriata per il tuo materiale."
 
 
@@ -1876,61 +1877,61 @@ msgid "Selecting fil. slot"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_OK c=20
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6522
+#: ../../Firmware/ultralcd.cpp:6505
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Autotest OK"
 msgstr "Autotest OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6295
+#: ../../Firmware/ultralcd.cpp:6278
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Avvia autotest"
 msgstr "Avvia autotest"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4875
+#: ../../Firmware/ultralcd.cpp:4858
 msgid "Selftest"
 msgid "Selftest"
 msgstr "Autotest"
 msgstr "Autotest"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6961
+#: ../../Firmware/ultralcd.cpp:6944
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Errore Autotest!"
 msgstr "Errore Autotest!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
-#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6509
+#: ../../Firmware/ultralcd.cpp:7031 ../../Firmware/ultralcd.cpp:7295
 msgid "Selftest failed"
 msgid "Selftest failed"
 msgstr "Autotest fallito"
 msgstr "Autotest fallito"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545
+#: ../../Firmware/Marlin_main.cpp:1546
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Verra effettuato un self test per calibrare l'homing senza sensori"
 msgstr "Verra effettuato un self test per calibrare l'homing senza sensori"
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1723
+#: ../../Firmware/ultralcd.cpp:1710
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Info Sensore"
 msgstr "Info Sensore"
 
 
 #. MSG_FS_VERIFIED c=20 r=3
 #. MSG_FS_VERIFIED c=20 r=3
-#: ../../Firmware/ultralcd.cpp:6262
+#: ../../Firmware/ultralcd.cpp:6245
 msgid "Sensor verified, remove the filament now."
 msgid "Sensor verified, remove the filament now."
 msgstr "Sensore verificato, rimuovere il filamento."
 msgstr "Sensore verificato, rimuovere il filamento."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2771
+#: ../../Firmware/ultralcd.cpp:2758
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Imposta temperatura:"
 msgstr "Imposta temperatura:"
 
 
 #. MSG_SETTINGS c=18
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
-#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
-#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
-#: ../../Firmware/ultralcd.cpp:5878
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3491
+#: ../../Firmware/ultralcd.cpp:3650 ../../Firmware/ultralcd.cpp:4151
+#: ../../Firmware/ultralcd.cpp:5576 ../../Firmware/ultralcd.cpp:5808
+#: ../../Firmware/ultralcd.cpp:5861
 msgid "Settings"
 msgid "Settings"
 msgstr "Impostazioni"
 msgstr "Impostazioni"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2538
+#: ../../Firmware/ultralcd.cpp:2525
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Deviaz. forte"
 msgstr "Deviaz. forte"
 
 
@@ -1941,7 +1942,7 @@ msgid "Sheet"
 msgstr "Piano"
 msgstr "Piano"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3795
+#: ../../Firmware/ultralcd.cpp:3778
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1954,18 +1955,18 @@ msgstr ""
 "%cReset"
 "%cReset"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4886
+#: ../../Firmware/ultralcd.cpp:4869
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Stato finecorsa"
 msgstr "Stato finecorsa"
 
 
 #. MSG_SILENT c=7
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
-#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:4437 ../../Firmware/ultralcd.cpp:5759
 msgid "Silent"
 msgid "Silent"
 msgstr "Silenz."
 msgstr "Silenz."
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2537
+#: ../../Firmware/ultralcd.cpp:2524
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Deviaz. lieve"
 msgstr "Deviaz. lieve"
 
 
@@ -1979,13 +1980,13 @@ msgstr ""
 "e 100 perche siano ordinati."
 "e 100 perche siano ordinati."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3052
+#: ../../Firmware/Marlin_main.cpp:3053
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Sono stati rilevati problemi, avviato livellamento Z ..."
 msgstr "Sono stati rilevati problemi, avviato livellamento Z ..."
 
 
 #. MSG_SORT c=7
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
-#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4384
+#: ../../Firmware/ultralcd.cpp:4385 ../../Firmware/ultralcd.cpp:4386
 msgid "Sort"
 msgid "Sort"
 msgstr "Ordina"
 msgstr "Ordina"
 
 
@@ -1996,155 +1997,155 @@ msgid "Sorting files"
 msgstr "Ordinando i file"
 msgstr "Ordinando i file"
 
 
 #. MSG_SOUND c=9
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
-#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
-#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4431
+#: ../../Firmware/ultralcd.cpp:4434 ../../Firmware/ultralcd.cpp:4437
+#: ../../Firmware/ultralcd.cpp:4440 ../../Firmware/ultralcd.cpp:4443
 msgid "Sound"
 msgid "Sound"
 msgstr "Suono"
 msgstr "Suono"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5731
+#: ../../Firmware/ultralcd.cpp:5714
 msgid "Speed"
 msgid "Speed"
 msgstr "Velocita"
 msgstr "Velocita"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
-#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7147
+#: ../../Firmware/ultralcd.cpp:7162 ../../Firmware/ultralcd.cpp:7170
 msgid "Spinning"
 msgid "Spinning"
 msgstr "Gira"
 msgstr "Gira"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4910
+#: ../../Firmware/Marlin_main.cpp:4911
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida."
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5598
+#: ../../Firmware/ultralcd.cpp:5581
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistiche"
 msgstr "Statistiche"
 
 
 #. MSG_STEALTH c=7
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
-#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4319
+#: ../../Firmware/ultralcd.cpp:4363 ../../Firmware/ultralcd.cpp:5751
 msgid "Stealth"
 msgid "Stealth"
 msgstr "Silenz."
 msgstr "Silenz."
 
 
 #. MSG_STEEL_SHEETS c=18
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
-#: ../../Firmware/ultralcd.cpp:5425
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4709
+#: ../../Firmware/ultralcd.cpp:5408
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Piani d'acciaio"
 msgstr "Piani d'acciaio"
 
 
-#. MSG_BTN_STOP c=5
-#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+#. MSG_BTN_STOP c=8
+#: ../../Firmware/mmu2/errors_list.h:299 ../../Firmware/mmu2/errors_list.h:309
 msgid "Stop"
 msgid "Stop"
-msgstr ""
+msgstr "Stop"
 
 
 #. MSG_STOP_PRINT c=18
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5520
+#: ../../Firmware/ultralcd.cpp:5979
 msgid "Stop print"
 msgid "Stop print"
 msgstr "Arresta stampa"
 msgstr "Arresta stampa"
 
 
 #. MSG_STRICT c=8
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
-#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
-#: ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4480
+#: ../../Firmware/ultralcd.cpp:4562 ../../Firmware/ultralcd.cpp:4601
+#: ../../Firmware/ultralcd.cpp:4642
 msgid "Strict"
 msgid "Strict"
 msgstr "Esatto"
 msgstr "Esatto"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5607
+#: ../../Firmware/ultralcd.cpp:5590
 msgid "Support"
 msgid "Support"
 msgstr "Supporto"
 msgstr "Supporto"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7020
+#: ../../Firmware/ultralcd.cpp:7003
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Scambiato"
 msgstr "Scambiato"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
 #: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 #: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
-msgstr ""
+msgstr "ANOMALIA TERMICA"
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #: ../../Firmware/temperature.cpp:2897
 #: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
-msgstr ""
+msgstr "Autocal. MT fallita"
 
 
 #. MSG_TITLE_TMC_DRIVER_ERROR c=20
 #. MSG_TITLE_TMC_DRIVER_ERROR c=20
-#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
-#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:179
+#: ../../Firmware/mmu2/errors_list.h:180 ../../Firmware/mmu2/errors_list.h:181
 msgid "TMC DRIVER ERROR"
 msgid "TMC DRIVER ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_TMC_DRIVER_RESET c=20
 #. MSG_TITLE_TMC_DRIVER_RESET c=20
-#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
-#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:182
+#: ../../Firmware/mmu2/errors_list.h:183 ../../Firmware/mmu2/errors_list.h:184
 msgid "TMC DRIVER RESET"
 msgid "TMC DRIVER RESET"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_TMC_DRIVER_SHORTED c=20
 #. MSG_TITLE_TMC_DRIVER_SHORTED c=20
-#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
-#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:188
+#: ../../Firmware/mmu2/errors_list.h:189 ../../Firmware/mmu2/errors_list.h:190
 msgid "TMC DRIVER SHORTED"
 msgid "TMC DRIVER SHORTED"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
 #. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
-#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
-#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:176
+#: ../../Firmware/mmu2/errors_list.h:177 ../../Firmware/mmu2/errors_list.h:178
 msgid "TMC OVERHEAT ERROR"
 msgid "TMC OVERHEAT ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
 #. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
-#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
-#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:185
+#: ../../Firmware/mmu2/errors_list.h:186 ../../Firmware/mmu2/errors_list.h:187
 msgid "TMC UNDERVOLTAGE ERR"
 msgid "TMC UNDERVOLTAGE ERR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
 #: ../../Firmware/temperature.cpp:2882
 #: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
-msgstr ""
+msgstr "Cal. modello termico"
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4759
+#: ../../Firmware/ultralcd.cpp:4742
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Temperatura"
 msgstr "Temperatura"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1716
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Temperature"
 msgstr "Temperature"
 
 
 #. MSG_TESTING_FILAMENT c=20
 #. MSG_TESTING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:444
 msgid "Testing filament"
 msgid "Testing filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
 #. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+#: ../../Firmware/mmu2/errors_list.h:215 ../../Firmware/mmu2/errors_list.h:254
 msgid ""
 msgid ""
 "The Idler cannot home properly. Check for anything blocking its movement."
 "The Idler cannot home properly. Check for anything blocking its movement."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
 #. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
-#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+#: ../../Firmware/mmu2/errors_list.h:241 ../../Firmware/mmu2/errors_list.h:282
 msgid ""
 msgid ""
 "The MMU unit reports its FW version incompatible with the printer's "
 "The MMU unit reports its FW version incompatible with the printer's "
 "firmware. Make sure the MMU firmware is up to date."
 "firmware. Make sure the MMU firmware is up to date."
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
 #. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+#: ../../Firmware/mmu2/errors_list.h:212 ../../Firmware/mmu2/errors_list.h:252
 msgid ""
 msgid ""
 "The Selector cannot home properly. Check for anything blocking its movement."
 "The Selector cannot home properly. Check for anything blocking its movement."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3940
+#: ../../Firmware/ultralcd.cpp:3923
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -2155,7 +2156,7 @@ msgstr ""
 "manuale (capitolo sulla calibrazione)."
 "manuale (capitolo sulla calibrazione)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1540 ../../Firmware/messages.cpp:43
 msgid ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -2164,69 +2165,69 @@ msgstr ""
 "Primi Passi, sezione Sequenza di Calibrazione."
 "Primi Passi, sezione Sequenza di Calibrazione."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4384
 msgid "Time"
 msgid "Time"
 msgstr "Cron."
 msgstr "Cron."
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5846
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Timeout"
 msgstr "Timeout"
 
 
 #. MSG_TOTAL c=6
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
-#: ../../Firmware/ultralcd.cpp:1300
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1154
+#: ../../Firmware/ultralcd.cpp:1287
 msgid "Total"
 msgid "Total"
 msgstr "Totale"
 msgstr "Totale"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
-#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/ultralcd.cpp:1231 ../../Firmware/ultralcd.cpp:1317
 msgid "Total failures"
 msgid "Total failures"
 msgstr "Totale fallimenti"
 msgstr "Totale fallimenti"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2385
+#: ../../Firmware/ultralcd.cpp:2372
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Filamento totale"
 msgstr "Filamento totale"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2386
+#: ../../Firmware/ultralcd.cpp:2373
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Tempo stampa totale"
 msgstr "Tempo stampa totale"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5509
+#: ../../Firmware/ultralcd.cpp:5492
 msgid "Tune"
 msgid "Tune"
 msgstr "Regola"
 msgstr "Regola"
 
 
 #. MSG_TITLE_UNLOAD_MANUALLY c=20
 #. MSG_TITLE_UNLOAD_MANUALLY c=20
-#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+#: ../../Firmware/mmu2/errors_list.h:160 ../../Firmware/mmu2/errors_list.h:201
 msgid "UNLOAD MANUALLY"
 msgid "UNLOAD MANUALLY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
 #. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
-#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+#: ../../Firmware/mmu2/errors_list.h:243 ../../Firmware/mmu2/errors_list.h:284
 msgid ""
 msgid ""
 "Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
 "Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
-#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+#. MSG_BTN_UNLOAD c=8
+#: ../../Firmware/mmu2/errors_list.h:298 ../../Firmware/mmu2/errors_list.h:308
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOAD_FILAMENT c=16
 #. MSG_UNLOAD_FILAMENT c=16
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
-#: ../../Firmware/ultralcd.cpp:5591
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5557
+#: ../../Firmware/ultralcd.cpp:5574
 msgid "Unload filament"
 msgid "Unload filament"
 msgstr "Scarica filam."
 msgstr "Scarica filam."
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/Marlin_main.cpp:3503 ../../Firmware/messages.cpp:116
 #: ../../Firmware/mmu2_progress_converter.cpp:50
 #: ../../Firmware/mmu2_progress_converter.cpp:50
-#: ../../Firmware/ultralcd.cpp:5193
+#: ../../Firmware/ultralcd.cpp:5176
 msgid "Unloading filament"
 msgid "Unloading filament"
 msgstr "Scaricando filamento"
 msgstr "Scaricando filamento"
 
 
@@ -2243,23 +2244,23 @@ msgid "Unloading to pulley"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIL_FAILED c=20 r=5
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6265
+#: ../../Firmware/ultralcd.cpp:6248
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Verifica fallita, rimuovere il filamento e riprovare."
 msgstr "Verifica fallita, rimuovere il filamento e riprovare."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1732
+#: ../../Firmware/ultralcd.cpp:1719
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Voltaggi"
 msgstr "Voltaggi"
 
 
 #. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
 #. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
-#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
-#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:173
+#: ../../Firmware/mmu2/errors_list.h:174 ../../Firmware/mmu2/errors_list.h:175
 msgid "WARNING TMC TOO HOT"
 msgid "WARNING TMC TOO HOT"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3551
+#: ../../Firmware/ultralcd.cpp:3534
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -2272,217 +2273,208 @@ msgstr ""
 "Modalita silenziosa"
 "Modalita silenziosa"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4115
+#: ../../Firmware/Marlin_main.cpp:4116
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Attendendo utente..."
 msgstr "Attendendo utente..."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2879
+#: ../../Firmware/ultralcd.cpp:2866
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "In attesa del raffreddamento della sonda PINDA"
 msgstr "In attesa del raffreddamento della sonda PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2911
+#: ../../Firmware/ultralcd.cpp:2898
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "In attesa del raffreddamento dell'ugello e del piano"
 msgstr "In attesa del raffreddamento dell'ugello e del piano"
 
 
 #. MSG_WARN c=8
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
-#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
-#: ../../Firmware/ultralcd.cpp:4656
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4477
+#: ../../Firmware/ultralcd.cpp:4559 ../../Firmware/ultralcd.cpp:4598
+#: ../../Firmware/ultralcd.cpp:4639
 msgid "Warn"
 msgid "Warn"
 msgstr "Avviso"
 msgstr "Avviso"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1505
+#: ../../Firmware/Marlin_main.cpp:1506
 msgid "Warning: both printer type and motherboard type changed."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Attenzione: tipo di stampante e di scheda madre cambiati."
 msgstr "Attenzione: tipo di stampante e di scheda madre cambiati."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1497
+#: ../../Firmware/Marlin_main.cpp:1498
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Avviso: tipo di scheda madre cambiato"
 msgstr "Avviso: tipo di scheda madre cambiato"
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1501
+#: ../../Firmware/Marlin_main.cpp:1502
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Avviso: tipo di stampante cambiato."
 msgstr "Avviso: tipo di stampante cambiato."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3574
+#: ../../Firmware/Marlin_main.cpp:3575
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Filamento scaricato con successo?"
 msgstr "Filamento scaricato con successo?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
-#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
-#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6955
+#: ../../Firmware/ultralcd.cpp:6959 ../../Firmware/ultralcd.cpp:6979
+#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7009
 msgid "Wiring error"
 msgid "Wiring error"
 msgstr "Errore cablaggio"
 msgstr "Errore cablaggio"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4866
+#: ../../Firmware/ultralcd.cpp:4849
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Wizard"
 msgstr "Wizard"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4172
+#: ../../Firmware/ultralcd.cpp:4155
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "Correzione-X:"
 msgstr "Correzione-X:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5609
+#: ../../Firmware/ultralcd.cpp:5592
 msgid "XFLASH init"
 msgid "XFLASH init"
-msgstr ""
+msgstr "Inizializza XFLASH"
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1721
+#: ../../Firmware/ultralcd.cpp:1708
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "XYZ Cal. dettagli"
 msgstr "XYZ Cal. dettagli"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3356
+#: ../../Firmware/ultralcd.cpp:3339
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 "Calibrazione XYZ corretta. La distorsione verra compensata automaticamente."
 "Calibrazione XYZ corretta. La distorsione verra compensata automaticamente."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3353
+#: ../../Firmware/ultralcd.cpp:3336
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 msgstr "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3334
+#: ../../Firmware/ultralcd.cpp:3317
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."
 msgstr "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3340
+#: ../../Firmware/ultralcd.cpp:3323
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
-msgstr ""
+msgstr "Calibrazione XYZ compromessa. Punto anteriore sinistro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3337
+#: ../../Firmware/ultralcd.cpp:3320
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
-msgstr ""
-"Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
+msgstr "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3316
+#: ../../Firmware/ultralcd.cpp:3299
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "Calibrazione XYZ fallita. Il punto di calibrazione sul piano non e' stato "
 "Calibrazione XYZ fallita. Il punto di calibrazione sul piano non e' stato "
 "trovato."
 "trovato."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3305
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 msgstr "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3328
+#: ../../Firmware/ultralcd.cpp:3311
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
-msgstr ""
+msgstr "Calibrazione XYZ fallita. Punto anteriore sinistro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
-#: ../../Firmware/ultralcd.cpp:3347
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3302
+#: ../../Firmware/ultralcd.cpp:3330
 msgid "XYZ calibration failed. Please consult the manual."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 msgstr "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3308
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 msgstr "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3350
+#: ../../Firmware/ultralcd.cpp:3333
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"
 msgstr "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2492
+#: ../../Firmware/ultralcd.cpp:2479
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Distanza Y dal min"
 msgstr "Distanza Y dal min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4173
+#: ../../Firmware/ultralcd.cpp:4156
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Correzione-Y:"
 msgstr "Correzione-Y:"
 
 
 #. MSG_YES c=4
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
-#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
-#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2215
+#: ../../Firmware/ultralcd.cpp:2785 ../../Firmware/ultralcd.cpp:3157
+#: ../../Firmware/ultralcd.cpp:4730 ../../Firmware/ultralcd.cpp:5981
 msgid "Yes"
 msgid "Yes"
 msgstr "Si"
 msgstr "Si"
 
 
-#. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:835
-msgid ""
-"You are using firmware alpha version. This is development version. Using "
-"this version is not recommended and may cause printer damage."
-msgstr ""
-
-#. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:836
-msgid ""
-"You are using firmware beta version. This is development version. Using this "
-"version is not recommended and may cause printer damage."
-msgstr ""
-
 #. MSG_WIZARD_QUIT c=20 r=8
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4132
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 "E possibile riprendere il Wizard in qualsiasi momento attraverso "
 "E possibile riprendere il Wizard in qualsiasi momento attraverso "
 "Calibrazione -> Wizard."
 "Calibrazione -> Wizard."
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4174
+#: ../../Firmware/ultralcd.cpp:4157
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Correzione-Z:"
 msgstr "Correzione-Z:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5816
 msgid "Z-probe nr."
 msgid "Z-probe nr."
 msgstr "Nr. Z-test"
 msgstr "Nr. Z-test"
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2563
+#: ../../Firmware/ultralcd.cpp:2550
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] punto offset"
 msgstr "[0;0] punto offset"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2170
+#: ../../Firmware/ultralcd.cpp:2157
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "e cliccare manopola"
 msgstr "e cliccare manopola"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1804
 msgid "to load filament"
 msgid "to load filament"
 msgstr "per caricare il fil."
 msgstr "per caricare il fil."
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1821
+#: ../../Firmware/ultralcd.cpp:1808
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "per scaricare fil."
 msgstr "per scaricare fil."
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1675
 msgid "unknown"
 msgid "unknown"
 msgstr "sconosciuto"
 msgstr "sconosciuto"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
+#: ../../Firmware/Filament_sensor.cpp:293 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgid "unknown state"
 msgstr "stato sconosciuto"
 msgstr "stato sconosciuto"
 
 
+#. MSG_BTN_MORE c=8
+#: ../../Firmware/mmu2/errors_list.h:301
+#: ../../Firmware/mmu2_error_converter.cpp:167
+msgid "⏬"
+msgstr "⏬"
+
 #. MSG_REFRESH c=18
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
-#: ../../Firmware/ultralcd.cpp:6089
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6069
+#: ../../Firmware/ultralcd.cpp:6072
 msgid "🔃Refresh"
 msgid "🔃Refresh"
 msgstr "🔃Ricaricare"
 msgstr "🔃Ricaricare"
 
 

+ 4 - 10
lang/po/Firmware_lb.po

@@ -442,7 +442,7 @@ msgid ""
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1185,12 +1185,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1722,7 +1716,7 @@ msgstr ""
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -1978,7 +1972,7 @@ msgstr ""
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2149,7 +2143,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_lt.po

@@ -442,7 +442,7 @@ msgid ""
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1185,12 +1185,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1722,7 +1716,7 @@ msgstr ""
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -1978,7 +1972,7 @@ msgstr ""
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2149,7 +2143,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_nl.po

@@ -459,7 +459,7 @@ msgstr ""
 "Wilt u de laatste stap herhalen om de afstand tussen de tuit en de bed "
 "Wilt u de laatste stap herhalen om de afstand tussen de tuit en de bed "
 "opnieuw in te stellen?"
 "opnieuw in te stellen?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr "Klaar"
 msgstr "Klaar"
@@ -1232,12 +1232,6 @@ msgstr "Model"
 msgid "More details online."
 msgid "More details online."
 msgstr "Meer details online."
 msgstr "Meer details online."
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr "Meer⏬"
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1790,7 +1784,7 @@ msgstr "Hervatten print"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr "Intrekken van FINDA"
 msgstr "Intrekken van FINDA"
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr "Retry"
 msgstr "Retry"
@@ -2062,7 +2056,7 @@ msgstr "Stil"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Staalplaten"
 msgstr "Staalplaten"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr "Stop"
 msgstr "Stop"
@@ -2244,7 +2238,7 @@ msgstr ""
 "Onverwachte FINDA-aflezing. Zorg ervoor dat er geen filament onder FINDA zit"
 "Onverwachte FINDA-aflezing. Zorg ervoor dat er geen filament onder FINDA zit"
 " en dat de selecteur vrij is. Controleer de FINDA-verbinding."
 " en dat de selecteur vrij is. Controleer de FINDA-verbinding."
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr "Ontla."
 msgstr "Ontla."

+ 4 - 10
lang/po/Firmware_no.po

@@ -456,7 +456,7 @@ msgstr ""
 "Vil du repetere det siste trinnet for å omjustere avstanden mellom dysen og "
 "Vil du repetere det siste trinnet for å omjustere avstanden mellom dysen og "
 "platen?"
 "platen?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1207,12 +1207,6 @@ msgstr "Modell"
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1755,7 +1749,7 @@ msgstr "Gjenopptar print"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2018,7 +2012,7 @@ msgstr "Stille"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Stål plate"
 msgstr "Stål plate"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2194,7 +2188,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_pl.po

@@ -456,7 +456,7 @@ msgstr ""
 "Chcesz powtorzyc ostatni krok i ponownie ustawic odleglosc miedzy dysza a "
 "Chcesz powtorzyc ostatni krok i ponownie ustawic odleglosc miedzy dysza a "
 "stolikiem?"
 "stolikiem?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1211,12 +1211,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1762,7 +1756,7 @@ msgstr "Wznawianie druku"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2031,7 +2025,7 @@ msgstr "Cichy"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Plyty stalowe"
 msgstr "Plyty stalowe"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2207,7 +2201,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_ro.po

@@ -457,7 +457,7 @@ msgstr ""
 "Vreti sa repetati ultimul pas pentru a reajusta distanta dintre varf si "
 "Vreti sa repetati ultimul pas pentru a reajusta distanta dintre varf si "
 "suprafata de print?"
 "suprafata de print?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr "Gata"
 msgstr "Gata"
@@ -1227,12 +1227,6 @@ msgstr "Model"
 msgid "More details online."
 msgid "More details online."
 msgstr "Mai multe detalii online"
 msgstr "Mai multe detalii online"
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr "More⏬"
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1781,7 +1775,7 @@ msgstr "Reluare print..."
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr "Retract de la FINDA"
 msgstr "Retract de la FINDA"
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr "Retry"
 msgstr "Retry"
@@ -2050,7 +2044,7 @@ msgstr "Silent."
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Suprafete print"
 msgstr "Suprafete print"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr "Stop"
 msgstr "Stop"
@@ -2230,7 +2224,7 @@ msgstr ""
 "Citire FINDA neasteptata.Asig. ca nu este Fil. sub FINDA si SELECTOR"
 "Citire FINDA neasteptata.Asig. ca nu este Fil. sub FINDA si SELECTOR"
 "Verifica conexiune FINDA"
 "Verifica conexiune FINDA"
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr "Unload"
 msgstr "Unload"

+ 174 - 151
lang/po/Firmware_sk.po

@@ -4,16 +4,16 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: Prusa-Firmware\n"
 "Project-Id-Version: Prusa-Firmware\n"
 "POT-Creation-Date: Wed 16 Mar 2022 09:25:13 AM CET\n"
 "POT-Creation-Date: Wed 16 Mar 2022 09:25:13 AM CET\n"
-"PO-Revision-Date: Wed 16 Mar 2022 09:25:13 AM CET\n"
+"PO-Revision-Date: 2022-09-22 09:05+0200\n"
 "Last-Translator: \n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "Language-Team: \n"
 "Language: sk\n"
 "Language: sk\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.7\n"
-"X-Poedit-SourceCharset: UTF-8\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Poedit-SourceCharset: UTF-8\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. MSG_IR_03_OR_OLDER c=18
 #: ../../Firmware/Filament_sensor.cpp:287
 #: ../../Firmware/Filament_sensor.cpp:287
@@ -63,7 +63,7 @@ msgstr "Abeceda"
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
 #: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 #: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
-msgstr ""
+msgstr "Vzdy"
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
 #: ../../Firmware/ultralcd.cpp:1406
 #: ../../Firmware/ultralcd.cpp:1406
@@ -83,13 +83,13 @@ msgstr "Asist."
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
 #: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 #: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
-msgstr ""
+msgstr "Auto"
 
 
 #. MSG_AUTO_HOME c=18
 #. MSG_AUTO_HOME c=18
 #: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
 #: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
 #: ../../Firmware/ultralcd.cpp:4871
 #: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgid "Auto home"
-msgstr ""
+msgstr "Auto home"
 
 
 #. MSG_AUTO_POWER c=10
 #. MSG_AUTO_POWER c=10
 #: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
 #: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
@@ -113,7 +113,7 @@ msgstr ""
 #: ../../Firmware/mmu2_progress_converter.cpp:16
 #: ../../Firmware/mmu2_progress_converter.cpp:16
 #: ../../Firmware/mmu2_progress_converter.cpp:42
 #: ../../Firmware/mmu2_progress_converter.cpp:42
 msgid "Avoiding grind"
 msgid "Avoiding grind"
-msgstr ""
+msgstr "Avoiding grind"
 
 
 #. MSG_SELFTEST_AXIS c=16
 #. MSG_SELFTEST_AXIS c=16
 #: ../../Firmware/ultralcd.cpp:7014
 #: ../../Firmware/ultralcd.cpp:7014
@@ -155,7 +155,7 @@ msgstr "Podlozka OK."
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
 #: ../../Firmware/ultralcd.cpp:4883
 #: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
-msgstr "Korekcie podlozky"
+msgstr "Korekcia podlozky"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
 #: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
@@ -205,7 +205,7 @@ msgstr "Podsvietenie"
 #. MSG_TITLE_COMMUNICATION_ERROR c=20
 #. MSG_TITLE_COMMUNICATION_ERROR c=20
 #: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
 #: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
 msgid "COMMUNICATION ERROR"
 msgid "COMMUNICATION ERROR"
-msgstr ""
+msgstr "COMMUNICATION ERROR"
 
 
 #. MSG_CALIBRATE_BED c=18
 #. MSG_CALIBRATE_BED c=18
 #: ../../Firmware/ultralcd.cpp:4877
 #: ../../Firmware/ultralcd.cpp:4877
@@ -260,12 +260,13 @@ msgstr "Kalibracia OK"
 #: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
 #: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
 #: ../../Firmware/mmu2/errors_list.h:245
 #: ../../Firmware/mmu2/errors_list.h:245
 msgid "Can't move Selector or Idler."
 msgid "Can't move Selector or Idler."
-msgstr ""
+msgstr "Selektor alebo Idler nie je mozne presunut."
 
 
 #. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
 #. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
 #: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
 msgid "Cannot perform the action, filament is already loaded. Unload it first."
 msgid "Cannot perform the action, filament is already loaded. Unload it first."
 msgstr ""
 msgstr ""
+"Nie je mozne vykonat akciu, filament je uz zavedeny. Najskor ho vytiahnite."
 
 
 #. MSG_SD_REMOVED c=20
 #. MSG_SD_REMOVED c=20
 #: ../../Firmware/ultralcd.cpp:7700
 #: ../../Firmware/ultralcd.cpp:7700
@@ -275,7 +276,7 @@ msgstr "Karta vysunuta"
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
 #: ../../Firmware/ultralcd.cpp:5547
 #: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
-msgstr ""
+msgstr "Zmenit SD kartu"
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. MSG_FILAMENTCHANGE c=18
 #: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
 #: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
@@ -286,7 +287,7 @@ msgstr "Vymenit filament"
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
 #: ../../Firmware/ultralcd.cpp:2179
 #: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
-msgstr "Zmena uspesna!"
+msgstr "Vymena uspesna!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
 #: ../../Firmware/ultralcd.cpp:2227
 #: ../../Firmware/ultralcd.cpp:2227
@@ -339,7 +340,7 @@ msgstr "Kontrola senzorov"
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
 #: ../../Firmware/ultralcd.cpp:4728
 #: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
-msgstr "Kontrola"
+msgstr "Kontroly"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
 #: ../../Firmware/ultralcd.cpp:2230
 #: ../../Firmware/ultralcd.cpp:2230
@@ -392,15 +393,15 @@ msgid ""
 "be turned on only in\n"
 "be turned on only in\n"
 "Normal mode"
 "Normal mode"
 msgstr ""
 msgstr ""
-"Crash detekcia moze\n"
+"Detekcia narazu moze\n"
 "byt zapnuta len v\n"
 "byt zapnuta len v\n"
-"Normal mode"
+"Normalnom rezime"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. MSG_CUT_FILAMENT c=17
 #: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
 #: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
 #: ../../Firmware/ultralcd.cpp:5578
 #: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgid "Cut filament"
-msgstr "Odstrihnut"
+msgstr "Odstrihnut filam."
 
 
 #. MSG_CUTTER c=9
 #. MSG_CUTTER c=9
 #: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
 #: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
@@ -416,12 +417,12 @@ msgstr "Datum:"
 #. MSG_DIM c=6
 #. MSG_DIM c=6
 #: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 #: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
-msgstr "Temny"
+msgstr "Tmavy"
 
 
 #. MSG_BTN_DISABLE_MMU c=9
 #. MSG_BTN_DISABLE_MMU c=9
 #: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
 #: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
 msgid "Disable"
 msgid "Disable"
-msgstr ""
+msgstr "Vypnut"
 
 
 #. MSG_DISABLE_STEPPERS c=18
 #. MSG_DISABLE_STEPPERS c=18
 #: ../../Firmware/ultralcd.cpp:4764
 #: ../../Firmware/ultralcd.cpp:4764
@@ -433,7 +434,7 @@ msgstr "Vypnut motory"
 #: ../../Firmware/mmu2_progress_converter.cpp:36
 #: ../../Firmware/mmu2_progress_converter.cpp:36
 #: ../../Firmware/mmu2_progress_converter.cpp:44
 #: ../../Firmware/mmu2_progress_converter.cpp:44
 msgid "Disengaging idler"
 msgid "Disengaging idler"
-msgstr ""
+msgstr "Uvolnenie idlera"
 
 
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 #: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
@@ -455,10 +456,10 @@ msgstr ""
 "Chcete opakovat posledny krok a pozmenit vzdialenost medzi tryskou a "
 "Chcete opakovat posledny krok a pozmenit vzdialenost medzi tryskou a "
 "podlozkou?"
 "podlozkou?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
-msgstr ""
+msgstr "Hotov"
 
 
 #. MSG_EXTRUDER_CORRECTION c=13
 #. MSG_EXTRUDER_CORRECTION c=13
 #: ../../Firmware/ultralcd.cpp:4176
 #: ../../Firmware/ultralcd.cpp:4176
@@ -469,30 +470,30 @@ msgstr "Korekcia E:"
 #: ../../Firmware/mmu2_progress_converter.cpp:19
 #: ../../Firmware/mmu2_progress_converter.cpp:19
 #: ../../Firmware/mmu2_progress_converter.cpp:48
 #: ../../Firmware/mmu2_progress_converter.cpp:48
 msgid "ERR Help filament"
 msgid "ERR Help filament"
-msgstr ""
+msgstr "ERR Help filament"
 
 
 #. MSG_PROGRESS_ERR_INTERNAL c=20
 #. MSG_PROGRESS_ERR_INTERNAL c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:18
 #: ../../Firmware/mmu2_progress_converter.cpp:18
 #: ../../Firmware/mmu2_progress_converter.cpp:47
 #: ../../Firmware/mmu2_progress_converter.cpp:47
 msgid "ERR Internal"
 msgid "ERR Internal"
-msgstr ""
+msgstr "ERR Internal"
 
 
 #. MSG_PROGRESS_ERR_TMC c=20
 #. MSG_PROGRESS_ERR_TMC c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:20
 #: ../../Firmware/mmu2_progress_converter.cpp:20
 #: ../../Firmware/mmu2_progress_converter.cpp:49
 #: ../../Firmware/mmu2_progress_converter.cpp:49
 msgid "ERR TMC failed"
 msgid "ERR TMC failed"
-msgstr ""
+msgstr "ERR TMC failed"
 
 
 #. MSG_PROGRESS_WAIT_USER c=20
 #. MSG_PROGRESS_WAIT_USER c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:17
 #: ../../Firmware/mmu2_progress_converter.cpp:17
 #: ../../Firmware/mmu2_progress_converter.cpp:46
 #: ../../Firmware/mmu2_progress_converter.cpp:46
 msgid "ERR Wait for User"
 msgid "ERR Wait for User"
-msgstr ""
+msgstr "ERR Wait for User"
 
 
 #. MSG_ERROR c=10
 #. MSG_ERROR c=10
 #: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 #: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
-msgstr "CHYBA:"
+msgstr "ERROR:"
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. MSG_EJECT_FILAMENT c=17
 #: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
 #: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
@@ -505,7 +506,7 @@ msgstr "Vysunut fil."
 #: ../../Firmware/mmu2_progress_converter.cpp:27
 #: ../../Firmware/mmu2_progress_converter.cpp:27
 #: ../../Firmware/mmu2_progress_converter.cpp:58
 #: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgid "Ejecting filament"
-msgstr "Vysuvam filament"
+msgstr "Vysunutie filamentu"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
 #: ../../Firmware/ultralcd.cpp:6984
 #: ../../Firmware/ultralcd.cpp:6984
@@ -527,25 +528,25 @@ msgstr "Konc. spinace"
 #: ../../Firmware/mmu2_progress_converter.cpp:35
 #: ../../Firmware/mmu2_progress_converter.cpp:35
 #: ../../Firmware/mmu2_progress_converter.cpp:45
 #: ../../Firmware/mmu2_progress_converter.cpp:45
 msgid "Engaging idler"
 msgid "Engaging idler"
-msgstr ""
+msgstr "Zapojenie idlera"
 
 
 #. MSG_EXTRUDER c=17
 #. MSG_EXTRUDER c=17
 #: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
 #: ../../Firmware/ultralcd.cpp:3512
 #: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgid "Extruder"
-msgstr ""
+msgstr "Extruder"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
 #: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
 #: ../../Firmware/ultralcd.cpp:7319
 #: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgid "Extruder fan:"
-msgstr "Lavy vent.:"
+msgstr "Extruder vent.:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
 #: ../../Firmware/ultralcd.cpp:1722
 #: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
-msgstr ""
+msgstr "Extruder info"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. MSG_FSENSOR_AUTOLOAD c=13
 #: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
 #: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
@@ -557,23 +558,23 @@ msgstr "F. autozav."
 #: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
 #: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
 #: ../../Firmware/ultralcd.cpp:4239
 #: ../../Firmware/ultralcd.cpp:4239
 msgid "F. jam detect"
 msgid "F. jam detect"
-msgstr ""
+msgstr "F. zasek"
 
 
 #. MSG_FSENSOR_RUNOUT c=13
 #. MSG_FSENSOR_RUNOUT c=13
 #: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
 #: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
 #: ../../Firmware/ultralcd.cpp:4236
 #: ../../Firmware/ultralcd.cpp:4236
 msgid "F. runout"
 msgid "F. runout"
-msgstr ""
+msgstr "F. vypadok"
 
 
 #. MSG_TITLE_FIL_ALREADY_LOADED c=20
 #. MSG_TITLE_FIL_ALREADY_LOADED c=20
 #: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
 #: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
 msgid "FILAMENT ALREADY LOA"
 msgid "FILAMENT ALREADY LOA"
-msgstr ""
+msgstr "FILAMENT ALREADY LOA"
 
 
 #. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
 #. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
 #: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
 #: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
 msgid "FINDA DIDNT TRIGGER"
 msgid "FINDA DIDNT TRIGGER"
-msgstr ""
+msgstr "FINDA DIDNT TRIGGER"
 
 
 #. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
 #. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
 #: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
@@ -581,6 +582,8 @@ msgid ""
 "FINDA didn't switch off while unloading filament. Try unloading manually. "
 "FINDA didn't switch off while unloading filament. Try unloading manually. "
 "Ensure filament can move and FINDA works."
 "Ensure filament can move and FINDA works."
 msgstr ""
 msgstr ""
+"FINDA sa nevypol pocas vyberania filamentu. Skuste to manualne. Uistite sa, "
+"ze filament sa moze hybat a FINDA funguje."
 
 
 #. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
 #. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
 #: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
@@ -588,47 +591,49 @@ msgid ""
 "FINDA didn't trigger while loading the filament. Ensure the filament can "
 "FINDA didn't trigger while loading the filament. Ensure the filament can "
 "move and FINDA works."
 "move and FINDA works."
 msgstr ""
 msgstr ""
+"FINDA sa nezopol pocas zavedenia filamentu. Uiste sa, ze FINDA funguje "
+"spravne."
 
 
 #. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
 #. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
 #: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
 #: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
 msgid "FINDA: FILAM. STUCK"
 msgid "FINDA: FILAM. STUCK"
-msgstr ""
+msgstr "FINDA: FILAM. STUCK"
 
 
 #. MSG_FS_ACTION c=10
 #. MSG_FS_ACTION c=10
 #: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
 #: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
 #: ../../Firmware/ultralcd.cpp:4248
 #: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgid "FS Action"
-msgstr "FS reakcia"
+msgstr "FS Akcia"
 
 
 #. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
 #. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
 #: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
 #: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
 msgid "FSENSOR DIDNT TRIGG."
 msgid "FSENSOR DIDNT TRIGG."
-msgstr ""
+msgstr "FSENSOR DIDNT TRIGG."
 
 
 #. MSG_TITLE_FSENSOR_TOO_EARLY c=20
 #. MSG_TITLE_FSENSOR_TOO_EARLY c=20
 #: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
 #: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
 msgid "FSENSOR TOO EARLY"
 msgid "FSENSOR TOO EARLY"
-msgstr ""
+msgstr "FSENSOR TOO EARLY"
 
 
 #. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
 #. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
 #: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
 #: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
 msgid "FSENSOR: FIL. STUCK"
 msgid "FSENSOR: FIL. STUCK"
-msgstr ""
+msgstr "FSENSOR: FIL. STUCK"
 
 
 #. MSG_TITLE_FW_RUNTIME_ERROR c=20
 #. MSG_TITLE_FW_RUNTIME_ERROR c=20
 #: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
 #: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
 msgid "FW RUNTIME ERROR"
 msgid "FW RUNTIME ERROR"
-msgstr ""
+msgstr "FW RUNTIME ERROR"
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
 #: ../../Firmware/ultralcd.cpp:5602
 #: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
-msgstr "Zlyhanie"
+msgstr "Statistiky zlyhani"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
 #: ../../Firmware/ultralcd.cpp:5605
 #: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
-msgstr "Zlyhanie MMU"
+msgstr "Zlyhania MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
 #: ../../Firmware/ultralcd.cpp:7030
 #: ../../Firmware/ultralcd.cpp:7030
@@ -658,25 +663,25 @@ msgstr "Kontr. vent."
 #: ../../Firmware/mmu2_progress_converter.cpp:13
 #: ../../Firmware/mmu2_progress_converter.cpp:13
 #: ../../Firmware/mmu2_progress_converter.cpp:39
 #: ../../Firmware/mmu2_progress_converter.cpp:39
 msgid "Feeding to FINDA"
 msgid "Feeding to FINDA"
-msgstr ""
+msgstr "Zavedenie do FINDA"
 
 
 #. MSG_PROGRESS_FEED_FSENSOR c=20
 #. MSG_PROGRESS_FEED_FSENSOR c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:31
 #: ../../Firmware/mmu2_progress_converter.cpp:31
 #: ../../Firmware/mmu2_progress_converter.cpp:62
 #: ../../Firmware/mmu2_progress_converter.cpp:62
 msgid "Feeding to FSensor"
 msgid "Feeding to FSensor"
-msgstr ""
+msgstr "Zavedenie do Fsensor"
 
 
 #. MSG_PROGRESS_FEED_EXTRUDER c=20
 #. MSG_PROGRESS_FEED_EXTRUDER c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:14
 #: ../../Firmware/mmu2_progress_converter.cpp:14
 #: ../../Firmware/mmu2_progress_converter.cpp:40
 #: ../../Firmware/mmu2_progress_converter.cpp:40
 msgid "Feeding to extruder"
 msgid "Feeding to extruder"
-msgstr ""
+msgstr "Zavedenie do extrud."
 
 
 #. MSG_PROGRESS_FEED_NOZZLE c=20
 #. MSG_PROGRESS_FEED_NOZZLE c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:15
 #: ../../Firmware/mmu2_progress_converter.cpp:15
 #: ../../Firmware/mmu2_progress_converter.cpp:41
 #: ../../Firmware/mmu2_progress_converter.cpp:41
 msgid "Feeding to nozzle"
 msgid "Feeding to nozzle"
-msgstr ""
+msgstr "Zavedenie do trysky"
 
 
 #. MSG_FIL_RUNOUTS c=15
 #. MSG_FIL_RUNOUTS c=15
 #: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
 #: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
@@ -696,7 +701,7 @@ msgstr "Fil. senzor"
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
 #: ../../Firmware/ultralcd.cpp:3806
 #: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgid "Filament"
-msgstr ""
+msgstr "Filament"
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
 #: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
@@ -722,6 +727,8 @@ msgid ""
 "Filament sensor didn't switch off while unloading filament. Ensure filament "
 "Filament sensor didn't switch off while unloading filament. Ensure filament "
 "can move and the sensor works."
 "can move and the sensor works."
 msgstr ""
 msgstr ""
+"Senzor filamentu sa nevypol pocas vyberania filamentu. Skontrolujte, ze sa "
+"filament moze hybat a senzor funguje spravne."
 
 
 #. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
 #. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
 #: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
@@ -729,6 +736,8 @@ msgid ""
 "Filament sensor didn't trigger while loading the filament. Ensure the "
 "Filament sensor didn't trigger while loading the filament. Ensure the "
 "filament reached the fsensor and the sensor works."
 "filament reached the fsensor and the sensor works."
 msgstr ""
 msgstr ""
+"Senzor filamentu sa nezopol pocas zavedenia filamentu. Skontrolujte, ze "
+"filament dosiahol fsenzor a senzor funguje  spravne."
 
 
 #. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
 #. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
 #: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
@@ -736,6 +745,8 @@ msgid ""
 "Filament sensor triggered too early while loading to extruder. Check there "
 "Filament sensor triggered too early while loading to extruder. Check there "
 "isn't anything stuck in PTFE tube. Check that sensor reads properly."
 "isn't anything stuck in PTFE tube. Check that sensor reads properly."
 msgstr ""
 msgstr ""
+"Filament senzor sa zopol priskoro pocas zavedenia do extruderu. Skontrolujte "
+"ci je PTFE trubicka priechodzia a senzor funguje spravne."
 
 
 #. MSG_FILAMENT_USED c=19
 #. MSG_FILAMENT_USED c=19
 #: ../../Firmware/ultralcd.cpp:2363
 #: ../../Firmware/ultralcd.cpp:2363
@@ -780,7 +791,7 @@ msgstr "Predny tlacovy vent?"
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
 #: ../../Firmware/ultralcd.cpp:2752
 #: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
-msgstr "Vpredu [μm]"
+msgstr "Predna st.[μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
 #: ../../Firmware/ultralcd.cpp:7019
 #: ../../Firmware/ultralcd.cpp:7019
@@ -835,7 +846,7 @@ msgstr ""
 #: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
 #: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
 #: ../../Firmware/ultralcd.cpp:4662
 #: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgid "Gcode"
-msgstr ""
+msgstr "G-code"
 
 
 #. MSG_HW_SETUP c=18
 #. MSG_HW_SETUP c=18
 #: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
 #: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
@@ -895,7 +906,7 @@ msgstr "Vys. vykon"
 #: ../../Firmware/mmu2_progress_converter.cpp:29
 #: ../../Firmware/mmu2_progress_converter.cpp:29
 #: ../../Firmware/mmu2_progress_converter.cpp:60
 #: ../../Firmware/mmu2_progress_converter.cpp:60
 msgid "Homing"
 msgid "Homing"
-msgstr ""
+msgstr "Navrat"
 
 
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
 #: ../../Firmware/ultralcd.cpp:4041
 #: ../../Firmware/ultralcd.cpp:4041
@@ -910,17 +921,17 @@ msgstr "Teraz urobim kalibraciu Z."
 #. MSG_TITLE_IDLER_CANNOT_HOME c=20
 #. MSG_TITLE_IDLER_CANNOT_HOME c=20
 #: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
 #: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
 msgid "IDLER CANNOT HOME"
 msgid "IDLER CANNOT HOME"
-msgstr ""
+msgstr "IDLER CANNOT HOME"
 
 
 #. MSG_TITLE_IDLER_CANNOT_MOVE c=20
 #. MSG_TITLE_IDLER_CANNOT_MOVE c=20
 #: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
 #: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
 msgid "IDLER CANNOT MOVE"
 msgid "IDLER CANNOT MOVE"
-msgstr ""
+msgstr "IDLER CANNOT MOVE"
 
 
 #. MSG_TITLE_INVALID_TOOL c=20
 #. MSG_TITLE_INVALID_TOOL c=20
 #: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
 #: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
 msgid "INVALID TOOL"
 msgid "INVALID TOOL"
-msgstr ""
+msgstr "INVALID TOOL"
 
 
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
 #: ../../Firmware/ultralcd.cpp:4115
 #: ../../Firmware/ultralcd.cpp:4115
@@ -934,7 +945,7 @@ msgstr ""
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #: ../../Firmware/mesh_bed_calibration.cpp:2530
 #: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgid "Improving bed calibration point"
-msgstr ""
+msgstr "Zlepsenie bodu kalibracie podlozky"
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
 #: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 #: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
@@ -944,7 +955,7 @@ msgstr "Informacie"
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
 #: ../../Firmware/ultralcd.cpp:5554
 #: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
-msgstr ""
+msgstr "Nacitanie SD karty"
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
 #: ../../Firmware/ultralcd.cpp:2165
 #: ../../Firmware/ultralcd.cpp:2165
@@ -964,6 +975,8 @@ msgid ""
 "Internal runtime error. Try resetting the MMU unit or updating the firmware. "
 "Internal runtime error. Try resetting the MMU unit or updating the firmware. "
 "If the issue persists, contact support."
 "If the issue persists, contact support."
 msgstr ""
 msgstr ""
+"Interna chyba. Skuste resetovat MMU alebo aktualizovat firmware. Ak chyba "
+"pretrvava, kontaktujte podporu."
 
 
 #. MSG_FILAMENT_LOADED c=20 r=2
 #. MSG_FILAMENT_LOADED c=20 r=2
 #: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
 #: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
@@ -1008,7 +1021,7 @@ msgstr "Lavy vent na tryske?"
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
 #: ../../Firmware/ultralcd.cpp:2750
 #: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
-msgstr "Vlavo [μm]"
+msgstr "Lava str.[μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
 #: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 #: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
@@ -1035,7 +1048,7 @@ msgstr "Doladenie osi Z"
 #: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
 #: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
 #: ../../Firmware/ultralcd.cpp:5178
 #: ../../Firmware/ultralcd.cpp:5178
 msgid "Load All"
 msgid "Load All"
-msgstr ""
+msgstr "Zaviest vsetko"
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. MSG_LOAD_FILAMENT c=17
 #: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
 #: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
@@ -1047,7 +1060,7 @@ msgstr "Zaviest filament"
 #. MSG_LOAD_TO_EXTRUDER c=18
 #. MSG_LOAD_TO_EXTRUDER c=18
 #: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
 #: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
 msgid "Load to extruder"
 msgid "Load to extruder"
-msgstr ""
+msgstr "Zaviest do extr."
 
 
 #. MSG_LOAD_TO_NOZZLE c=18
 #. MSG_LOAD_TO_NOZZLE c=18
 #: ../../Firmware/ultralcd.cpp:5573
 #: ../../Firmware/ultralcd.cpp:5573
@@ -1081,12 +1094,12 @@ msgstr "Hlasny"
 #. MSG_TITLE_FW_UPDATE_NEEDED c=20
 #. MSG_TITLE_FW_UPDATE_NEEDED c=20
 #: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
 #: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
 msgid "MMU FW UPDATE NEEDED"
 msgid "MMU FW UPDATE NEEDED"
-msgstr ""
+msgstr "MMU FW UPDATE NEEDED"
 
 
 #. MSG_DESC_QUEUE_FULL c=20 r=8
 #. MSG_DESC_QUEUE_FULL c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
 #: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
 msgid "MMU Firmware internal error, please reset the MMU."
 msgid "MMU Firmware internal error, please reset the MMU."
-msgstr ""
+msgstr "Chyba MMU Firmwaru, resetujte MMU."
 
 
 #. MSG_MMU_MODE c=8
 #. MSG_MMU_MODE c=8
 #: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
 #: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
@@ -1097,12 +1110,12 @@ msgstr "MMU mod"
 #. MSG_TITLE_MMU_NOT_RESPONDING c=20
 #. MSG_TITLE_MMU_NOT_RESPONDING c=20
 #: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
 #: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
 msgid "MMU NOT RESPONDING"
 msgid "MMU NOT RESPONDING"
-msgstr ""
+msgstr "MMU NOT RESPONDING"
 
 
 #. MSG_MMU_RESTORE_TEMP c=20 r=4
 #. MSG_MMU_RESTORE_TEMP c=20 r=4
 #: ../../Firmware/mmu2.cpp:598
 #: ../../Firmware/mmu2.cpp:598
 msgid "MMU Retry: Restoring temperature..."
 msgid "MMU Retry: Restoring temperature..."
-msgstr ""
+msgstr "MMU: Obnovenie teploty..."
 
 
 #. MSG_MMU_FAILS c=15
 #. MSG_MMU_FAILS c=15
 #: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
 #: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
@@ -1121,6 +1134,8 @@ msgid ""
 "MMU unit not responding correctly. Check the wiring and connectors. If the "
 "MMU unit not responding correctly. Check the wiring and connectors. If the "
 "issue persists, contact support."
 "issue persists, contact support."
 msgstr ""
 msgstr ""
+"MMU neodpoveda spravne. Skontrolujte zapojenie a konektory. Ak chyba "
+"pretrvava, kontaktujte podporu."
 
 
 #. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
 #. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
 #: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
@@ -1128,6 +1143,8 @@ msgid ""
 "MMU unit not responding. Check the wiring and connectors. If the issue "
 "MMU unit not responding. Check the wiring and connectors. If the issue "
 "persists, contact support."
 "persists, contact support."
 msgstr ""
 msgstr ""
+"MMU neodpoveda. Skontrolujte zapojenie a konektory. Ak chyba pretrvava, "
+"kontaktujte podporu."
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
 #: ../../Firmware/ultralcd.cpp:1679
 #: ../../Firmware/ultralcd.cpp:1679
@@ -1164,13 +1181,13 @@ msgstr "Meriam referencnu vysku kalibracneho bodu"
 #. MSG_MESH c=12
 #. MSG_MESH c=12
 #: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 #: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
-msgstr ""
+msgstr "Mriezka"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. MSG_MESH_BED_LEVELING c=18
 #: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
 #: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
 #: ../../Firmware/ultralcd.cpp:4881
 #: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgid "Mesh Bed Leveling"
-msgstr ""
+msgstr "Vyrovnanie podl."
 
 
 #. MSG_MODE c=6
 #. MSG_MODE c=6
 #: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
 #: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
@@ -1193,7 +1210,7 @@ msgstr "Prebieha zmena modu..."
 #: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
 #: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
 #: ../../Firmware/ultralcd.cpp:4582
 #: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgid "Model"
-msgstr ""
+msgstr "Model"
 
 
 #. MSG_DESC_TMC c=20 r=8
 #. MSG_DESC_TMC c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
 #: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
@@ -1207,19 +1224,13 @@ msgstr ""
 #: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
 #: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
 #: ../../Firmware/mmu2/errors_list.h:263
 #: ../../Firmware/mmu2/errors_list.h:263
 msgid "More details online."
 msgid "More details online."
-msgstr ""
-
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
+msgstr "Viac podrobnosti online."
 
 
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgid "Motor"
-msgstr ""
+msgstr "Motor"
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
 #: ../../Firmware/ultralcd.cpp:3509
 #: ../../Firmware/ultralcd.cpp:3509
@@ -1245,7 +1256,7 @@ msgstr "Posunut os"
 #: ../../Firmware/mmu2_progress_converter.cpp:30
 #: ../../Firmware/mmu2_progress_converter.cpp:30
 #: ../../Firmware/mmu2_progress_converter.cpp:61
 #: ../../Firmware/mmu2_progress_converter.cpp:61
 msgid "Moving selector"
 msgid "Moving selector"
-msgstr ""
+msgstr "Presun selektora"
 
 
 #. MSG_NA c=3
 #. MSG_NA c=3
 #: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
 #: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
@@ -1254,7 +1265,7 @@ msgstr ""
 #: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
 #: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
 #: ../../Firmware/ultralcd.cpp:5834
 #: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgid "N/A"
-msgstr ""
+msgstr "N/A"
 
 
 #. MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
 #. MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
 #: ../../Firmware/util.cpp:199
 #: ../../Firmware/util.cpp:199
@@ -1292,7 +1303,7 @@ msgstr "Ziadne"
 #: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
 #: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
 #: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 #: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgid "Normal"
-msgstr ""
+msgstr "Normal"
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #: ../../Firmware/ultralcd.cpp:6968
 #: ../../Firmware/ultralcd.cpp:6968
@@ -1314,7 +1325,7 @@ msgstr "Teraz skalibrujem vzdialenost medzi koncom trysky a povrchom podlozky."
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #: ../../Firmware/ultralcd.cpp:4059
 #: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
-msgstr "Teraz predhrejem trysku pre PLA."
+msgstr "Teraz predohrejem trysku pre PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #: ../../Firmware/ultralcd.cpp:4048
 #: ../../Firmware/ultralcd.cpp:4048
@@ -1338,7 +1349,7 @@ msgstr "Tryska"
 #: ../../Firmware/mmu2_progress_converter.cpp:8
 #: ../../Firmware/mmu2_progress_converter.cpp:8
 #: ../../Firmware/mmu2_progress_converter.cpp:34
 #: ../../Firmware/mmu2_progress_converter.cpp:34
 msgid "OK"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 
 #. MSG_OFF c=3
 #. MSG_OFF c=3
 #: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
 #: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
@@ -1380,7 +1391,7 @@ msgstr "Raz"
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 #: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgid "PAUSED THERMAL ERROR"
-msgstr ""
+msgstr "PAUSED THERMAL ERROR"
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
 #: ../../Firmware/ultralcd.cpp:1036
 #: ../../Firmware/ultralcd.cpp:1036
@@ -1412,7 +1423,7 @@ msgstr "PINDA kal."
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #: ../../Firmware/ultralcd.cpp:3384
 #: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
-msgstr "Teplotna kalibracia zlyhala"
+msgstr "Kalibracia PINDA zlyhala"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
 #: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
@@ -1421,19 +1432,19 @@ msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr ""
 msgstr ""
-"PINDA kalibracia dokoncena a je teraz aktivna. Da je mozno deaktivovat v "
-"menu Nastavenie->PINDA kal."
+"PINDA kalibracia dokoncena a je teraz aktivna. Je mozne ju deaktivovat v "
+"menu Nastavenia->PINDA kal."
 
 
 #. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
 #. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
 #: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
 #: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
 msgid "PULLEY CANNOT MOVE"
 msgid "PULLEY CANNOT MOVE"
-msgstr ""
+msgstr "PULLEY CANNOT MOVE"
 
 
 #. MSG_PROGRESS_PARK_SELECTOR c=20
 #. MSG_PROGRESS_PARK_SELECTOR c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:26
 #: ../../Firmware/mmu2_progress_converter.cpp:26
 #: ../../Firmware/mmu2_progress_converter.cpp:57
 #: ../../Firmware/mmu2_progress_converter.cpp:57
 msgid "Parking selector"
 msgid "Parking selector"
-msgstr ""
+msgstr "Parkovanie selektora"
 
 
 #. MSG_PAUSE c=5
 #. MSG_PAUSE c=5
 #: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 #: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
@@ -1450,7 +1461,7 @@ msgstr "Pozastavit tlac"
 #: ../../Firmware/mmu2_progress_converter.cpp:24
 #: ../../Firmware/mmu2_progress_converter.cpp:24
 #: ../../Firmware/mmu2_progress_converter.cpp:55
 #: ../../Firmware/mmu2_progress_converter.cpp:55
 msgid "Performing cut"
 msgid "Performing cut"
-msgstr ""
+msgstr "Strihanie"
 
 
 #. MSG_PAPER c=20 r=10
 #. MSG_PAPER c=20 r=10
 #: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 #: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
@@ -1528,7 +1539,7 @@ msgstr "Umiestnite prosim platnu na podlozku"
 #: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
 #: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
 #: ../../Firmware/messages.cpp:78
 #: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgid "Please press the knob to unload filament"
-msgstr "Pre vysunutie filamentu stlacte prosim tlacidlo"
+msgstr "Pre vysunutie filamentu stlacte tlacidlo"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 #: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
@@ -1538,18 +1549,18 @@ msgstr "Prosim vyberte urychlene filament"
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
 #: ../../Firmware/ultralcd.cpp:4047
 #: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
-msgstr "Najskor prosim odstrante prevozne suciastky."
+msgstr "Najskor prosim odstrante prevozne pomocky."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
 #: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
 #: ../../Firmware/messages.cpp:83
 #: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgid "Please remove steel sheet from heatbed."
-msgstr "Odstrante prosim platnu z pozdlozky."
+msgstr "Odstrante prosim platnu z podlozky."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
 #: ../../Firmware/Marlin_main.cpp:4897
 #: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
-msgstr "Nejskor spustte kalibraciu XYZ."
+msgstr "Najskor spustite kalibraciu XYZ."
 
 
 #. MSG_UNLOAD_FILAMENT_REPEAT c=20 r=4
 #. MSG_UNLOAD_FILAMENT_REPEAT c=20 r=4
 #: ../../Firmware/ultralcd.cpp:6255
 #: ../../Firmware/ultralcd.cpp:6255
@@ -1582,7 +1593,7 @@ msgstr "Predohrev"
 #. MSG_PREHEAT_NOZZLE c=20
 #. MSG_PREHEAT_NOZZLE c=20
 #: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 #: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgid "Preheat the nozzle!"
-msgstr "Predhrejte trysku!"
+msgstr "Predohrejte trysku!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. MSG_WIZARD_HEATING c=20 r=3
 #: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
 #: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
@@ -1593,7 +1604,7 @@ msgstr "Predhrev trysky. Prosim cakajte."
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
 #: ../../Firmware/ultralcd.cpp:2001
 #: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
-msgstr "Predhrev k strihu"
+msgstr "Predohrev k strihu"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
 #: ../../Firmware/ultralcd.cpp:1998
 #: ../../Firmware/ultralcd.cpp:1998
@@ -1608,13 +1619,13 @@ msgstr "Predhrev k zavedeniu"
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #: ../../Firmware/ultralcd.cpp:1994
 #: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
-msgstr "Predhrev k vybratiu"
+msgstr "Predohrev k vybratiu"
 
 
 #. MSG_PROGRESS_PREPARE_BLADE c=20
 #. MSG_PROGRESS_PREPARE_BLADE c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:22
 #: ../../Firmware/mmu2_progress_converter.cpp:22
 #: ../../Firmware/mmu2_progress_converter.cpp:53
 #: ../../Firmware/mmu2_progress_converter.cpp:53
 msgid "Preparing blade"
 msgid "Preparing blade"
-msgstr ""
+msgstr "Priprava cepele"
 
 
 #. MSG_PRESS_KNOB c=20
 #. MSG_PRESS_KNOB c=20
 #: ../../Firmware/ultralcd.cpp:1809
 #: ../../Firmware/ultralcd.cpp:1809
@@ -1684,27 +1695,29 @@ msgstr ""
 #: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
 #: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
 msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
 msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
 msgstr ""
 msgstr ""
+"Motor remenice sa zasekol. Skontrolujte, ze sa remenica moze hybat a jej "
+"zapojenie."
 
 
 #. MSG_PROGRESS_PUSH_FILAMENT c=20
 #. MSG_PROGRESS_PUSH_FILAMENT c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:23
 #: ../../Firmware/mmu2_progress_converter.cpp:23
 #: ../../Firmware/mmu2_progress_converter.cpp:54
 #: ../../Firmware/mmu2_progress_converter.cpp:54
 msgid "Pushing filament"
 msgid "Pushing filament"
-msgstr ""
+msgstr "Tlacenie filamentu"
 
 
 #. MSG_TITLE_QUEUE_FULL c=20
 #. MSG_TITLE_QUEUE_FULL c=20
 #: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
 #: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
 msgid "QUEUE FULL"
 msgid "QUEUE FULL"
-msgstr ""
+msgstr "QUEUE FULL"
 
 
 #. MSG_RPI_PORT c=13
 #. MSG_RPI_PORT c=13
 #: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 #: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
-msgstr ""
+msgstr "RPi port"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
 #: ../../Firmware/ultralcd.cpp:2753
 #: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
-msgstr "Vzadu [μm]"
+msgstr "Zadna str.[μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
 #: ../../Firmware/Marlin_main.cpp:10899
 #: ../../Firmware/Marlin_main.cpp:10899
@@ -1727,17 +1740,19 @@ msgid ""
 "Requested filament tool is not available on this hardware. Check the G-code "
 "Requested filament tool is not available on this hardware. Check the G-code "
 "for tool index out of range (T0-T4)."
 "for tool index out of range (T0-T4)."
 msgstr ""
 msgstr ""
+"Pozadovany nastroj filamentu nie je k dispozicii. Skontrolujte G-code pre "
+"nastroj mimo rozsah (T0-T4)."
 
 
 #. MSG_RESET c=14
 #. MSG_RESET c=14
 #: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
 #: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
 #: ../../Firmware/ultralcd.cpp:5436
 #: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgid "Reset"
-msgstr ""
+msgstr "Reset"
 
 
 #. MSG_BTN_RESTART_MMU c=9
 #. MSG_BTN_RESTART_MMU c=9
 #: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
 #: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
 msgid "Reset MMU"
 msgid "Reset MMU"
-msgstr ""
+msgstr "Reset MMU"
 
 
 #. MSG_CALIBRATE_BED_RESET c=18
 #. MSG_CALIBRATE_BED_RESET c=18
 #: ../../Firmware/ultralcd.cpp:4888
 #: ../../Firmware/ultralcd.cpp:4888
@@ -1759,18 +1774,18 @@ msgstr "Obnovenie tlace"
 #: ../../Firmware/mmu2_progress_converter.cpp:28
 #: ../../Firmware/mmu2_progress_converter.cpp:28
 #: ../../Firmware/mmu2_progress_converter.cpp:59
 #: ../../Firmware/mmu2_progress_converter.cpp:59
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
-msgstr ""
+msgstr "Vybrat z FINDA"
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
-msgstr ""
+msgstr "Znova"
 
 
 #. MSG_PROGRESS_RETURN_SELECTOR c=20
 #. MSG_PROGRESS_RETURN_SELECTOR c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:25
 #: ../../Firmware/mmu2_progress_converter.cpp:25
 #: ../../Firmware/mmu2_progress_converter.cpp:56
 #: ../../Firmware/mmu2_progress_converter.cpp:56
 msgid "Returning selector"
 msgid "Returning selector"
-msgstr ""
+msgstr "Navrat selektora"
 
 
 #. MSG_RIGHT c=10
 #. MSG_RIGHT c=10
 #: ../../Firmware/ultralcd.cpp:2495
 #: ../../Firmware/ultralcd.cpp:2495
@@ -1780,7 +1795,7 @@ msgstr "Vpravo"
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
 #: ../../Firmware/ultralcd.cpp:2751
 #: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
-msgstr "Vpravo [μm]"
+msgstr "Prava str.[μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
 #: ../../Firmware/ultralcd.cpp:3857
 #: ../../Firmware/ultralcd.cpp:3857
@@ -1801,12 +1816,12 @@ msgstr "SD karta"
 #. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
 #. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
 #: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
 #: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
 msgid "SELECTOR CANNOT HOME"
 msgid "SELECTOR CANNOT HOME"
-msgstr ""
+msgstr "SELECTOR CANNOT HOME"
 
 
 #. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
 #. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
 #: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
 #: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
 msgid "SELECTOR CANNOT MOVE"
 msgid "SELECTOR CANNOT MOVE"
-msgstr ""
+msgstr "SELECTOR CANNOT MOVE"
 
 
 #. MSG_STOPPED c=20
 #. MSG_STOPPED c=20
 #: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 #: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
@@ -1835,7 +1850,7 @@ msgstr "Zvolte filament pre kalibraciu prvej vrstvy z nasledujuceho menu"
 #: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 #: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgid "Select extruder:"
-msgstr "Vyberte extruder:"
+msgstr "Zvolte extruder:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. MSG_SELECT_FILAMENT c=20
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
 #: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
@@ -1863,38 +1878,38 @@ msgstr "Zvolte teplotu, ktora odpoveda vasmu materialu."
 #: ../../Firmware/mmu2_progress_converter.cpp:21
 #: ../../Firmware/mmu2_progress_converter.cpp:21
 #: ../../Firmware/mmu2_progress_converter.cpp:52
 #: ../../Firmware/mmu2_progress_converter.cpp:52
 msgid "Selecting fil. slot"
 msgid "Selecting fil. slot"
-msgstr ""
+msgstr "Vyber slotu fil."
 
 
 #. MSG_SELFTEST_OK c=20
 #. MSG_SELFTEST_OK c=20
 #: ../../Firmware/ultralcd.cpp:6522
 #: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
-msgstr ""
+msgstr "Samotest OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
 #: ../../Firmware/ultralcd.cpp:6295
 #: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
-msgstr ""
+msgstr "Zaciatok testu"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
 #: ../../Firmware/ultralcd.cpp:4875
 #: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
-msgstr ""
+msgstr "Samotest"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
 #: ../../Firmware/ultralcd.cpp:6961
 #: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
-msgstr "Chyba Selftestu!"
+msgstr "Chyba samotestu!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. MSG_SELFTEST_FAILED c=20
 #: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
 #: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
 #: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 #: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgid "Selftest failed"
-msgstr "Selftest zlyhal"
+msgstr "Samotest zlyhal"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. MSG_FORCE_SELFTEST c=20 r=8
 #: ../../Firmware/Marlin_main.cpp:1545
 #: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
-msgstr "Pre kalibraciu presneho rehomovania bude teraz spusteny selftest."
+msgstr "Bude spusteny test pre kalibraciu presneho navratu."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
 #: ../../Firmware/ultralcd.cpp:1723
 #: ../../Firmware/ultralcd.cpp:1723
@@ -1917,7 +1932,7 @@ msgstr "Nastavte teplotu:"
 #: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
 #: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
 #: ../../Firmware/ultralcd.cpp:5878
 #: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgid "Settings"
-msgstr "Nastavenie"
+msgstr "Nastavenia"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
 #: ../../Firmware/ultralcd.cpp:2538
 #: ../../Firmware/ultralcd.cpp:2538
@@ -2025,10 +2040,10 @@ msgstr "Tichy"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Platne"
 msgstr "Platne"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
-msgstr ""
+msgstr "Zast."
 
 
 #. MSG_STOP_PRINT c=18
 #. MSG_STOP_PRINT c=18
 #: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
 #: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
@@ -2056,47 +2071,47 @@ msgstr "Prehodene"
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
 #: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 #: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
-msgstr ""
+msgstr "THERMAL ANOMALY"
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #: ../../Firmware/temperature.cpp:2897
 #: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
-msgstr ""
+msgstr "TM autotune failed"
 
 
 #. MSG_TITLE_TMC_DRIVER_ERROR c=20
 #. MSG_TITLE_TMC_DRIVER_ERROR c=20
 #: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
 #: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
 #: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
 #: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
 msgid "TMC DRIVER ERROR"
 msgid "TMC DRIVER ERROR"
-msgstr ""
+msgstr "TMC DRIVER ERROR"
 
 
 #. MSG_TITLE_TMC_DRIVER_RESET c=20
 #. MSG_TITLE_TMC_DRIVER_RESET c=20
 #: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
 #: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
 #: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
 #: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
 msgid "TMC DRIVER RESET"
 msgid "TMC DRIVER RESET"
-msgstr ""
+msgstr "TMC DRIVER RESET"
 
 
 #. MSG_TITLE_TMC_DRIVER_SHORTED c=20
 #. MSG_TITLE_TMC_DRIVER_SHORTED c=20
 #: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
 #: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
 #: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
 #: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
 msgid "TMC DRIVER SHORTED"
 msgid "TMC DRIVER SHORTED"
-msgstr ""
+msgstr "TMC DRIVER SHORTED"
 
 
 #. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
 #. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
 #: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
 #: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
 #: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
 #: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
 msgid "TMC OVERHEAT ERROR"
 msgid "TMC OVERHEAT ERROR"
-msgstr ""
+msgstr "TMC OVERHEAT ERROR"
 
 
 #. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
 #. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
 #: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
 #: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
 #: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
 #: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
 msgid "TMC UNDERVOLTAGE ERR"
 msgid "TMC UNDERVOLTAGE ERR"
-msgstr ""
+msgstr "TMC UNDERVOLTAGE ERR"
 
 
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
 #: ../../Firmware/temperature.cpp:2882
 #: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
-msgstr ""
+msgstr "Autom. nast. teploty"
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
 #: ../../Firmware/ultralcd.cpp:4759
 #: ../../Firmware/ultralcd.cpp:4759
@@ -2111,13 +2126,14 @@ msgstr "Teploty"
 #. MSG_TESTING_FILAMENT c=20
 #. MSG_TESTING_FILAMENT c=20
 #: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
 #: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
 msgid "Testing filament"
 msgid "Testing filament"
-msgstr ""
+msgstr "Kontrola filamentu"
 
 
 #. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
 #. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
 #: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
 msgid ""
 msgid ""
 "The Idler cannot home properly. Check for anything blocking its movement."
 "The Idler cannot home properly. Check for anything blocking its movement."
 msgstr ""
 msgstr ""
+"Idler sa nemoze vratit na miesto. Skontrolujte ci nieco neblokuje jeho pohyb."
 
 
 #. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
 #. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
 #: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
 #: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
@@ -2125,12 +2141,16 @@ msgid ""
 "The MMU unit reports its FW version incompatible with the printer's "
 "The MMU unit reports its FW version incompatible with the printer's "
 "firmware. Make sure the MMU firmware is up to date."
 "firmware. Make sure the MMU firmware is up to date."
 msgstr ""
 msgstr ""
+"Verzia FW MMU je nekompatibilna s FW tlaciarne. Skontrolujte aktualizacie "
+"MMU firmwaru."
 
 
 #. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
 #. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
 #: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
 msgid ""
 msgid ""
 "The Selector cannot home properly. Check for anything blocking its movement."
 "The Selector cannot home properly. Check for anything blocking its movement."
 msgstr ""
 msgstr ""
+"Selektor sa nemoze vratit na miesto. Skontrolujte ci nieco neblokuje jeho "
+"pohyb."
 
 
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
 #: ../../Firmware/ultralcd.cpp:3940
 #: ../../Firmware/ultralcd.cpp:3940
@@ -2159,7 +2179,7 @@ msgstr "Cas"
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
 #: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 #: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
-msgstr ""
+msgstr "Casovac"
 
 
 #. MSG_TOTAL c=6
 #. MSG_TOTAL c=6
 #: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
 #: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
@@ -2191,7 +2211,7 @@ msgstr "Ladit"
 #. MSG_TITLE_UNLOAD_MANUALLY c=20
 #. MSG_TITLE_UNLOAD_MANUALLY c=20
 #: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
 #: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
 msgid "UNLOAD MANUALLY"
 msgid "UNLOAD MANUALLY"
-msgstr ""
+msgstr "UNLOAD MANUALLY"
 
 
 #. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
 #. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
 #: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
 #: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
@@ -2199,11 +2219,13 @@ msgid ""
 "Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
 "Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
+"Neocakavane nacitanie FINDA. Skontrolujte, ze filament nie je pod FINDA a "
+"selektor je volny. Skontrolujte pripojenie FINDA."
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
-msgstr ""
+msgstr "Vysuv"
 
 
 #. MSG_UNLOAD_FILAMENT c=16
 #. MSG_UNLOAD_FILAMENT c=16
 #: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
 #: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
@@ -2216,19 +2238,19 @@ msgstr "Vybrat filament"
 #: ../../Firmware/mmu2_progress_converter.cpp:50
 #: ../../Firmware/mmu2_progress_converter.cpp:50
 #: ../../Firmware/ultralcd.cpp:5193
 #: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgid "Unloading filament"
-msgstr "Vysuvam filament"
+msgstr "Vysuvanie filamentu"
 
 
 #. MSG_PROGRESS_UNLOAD_FINDA c=20
 #. MSG_PROGRESS_UNLOAD_FINDA c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:11
 #: ../../Firmware/mmu2_progress_converter.cpp:11
 #: ../../Firmware/mmu2_progress_converter.cpp:37
 #: ../../Firmware/mmu2_progress_converter.cpp:37
 msgid "Unloading to FINDA"
 msgid "Unloading to FINDA"
-msgstr ""
+msgstr "Vysuvanie do FINDA"
 
 
 #. MSG_PROGRESS_UNLOAD_PULLEY c=20
 #. MSG_PROGRESS_UNLOAD_PULLEY c=20
 #: ../../Firmware/mmu2_progress_converter.cpp:12
 #: ../../Firmware/mmu2_progress_converter.cpp:12
 #: ../../Firmware/mmu2_progress_converter.cpp:38
 #: ../../Firmware/mmu2_progress_converter.cpp:38
 msgid "Unloading to pulley"
 msgid "Unloading to pulley"
-msgstr ""
+msgstr "Vysuv. do remenice"
 
 
 #. MSG_FIL_FAILED c=20 r=5
 #. MSG_FIL_FAILED c=20 r=5
 #: ../../Firmware/ultralcd.cpp:6265
 #: ../../Firmware/ultralcd.cpp:6265
@@ -2244,7 +2266,7 @@ msgstr "Napatie"
 #: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
 #: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
 #: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
 #: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
 msgid "WARNING TMC TOO HOT"
 msgid "WARNING TMC TOO HOT"
-msgstr ""
+msgstr "WARNING TMC TOO HOT"
 
 
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 #: ../../Firmware/ultralcd.cpp:3551
 #: ../../Firmware/ultralcd.cpp:3551
@@ -2257,7 +2279,7 @@ msgstr ""
 "POZOR:\n"
 "POZOR:\n"
 "Crash detekcia\n"
 "Crash detekcia\n"
 "deaktivovana v\n"
 "deaktivovana v\n"
-"Stealth mode"
+"Tichom rezime"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
 #: ../../Firmware/Marlin_main.cpp:4115
 #: ../../Firmware/Marlin_main.cpp:4115
@@ -2267,7 +2289,7 @@ msgstr "Caka sa na uzivatela"
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #: ../../Firmware/ultralcd.cpp:2879
 #: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
-msgstr "Cakanie na schladnutie PINDA"
+msgstr "Caka sa na ochladenie PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
 #: ../../Firmware/ultralcd.cpp:2911
 #: ../../Firmware/ultralcd.cpp:2911
@@ -2284,12 +2306,12 @@ msgstr "Varovat"
 #. MSG_CHANGED_BOTH c=20 r=4
 #. MSG_CHANGED_BOTH c=20 r=4
 #: ../../Firmware/Marlin_main.cpp:1505
 #: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgid "Warning: both printer type and motherboard type changed."
-msgstr "Varovanie: doslo k zmene typu tlaciarne a motherboardu."
+msgstr "Varovanie: doslo k zmene typu tlaciarne a maticnej dosky."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #: ../../Firmware/Marlin_main.cpp:1497
 #: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
-msgstr "Varovanie: doslo k zmene typu motherboardu."
+msgstr "Varovanie: doslo k zmene typu maticnej dosky."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
 #: ../../Firmware/Marlin_main.cpp:1501
 #: ../../Firmware/Marlin_main.cpp:1501
@@ -2321,7 +2343,7 @@ msgstr "Korekcia X:"
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
 #: ../../Firmware/ultralcd.cpp:5609
 #: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
-msgstr ""
+msgstr "XFLASH init"
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
 #: ../../Firmware/ultralcd.cpp:1721
 #: ../../Firmware/ultralcd.cpp:1721
@@ -2332,7 +2354,7 @@ msgstr "Detaily XYZ kal."
 #: ../../Firmware/ultralcd.cpp:3356
 #: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
-"Kalibracia XYZ v poradku. Skosenie bude automaticky vyrovnane pri tlaci."
+"Kalibracia XYZ v poriadku. Skosenie bude automaticky vyrovnane pri tlaci."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3353
 #: ../../Firmware/ultralcd.cpp:3353
@@ -2342,19 +2364,19 @@ msgstr "Kalibracia XYZ v poriadku. X/Y osi mierne skosene. Dobra praca!"
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3334
 #: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
-msgstr "Kalibracia XYZ nepresna. Predne kalibracne body su velmi vpredu."
+msgstr "Kalibracia XYZ je nepresna. Predne kalibracne body su nedostupne."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3340
 #: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
-msgstr ""
+msgstr "Kalibracia XYZ je nepresna. Lavy predny bod je nedostupny."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3337
 #: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
-msgstr "Kalibracia XYZ nepresna. Pravy predny bod je velmi vpredu."
+msgstr "Kalibracia XYZ je nepresna. Pravy predny bod je nedostupny."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #: ../../Firmware/ultralcd.cpp:3316
 #: ../../Firmware/ultralcd.cpp:3316
@@ -2364,14 +2386,12 @@ msgstr "Kalibracia XYZ zlyhala. Kalibracny bod podlozky nenajdeny."
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #: ../../Firmware/ultralcd.cpp:3322
 #: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgid "XYZ calibration failed. Front calibration points not reachable."
-msgstr ""
-"Kalibracia XYZ zlyhala. Predne kalibracne body velmi vpredu. Zrovnajte "
-"tlaciaren."
+msgstr "Kalibracia XYZ zlyhala. Predne kalibracne body su nedostupne."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3328
 #: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
-msgstr ""
+msgstr "Kalibracia XYZ zlyhala. Lavy predny bod je nedostupny"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
 #: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
@@ -2382,13 +2402,12 @@ msgstr "Kalibracia XYZ zlyhala. Nahliadnite do manualu."
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #: ../../Firmware/ultralcd.cpp:3325
 #: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
-msgstr ""
-"Kalibracia XYZ zlyhala. Pravy predny bod velmi vpredu. Zrovnajte tlaciaren."
+msgstr "Kalibracia XYZ zlyhala. Pravy predny bod je nedostupny."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #: ../../Firmware/ultralcd.cpp:3350
 #: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
-msgstr "Kalibracia XYZ v poradku. X/Y osi su kolme. Gratulujem!"
+msgstr "Kalibracia XYZ v poradku. X/Y osi su kolme. Gratulujeme!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
 #: ../../Firmware/ultralcd.cpp:2492
 #: ../../Firmware/ultralcd.cpp:2492
@@ -2413,6 +2432,8 @@ msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
+"Pouzivate ALPHA verziu firmveru. Toto je vyvojova verzia. Pouzivanie tejto "
+"verzie sa neodporuca a moze sposobit poskodenie tlaciarne."
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
 #: ../../Firmware/Marlin_main.cpp:836
 #: ../../Firmware/Marlin_main.cpp:836
@@ -2420,6 +2441,8 @@ msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
+"Pouzivate BETA verziu firmveru. Toto je vyvojova verzia. Pouzivanie tejto "
+"verzie sa neodporuca a moze sposobit poskodenie tlaciarne."
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. MSG_WIZARD_QUIT c=20 r=8
 #: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 #: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149

+ 4 - 10
lang/po/Firmware_sl.po

@@ -442,7 +442,7 @@ msgid ""
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1185,12 +1185,6 @@ msgstr ""
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1722,7 +1716,7 @@ msgstr ""
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -1978,7 +1972,7 @@ msgstr ""
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2149,7 +2143,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 4 - 10
lang/po/Firmware_sv.po

@@ -456,7 +456,7 @@ msgstr ""
 "Vill du upprepa det sista steget för att justera avståndet mellan munstycket "
 "Vill du upprepa det sista steget för att justera avståndet mellan munstycket "
 "och värmebädden?"
 "och värmebädden?"
 
 
-#. MSG_BTN_CONTINUE c=5
+#. MSG_BTN_CONTINUE c=8
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 #: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
@@ -1214,12 +1214,6 @@ msgstr "Modell"
 msgid "More details online."
 msgid "More details online."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_MORE c=5
-#: ../../Firmware/mmu2/errors_list.h:287
-#: ../../Firmware/mmu2_error_converter.cpp:153
-msgid "More⏬"
-msgstr ""
-
 #. MSG_SELFTEST_MOTOR c=18
 #. MSG_SELFTEST_MOTOR c=18
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 #: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
@@ -1770,7 +1764,7 @@ msgstr "Återupptar utskrift"
 msgid "Retract from FINDA"
 msgid "Retract from FINDA"
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_RETRY c=5
+#. MSG_BTN_RETRY c=8
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 #: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
 msgid "Retry"
 msgid "Retry"
 msgstr ""
 msgstr ""
@@ -2036,7 +2030,7 @@ msgstr "Tyst"
 msgid "Steel sheets"
 msgid "Steel sheets"
 msgstr "Metallskivor"
 msgstr "Metallskivor"
 
 
-#. MSG_BTN_STOP c=5
+#. MSG_BTN_STOP c=8
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 #: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
 msgid "Stop"
 msgid "Stop"
 msgstr ""
 msgstr ""
@@ -2211,7 +2205,7 @@ msgid ""
 "is free. Check FINDA connection."
 "is free. Check FINDA connection."
 msgstr ""
 msgstr ""
 
 
-#. MSG_BTN_UNLOAD c=6
+#. MSG_BTN_UNLOAD c=8
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 #: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
 msgid "Unload"
 msgid "Unload"
 msgstr ""
 msgstr ""

+ 3 - 0
lib/CMakeLists.txt

@@ -0,0 +1,3 @@
+if(NOT CMAKE_CROSSCOMPILING)
+  add_subdirectory(Catch2)
+endif()

+ 25 - 0
lib/Catch2/.clang-format

@@ -0,0 +1,25 @@
+---
+AccessModifierOffset: '-4'
+AlignEscapedNewlines: Left
+AllowAllConstructorInitializersOnNextLine: 'true'
+BinPackArguments: 'false'
+BinPackParameters: 'false'
+BreakConstructorInitializers: AfterColon
+ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
+DerivePointerAlignment: 'false'
+FixNamespaceComments: 'true'
+IncludeBlocks: Regroup
+IndentCaseLabels: 'false'
+IndentPPDirectives: AfterHash
+IndentWidth: '4'
+Language: Cpp
+NamespaceIndentation: All
+PointerAlignment: Left
+SpaceBeforeCtorInitializerColon: 'false'
+SpaceInEmptyParentheses: 'false'
+SpacesInParentheses: 'true'
+Standard: Cpp11
+TabWidth: '4'
+UseTab: Never
+
+...

+ 94 - 0
lib/Catch2/.conan/build.py

@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import os
+import re
+from cpt.packager import ConanMultiPackager
+from cpt.ci_manager import CIManager
+from cpt.printer import Printer
+
+
+class BuilderSettings(object):
+    @property
+    def username(self):
+        """ Set catchorg as package's owner
+        """
+        return os.getenv("CONAN_USERNAME", "catchorg")
+
+    @property
+    def login_username(self):
+        """ Set Bintray login username
+        """
+        return os.getenv("CONAN_LOGIN_USERNAME", "horenmar")
+
+    @property
+    def upload(self):
+        """ Set Catch2 repository to be used on upload.
+            The upload server address could be customized by env var
+            CONAN_UPLOAD. If not defined, the method will check the branch name.
+            Only master or CONAN_STABLE_BRANCH_PATTERN will be accepted.
+            The master branch will be pushed to testing channel, because it does
+            not match the stable pattern. Otherwise it will upload to stable
+            channel.
+        """
+        return os.getenv("CONAN_UPLOAD", "https://api.bintray.com/conan/catchorg/catch2")
+
+    @property
+    def upload_only_when_stable(self):
+        """ Force to upload when running over tag branch
+        """
+        return os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", "True").lower() in ["true", "1", "yes"]
+
+    @property
+    def stable_branch_pattern(self):
+        """ Only upload the package the branch name is like a tag
+        """
+        return os.getenv("CONAN_STABLE_BRANCH_PATTERN", r"v\d+\.\d+\.\d+")
+
+    @property
+    def reference(self):
+        """ Read project version from branch create Conan reference
+        """
+        return os.getenv("CONAN_REFERENCE", "Catch2/{}".format(self._version))
+
+    @property
+    def channel(self):
+        """ Default Conan package channel when not stable
+        """
+        return os.getenv("CONAN_CHANNEL", "testing")
+
+    @property
+    def _version(self):
+        """ Get version name from cmake file
+        """
+        pattern = re.compile(r"project\(Catch2 LANGUAGES CXX VERSION (\d+\.\d+\.\d+)\)")
+        version = "latest"
+        with open("CMakeLists.txt") as file:
+            for line in file:
+                result = pattern.search(line)
+                if result:
+                    version = result.group(1)
+        return version
+
+    @property
+    def _branch(self):
+        """ Get branch name from CI manager
+        """
+        printer = Printer(None)
+        ci_manager = CIManager(printer)
+        return ci_manager.get_branch()
+
+
+if __name__ == "__main__":
+    settings = BuilderSettings()
+    builder = ConanMultiPackager(
+        reference=settings.reference,
+        channel=settings.channel,
+        upload=settings.upload,
+        upload_only_when_stable=settings.upload_only_when_stable,
+        stable_branch_pattern=settings.stable_branch_pattern,
+        login_username=settings.login_username,
+        username=settings.username,
+        test_folder=os.path.join(".conan", "test_package"))
+    builder.add()
+    builder.run()

+ 11 - 0
lib/Catch2/.conan/test_package/CMakeLists.txt

@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.2.0)
+project(test_package CXX)
+
+include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
+conan_basic_setup(TARGETS)
+
+find_package(Catch2 REQUIRED CONFIG)
+
+add_executable(${PROJECT_NAME} test_package.cpp)
+target_link_libraries(${PROJECT_NAME} CONAN_PKG::Catch2)
+set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 11)

+ 19 - 0
lib/Catch2/.conan/test_package/conanfile.py

@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from conans import ConanFile, CMake
+import os
+
+
+class TestPackageConan(ConanFile):
+    settings = "os", "compiler", "build_type", "arch"
+    generators = "cmake"
+
+    def build(self):
+        cmake = CMake(self)
+        cmake.configure()
+        cmake.build()
+
+    def test(self):
+        assert os.path.isfile(os.path.join(self.deps_cpp_info["Catch2"].rootpath, "licenses", "LICENSE.txt"))
+        bin_path = os.path.join("bin", "test_package")
+        self.run("%s -s" % bin_path, run_environment=True)

+ 15 - 0
lib/Catch2/.conan/test_package/test_package.cpp

@@ -0,0 +1,15 @@
+#define CATCH_CONFIG_MAIN
+
+#include <catch2/catch.hpp>
+
+int Factorial( int number ) {
+    return number <= 1 ? 1 : Factorial( number - 1 ) * number;
+}
+
+TEST_CASE( "Factorial Tests", "[single-file]" ) {
+    REQUIRE( Factorial(0) == 1 );
+    REQUIRE( Factorial(1) == 1 );
+    REQUIRE( Factorial(2) == 2 );
+    REQUIRE( Factorial(3) == 6 );
+    REQUIRE( Factorial(10) == 3628800 );
+}

+ 22 - 0
lib/Catch2/.gitattributes

@@ -0,0 +1,22 @@
+# This sets the default behaviour, overriding core.autocrlf
+* text=auto
+
+# All source files should have unix line-endings in the repository,
+# but convert to native line-endings on checkout
+*.cpp text
+*.h text
+*.hpp text
+
+# Windows specific files should retain windows line-endings
+*.sln text eol=crlf
+
+# Keep executable scripts with LFs so they can be run after being
+# checked out on Windows
+*.py text eol=lf
+
+
+# Keep the single include header with LFs to make sure it is uploaded,
+# hashed etc with LF
+single_include/**/*.hpp eol=lf
+# Also keep the LICENCE file with LFs for the same reason
+LICENCE.txt eol=lf

+ 1 - 0
lib/Catch2/.github/FUNDING.yml

@@ -0,0 +1 @@
+custom: "https://www.paypal.me/horenmar"

+ 29 - 0
lib/Catch2/.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,29 @@
+---
+name: Bug report
+about: Create an issue that documents a bug
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Reproduction steps**
+Steps to reproduce the bug.
+<!-- Usually this means a small and self-contained piece of code that uses Catch and specifying compiler flags if relevant. -->
+
+
+**Platform information:**
+<!-- Fill in any extra information that might be important for your issue. -->
+ - OS: **Windows NT**
+ - Compiler+version: **GCC v2.9.5**
+ - Catch version: **v1.2.3**
+
+
+**Additional context**
+Add any other context about the problem here.

+ 14 - 0
lib/Catch2/.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,14 @@
+---
+name: Feature request
+about: Create an issue that requests a feature or other improvement
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Description**
+Describe the feature/change you request and why do you want it.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.

+ 28 - 0
lib/Catch2/.github/pull_request_template.md

@@ -0,0 +1,28 @@
+<!--
+Please do not submit pull requests changing the `version.hpp`
+or the single-include `catch.hpp` file, these are changed
+only when a new release is made.
+
+Before submitting a PR you should probably read the contributor documentation
+at docs/contributing.md. It will tell you how to properly test your changes.
+-->
+
+
+## Description
+<!--
+Describe the what and the why of your pull request. Remember that these two
+are usually a bit different. As an example, if you have made various changes
+to decrease the number of new strings allocated, that's what. The why probably
+was that you have a large set of tests and found that this speeds them up.
+-->
+
+## GitHub Issues
+<!-- 
+If this PR was motivated by some existing issues, reference them here.
+
+If it is a simple bug-fix, please also add a line like 'Closes #123'
+to your commit message, so that it is automatically closed.
+If it is not, don't, as it might take several iterations for a feature
+to be done properly. If in doubt, leave it open and reference it in the
+PR itself, so that maintainers can decide.
+-->

+ 31 - 0
lib/Catch2/.gitignore

@@ -0,0 +1,31 @@
+*.build
+*.pbxuser
+*.mode1v3
+*.ncb
+*.suo
+Debug
+Release
+*.user
+*.xcuserstate
+.DS_Store
+xcuserdata
+CatchSelfTest.xcscheme
+Breakpoints.xcbkptlist
+projects/VS2010/TestCatch/_UpgradeReport_Files/
+projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj.filters
+projects/VisualStudio/TestCatch/UpgradeLog.XML
+projects/CMake/.idea
+projects/CMake/cmake-build-debug
+UpgradeLog.XML
+Resources/DWARF
+projects/Generated
+*.pyc
+DerivedData
+*.xccheckout
+Build
+.idea
+.vs
+cmake-build-*
+benchmark-dir
+.conan/test_package/build
+bazel-*

+ 12 - 0
lib/Catch2/.gitrepo

@@ -0,0 +1,12 @@
+; DO NOT EDIT (unless you know what you are doing)
+;
+; This subdirectory is a git "subrepo", and this file is maintained by the
+; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
+;
+[subrepo]
+	remote = git@github.com:catchorg/Catch2.git
+	branch = v2.x
+	commit = 5c88067bd339465513af4aec606bd2292f1b594a
+	parent = c58a5298d683f9b137f23a929eac699cd776f66c
+	method = merge
+	cmdver = 0.4.3

+ 339 - 0
lib/Catch2/.travis.yml

@@ -0,0 +1,339 @@
+language: cpp
+
+branches:
+  except:
+  - /dev-appveyor.*/
+
+common_sources: &all_sources
+  - ubuntu-toolchain-r-test
+  - llvm-toolchain-trusty
+  - llvm-toolchain-trusty-3.9
+  - llvm-toolchain-trusty-4.0
+  - llvm-toolchain-xenial-5.0
+  - llvm-toolchain-xenial-6.0
+
+matrix:
+  include:
+
+    # 1/ Linux Clang Builds
+    - os: linux
+      compiler: clang
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['clang-3.5']
+      env: COMPILER='clang++-3.5'
+
+    - os: linux
+      compiler: clang
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['clang-3.6']
+      env: COMPILER='clang++-3.6'
+
+    # Clang 3.7 is intentionally skipped as we cannot get it easily on
+    # TravisCI container
+
+    - os: linux
+      compiler: clang
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['lcov', 'clang-3.8']
+      env: COMPILER='clang++-3.8'
+
+    - os: linux
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-3.9']
+      env: COMPILER='clang++-3.9'
+
+    - os: linux
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-4.0']
+      env: COMPILER='clang++-4.0'
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-5.0']
+      env: COMPILER='clang++-5.0'
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-6.0']
+      env: COMPILER='clang++-6.0'
+
+    # 2/ Linux GCC Builds
+    - os: linux
+      compiler: gcc
+      addons:
+        apt:
+         sources: *all_sources
+         packages: ['g++-4.8']
+      env: COMPILER='g++-4.8'
+
+    - os: linux
+      compiler: gcc
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['g++-4.9']
+      env: COMPILER='g++-4.9'
+
+    - os: linux
+      compiler: gcc
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['g++-5']
+      env: COMPILER='g++-5'
+
+    - os: linux
+      compiler: gcc
+      addons: &gcc6
+        apt:
+          sources: *all_sources
+          packages: ['g++-6']
+      env: COMPILER='g++-6'
+
+    - os: linux
+      compiler: gcc
+      addons: &gcc7
+        apt:
+          sources: *all_sources
+          packages: ['g++-7']
+      env: COMPILER='g++-7'
+
+    - os: linux
+      compiler: gcc
+      addons: &gcc8
+        apt:
+          sources: *all_sources
+          packages: ['g++-8']
+      env: COMPILER='g++-8'
+
+    # 3b/ Linux C++14 Clang builds
+    # Note that we need newer libstdc++ for C++14 support
+    - os: linux
+      compiler: clang
+      addons:
+          apt:
+              packages: ['clang-3.8', 'libstdc++-6-dev']
+              sources:
+                  - ubuntu-toolchain-r-test
+                  - llvm-toolchain-trusty
+      env: COMPILER='clang++-3.8' CPP14=1
+
+    - os: linux
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-3.9', 'libstdc++-6-dev']
+      env: COMPILER='clang++-3.9' CPP14=1
+
+    - os: linux
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-4.0', 'libstdc++-6-dev']
+      env: COMPILER='clang++-4.0' CPP14=1
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-5.0', 'libstdc++-6-dev']
+      env: COMPILER='clang++-5.0' CPP14=1
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-6.0', 'libstdc++-6-dev']
+      env: COMPILER='clang++-6.0' CPP14=1
+
+
+    # 4a/ Linux C++14 GCC builds
+    - os: linux
+      compiler: gcc
+      addons: *gcc6
+      env: COMPILER='g++-6' CPP14=1
+
+    - os: linux
+      compiler: gcc
+      addons: *gcc7
+      env: COMPILER='g++-7' CPP14=1
+
+    - os: linux
+      compiler: gcc
+      addons: *gcc8
+      env: COMPILER='g++-8' CPP14=1
+
+    # 5/ OSX Clang Builds
+    - os: osx
+      osx_image: xcode7.3
+      compiler: clang
+      env: COMPILER='clang++'
+
+    - os: osx
+      osx_image: xcode8
+      compiler: clang
+      env: COMPILER='clang++'
+
+    - os: osx
+      osx_image: xcode9
+      compiler: clang
+      env: COMPILER='clang++'
+
+    - os: osx
+      osx_image: xcode9.1
+      compiler: clang
+      env: COMPILER='clang++'
+
+    - os: osx
+      osx_image: xcode9.1
+      compiler: clang
+      env: COMPILER='clang++' CPP14=1
+
+    # 6/ Special builds -- examples, coverage, valgrind, etc.
+    - os: linux
+      compiler: gcc
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['lcov', 'g++-7']
+      env: COMPILER='g++-7' CPP14=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1
+
+    - os: linux
+      compiler: clang
+      addons:
+        apt:
+          packages: ['clang-3.8', 'lcov']
+          sources:
+            - ubuntu-toolchain-r-test
+            - llvm-toolchain-trusty
+      env: COMPILER='clang++-3.8' EXAMPLES=1 COVERAGE=1 EXTRAS=1
+
+    - os: linux
+      compiler: gcc
+      addons:
+        apt:
+          sources: *all_sources
+          packages: ['valgrind', 'lcov', 'g++-7']
+      env: COMPILER='g++-7' CPP14=1 VALGRIND=1
+
+    - os: osx
+      osx_image: xcode9.1
+      compiler: clang
+      env: COMPILER='clang++' CPP14=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1
+
+    # 7/ C++17 builds
+    - os: linux
+      compiler: gcc
+      addons: *gcc7
+      env: COMPILER='g++-7' CPP17=1
+
+    - os: linux
+      compiler: gcc
+      addons: *gcc7
+      env: COMPILER='g++-7' EXAMPLES=1 COVERAGE=1 EXTRAS=1 CPP17=1
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-6.0', 'libstdc++-8-dev']
+      env: COMPILER='clang++-6.0' CPP17=1
+
+    - os: linux
+      dist: xenial
+      compiler: clang
+      addons:
+          apt:
+              sources: *all_sources
+              packages: ['clang-6.0', 'libstdc++-8-dev']
+      env: COMPILER='clang++-6.0' CPP17=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1
+
+    # 8/ Conan
+    - language: python
+      python:
+        - "3.7"
+      dist: xenial
+      install:
+        - pip install conan-package-tools
+      env:
+        - CONAN_GCC_VERSIONS=8
+        - CONAN_DOCKER_IMAGE=conanio/gcc8
+      script:
+        - python .conan/build.py
+
+install:
+  - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
+  - mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR}
+  - |
+    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
+      CMAKE_URL="http://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.tar.gz"
+      mkdir cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake
+      export PATH=${DEPS_DIR}/cmake/bin:${PATH}
+    elif [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
+        which cmake || brew install cmake;
+    fi
+
+before_script:
+  - export CXX=${COMPILER}
+  - cd ${TRAVIS_BUILD_DIR}
+  # Regenerate single header file, so it is tested in the examples...
+  - python scripts/generateSingleHeader.py
+
+  - |
+    if [[ ${CPP17} -eq 1 ]]; then
+      export CPP_STANDARD=17
+    elif [[ ${CPP14} -eq 1 ]]; then
+      export CPP_STANDARD=14
+    else
+      export CPP_STANDARD=11
+    fi
+
+    # Use Debug builds for running Valgrind and building examples
+  - cmake -H. -BBuild-Debug -DCMAKE_BUILD_TYPE=Debug -Wdev -DCATCH_USE_VALGRIND=${VALGRIND} -DCATCH_BUILD_EXAMPLES=${EXAMPLES} -DCATCH_ENABLE_COVERAGE=${COVERAGE} -DCATCH_BUILD_EXTRA_TESTS=${EXTRAS} -DCMAKE_CXX_STANDARD=${CPP_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED=On -DCMAKE_CXX_EXTENSIONS=OFF
+    # Don't bother with release build for coverage build
+  - cmake -H. -BBuild-Release -DCMAKE_BUILD_TYPE=Release -Wdev -DCMAKE_CXX_STANDARD=${CPP_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED=On -DCMAKE_CXX_EXTENSIONS=OFF
+
+
+script:
+  - cd Build-Debug
+  - make -j 2
+  - CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
+    # Coverage collection does not work for OS X atm
+  - |
+    if [[ "${TRAVIS_OS_NAME}" == "linux" ]] && [[ "${COVERAGE}" == "1" ]]; then
+      make gcov
+      make lcov
+      bash <(curl -s https://codecov.io/bash) -X gcov || echo "Codecov did not collect coverage reports"
+    fi
+  - # Go to release build
+  - cd ../Build-Release
+  - make -j 2
+  - CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2

+ 17 - 0
lib/Catch2/BUILD.bazel

@@ -0,0 +1,17 @@
+# Load the cc_library rule.
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
+# Header-only rule to export catch2/catch.hpp.
+cc_library(
+    name = "catch2",
+    hdrs = ["single_include/catch2/catch.hpp"],
+    includes = ["single_include/"],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "catch2_with_main",
+    srcs = ["src/catch_with_main.cpp"],
+    visibility = ["//visibility:public"],
+    deps = ["//:catch2"],
+)

+ 10 - 0
lib/Catch2/CMake/Catch2Config.cmake.in

@@ -0,0 +1,10 @@
+@PACKAGE_INIT@
+
+
+# Avoid repeatedly including the targets
+if(NOT TARGET Catch2::Catch2)
+    # Provide path for scripts
+    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+
+    include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake)
+endif()

+ 157 - 0
lib/Catch2/CMake/FindGcov.cmake

@@ -0,0 +1,157 @@
+# This file is part of CMake-codecov.
+#
+# Copyright (c)
+#   2015-2017 RWTH Aachen University, Federal Republic of Germany
+#
+# See the LICENSE file in the package base directory for details
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# include required Modules
+include(FindPackageHandleStandardArgs)
+
+
+# Search for gcov binary.
+set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
+set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY})
+
+get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+foreach (LANG ${ENABLED_LANGUAGES})
+	# Gcov evaluation is dependent on the used compiler. Check gcov support for
+	# each compiler that is used. If gcov binary was already found for this
+	# compiler, do not try to find it again.
+	if (NOT GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN)
+		get_filename_component(COMPILER_PATH "${CMAKE_${LANG}_COMPILER}" PATH)
+
+		if ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "GNU")
+			# Some distributions like OSX (homebrew) ship gcov with the compiler
+			# version appended as gcov-x. To find this binary we'll build the
+			# suggested binary name with the compiler version.
+			string(REGEX MATCH "^[0-9]+" GCC_VERSION
+				"${CMAKE_${LANG}_COMPILER_VERSION}")
+
+			find_program(GCOV_BIN NAMES gcov-${GCC_VERSION} gcov
+				HINTS ${COMPILER_PATH})
+
+		elseif ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "Clang")
+			# Some distributions like Debian ship llvm-cov with the compiler
+			# version appended as llvm-cov-x.y. To find this binary we'll build
+			# the suggested binary name with the compiler version.
+			string(REGEX MATCH "^[0-9]+.[0-9]+" LLVM_VERSION
+				"${CMAKE_${LANG}_COMPILER_VERSION}")
+
+			# llvm-cov prior version 3.5 seems to be not working with coverage
+			# evaluation tools, but these versions are compatible with the gcc
+			# gcov tool.
+			if(LLVM_VERSION VERSION_GREATER 3.4)
+				find_program(LLVM_COV_BIN NAMES "llvm-cov-${LLVM_VERSION}"
+					"llvm-cov" HINTS ${COMPILER_PATH})
+				mark_as_advanced(LLVM_COV_BIN)
+
+				if (LLVM_COV_BIN)
+					find_program(LLVM_COV_WRAPPER "llvm-cov-wrapper" PATHS
+						${CMAKE_MODULE_PATH})
+					if (LLVM_COV_WRAPPER)
+						set(GCOV_BIN "${LLVM_COV_WRAPPER}" CACHE FILEPATH "")
+
+						# set additional parameters
+						set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV
+							"LLVM_COV_BIN=${LLVM_COV_BIN}" CACHE STRING
+							"Environment variables for llvm-cov-wrapper.")
+						mark_as_advanced(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV)
+					endif ()
+				endif ()
+			endif ()
+
+			if (NOT GCOV_BIN)
+				# Fall back to gcov binary if llvm-cov was not found or is
+				# incompatible. This is the default on OSX, but may crash on
+				# recent Linux versions.
+				find_program(GCOV_BIN gcov HINTS ${COMPILER_PATH})
+			endif ()
+		endif ()
+
+
+		if (GCOV_BIN)
+			set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN "${GCOV_BIN}" CACHE STRING
+				"${LANG} gcov binary.")
+
+			if (NOT CMAKE_REQUIRED_QUIET)
+				message("-- Found gcov evaluation for "
+				"${CMAKE_${LANG}_COMPILER_ID}: ${GCOV_BIN}")
+			endif()
+
+			unset(GCOV_BIN CACHE)
+		endif ()
+	endif ()
+endforeach ()
+
+
+
+
+# Add a new global target for all gcov targets. This target could be used to
+# generate the gcov files for the whole project instead of calling <TARGET>-gcov
+# for each target.
+if (NOT TARGET gcov)
+	add_custom_target(gcov)
+endif (NOT TARGET gcov)
+
+
+
+# This function will add gcov evaluation for target <TNAME>. Only sources of
+# this target will be evaluated and no dependencies will be added. It will call
+# Gcov on any source file of <TNAME> once and store the gcov file in the same
+# directory.
+function (add_gcov_target TNAME)
+	set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+
+	# We don't have to check, if the target has support for coverage, thus this
+	# will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+	# have to determine which gcov binary to use.
+	get_target_property(TSOURCES ${TNAME} SOURCES)
+	set(SOURCES "")
+	set(TCOMPILER "")
+	foreach (FILE ${TSOURCES})
+		codecov_path_of_source(${FILE} FILE)
+		if (NOT "${FILE}" STREQUAL "")
+			codecov_lang_of_source(${FILE} LANG)
+			if (NOT "${LANG}" STREQUAL "")
+				list(APPEND SOURCES "${FILE}")
+				set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+			endif ()
+		endif ()
+	endforeach ()
+
+	# If no gcov binary was found, coverage data can't be evaluated.
+	if (NOT GCOV_${TCOMPILER}_BIN)
+		message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+		return()
+	endif ()
+
+	set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+	set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+	set(BUFFER "")
+	foreach(FILE ${SOURCES})
+		get_filename_component(FILE_PATH "${TDIR}/${FILE}" PATH)
+
+		# call gcov
+		add_custom_command(OUTPUT ${TDIR}/${FILE}.gcov
+			COMMAND ${GCOV_ENV} ${GCOV_BIN} ${TDIR}/${FILE}.gcno > /dev/null
+			DEPENDS ${TNAME} ${TDIR}/${FILE}.gcno
+			WORKING_DIRECTORY ${FILE_PATH}
+		)
+
+		list(APPEND BUFFER ${TDIR}/${FILE}.gcov)
+	endforeach()
+
+
+	# add target for gcov evaluation of <TNAME>
+	add_custom_target(${TNAME}-gcov DEPENDS ${BUFFER})
+
+	# add evaluation target to the global gcov target.
+	add_dependencies(gcov ${TNAME}-gcov)
+endfunction (add_gcov_target)

+ 354 - 0
lib/Catch2/CMake/FindLcov.cmake

@@ -0,0 +1,354 @@
+# This file is part of CMake-codecov.
+#
+# Copyright (c)
+#   2015-2017 RWTH Aachen University, Federal Republic of Germany
+#
+# See the LICENSE file in the package base directory for details
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# configuration
+set(LCOV_DATA_PATH "${CMAKE_BINARY_DIR}/lcov/data")
+set(LCOV_DATA_PATH_INIT "${LCOV_DATA_PATH}/init")
+set(LCOV_DATA_PATH_CAPTURE "${LCOV_DATA_PATH}/capture")
+set(LCOV_HTML_PATH "${CMAKE_BINARY_DIR}/lcov/html")
+
+
+
+
+# Search for Gcov which is used by Lcov.
+find_package(Gcov)
+
+
+
+
+# This function will add lcov evaluation for target <TNAME>. Only sources of
+# this target will be evaluated and no dependencies will be added. It will call
+# geninfo on any source file of <TNAME> once and store the info file in the same
+# directory.
+#
+# Note: This function is only a wrapper to define this function always, even if
+#   coverage is not supported by the compiler or disabled. This function must
+#   be defined here, because the module will be exited, if there is no coverage
+#   support by the compiler or it is disabled by the user.
+function (add_lcov_target TNAME)
+	if (LCOV_FOUND)
+		# capture initial coverage data
+		lcov_capture_initial_tgt(${TNAME})
+
+		# capture coverage data after execution
+		lcov_capture_tgt(${TNAME})
+	endif ()
+endfunction (add_lcov_target)
+
+
+
+
+# include required Modules
+include(FindPackageHandleStandardArgs)
+
+# Search for required lcov binaries.
+find_program(LCOV_BIN lcov)
+find_program(GENINFO_BIN geninfo)
+find_program(GENHTML_BIN genhtml)
+find_package_handle_standard_args(lcov
+	REQUIRED_VARS LCOV_BIN GENINFO_BIN GENHTML_BIN
+)
+
+# enable genhtml C++ demangeling, if c++filt is found.
+set(GENHTML_CPPFILT_FLAG "")
+find_program(CPPFILT_BIN c++filt)
+if (NOT CPPFILT_BIN STREQUAL "")
+	set(GENHTML_CPPFILT_FLAG "--demangle-cpp")
+endif (NOT CPPFILT_BIN STREQUAL "")
+
+# enable no-external flag for lcov, if available.
+if (GENINFO_BIN AND NOT DEFINED GENINFO_EXTERN_FLAG)
+	set(FLAG "")
+	execute_process(COMMAND ${GENINFO_BIN} --help OUTPUT_VARIABLE GENINFO_HELP)
+	string(REGEX MATCH "external" GENINFO_RES "${GENINFO_HELP}")
+	if (GENINFO_RES)
+		set(FLAG "--no-external")
+	endif ()
+
+	set(GENINFO_EXTERN_FLAG "${FLAG}"
+		CACHE STRING "Geninfo flag to exclude system sources.")
+endif ()
+
+# If Lcov was not found, exit module now.
+if (NOT LCOV_FOUND)
+	return()
+endif (NOT LCOV_FOUND)
+
+
+
+
+# Create directories to be used.
+file(MAKE_DIRECTORY ${LCOV_DATA_PATH_INIT})
+file(MAKE_DIRECTORY ${LCOV_DATA_PATH_CAPTURE})
+
+set(LCOV_REMOVE_PATTERNS "")
+
+# This function will merge lcov files to a single target file. Additional lcov
+# flags may be set with setting LCOV_EXTRA_FLAGS before calling this function.
+function (lcov_merge_files OUTFILE ...)
+	# Remove ${OUTFILE} from ${ARGV} and generate lcov parameters with files.
+	list(REMOVE_AT ARGV 0)
+
+	# Generate merged file.
+	string(REPLACE "${CMAKE_BINARY_DIR}/" "" FILE_REL "${OUTFILE}")
+	add_custom_command(OUTPUT "${OUTFILE}.raw"
+		COMMAND cat ${ARGV} > ${OUTFILE}.raw
+		DEPENDS ${ARGV}
+		COMMENT "Generating ${FILE_REL}"
+	)
+
+	add_custom_command(OUTPUT "${OUTFILE}"
+		COMMAND ${LCOV_BIN} --quiet -a ${OUTFILE}.raw --output-file ${OUTFILE}
+			--base-directory ${PROJECT_SOURCE_DIR} ${LCOV_EXTRA_FLAGS}
+		COMMAND ${LCOV_BIN} --quiet -r ${OUTFILE} ${LCOV_REMOVE_PATTERNS}
+			--output-file ${OUTFILE} ${LCOV_EXTRA_FLAGS}
+		DEPENDS ${OUTFILE}.raw
+		COMMENT "Post-processing ${FILE_REL}"
+	)
+endfunction ()
+
+
+
+
+# Add a new global target to generate initial coverage reports for all targets.
+# This target will be used to generate the global initial info file, which is
+# used to gather even empty report data.
+if (NOT TARGET lcov-capture-init)
+	add_custom_target(lcov-capture-init)
+	set(LCOV_CAPTURE_INIT_FILES "" CACHE INTERNAL "")
+endif (NOT TARGET lcov-capture-init)
+
+
+# This function will add initial capture of coverage data for target <TNAME>,
+# which is needed to get also data for objects, which were not loaded at
+# execution time. It will call geninfo for every source file of <TNAME> once and
+# store the info file in the same directory.
+function (lcov_capture_initial_tgt TNAME)
+	# We don't have to check, if the target has support for coverage, thus this
+	# will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+	# have to determine which gcov binary to use.
+	get_target_property(TSOURCES ${TNAME} SOURCES)
+	set(SOURCES "")
+	set(TCOMPILER "")
+	foreach (FILE ${TSOURCES})
+		codecov_path_of_source(${FILE} FILE)
+		if (NOT "${FILE}" STREQUAL "")
+			codecov_lang_of_source(${FILE} LANG)
+			if (NOT "${LANG}" STREQUAL "")
+				list(APPEND SOURCES "${FILE}")
+				set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+			endif ()
+		endif ()
+	endforeach ()
+
+	# If no gcov binary was found, coverage data can't be evaluated.
+	if (NOT GCOV_${TCOMPILER}_BIN)
+		message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+		return()
+	endif ()
+
+	set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+	set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+	set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+	set(GENINFO_FILES "")
+	foreach(FILE ${SOURCES})
+		# generate empty coverage files
+		set(OUTFILE "${TDIR}/${FILE}.info.init")
+		list(APPEND GENINFO_FILES ${OUTFILE})
+
+		add_custom_command(OUTPUT ${OUTFILE} COMMAND ${GCOV_ENV} ${GENINFO_BIN}
+				--quiet --base-directory ${PROJECT_SOURCE_DIR} --initial
+				--gcov-tool ${GCOV_BIN} --output-filename ${OUTFILE}
+				${GENINFO_EXTERN_FLAG} ${TDIR}/${FILE}.gcno
+			DEPENDS ${TNAME}
+			COMMENT "Capturing initial coverage data for ${FILE}"
+		)
+	endforeach()
+
+	# Concatenate all files generated by geninfo to a single file per target.
+	set(OUTFILE "${LCOV_DATA_PATH_INIT}/${TNAME}.info")
+	set(LCOV_EXTRA_FLAGS "--initial")
+	lcov_merge_files("${OUTFILE}" ${GENINFO_FILES})
+	add_custom_target(${TNAME}-capture-init ALL DEPENDS ${OUTFILE})
+
+	# add geninfo file generation to global lcov-geninfo target
+	add_dependencies(lcov-capture-init ${TNAME}-capture-init)
+	set(LCOV_CAPTURE_INIT_FILES "${LCOV_CAPTURE_INIT_FILES}"
+		"${OUTFILE}" CACHE INTERNAL ""
+	)
+endfunction (lcov_capture_initial_tgt)
+
+
+# This function will generate the global info file for all targets. It has to be
+# called after all other CMake functions in the root CMakeLists.txt file, to get
+# a full list of all targets that generate coverage data.
+function (lcov_capture_initial)
+	# Skip this function (and do not create the following targets), if there are
+	# no input files.
+	if ("${LCOV_CAPTURE_INIT_FILES}" STREQUAL "")
+		return()
+	endif ()
+
+	# Add a new target to merge the files of all targets.
+	set(OUTFILE "${LCOV_DATA_PATH_INIT}/all_targets.info")
+	lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_INIT_FILES})
+	add_custom_target(lcov-geninfo-init ALL	DEPENDS ${OUTFILE}
+		lcov-capture-init
+	)
+endfunction (lcov_capture_initial)
+
+
+
+
+# Add a new global target to generate coverage reports for all targets. This
+# target will be used to generate the global info file.
+if (NOT TARGET lcov-capture)
+	add_custom_target(lcov-capture)
+	set(LCOV_CAPTURE_FILES "" CACHE INTERNAL "")
+endif (NOT TARGET lcov-capture)
+
+
+# This function will add capture of coverage data for target <TNAME>, which is
+# needed to get also data for objects, which were not loaded at execution time.
+# It will call geninfo for every source file of <TNAME> once and store the info
+# file in the same directory.
+function (lcov_capture_tgt TNAME)
+	# We don't have to check, if the target has support for coverage, thus this
+	# will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+	# have to determine which gcov binary to use.
+	get_target_property(TSOURCES ${TNAME} SOURCES)
+	set(SOURCES "")
+	set(TCOMPILER "")
+	foreach (FILE ${TSOURCES})
+		codecov_path_of_source(${FILE} FILE)
+		if (NOT "${FILE}" STREQUAL "")
+			codecov_lang_of_source(${FILE} LANG)
+			if (NOT "${LANG}" STREQUAL "")
+				list(APPEND SOURCES "${FILE}")
+				set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+			endif ()
+		endif ()
+	endforeach ()
+
+	# If no gcov binary was found, coverage data can't be evaluated.
+	if (NOT GCOV_${TCOMPILER}_BIN)
+		message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+		return()
+	endif ()
+
+	set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+	set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+	set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+	set(GENINFO_FILES "")
+	foreach(FILE ${SOURCES})
+		# Generate coverage files. If no .gcda file was generated during
+		# execution, the empty coverage file will be used instead.
+		set(OUTFILE "${TDIR}/${FILE}.info")
+		list(APPEND GENINFO_FILES ${OUTFILE})
+
+		add_custom_command(OUTPUT ${OUTFILE}
+			COMMAND test -f "${TDIR}/${FILE}.gcda"
+				&& ${GCOV_ENV} ${GENINFO_BIN} --quiet --base-directory
+					${PROJECT_SOURCE_DIR} --gcov-tool ${GCOV_BIN}
+					--output-filename ${OUTFILE} ${GENINFO_EXTERN_FLAG}
+					${TDIR}/${FILE}.gcda
+				|| cp ${OUTFILE}.init ${OUTFILE}
+			DEPENDS ${TNAME} ${TNAME}-capture-init
+			COMMENT "Capturing coverage data for ${FILE}"
+		)
+	endforeach()
+
+	# Concatenate all files generated by geninfo to a single file per target.
+	set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/${TNAME}.info")
+	lcov_merge_files("${OUTFILE}" ${GENINFO_FILES})
+	add_custom_target(${TNAME}-geninfo DEPENDS ${OUTFILE})
+
+	# add geninfo file generation to global lcov-capture target
+	add_dependencies(lcov-capture ${TNAME}-geninfo)
+	set(LCOV_CAPTURE_FILES "${LCOV_CAPTURE_FILES}" "${OUTFILE}" CACHE INTERNAL
+		""
+	)
+
+	# Add target for generating html output for this target only.
+	file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/${TNAME})
+	add_custom_target(${TNAME}-genhtml
+		COMMAND ${GENHTML_BIN} --quiet --sort --prefix ${PROJECT_SOURCE_DIR}
+			--baseline-file ${LCOV_DATA_PATH_INIT}/${TNAME}.info
+			--output-directory ${LCOV_HTML_PATH}/${TNAME}
+			--title "${CMAKE_PROJECT_NAME} - target ${TNAME}"
+			${GENHTML_CPPFILT_FLAG} ${OUTFILE}
+		DEPENDS ${TNAME}-geninfo ${TNAME}-capture-init
+	)
+endfunction (lcov_capture_tgt)
+
+
+# This function will generate the global info file for all targets. It has to be
+# called after all other CMake functions in the root CMakeLists.txt file, to get
+# a full list of all targets that generate coverage data.
+function (lcov_capture)
+	# Skip this function (and do not create the following targets), if there are
+	# no input files.
+	if ("${LCOV_CAPTURE_FILES}" STREQUAL "")
+		return()
+	endif ()
+
+	# Add a new target to merge the files of all targets.
+	set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/all_targets.info")
+	lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_FILES})
+	add_custom_target(lcov-geninfo DEPENDS ${OUTFILE} lcov-capture)
+
+	# Add a new global target for all lcov targets. This target could be used to
+	# generate the lcov html output for the whole project instead of calling
+	# <TARGET>-geninfo and <TARGET>-genhtml for each target. It will also be
+	# used to generate a html site for all project data together instead of one
+	# for each target.
+	if (NOT TARGET lcov)
+		file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/all_targets)
+		add_custom_target(lcov
+			COMMAND ${GENHTML_BIN} --quiet --sort
+				--baseline-file ${LCOV_DATA_PATH_INIT}/all_targets.info
+				--output-directory ${LCOV_HTML_PATH}/all_targets
+				--title "${CMAKE_PROJECT_NAME}" --prefix "${PROJECT_SOURCE_DIR}"
+				${GENHTML_CPPFILT_FLAG} ${OUTFILE}
+			DEPENDS lcov-geninfo-init lcov-geninfo
+		)
+	endif ()
+endfunction (lcov_capture)
+
+
+
+
+# Add a new global target to generate the lcov html report for the whole project
+# instead of calling <TARGET>-genhtml for each target (to create an own report
+# for each target). Instead of the lcov target it does not require geninfo for
+# all targets, so you have to call <TARGET>-geninfo to generate the info files
+# the targets you'd like to have in your report or lcov-geninfo for generating
+# info files for all targets before calling lcov-genhtml.
+file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/selected_targets)
+if (NOT TARGET lcov-genhtml)
+	add_custom_target(lcov-genhtml
+		COMMAND ${GENHTML_BIN}
+			--quiet
+			--output-directory ${LCOV_HTML_PATH}/selected_targets
+			--title \"${CMAKE_PROJECT_NAME} - targets  `find
+				${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name
+				\"all_targets.info\" -exec basename {} .info \\\;`\"
+			--prefix ${PROJECT_SOURCE_DIR}
+			--sort
+			${GENHTML_CPPFILT_FLAG}
+			`find ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name
+				\"all_targets.info\"`
+	)
+endif (NOT TARGET lcov-genhtml)

+ 258 - 0
lib/Catch2/CMake/Findcodecov.cmake

@@ -0,0 +1,258 @@
+# This file is part of CMake-codecov.
+#
+# Copyright (c)
+#   2015-2017 RWTH Aachen University, Federal Republic of Germany
+#
+# See the LICENSE file in the package base directory for details
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# Add an option to choose, if coverage should be enabled or not. If enabled
+# marked targets will be build with coverage support and appropriate targets
+# will be added. If disabled coverage will be ignored for *ALL* targets.
+option(ENABLE_COVERAGE "Enable coverage build." OFF)
+
+set(COVERAGE_FLAG_CANDIDATES
+	# gcc and clang
+	"-O0 -g -fprofile-arcs -ftest-coverage"
+
+	# gcc and clang fallback
+	"-O0 -g --coverage"
+)
+
+
+# Add coverage support for target ${TNAME} and register target for coverage
+# evaluation. If coverage is disabled or not supported, this function will
+# simply do nothing.
+#
+# Note: This function is only a wrapper to define this function always, even if
+#   coverage is not supported by the compiler or disabled. This function must
+#   be defined here, because the module will be exited, if there is no coverage
+#   support by the compiler or it is disabled by the user.
+function (add_coverage TNAME)
+	# only add coverage for target, if coverage is support and enabled.
+	if (ENABLE_COVERAGE)
+		foreach (TNAME ${ARGV})
+			add_coverage_target(${TNAME})
+		endforeach ()
+	endif ()
+endfunction (add_coverage)
+
+
+# Add global target to gather coverage information after all targets have been
+# added. Other evaluation functions could be added here, after checks for the
+# specific module have been passed.
+#
+# Note: This function is only a wrapper to define this function always, even if
+#   coverage is not supported by the compiler or disabled. This function must
+#   be defined here, because the module will be exited, if there is no coverage
+#   support by the compiler or it is disabled by the user.
+function (coverage_evaluate)
+	# add lcov evaluation
+	if (LCOV_FOUND)
+		lcov_capture_initial()
+		lcov_capture()
+	endif (LCOV_FOUND)
+endfunction ()
+
+
+# Exit this module, if coverage is disabled. add_coverage is defined before this
+# return, so this module can be exited now safely without breaking any build-
+# scripts.
+if (NOT ENABLE_COVERAGE)
+	return()
+endif ()
+
+
+
+
+# Find the reuired flags foreach language.
+set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
+set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY})
+
+get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+foreach (LANG ${ENABLED_LANGUAGES})
+	# Coverage flags are not dependent on language, but the used compiler. So
+	# instead of searching flags foreach language, search flags foreach compiler
+	# used.
+	set(COMPILER ${CMAKE_${LANG}_COMPILER_ID})
+	if (NOT COVERAGE_${COMPILER}_FLAGS)
+		foreach (FLAG ${COVERAGE_FLAG_CANDIDATES})
+			if(NOT CMAKE_REQUIRED_QUIET)
+				message(STATUS "Try ${COMPILER} code coverage flag = [${FLAG}]")
+			endif()
+
+			set(CMAKE_REQUIRED_FLAGS "${FLAG}")
+			unset(COVERAGE_FLAG_DETECTED CACHE)
+
+			if (${LANG} STREQUAL "C")
+				include(CheckCCompilerFlag)
+				check_c_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED)
+
+			elseif (${LANG} STREQUAL "CXX")
+				include(CheckCXXCompilerFlag)
+				check_cxx_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED)
+
+			elseif (${LANG} STREQUAL "Fortran")
+				# CheckFortranCompilerFlag was introduced in CMake 3.x. To be
+				# compatible with older Cmake versions, we will check if this
+				# module is present before we use it. Otherwise we will define
+				# Fortran coverage support as not available.
+				include(CheckFortranCompilerFlag OPTIONAL
+					RESULT_VARIABLE INCLUDED)
+				if (INCLUDED)
+					check_fortran_compiler_flag("${FLAG}"
+						COVERAGE_FLAG_DETECTED)
+				elseif (NOT CMAKE_REQUIRED_QUIET)
+					message("-- Performing Test COVERAGE_FLAG_DETECTED")
+					message("-- Performing Test COVERAGE_FLAG_DETECTED - Failed"
+						" (Check not supported)")
+				endif ()
+			endif()
+
+			if (COVERAGE_FLAG_DETECTED)
+				set(COVERAGE_${COMPILER}_FLAGS "${FLAG}"
+					CACHE STRING "${COMPILER} flags for code coverage.")
+				mark_as_advanced(COVERAGE_${COMPILER}_FLAGS)
+				break()
+			else ()
+				message(WARNING "Code coverage is not available for ${COMPILER}"
+				        " compiler. Targets using this compiler will be "
+				        "compiled without it.")
+			endif ()
+		endforeach ()
+	endif ()
+endforeach ()
+
+set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
+
+
+
+
+# Helper function to get the language of a source file.
+function (codecov_lang_of_source FILE RETURN_VAR)
+	get_filename_component(FILE_EXT "${FILE}" EXT)
+	string(TOLOWER "${FILE_EXT}" FILE_EXT)
+	string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT)
+
+	get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+	foreach (LANG ${ENABLED_LANGUAGES})
+		list(FIND CMAKE_${LANG}_SOURCE_FILE_EXTENSIONS "${FILE_EXT}" TEMP)
+		if (NOT ${TEMP} EQUAL -1)
+			set(${RETURN_VAR} "${LANG}" PARENT_SCOPE)
+			return()
+		endif ()
+	endforeach()
+
+	set(${RETURN_VAR} "" PARENT_SCOPE)
+endfunction ()
+
+
+# Helper function to get the relative path of the source file destination path.
+# This path is needed by FindGcov and FindLcov cmake files to locate the
+# captured data.
+function (codecov_path_of_source FILE RETURN_VAR)
+	string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _source ${FILE})
+
+	# If expression was found, SOURCEFILE is a generator-expression for an
+	# object library. Currently we found no way to call this function automatic
+	# for the referenced target, so it must be called in the directoryso of the
+	# object library definition.
+	if (NOT "${_source}" STREQUAL "")
+		set(${RETURN_VAR} "" PARENT_SCOPE)
+		return()
+	endif ()
+
+
+	string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" FILE "${FILE}")
+	if(IS_ABSOLUTE ${FILE})
+		file(RELATIVE_PATH FILE ${CMAKE_CURRENT_SOURCE_DIR} ${FILE})
+	endif()
+
+	# get the right path for file
+	string(REPLACE ".." "__" PATH "${FILE}")
+
+	set(${RETURN_VAR} "${PATH}" PARENT_SCOPE)
+endfunction()
+
+
+
+
+# Add coverage support for target ${TNAME} and register target for coverage
+# evaluation.
+function(add_coverage_target TNAME)
+	# Check if all sources for target use the same compiler. If a target uses
+	# e.g. C and Fortran mixed and uses different compilers (e.g. clang and
+	# gfortran) this can trigger huge problems, because different compilers may
+	# use different implementations for code coverage.
+	get_target_property(TSOURCES ${TNAME} SOURCES)
+	set(TARGET_COMPILER "")
+	set(ADDITIONAL_FILES "")
+	foreach (FILE ${TSOURCES})
+		# If expression was found, FILE is a generator-expression for an object
+		# library. Object libraries will be ignored.
+		string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _file ${FILE})
+		if ("${_file}" STREQUAL "")
+			codecov_lang_of_source(${FILE} LANG)
+			if (LANG)
+				list(APPEND TARGET_COMPILER ${CMAKE_${LANG}_COMPILER_ID})
+
+				list(APPEND ADDITIONAL_FILES "${FILE}.gcno")
+				list(APPEND ADDITIONAL_FILES "${FILE}.gcda")
+			endif ()
+		endif ()
+	endforeach ()
+
+	list(REMOVE_DUPLICATES TARGET_COMPILER)
+	list(LENGTH TARGET_COMPILER NUM_COMPILERS)
+
+	if (NUM_COMPILERS GREATER 1)
+		message(WARNING "Can't use code coverage for target ${TNAME}, because "
+		        "it will be compiled by incompatible compilers. Target will be "
+		        "compiled without code coverage.")
+		return()
+
+	elseif (NUM_COMPILERS EQUAL 0)
+		message(WARNING "Can't use code coverage for target ${TNAME}, because "
+		        "it uses an unknown compiler. Target will be compiled without "
+		        "code coverage.")
+		return()
+
+	elseif (NOT DEFINED "COVERAGE_${TARGET_COMPILER}_FLAGS")
+		# A warning has been printed before, so just return if flags for this
+		# compiler aren't available.
+		return()
+	endif()
+
+
+	# enable coverage for target
+	set_property(TARGET ${TNAME} APPEND_STRING
+		PROPERTY COMPILE_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}")
+	set_property(TARGET ${TNAME} APPEND_STRING
+		PROPERTY LINK_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}")
+
+
+	# Add gcov files generated by compiler to clean target.
+	set(CLEAN_FILES "")
+	foreach (FILE ${ADDITIONAL_FILES})
+		codecov_path_of_source(${FILE} FILE)
+		list(APPEND CLEAN_FILES "CMakeFiles/${TNAME}.dir/${FILE}")
+	endforeach()
+
+	set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
+		"${CLEAN_FILES}")
+
+
+	add_gcov_target(${TNAME})
+	add_lcov_target(${TNAME})
+endfunction(add_coverage_target)
+
+
+
+
+# Include modules for parsing the collected data and output it in a readable
+# format (like gcov and lcov).
+find_package(Gcov)
+find_package(Lcov)

+ 26 - 0
lib/Catch2/CMake/MiscFunctions.cmake

@@ -0,0 +1,26 @@
+#checks that the given hard-coded list contains all headers + sources in the given folder
+function(CheckFileList LIST_VAR FOLDER)
+  set(MESSAGE " should be added to the variable ${LIST_VAR}")
+  set(MESSAGE "${MESSAGE} in ${CMAKE_CURRENT_LIST_FILE}\n")
+  file(GLOB GLOBBED_LIST "${FOLDER}/*.cpp"
+                         "${FOLDER}/*.hpp"
+                         "${FOLDER}/*.h")
+  list(REMOVE_ITEM GLOBBED_LIST ${${LIST_VAR}})
+  foreach(EXTRA_ITEM ${GLOBBED_LIST})
+    string(REPLACE "${CATCH_DIR}/" "" RELATIVE_FILE_NAME "${EXTRA_ITEM}")
+    message(AUTHOR_WARNING "The file \"${RELATIVE_FILE_NAME}\"${MESSAGE}")
+  endforeach()
+endfunction()
+
+function(CheckFileListRec LIST_VAR FOLDER)
+  set(MESSAGE " should be added to the variable ${LIST_VAR}")
+  set(MESSAGE "${MESSAGE} in ${CMAKE_CURRENT_LIST_FILE}\n")
+  file(GLOB_RECURSE GLOBBED_LIST "${FOLDER}/*.cpp"
+                                 "${FOLDER}/*.hpp"
+                                 "${FOLDER}/*.h")
+  list(REMOVE_ITEM GLOBBED_LIST ${${LIST_VAR}})
+  foreach(EXTRA_ITEM ${GLOBBED_LIST})
+    string(REPLACE "${CATCH_DIR}/" "" RELATIVE_FILE_NAME "${EXTRA_ITEM}")
+    message(AUTHOR_WARNING "The file \"${RELATIVE_FILE_NAME}\"${MESSAGE}")
+  endforeach()
+endfunction()

+ 7 - 0
lib/Catch2/CMake/catch2.pc.in

@@ -0,0 +1,7 @@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
+
+Name: Catch2
+Description: A modern, C++-native, header-only, test framework for C++11
+URL: https://github.com/catchorg/Catch2
+Version: @Catch2_VERSION@
+Cflags: -I${includedir}

+ 0 - 0
lib/Catch2/CMake/llvm-cov-wrapper


Some files were not shown because too many files changed in this diff