From 28edd5a80beed6740ab365b71b5232c290bd688a Mon Sep 17 00:00:00 2001 From: 3d-gussner <3d.gussner@gmail.com> Date: Mon, 23 Sep 2019 19:22:45 +0200 Subject: [PATCH 01/26] Prepare PF-build.sh for Prusa Arduino_Boards V1.0.2 As I am planning to add new Prusa Arduino_Boards definition version 1.0.2 which contains few changes which interfere withthe existing PF-build.sh using Arduino_Boards v1.0.1, i had to add an additional variable. I have tested PF-build.sh with Arduino_Boards v1.0.1 and v1.0.2 It creates identical firmware hex files, if I manage it to run in the same minute. If one of the runs is off by a minute compared to the other there is just one line in the hex code different, which is showing the compiling date, time and firmware version. --- PF-build.sh | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/PF-build.sh b/PF-build.sh index fb3b51a10..9bafed344 100755 --- a/PF-build.sh +++ b/PF-build.sh @@ -56,7 +56,7 @@ # Some may argue that this is only used by a script, BUT as soon someone accidentally or on purpose starts Arduino IDE # it will use the default Arduino IDE folders and so can corrupt the build environment. # -# Version: 1.0.6-Build_9 +# Version: 1.0.6-Build_10 # Change log: # 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt' # 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown @@ -112,7 +112,7 @@ # Changed Hex-files folder to PF-build-hex as requested in PR # 23 Jul 2019, 3d-gussner, Added Finding OS version routine so supporting new OS should get easier # 26 Jul 2019, 3d-gussner, Change JSON repository to prusa3d after PR https://github.com/prusa3d/Arduino_Boards/pull/1 was merged - +# 23 Sep 2019, 3d-gussner, Prepare PF-build.sh for comming Prusa3d/Arduino_Boards version 1.0.2 Pull Request #### Start check if OSTYPE is supported OS_FOUND=$( command -v uname) @@ -211,7 +211,8 @@ fi #### Set build environment ARDUINO_ENV="1.8.5" BUILD_ENV="1.0.6" -BOARD="PrusaResearchRambo" +BOARD="rambo" +BOARD_PACKAGE_NAME="PrusaResearchRambo" BOARD_VERSION="1.0.1" BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json" BOARD_FILENAME="prusa3drambo" @@ -229,6 +230,7 @@ echo "" echo "Ardunio IDE :" $ARDUINO_ENV echo "Build env :" $BUILD_ENV echo "Board :" $BOARD +echo "Package name:" $BOARD_PACKAGE_NAME echo "Specific Lib:" $LIB echo "" @@ -317,7 +319,7 @@ if [ ! -e ../PF-build-env-$BUILD_ENV/Preferences-$TARGET_OS-$Processor.txt ]; th echo "update.check" sed -i 's/update.check = true/update.check = false/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt echo "board" - sed -i 's/board = uno/board = rambo/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt + sed -i 's/board = uno/board = $BOARD/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt echo "editor.linenumbers" sed -i 's/editor.linenumbers = false/editor.linenumbers = true/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt echo "boardsmanager.additional.urls" @@ -336,24 +338,24 @@ if [ ! -f "$BOARD_FILENAME-$BOARD_VERSION.tar.bz2" ]; then sleep 2 wget $BOARD_FILE_URL || exit 9 fi -if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then - echo "$(tput setaf 6)Unzipping $BOARD Arduino IDE portable...$(tput setaf 2)" +if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then + echo "$(tput setaf 6)Unzipping $BOARD_PACKAGE_NAME Arduino IDE portable...$(tput setaf 2)" sleep 2 tar -xvf $BOARD_FILENAME-$BOARD_VERSION.tar.bz2 -C ../PF-build-env-$BUILD_ENV/ || exit 10 - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD + if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then + mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD + if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then + mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware + if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware ]; then + mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr + if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr ]; then + mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr fi - mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr/$BOARD_VERSION + mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION echo "# $BOARD_FILENAME-$BOARD_VERSION" >> ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr 0)" fi @@ -634,8 +636,8 @@ do echo "Start to build Prusa Firmware ..." echo "Using variant $VARIANT$(tput setaf 3)" sleep 2 - #$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 - $BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 + #$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 + $BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 echo "$(tput sgr 0)" if [ $LANGUAGES == "ALL" ]; then From 2af43667c81fdde913bc8193e134b55021acf8a9 Mon Sep 17 00:00:00 2001 From: 3d-gussner <3d.gussner@gmail.com> Date: Thu, 17 Oct 2019 14:05:51 +0200 Subject: [PATCH 02/26] Changed folder and check file names... to have seperated build enviroments depening on Arduino IDE versions and board-versions. Successfully tested with: - Arduino IDE 1.8.5 and board version 1.0.1 - Arduino IDE 1.8.5 and board version 1.0.2 - These two above generate identical hex files - Arduino IDE 1.8.7 and board version 1.0.2 - Arduino IDE 1.8.8 and board version 1.0.2 - Arduino IDE 1.8.9 and board version 1.0.2 - These three above generate identical hex files - Compared to the 1.8.5 hex files the code uses less resources (Multi language/EN_ONLY): ``` Sketch uses 240082 bytes (94%) of program storage space. Maximum is 253952 bytes. Global variables use 6002 bytes of dynamic memory. Sketch uses 222344 bytes (87%) of program storage space. Maximum is 253952 bytes. Global variables use 6019 bytes of dynamic memory. ``` vs. ``` Sketch uses 241526 bytes (95%) of program storage space. Maximum is 253952 bytes. Global variables use 6046 bytes of dynamic memory. Sketch uses 223828 bytes (88%) of program storage space. Maximum is 253952 bytes. Global variables use 6065 bytes of dynamic memory. ``` Failed tests: - Arduino IDE 1.8.6 and board version 1.0.2 - Arduino IDE 1.8.10 and board version 1.0.2 --- PF-build.sh | 107 +++++++++++++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/PF-build.sh b/PF-build.sh index 9bafed344..7f538ea09 100755 --- a/PF-build.sh +++ b/PF-build.sh @@ -113,6 +113,8 @@ # 23 Jul 2019, 3d-gussner, Added Finding OS version routine so supporting new OS should get easier # 26 Jul 2019, 3d-gussner, Change JSON repository to prusa3d after PR https://github.com/prusa3d/Arduino_Boards/pull/1 was merged # 23 Sep 2019, 3d-gussner, Prepare PF-build.sh for comming Prusa3d/Arduino_Boards version 1.0.2 Pull Request +# 17 Oct 2019, 3d-gussner, Changed folder and check file names to have seperated build enviroments depening on Arduino IDE version and +# board-versions. #### Start check if OSTYPE is supported OS_FOUND=$( command -v uname) @@ -261,12 +263,12 @@ if [ $TARGET_OS == "windows" ]; then wget https://downloads.arduino.cc/arduino-$ARDUINO_ENV-windows.zip || exit 7 echo "$(tput sgr 0)" fi - if [ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor" ]; then + if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then echo "$(tput setaf 6)Unzipping Windows 32/64-bit Arduino IDE portable...$(tput setaf 2)" sleep 2 unzip arduino-$ARDUINO_ENV-windows.zip -d ../PF-build-env-$BUILD_ENV || exit 7 - mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor - echo "# arduino-$ARDUINO_ENV-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor + mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor + echo "# arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr0)" fi fi @@ -279,55 +281,55 @@ if [ $TARGET_OS == "linux" ]; then wget --no-check-certificate https://downloads.arduino.cc/arduino-$ARDUINO_ENV-linux$Processor.tar.xz || exit 8 echo "$(tput sgr 0)" fi - if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor.txt" ]]; then + if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then echo "$(tput setaf 6)Unzipping Linux $Processor Arduino IDE portable...$(tput setaf 2)" sleep 2 tar -xvf arduino-$ARDUINO_ENV-linux$Processor.tar.xz -C ../PF-build-env-$BUILD_ENV/ || exit 8 - mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor - echo "# arduino-$ARDUINO_ENV-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor.txt + mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor + echo "# arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr0)" fi fi # Make Arduino IDE portable -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/ +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/ fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/output/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/output +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/output/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/output fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/libraries/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/libraries +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/libraries/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/libraries fi -if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/staging/ ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/staging +if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/staging/ ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/staging fi # Change Arduino IDE preferences -if [ ! -e ../PF-build-env-$BUILD_ENV/Preferences-$TARGET_OS-$Processor.txt ]; then - echo "$(tput setaf 6)Setting $TARGET_OS-$Processor Arduino IDE preferences for portable GUI usage...$(tput setaf 2)" +if [ ! -e ../PF-build-env-$BUILD_ENV/Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt ]; then + echo "$(tput setaf 6)Setting $ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor Arduino IDE preferences for portable GUI usage...$(tput setaf 2)" sleep 2 echo "update.check" - sed -i 's/update.check = true/update.check = false/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt + sed -i 's/update.check = true/update.check = false/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt echo "board" - sed -i 's/board = uno/board = $BOARD/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt + sed -i 's/board = uno/board = $BOARD/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt echo "editor.linenumbers" - sed -i 's/editor.linenumbers = false/editor.linenumbers = true/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt + sed -i 's/editor.linenumbers = false/editor.linenumbers = true/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt echo "boardsmanager.additional.urls" - echo "boardsmanager.additional.urls=$BOARD_URL" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt - echo "build.verbose=true" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt - echo "compiler.cache_core=false" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt - echo "compiler.warning_level=all" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt - echo "# Preferences-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/Preferences-$TARGET_OS-$Processor.txt + echo "boardsmanager.additional.urls=$BOARD_URL" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt + echo "build.verbose=true" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt + echo "compiler.cache_core=false" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt + echo "compiler.warning_level=all" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt + echo "# Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr0)" fi @@ -338,25 +340,26 @@ if [ ! -f "$BOARD_FILENAME-$BOARD_VERSION.tar.bz2" ]; then sleep 2 wget $BOARD_FILE_URL || exit 9 fi -if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then +if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then echo "$(tput setaf 6)Unzipping $BOARD_PACKAGE_NAME Arduino IDE portable...$(tput setaf 2)" sleep 2 tar -xvf $BOARD_FILENAME-$BOARD_VERSION.tar.bz2 -C ../PF-build-env-$BUILD_ENV/ || exit 10 - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME + if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME + if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware + if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware fi - if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr ]; then - mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr + if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr ]; then + mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr fi - mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION - echo "# $BOARD_FILENAME-$BOARD_VERSION" >> ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt + mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION + echo "# $BOARD_FILENAME-$BOARD_VERSION" >> ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt + echo "$(tput sgr 0)" fi @@ -367,30 +370,30 @@ if [ ! -f "PF-build-env-$BUILD_ENV.zip" ]; then wget $PF_BUILD_FILE_URL || exit 11 echo "$(tput sgr 0)" fi -if [ ! -e "../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$TARGET_OS-$Processor.txt" ]; then +if [ ! -e "../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]; then echo "$(tput setaf 6)Unzipping Prusa Firmware build environment...$(tput setaf 2)" sleep 2 - unzip -o PF-build-env-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor || exit 12 - echo "# PF-build-env-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$TARGET_OS-$Processor.txt + unzip -o PF-build-env-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor || exit 12 + echo "# PF-build-env-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr0)" fi # Check if User updated Arduino IDE 1.8.5 boardsmanager and tools -if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools" ]; then +if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools" ]; then echo "$(tput setaf 6)Arduino IDE boards / tools have been manually updated...$" echo "Please don't update the 'Arduino AVR boards' as this will prevent running this script (tput setaf 2)" sleep 2 fi -if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2" ]; then +if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2" ]; then echo "$(tput setaf 6)PrusaReasearch compatible tools have been manually updated...$(tput setaf 2)" sleep 2 echo "$(tput setaf 6)Copying Prusa Firmware build environment to manually updated boards / tools...$(tput setaf 2)" sleep 2 - cp -f ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/hardware/tools/avr/avr/lib/ldscripts/avr6.xn ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/avr/lib/ldscripts/avr6.xn - echo "# PF-build-env-portable-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-portable-$BUILD_ENV-$TARGET_OS-$Processor.txt + cp -f ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/hardware/tools/avr/avr/lib/ldscripts/avr6.xn ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/avr/lib/ldscripts/avr6.xn + echo "# PF-build-env-portable-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-portable-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt echo "$(tput sgr0)" fi -if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2" ]; then +if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2" ]; then echo "$(tput setaf 1)Arduino IDE tools have been updated manually to a non supported version!!!" echo "Delete ../PF-build-env-$BUILD_ENV and start the script again" echo "Script will not continue until this have been fixed $(tput setaf 2)" @@ -491,7 +494,7 @@ if [ ! -z "$3" ] ; then fi #Set BUILD_ENV_PATH -cd ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor || exit 24 +cd ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor || exit 24 BUILD_ENV_PATH="$( pwd -P )" cd ../.. @@ -636,8 +639,8 @@ do echo "Start to build Prusa Firmware ..." echo "Using variant $VARIANT$(tput setaf 3)" sleep 2 - #$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 - $BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 + #$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 + $BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14 echo "$(tput sgr 0)" if [ $LANGUAGES == "ALL" ]; then From 359c44712718b506166f159d9ec6a3c769180a9d Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sat, 16 Nov 2019 22:44:34 +0200 Subject: [PATCH 03/26] Do not check for fanError if it is not enabled on resume Fix typos --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 2ed8d5de4..a6f92f47b 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6652,6 +6652,7 @@ static void lcd_test_menu() static bool fan_error_selftest() { #ifdef FANCHECK + if (!fans_check_enabled) return 0; fanSpeed = 255; #ifdef FAN_SOFT_PWM @@ -6682,9 +6683,8 @@ static bool fan_error_selftest() return 1; } #endif +#endif //FANCHECK return 0; - -#endif //FANCHECK } //! @brief Resume paused print From 14104e7bf98b5bf28d6db64585a65bf40b55196a Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 17 Nov 2019 10:44:11 +0200 Subject: [PATCH 04/26] Clear error flag when fanError is disabled --- Firmware/ultralcd.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a6f92f47b..fdb1e954f 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2270,6 +2270,7 @@ static void lcd_support_menu() void lcd_set_fan_check() { fans_check_enabled = !fans_check_enabled; eeprom_update_byte((unsigned char *)EEPROM_FAN_CHECK_ENABLED, fans_check_enabled); + if (fans_check_enabled == false) fan_check_error = EFCE_OK; //reset error if fanCheck is disabled during error. Allows resuming print. } #ifdef MMU_HAS_CUTTER From b077303156aec0a5a775654334aa405ba36aacc2 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 17 Nov 2019 11:10:13 +0200 Subject: [PATCH 05/26] Fix compile error --- Firmware/ultralcd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index fdb1e954f..3bc94b81e 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2270,7 +2270,9 @@ static void lcd_support_menu() void lcd_set_fan_check() { fans_check_enabled = !fans_check_enabled; eeprom_update_byte((unsigned char *)EEPROM_FAN_CHECK_ENABLED, fans_check_enabled); +#ifdef FANCHECK if (fans_check_enabled == false) fan_check_error = EFCE_OK; //reset error if fanCheck is disabled during error. Allows resuming print. +#endif //FANCHECK } #ifdef MMU_HAS_CUTTER From 404802b5e6e3ebd3a21f936691b7885f11966c26 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sun, 13 Oct 2019 18:49:32 +0200 Subject: [PATCH 06/26] Clear "sdprinting" state only when all SD moves are complete Ensure card.printingHasFinished sees all the planned moves before clearing sdprinting. To do that, we need to ensure all SD commands exited the command queue. --- Firmware/cmdqueue.cpp | 55 +++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index 74a8b90a5..e17db42a3 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -582,30 +582,8 @@ void get_command() ((serial_char == '#' || serial_char == ':') && comment_mode == false) || serial_count >= (MAX_CMD_SIZE - 1) || n==-1) { - if(card.eof()){ - SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED - stoptime=_millis(); - char time[30]; - unsigned long t=(stoptime-starttime-pause_time)/1000; - pause_time = 0; - int hours, minutes; - minutes=(t/60)%60; - hours=t/60/60; - save_statistics(total_filament_used, t); - sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); - SERIAL_ECHO_START; - SERIAL_ECHOLN(time); - lcd_setstatus(time); - card.printingHasFinished(); - card.checkautostart(true); + if(card.eof()) break; - if (farm_mode) - { - prusa_statistics(6); - lcd_commands_type = LcdCommands::FarmModeConfirm; - } - - } if(serial_char=='#') stop_buffering=true; @@ -663,6 +641,37 @@ void get_command() else if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char; } } + if(card.eof()) + { + // file was fully buffered, but commands might still need to be planned! + // do *not* clear sdprinting until all SD commands are consumed to ensure + // SD state can be resumed from a saved printing state. sdprinting is only + // cleared by printingHasFinished after peforming all remaining moves. + if(!cmdqueue_calc_sd_length()) + { + SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED + stoptime=_millis(); + char time[30]; + unsigned long t=(stoptime-starttime-pause_time)/1000; + pause_time = 0; + int hours, minutes; + minutes=(t/60)%60; + hours=t/60/60; + save_statistics(total_filament_used, t); + sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); + SERIAL_ECHO_START; + SERIAL_ECHOLN(time); + lcd_setstatus(time); + card.printingHasFinished(); + card.checkautostart(true); + + if (farm_mode) + { + prusa_statistics(6); + lcd_commands_type = LcdCommands::FarmModeConfirm; + } + } + } #endif //SDSUPPORT } From 0f6b9b40512eca03abbc930ae337a87ddf9323d6 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 15 Oct 2019 21:09:28 +0200 Subject: [PATCH 07/26] Unroll the stack in restore_print_from_ram_and_continue While handling moves in a recursive plan, such a filament check, ensure restore_print_from_ram_and_continue unwinds the stack by aborting early from any call that waits on the planner. This currently only handles G1 moves, but hard-coded behavior that can trigger recursive behavior (such as filament change) will probably have to be checked too. --- Firmware/Marlin_main.cpp | 6 ++++++ Firmware/planner.cpp | 2 +- Firmware/planner.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 19d799534..46fef27a0 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8363,6 +8363,8 @@ void clamp_to_software_endstops(float target[3]) current_position[Z_AXIS] + t * dz, current_position[E_AXIS] + t * de, feed_rate, extruder); + if (waiting_inside_plan_buffer_line_print_aborted) + return; } } // The rest of the path. @@ -8390,6 +8392,8 @@ void prepare_move() plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), active_extruder); #endif } + if (waiting_inside_plan_buffer_line_print_aborted) + return; for(int8_t i=0; i < NUM_AXIS; i++) { current_position[i] = destination[i]; @@ -10264,10 +10268,12 @@ void restore_print_from_ram_and_continue(float e_move) else { //not sd printing nor usb printing } + SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this lcd_setstatuspgm(_T(WELCOME_MSG)); saved_printing_type = PRINTING_TYPE_NONE; saved_printing = false; + waiting_inside_plan_buffer_line_print_aborted = true; //unroll the stack } void print_world_coordinates() diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 752d07258..63058d2cf 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -666,8 +666,8 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate // If the buffer is full: good! That means we are well ahead of the robot. // Rest here until there is room in the buffer. + waiting_inside_plan_buffer_line_print_aborted = false; if (block_buffer_tail == next_buffer_head) { - waiting_inside_plan_buffer_line_print_aborted = false; do { manage_heater(); // Vojtech: Don't disable motors inside the planner! diff --git a/Firmware/planner.h b/Firmware/planner.h index 7904c45a5..4977265bf 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -238,6 +238,7 @@ FORCE_INLINE bool planner_queue_full() { // wait for the steppers to stop, // update planner's current position and the current_position of the front end. extern void planner_abort_hard(); +extern bool waiting_inside_plan_buffer_line_print_aborted; #ifdef PREVENT_DANGEROUS_EXTRUDE void set_extrude_min_temp(float temp); From 5fa7c178b5fa2232c9c2f3e1939611e9ad453f1b Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 15 Oct 2019 21:14:28 +0200 Subject: [PATCH 08/26] Do not set current_position in mesh_plan_buffer_line This is a task which _has_ to be performed by the caller, such as prepare_move(). --- Firmware/Marlin_main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 46fef27a0..6686fba0a 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8369,10 +8369,6 @@ void clamp_to_software_endstops(float target[3]) } // The rest of the path. plan_buffer_line(x, y, z, e, feed_rate, extruder); - current_position[X_AXIS] = x; - current_position[Y_AXIS] = y; - current_position[Z_AXIS] = z; - current_position[E_AXIS] = e; } #endif // MESH_BED_LEVELING From faa9e925fe38acfc3de13aae35e6227c68fedc1e Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 15 Oct 2019 21:20:18 +0200 Subject: [PATCH 09/26] Replace a few loops with set_current_to_destination() --- Firmware/Marlin_main.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6686fba0a..3d1945efd 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8391,9 +8391,7 @@ void prepare_move() if (waiting_inside_plan_buffer_line_print_aborted) return; - for(int8_t i=0; i < NUM_AXIS; i++) { - current_position[i] = destination[i]; - } + set_current_to_destination(); } void prepare_arc_move(char isclockwise) { @@ -9114,10 +9112,8 @@ void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_poi destination[X_AXIS] = ix * (x_dimension / (x_points_num - 1)) + shift_x; destination[Y_AXIS] = iy * (y_dimension / (y_points_num - 1)) + shift_y; - mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], XY_AXIS_FEEDRATE/6, active_extruder); - for(int8_t i=0; i < NUM_AXIS; i++) { - current_position[i] = destination[i]; - } + mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], XY_AXIS_FEEDRATE/6, active_extruder); + set_current_to_destination(); st_synchronize(); // printf_P(PSTR("X = %f; Y= %f \n"), current_position[X_AXIS], current_position[Y_AXIS]); From 4268c2fdae35c97d732fa4318a60c342e5547065 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 15 Oct 2019 21:23:50 +0200 Subject: [PATCH 10/26] Fix recovery from relative/chunked moves When starting to replay existing USB/SD commands from a recovery state, an immediate relative move needs to compensate for a previously interrupted move. This is almost the norm for the E axis. Instead of saving the relative status of the move (which needs to account for the world2machine conversion and is not always available on a chunked move split by MBL) save directly the calculated target position for the move in the original plan, which is easy to replay. --- Firmware/Marlin_main.cpp | 61 ++++++++++++++++++++++++++++++++++------ Firmware/eeprom.h | 3 +- Firmware/planner.cpp | 31 +++++++++++++------- Firmware/planner.h | 5 ++-- 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3d1945efd..4877f7a8b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -309,6 +309,8 @@ bool no_response = false; uint8_t important_status; uint8_t saved_filament_type; +#define SAVED_TARGET_UNSET (X_MIN_POS-1) +float saved_target[NUM_AXIS] = {SAVED_TARGET_UNSET, 0, 0, 0}; // save/restore printing in case that mmu was not responding bool mmu_print_saved = false; @@ -4043,8 +4045,19 @@ if(eSoundMode!=e_SOUND_MODE_SILENT) #endif + get_coordinates(); // For X Y Z E F + + // When recovering from a previous print move, restore the originally + // calculated target position on the first USB/SD command. This accounts + // properly for relative moves + if ((saved_target[0] != SAVED_TARGET_UNSET) && + ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) || + (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR))) + { + memcpy(destination, saved_target, sizeof(destination)); + saved_target[0] = SAVED_TARGET_UNSET; + } - get_coordinates(); // For X Y Z E F if (total_filament_used > ((current_position[E_AXIS] - destination[E_AXIS]) * 100)) { //protection against total_filament_used overflow total_filament_used = total_filament_used + ((destination[E_AXIS] - current_position[E_AXIS]) * 100); } @@ -8339,30 +8352,37 @@ void clamp_to_software_endstops(float target[3]) } #ifdef MESH_BED_LEVELING - void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, const uint8_t extruder) { +void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, const uint8_t extruder) { float dx = x - current_position[X_AXIS]; float dy = y - current_position[Y_AXIS]; - float dz = z - current_position[Z_AXIS]; int n_segments = 0; - + if (mbl.active) { float len = abs(dx) + abs(dy); if (len > 0) // Split to 3cm segments or shorter. n_segments = int(ceil(len / 30.f)); } - + if (n_segments > 1) { + // In a multi-segment move explicitly set the final target in the plan + // as the move will be recalculated in it's entirety + float gcode_target[NUM_AXIS]; + gcode_target[X_AXIS] = x; + gcode_target[Y_AXIS] = y; + gcode_target[Z_AXIS] = z; + gcode_target[E_AXIS] = e; + + float dz = z - current_position[Z_AXIS]; float de = e - current_position[E_AXIS]; + for (int i = 1; i < n_segments; ++ i) { float t = float(i) / float(n_segments); - if (saved_printing || (mbl.active == false)) return; - plan_buffer_line( - current_position[X_AXIS] + t * dx, + plan_buffer_line(current_position[X_AXIS] + t * dx, current_position[Y_AXIS] + t * dy, current_position[Z_AXIS] + t * dz, current_position[E_AXIS] + t * de, - feed_rate, extruder); + feed_rate, extruder, gcode_target); if (waiting_inside_plan_buffer_line_print_aborted) return; } @@ -9602,6 +9622,12 @@ void uvlo_() // Backup the feedrate in mm/min. int feedrate_bckp = blocks_queued() ? (block_buffer[block_buffer_tail].nominal_speed * 60.f) : feedrate; + // save the original target position of the current move + if (blocks_queued()) + memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); + else + saved_target[0] = SAVED_TARGET_UNSET; + // After this call, the planner queue is emptied and the current_position is set to a current logical coordinate. // The logical coordinate will likely differ from the machine coordinate if the skew calibration and mesh bed leveling // are in action. @@ -9679,6 +9705,11 @@ void uvlo_() #endif #endif eeprom_update_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY), (uint16_t)extrudemultiply); + // Store the saved target + eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+0*4), saved_target[X_AXIS]); + eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+1*4), saved_target[Y_AXIS]); + eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+2*4), saved_target[Z_AXIS]); + eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+3*4), saved_target[E_AXIS]); // Finaly store the "power outage" flag. if(sd_print) eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); @@ -9927,6 +9958,12 @@ void recover_machine_state_after_power_panic(bool bTiny) #endif #endif extrudemultiply = (int)eeprom_read_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY)); + + // 9) Recover the saved target + saved_target[X_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_SAVED_TARGET+0*4)); + saved_target[Y_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_SAVED_TARGET+1*4)); + saved_target[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_SAVED_TARGET+2*4)); + saved_target[E_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_SAVED_TARGET+3*4)); } void restore_print_from_eeprom() { @@ -10143,6 +10180,12 @@ void stop_and_save_print_to_ram(float z_move, float e_move) saved_feedrate2 = blocks_queued() ? (block_buffer[block_buffer_tail].nominal_speed * 60.f) : feedrate; #endif + // save the original target position of the current move + if (blocks_queued()) + memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); + else + saved_target[0] = SAVED_TARGET_UNSET; + planner_abort_hard(); //abort printing memcpy(saved_pos, current_position, sizeof(saved_pos)); saved_active_extruder = active_extruder; //save active_extruder diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 0949e4110..82852220f 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -204,9 +204,10 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); #define EEPROM_FSENSOR_PCB (EEPROM_SHEETS_BASE-1) // uint8 #define EEPROM_FSENSOR_ACTION_NA (EEPROM_FSENSOR_PCB-1) // uint8 +#define EEPROM_UVLO_SAVED_TARGET (EEPROM_FSENSOR_ACTION_NA - 4*4) // 4 x float for saved target for all axes //This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items. -#define EEPROM_LAST_ITEM EEPROM_SHEETS_BASE +#define EEPROM_LAST_ITEM EEPROM_UVLO_SAVED_TARGET // !!!!! // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!! // !!!!! diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 63058d2cf..c1285aed6 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -659,7 +659,7 @@ float junction_deviation = 0.1; // Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in // mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration // calculation the caller must also provide the physical length of the line in millimeters. -void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder) +void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_target) { // Calculate the buffer head after we push this byte int next_buffer_head = next_block_index(block_buffer_head); @@ -687,6 +687,26 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate planner_update_queue_min_counter(); #endif /* PLANNER_DIAGNOSTICS */ + // Prepare to set up new block + block_t *block = &block_buffer[block_buffer_head]; + + // Set sdlen for calculating sd position + block->sdlen = 0; + + // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) + block->busy = false; + + // Save original destination of the move + if (gcode_target) + memcpy(block->gcode_target, gcode_target, sizeof(block_t::gcode_target)); + else + { + block->gcode_target[X_AXIS] = x; + block->gcode_target[Y_AXIS] = y; + block->gcode_target[Z_AXIS] = z; + block->gcode_target[E_AXIS] = e; + } + #ifdef ENABLE_AUTO_BED_LEVELING apply_rotation_xyz(plan_bed_level_matrix, x, y, z); #endif // ENABLE_AUTO_BED_LEVELING @@ -786,15 +806,6 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate } #endif - // Prepare to set up new block - block_t *block = &block_buffer[block_buffer_head]; - - // Set sdlen for calculating sd position - block->sdlen = 0; - - // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) - block->busy = false; - // Number of steps for each axis #ifndef COREXY // default non-h-bot planning diff --git a/Firmware/planner.h b/Firmware/planner.h index 4977265bf..d4c6bc2b4 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -116,7 +116,8 @@ typedef struct { unsigned long abs_adv_steps_multiplier8; // Factorised by 2^8 to avoid float #endif - uint16_t sdlen; + float gcode_target[NUM_AXIS]; // Target (abs mm) of the original Gcode instruction + uint16_t sdlen; // Length of the Gcode instruction } block_t; #ifdef LIN_ADVANCE @@ -147,7 +148,7 @@ vector_3 plan_get_position(); /// The performance penalty is negligible, since these planned lines are usually maintenance moves with the extruder. void plan_buffer_line_curposXYZE(float feed_rate, uint8_t extruder); -void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder); +void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_target = NULL); //void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder); #endif // ENABLE_AUTO_BED_LEVELING From 6ecff003b78e276ae775e47279559b45b8584d75 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Wed, 16 Oct 2019 18:47:18 +0200 Subject: [PATCH 11/26] Fix M600 insertion by the filament sensor Remove incorrect usage of stop_and_save_print combined with the fsensor_recovert internal instruction which would result in a broken sequence of events and/or broken stack. Re-use the now safe stop/recover functions in the same spot (fsensor_checkpoint_stream) to effectively cut a hole in the current gcode stream to insert an M600 instruction, which removes all recursive behavior without the need of extra state variables. --- Firmware/Marlin_main.cpp | 9 +------- Firmware/fsensor.cpp | 46 +++++++++++++++++----------------------- Firmware/fsensor.h | 2 ++ Firmware/mmu.cpp | 3 +-- 4 files changed, 24 insertions(+), 36 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4877f7a8b..5afeb525b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3657,7 +3657,7 @@ void process_commands() Set of internal PRUSA commands - PRUSA [ Ping | PRN | FAN | fn | thx | uvlo | fsensor_recover | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | Beat | FR ] + PRUSA [ Ping | PRN | FAN | fn | thx | uvlo | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | Beat | FR ] - `Ping` - `PRN` - Prints revision of the printer @@ -3665,7 +3665,6 @@ void process_commands() - `fn` - Prints farm no. - `thx` - `uvlo` - - `fsensor_recover` - Filament sensor recover - restore print and continue - `MMURES` - Reset MMU - `RESET` - (Careful!) - `fv` - ? @@ -3715,12 +3714,6 @@ void process_commands() eeprom_update_byte((uint8_t*)EEPROM_UVLO,0); enquecommand_P(PSTR("M24")); } -#ifdef FILAMENT_SENSOR - else if (code_seen("fsensor_recover")) // PRUSA fsensor_recover - { - fsensor_restore_print_and_continue(); - } -#endif //FILAMENT_SENSOR else if (code_seen("MMURES")) // PRUSA MMURES { mmu_reset(); diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index c01274fb3..1c28d025f 100755 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -57,15 +57,8 @@ bool fsensor_enabled = true; bool fsensor_watch_runout = true; //! not responding - is set if any communication error occurred during initialization or readout bool fsensor_not_responding = false; -//! printing saved -bool fsensor_printing_saved = false; //! enable/disable quality meassurement bool fsensor_oq_meassure_enabled = false; -//! as explained in the CHECK_FSENSOR macro: this flag is set to true when fsensor posts -//! the M600 into the command queue, which elliminates the hazard of having posted multiple M600's -//! before the first one gets read and started processing. -//! Btw., the IR fsensor could do up to 6 posts before the command queue managed to start processing the first M600 ;) -static bool fsensor_m600_enqueued = false; //! number of errors, updated in ISR uint8_t fsensor_err_cnt = 0; @@ -137,12 +130,19 @@ void fsensor_stop_and_save_print(void) void fsensor_restore_print_and_continue(void) { printf_P(PSTR("fsensor_restore_print_and_continue\n")); - fsensor_watch_runout = true; fsensor_err_cnt = 0; - fsensor_m600_enqueued = false; restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change } +// fsensor_checkpoint_print cuts the current print job at the current position, +// allowing new instructions to be inserted in the middle +void fsensor_checkpoint_print(void) +{ + printf_P(PSTR("fsensor_checkpoint_print\n")); + stop_and_save_print_to_ram(0, 0); + restore_print_from_ram_and_continue(0); +} + void fsensor_init(void) { #ifdef PAT9125 @@ -565,8 +565,6 @@ void fsensor_enque_M600(){ printf_P(PSTR("fsensor_update - M600\n")); eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1); eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1); - enquecommand_front_P(PSTR("PRUSA fsensor_recover")); - fsensor_m600_enqueued = true; enquecommand_front_P((PSTR("M600"))); } @@ -578,7 +576,7 @@ void fsensor_enque_M600(){ void fsensor_update(void) { #ifdef PAT9125 - if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX) && ( ! fsensor_m600_enqueued) ) + if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX)) { bool autoload_enabled_tmp = fsensor_autoload_enabled; fsensor_autoload_enabled = false; @@ -611,22 +609,18 @@ void fsensor_update(void) err |= (fsensor_oq_er_sum > 2); err |= (fsensor_oq_yd_sum < (4 * FSENSOR_OQ_MIN_YD)); - if (!err) - { - printf_P(PSTR("fsensor_err_cnt = 0\n")); - fsensor_restore_print_and_continue(); - } - else - { - fsensor_enque_M600(); - fsensor_watch_runout = false; - } + fsensor_restore_print_and_continue(); fsensor_autoload_enabled = autoload_enabled_tmp; fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp; + + if (!err) + printf_P(PSTR("fsensor_err_cnt = 0\n")); + else + fsensor_enque_M600(); } #else //PAT9125 - if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) ) - { + if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected) + { if(digitalRead(IR_SENSOR_PIN)) { // IR_SENSOR_PIN ~ H #if IR_SENSOR_ANALOG @@ -670,8 +664,8 @@ void fsensor_update(void) else { #endif //IR_SENSOR_ANALOG - fsensor_stop_and_save_print(); - fsensor_enque_M600(); + fsensor_checkpoint_print(); + fsensor_enque_M600(); #if IR_SENSOR_ANALOG } } diff --git a/Firmware/fsensor.h b/Firmware/fsensor.h index 48ad5fba0..aa4963afa 100755 --- a/Firmware/fsensor.h +++ b/Firmware/fsensor.h @@ -21,6 +21,8 @@ extern bool fsensor_oq_meassure_enabled; extern void fsensor_stop_and_save_print(void); //! restore print - restore position and heatup to original temperature extern void fsensor_restore_print_and_continue(void); +//! split the current gcode stream to insert new instructions +extern void fsensor_checkpoint_print(void); //! @} //! initialize diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index c9ca9cb65..f1515d988 100755 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -382,8 +382,7 @@ void mmu_loop(void) FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda); //printf_P(PSTR("Eact: %d\n"), int(e_active())); if (!mmu_finda && CHECK_FSENSOR && fsensor_enabled) { - fsensor_stop_and_save_print(); - enquecommand_front_P(PSTR("PRUSA fsensor_recover")); //then recover + fsensor_checkpoint_print(); ad_markDepleted(mmu_extruder); if (lcd_autoDepleteEnabled() && !ad_allDepleted()) { From 4f0af648fb95903942d0ebf1cad9d1d214048084 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sat, 19 Oct 2019 18:48:02 +0200 Subject: [PATCH 12/26] Save/restore feedmultiply independently of the feedrate --- Firmware/Marlin_main.cpp | 34 ++++++++++++++++++---------------- Firmware/eeprom.h | 3 ++- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 5afeb525b..00e0ae993 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -375,8 +375,8 @@ bool saved_printing = false; //!< Print is paused and saved in RAM static uint32_t saved_sdpos = 0; //!< SD card position, or line number in case of USB printing uint8_t saved_printing_type = PRINTING_TYPE_SD; static float saved_pos[4] = { 0, 0, 0, 0 }; -//! Feedrate hopefully derived from an active block of the planner at the time the print has been canceled, in mm/min. static float saved_feedrate2 = 0; +static int saved_feedmultiply2 = 0; static uint8_t saved_active_extruder = 0; static float saved_extruder_temperature = 0.0; //!< Active extruder temperature static bool saved_extruder_under_pressure = false; @@ -9612,9 +9612,6 @@ void uvlo_() if (sd_position < 0) sd_position = 0; } - // Backup the feedrate in mm/min. - int feedrate_bckp = blocks_queued() ? (block_buffer[block_buffer_tail].nominal_speed * 60.f) : feedrate; - // save the original target position of the current move if (blocks_queued()) memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); @@ -9686,7 +9683,9 @@ void uvlo_() eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]); eeprom_update_float((float*)EEPROM_UVLO_CURRENT_POSITION_Z , current_position[Z_AXIS]); // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates) - EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp); + int i_feedrate = feedrate; + EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &i_feedrate); + EEPROM_save_B(EEPROM_UVLO_FEEDMULTIPLY, &feedmultiply); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, target_temperature_bed); eeprom_update_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED, fanSpeed); @@ -9961,6 +9960,7 @@ void recover_machine_state_after_power_panic(bool bTiny) void restore_print_from_eeprom() { int feedrate_rec; + int feedmultiply_rec; uint8_t fan_speed_rec; char cmd[30]; char filename[13]; @@ -9969,8 +9969,11 @@ void restore_print_from_eeprom() { fan_speed_rec = eeprom_read_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED); EEPROM_read_B(EEPROM_UVLO_FEEDRATE, &feedrate_rec); + EEPROM_read_B(EEPROM_UVLO_FEEDMULTIPLY, &feedmultiply_rec); SERIAL_ECHOPGM("Feedrate:"); - MYSERIAL.println(feedrate_rec); + MYSERIAL.print(feedrate_rec); + SERIAL_ECHOPGM(", feedmultiply:"); + MYSERIAL.println(feedmultiply_rec); depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH); @@ -10011,9 +10014,11 @@ void restore_print_from_eeprom() { enquecommand(cmd); // Unretract. enquecommand_P(PSTR("G1 E" STRINGIFY(2*default_retraction)" F480")); - // Set the feedrate saved at the power panic. + // Set the feedrates saved at the power panic. sprintf_P(cmd, PSTR("G1 F%d"), feedrate_rec); enquecommand(cmd); + sprintf_P(cmd, PSTR("M220 S%d"), feedmultiply_rec); + enquecommand(cmd); if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS)) { enquecommand_P(PSTR("M82")); //E axis abslute mode @@ -10165,14 +10170,6 @@ void stop_and_save_print_to_ram(float z_move, float e_move) } #endif -#if 0 - saved_feedrate2 = feedrate; //save feedrate -#else - // Try to deduce the feedrate from the first block of the planner. - // Speed is in mm/min. - saved_feedrate2 = blocks_queued() ? (block_buffer[block_buffer_tail].nominal_speed * 60.f) : feedrate; -#endif - // save the original target position of the current move if (blocks_queued()) memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); @@ -10181,6 +10178,8 @@ void stop_and_save_print_to_ram(float z_move, float e_move) planner_abort_hard(); //abort printing memcpy(saved_pos, current_position, sizeof(saved_pos)); + saved_feedrate2 = feedrate; //save feedrate + saved_feedmultiply2 = feedmultiply; //save feedmultiply saved_active_extruder = active_extruder; //save active_extruder saved_extruder_temperature = degTargetHotend(active_extruder); @@ -10258,7 +10257,6 @@ void restore_print_from_ram_and_continue(float e_move) wait_for_heater(_millis(), saved_active_extruder); heating_status = 2; } - feedrate = saved_feedrate2; //restore feedrate axis_relative_modes[E_AXIS] = saved_extruder_relative_mode; float e = saved_pos[E_AXIS] - e_move; plan_set_e_position(e); @@ -10281,6 +10279,10 @@ void restore_print_from_ram_and_continue(float e_move) fans_check_enabled = true; #endif + // restore original feedrate/feedmultiply _after_ restoring the extruder position + feedrate = saved_feedrate2; + feedmultiply = saved_feedmultiply2; + memcpy(current_position, saved_pos, sizeof(saved_pos)); memcpy(destination, current_position, sizeof(destination)); if (saved_printing_type == PRINTING_TYPE_SD) { //was sd printing diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 82852220f..3f1e61419 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -205,9 +205,10 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); #define EEPROM_FSENSOR_ACTION_NA (EEPROM_FSENSOR_PCB-1) // uint8 #define EEPROM_UVLO_SAVED_TARGET (EEPROM_FSENSOR_ACTION_NA - 4*4) // 4 x float for saved target for all axes +#define EEPROM_UVLO_FEEDMULTIPLY (EEPROM_UVLO_SAVED_TARGET - 2) // uint16_t for feedmultiply //This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items. -#define EEPROM_LAST_ITEM EEPROM_UVLO_SAVED_TARGET +#define EEPROM_LAST_ITEM EEPROM_UVLO_FEEDMULTIPLY // !!!!! // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!! // !!!!! From 17176c1df21574c53c2fefc0b1455f9eb3f5e625 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sat, 19 Oct 2019 21:20:38 +0200 Subject: [PATCH 13/26] Save/restore the default feedrate correctly Since the global feedrate can be similarly modified for moves ahead of time, save the original feedrate in the planner as we do for gcode_target. This avoids having to undo feedmultiply (and machine limits!) from "nominal_speed" as previously done. Thanks @leptun --- Firmware/Marlin.h | 1 + Firmware/Marlin_main.cpp | 31 +++++++++++++++++++++++++------ Firmware/planner.cpp | 9 ++++++--- Firmware/planner.h | 2 ++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 8a396dac1..d9078ada2 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -296,6 +296,7 @@ void setPwmFrequency(uint8_t pin, int val); extern bool fans_check_enabled; extern float homing_feedrate[]; extern bool axis_relative_modes[]; +extern float feedrate; extern int feedmultiply; extern int extrudemultiply; // Sets extrude multiply factor (in percent) for all extruders extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 00e0ae993..6e33a3974 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -331,7 +331,15 @@ float destination[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0}; // For tracing an arc static float offset[3] = {0.0, 0.0, 0.0}; -static float feedrate = 1500.0, next_feedrate, saved_feedrate; + +// Current feedrate +float feedrate = 1500.0; + +// Feedrate for the next move +static float next_feedrate; + +// Original feedrate saved during homing moves +static float saved_feedrate; // Determines Absolute or Relative Coordinates. // Also there is bool axis_relative_modes[] per axis flag. @@ -9612,11 +9620,18 @@ void uvlo_() if (sd_position < 0) sd_position = 0; } - // save the original target position of the current move + // save the global state at planning time + int feedrate_bckp; if (blocks_queued()) + { memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); + feedrate_bckp = current_block->gcode_feedrate; + } else + { saved_target[0] = SAVED_TARGET_UNSET; + feedrate_bckp = feedrate; + } // After this call, the planner queue is emptied and the current_position is set to a current logical coordinate. // The logical coordinate will likely differ from the machine coordinate if the skew calibration and mesh bed leveling @@ -9683,8 +9698,7 @@ void uvlo_() eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]); eeprom_update_float((float*)EEPROM_UVLO_CURRENT_POSITION_Z , current_position[Z_AXIS]); // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates) - int i_feedrate = feedrate; - EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &i_feedrate); + EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp); EEPROM_save_B(EEPROM_UVLO_FEEDMULTIPLY, &feedmultiply); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, target_temperature_bed); @@ -10170,15 +10184,20 @@ void stop_and_save_print_to_ram(float z_move, float e_move) } #endif - // save the original target position of the current move + // save the global state at planning time if (blocks_queued()) + { memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); + saved_feedrate2 = current_block->gcode_feedrate; + } else + { saved_target[0] = SAVED_TARGET_UNSET; + saved_feedrate2 = feedrate; + } planner_abort_hard(); //abort printing memcpy(saved_pos, current_position, sizeof(saved_pos)); - saved_feedrate2 = feedrate; //save feedrate saved_feedmultiply2 = feedmultiply; //save feedmultiply saved_active_extruder = active_extruder; //save active_extruder saved_extruder_temperature = degTargetHotend(active_extruder); diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index c1285aed6..0ccf54f83 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -690,12 +690,12 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate // Prepare to set up new block block_t *block = &block_buffer[block_buffer_head]; - // Set sdlen for calculating sd position - block->sdlen = 0; - // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) block->busy = false; + // Set sdlen for calculating sd position + block->sdlen = 0; + // Save original destination of the move if (gcode_target) memcpy(block->gcode_target, gcode_target, sizeof(block_t::gcode_target)); @@ -707,6 +707,9 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate block->gcode_target[E_AXIS] = e; } + // Save the global feedrate at scheduling time + block->gcode_feedrate = feedrate; + #ifdef ENABLE_AUTO_BED_LEVELING apply_rotation_xyz(plan_bed_level_matrix, x, y, z); #endif // ENABLE_AUTO_BED_LEVELING diff --git a/Firmware/planner.h b/Firmware/planner.h index d4c6bc2b4..27541e5f0 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -116,7 +116,9 @@ typedef struct { unsigned long abs_adv_steps_multiplier8; // Factorised by 2^8 to avoid float #endif + // Save/recovery state data float gcode_target[NUM_AXIS]; // Target (abs mm) of the original Gcode instruction + float gcode_feedrate; // Original feedrate uint16_t sdlen; // Length of the Gcode instruction } block_t; From 18eaf21baf38ec6bff47882af4b1c664f4b9e935 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sat, 19 Oct 2019 21:45:50 +0200 Subject: [PATCH 14/26] Halve memory usage of saved feedrate Truncate the saved feedrate to an uint16_t. This is more than sufficient for recovery. --- Firmware/Marlin_main.cpp | 8 ++++---- Firmware/eeprom.h | 2 +- Firmware/planner.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6e33a3974..a312f3e52 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -383,7 +383,7 @@ bool saved_printing = false; //!< Print is paused and saved in RAM static uint32_t saved_sdpos = 0; //!< SD card position, or line number in case of USB printing uint8_t saved_printing_type = PRINTING_TYPE_SD; static float saved_pos[4] = { 0, 0, 0, 0 }; -static float saved_feedrate2 = 0; +static uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float) static int saved_feedmultiply2 = 0; static uint8_t saved_active_extruder = 0; static float saved_extruder_temperature = 0.0; //!< Active extruder temperature @@ -9621,7 +9621,7 @@ void uvlo_() } // save the global state at planning time - int feedrate_bckp; + uint16_t feedrate_bckp; if (blocks_queued()) { memcpy(saved_target, current_block->gcode_target, sizeof(saved_target)); @@ -9698,7 +9698,7 @@ void uvlo_() eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]); eeprom_update_float((float*)EEPROM_UVLO_CURRENT_POSITION_Z , current_position[Z_AXIS]); // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates) - EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp); + eeprom_update_word((uint16_t*)EEPROM_UVLO_FEEDRATE, feedrate_bckp); EEPROM_save_B(EEPROM_UVLO_FEEDMULTIPLY, &feedmultiply); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, target_temperature_bed); @@ -9982,7 +9982,7 @@ void restore_print_from_eeprom() { char dir_name[9]; fan_speed_rec = eeprom_read_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED); - EEPROM_read_B(EEPROM_UVLO_FEEDRATE, &feedrate_rec); + feedrate_rec = eeprom_read_word((uint16_t*)EEPROM_UVLO_FEEDRATE); EEPROM_read_B(EEPROM_UVLO_FEEDMULTIPLY, &feedmultiply_rec); SERIAL_ECHOPGM("Feedrate:"); MYSERIAL.print(feedrate_rec); diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 3f1e61419..12a31d3cc 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -74,7 +74,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #define EEPROM_UVLO_CURRENT_POSITION_Z (EEPROM_FILE_POSITION - 4) //float for current position in Z #define EEPROM_UVLO_TARGET_HOTEND (EEPROM_UVLO_CURRENT_POSITION_Z - 1) #define EEPROM_UVLO_TARGET_BED (EEPROM_UVLO_TARGET_HOTEND - 1) -#define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2) +#define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2) //uint16_t #define EEPROM_UVLO_FAN_SPEED (EEPROM_UVLO_FEEDRATE - 1) #define EEPROM_FAN_CHECK_ENABLED (EEPROM_UVLO_FAN_SPEED - 1) #define EEPROM_UVLO_MESH_BED_LEVELING (EEPROM_FAN_CHECK_ENABLED - 9*2) diff --git a/Firmware/planner.h b/Firmware/planner.h index 27541e5f0..0d0cb41ab 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -118,7 +118,7 @@ typedef struct { // Save/recovery state data float gcode_target[NUM_AXIS]; // Target (abs mm) of the original Gcode instruction - float gcode_feedrate; // Original feedrate + uint16_t gcode_feedrate; // Default and/or move feedrate uint16_t sdlen; // Length of the Gcode instruction } block_t; From dbe2ed41500863b6948f5a0154700feb76dafdb7 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sun, 20 Oct 2019 17:34:54 +0200 Subject: [PATCH 15/26] Fix pause/resume when using M25/M601 Remove the conflicting and mostly useless card.paused flag (the printing is either paused, or not) and switch to isPrintPaused only which accounts for both cases (SD/USB) correctly. Fix M27/getStatus to show the current real status of the SD print. Synchronize the queue on M601, as required to precisely pause the print at the correct instruction. Alias M25 to M601, which when combined with PR #1899 fixes issue #1614. Guard against incorrect usage in M601, M602 and M603. --- Firmware/Marlin.h | 2 +- Firmware/Marlin_main.cpp | 36 ++++++++++++--------- Firmware/cardreader.cpp | 57 ++++++++++++++-------------------- Firmware/cardreader.h | 2 -- Firmware/ultralcd.cpp | 2 +- Tests/PrusaStatistics_test.cpp | 5 ++- 6 files changed, 48 insertions(+), 56 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index d9078ada2..7dedc8a4b 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -396,7 +396,7 @@ extern uint16_t gcode_in_progress; extern LongTimer safetyTimer; #define PRINT_PERCENT_DONE_INIT 0xff -#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || card.paused || mmu_print_saved) +#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || mmu_print_saved) //! Beware - mcode_in_progress is set as soon as the command gets really processed, //! which is not the same as posting the M600 command into the command queue diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index a312f3e52..fe94fab5b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5377,21 +5377,19 @@ if(eSoundMode!=e_SOUND_MODE_SILENT) card.openFile(strchr_pointer + 4,true); break; - //! ### M24 - Start SD print + //! ### M24 - Start/resume SD print // ---------------------------------- case 24: - if (!card.paused) - failstats_reset_print(); - card.startFileprint(); - starttime=_millis(); + if (isPrintPaused) + lcd_resume_print(); + else + { + failstats_reset_print(); + card.startFileprint(); + starttime=_millis(); + } break; - //! ### M25 - Pause SD print - // ---------------------------------- - case 25: - card.pauseSDPrint(); - break; - //! ### M26 S\ - Set SD index //! Set position in SD card file to index in bytes. //! This command is expected to be called after M23 and before M24. @@ -7246,26 +7244,34 @@ Sigma_Exit: break; #endif //FILAMENTCHANGEENABLE + //! ### M25 - Pause SD print //! ### M601 - Pause print + //! ### M125 - Pause print (TODO: not implemented) // ------------------------------- + case 25: case 601: { - cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore - lcd_pause_print(); + if (!isPrintPaused) + { + st_synchronize(); + cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore + lcd_pause_print(); + } } break; //! ### M602 - Resume print // ------------------------------- case 602: { - lcd_resume_print(); + if (isPrintPaused) + lcd_resume_print(); } break; //! ### M603 - Stop print // ------------------------------- case 603: { - lcd_print_stop(); + Stop(); } break; diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 3c01bf84b..047a2c761 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -25,7 +25,6 @@ CardReader::CardReader() sdpos = 0; sdprinting = false; cardOK = false; - paused = false; saving = false; logging = false; autostart_atmillis=0; @@ -242,24 +241,13 @@ void CardReader::startFileprint() if(cardOK) { sdprinting = true; - paused = false; - Stopped = false; + Stopped = false; #ifdef SDCARD_SORT_ALPHA //flush_presort(); #endif } } -void CardReader::pauseSDPrint() -{ - if(sdprinting) - { - sdprinting = false; - paused = true; - } -} - - void CardReader::openLogFile(const char* name) { logging = true; @@ -408,9 +396,7 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru SERIAL_ECHOLN(name); } sdprinting = false; - paused = false; - - + SdFile myDir; const char *fname=name; diveSubfolder(fname,myDir); @@ -492,24 +478,27 @@ uint32_t CardReader::getFileSize() void CardReader::getStatus() { - if(sdprinting){ - SERIAL_PROTOCOL(longFilename); - SERIAL_PROTOCOLPGM("\n"); - SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE - SERIAL_PROTOCOL(sdpos); - SERIAL_PROTOCOLPGM("/"); - SERIAL_PROTOCOLLN(filesize); - uint16_t time = _millis()/60000 - starttime/60000; - SERIAL_PROTOCOL(itostr2(time/60)); - SERIAL_PROTOCOL(':'); - SERIAL_PROTOCOL(itostr2(time%60)); - SERIAL_PROTOCOLPGM("\n"); - } - else if (paused) { - SERIAL_PROTOCOLLNPGM("SD print paused"); - } - else if (saved_printing) { - SERIAL_PROTOCOLLNPGM("Print saved"); + if(sdprinting) + { + if (isPrintPaused) { + SERIAL_PROTOCOLLNPGM("SD print paused"); + } + else if (saved_printing) { + SERIAL_PROTOCOLLNPGM("Print saved"); + } + else { + SERIAL_PROTOCOL(longFilename); + SERIAL_PROTOCOLPGM("\n"); + SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE + SERIAL_PROTOCOL(sdpos); + SERIAL_PROTOCOLPGM("/"); + SERIAL_PROTOCOLLN(filesize); + uint16_t time = _millis()/60000 - starttime/60000; + SERIAL_PROTOCOL(itostr2(time/60)); + SERIAL_PROTOCOL(':'); + SERIAL_PROTOCOL(itostr2(time%60)); + SERIAL_PROTOCOLPGM("\n"); + } } else { SERIAL_PROTOCOLLNPGM("Not SD printing"); diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index b7df8ff41..9a7d0f697 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -25,7 +25,6 @@ public: void closefile(bool store_location=false); void release(); void startFileprint(); - void pauseSDPrint(); uint32_t getFileSize(); void getStatus(); void printingHasFinished(); @@ -75,7 +74,6 @@ public: bool logging; bool sdprinting ; bool cardOK ; - bool paused ; char filename[13]; uint16_t modificationTime, modificationDate; uint32_t cluster, position; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 465fde2b4..cbfe017fd 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4108,7 +4108,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { { prusa_statistics_case0(15); } - else if (isPrintPaused || card.paused) + else if (isPrintPaused) { prusa_statistics_case0(14); } diff --git a/Tests/PrusaStatistics_test.cpp b/Tests/PrusaStatistics_test.cpp index 3c15899ab..261a4dc6d 100644 --- a/Tests/PrusaStatistics_test.cpp +++ b/Tests/PrusaStatistics_test.cpp @@ -198,7 +198,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { SERIAL_ECHOLN("}"); status_number = 15; } - else if (isPrintPaused || card.paused) + else if (isPrintPaused) { SERIAL_ECHO("{"); prusa_stat_printerstatus(14); @@ -490,7 +490,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { { prusa_statistics_case0(15); } - else if (isPrintPaused || card.paused) + else if (isPrintPaused) { prusa_statistics_case0(14); } @@ -753,7 +753,6 @@ TEST_CASE("Prusa_statistics test", "[prusa_stats]") SERIALS_RESET(); isPrintPaused = 0; - card.paused = 0; IS_SD_PRINTING = 1; old_code::prusa_statistics(test_codes[i],0); new_code::prusa_statistics(test_codes[i],0); From 779423f0e71b700f941d1c5e6b8ac1114f05adc5 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 29 Nov 2019 15:06:54 +0200 Subject: [PATCH 16/26] Move hardcoded values to variants --- Firmware/tmc2130.cpp | 4 ++-- Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 4 +++- Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 6a79f51ac..dca50ac77 100755 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -24,7 +24,7 @@ uint8_t tmc2130_current_h[4] = TMC2130_CURRENTS_H; uint8_t tmc2130_current_r[4] = TMC2130_CURRENTS_R; //running currents for homing -uint8_t tmc2130_current_r_home[4] = {8, 10, 20, 18}; +uint8_t tmc2130_current_r_home[4] = TMC2130_CURRENTS_R_HOME; //pwm_ampl @@ -40,7 +40,7 @@ uint8_t tmc2130_mres[4] = {0, 0, 0, 0}; //will be filed at begin of init uint8_t tmc2130_sg_thr[4] = {TMC2130_SG_THRS_X, TMC2130_SG_THRS_Y, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E}; -uint8_t tmc2130_sg_thr_home[4] = {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E}; +uint8_t tmc2130_sg_thr_home[4] = TMC2130_SG_THRS_HOME; uint8_t tmc2130_sg_homing_axes_mask = 0x00; diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 54f0c4699..685d77c6b 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -260,11 +260,13 @@ #define TMC2130_SG_THRS_Y 3 // stallguard sensitivity for Y axis #define TMC2130_SG_THRS_Z 4 // stallguard sensitivity for Z axis #define TMC2130_SG_THRS_E 3 // stallguard sensitivity for E axis +#define TMC2130_SG_THRS_HOME {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E} //new settings is possible for vsense = 1, running current value > 31 set vsense to zero and shift both currents by 1 bit right (Z axis only) #define TMC2130_CURRENTS_H {16, 20, 35, 30} // default holding currents for all axes #define TMC2130_CURRENTS_R {16, 20, 35, 30} // default running currents for all axes -#define TMC2130_UNLOAD_CURRENT_R 12 // lowe current for M600 to protect filament sensor +#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes +// #define TMC2130_UNLOAD_CURRENT_R 12 // lower current for M600 to protect filament sensor - Unused #define TMC2130_STEALTH_Z diff --git a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h index 62dae6aca..5ee149e75 100644 --- a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h @@ -262,11 +262,13 @@ #define TMC2130_SG_THRS_Y 3 // stallguard sensitivity for Y axis #define TMC2130_SG_THRS_Z 4 // stallguard sensitivity for Z axis #define TMC2130_SG_THRS_E 3 // stallguard sensitivity for E axis +#define TMC2130_SG_THRS_HOME {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E} //new settings is possible for vsense = 1, running current value > 31 set vsense to zero and shift both currents by 1 bit right (Z axis only) #define TMC2130_CURRENTS_H {16, 20, 35, 30} // default holding currents for all axes #define TMC2130_CURRENTS_R {16, 20, 35, 30} // default running currents for all axes -#define TMC2130_UNLOAD_CURRENT_R 12 // lowe current for M600 to protect filament sensor +#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes +// #define TMC2130_UNLOAD_CURRENT_R 12 // lower current for M600 to protect filament sensor - Unused #define TMC2130_STEALTH_Z From e7f2577233100a32abf050d1ba77492e9b3a1a91 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 29 Nov 2019 22:49:22 +0200 Subject: [PATCH 17/26] Fix kill messages --- Firmware/Marlin_main.cpp | 6 +++--- Firmware/cardreader.cpp | 8 ++++---- Firmware/cmdqueue.cpp | 2 +- Firmware/messages.c | 1 + Firmware/messages.h | 1 + Firmware/temperature.cpp | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index fe94fab5b..5788e0dd3 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5944,7 +5944,7 @@ Sigma_Exit: //! ### M112 - Emergency stop // ----------------------------------------- case 112: - kill(_n(""), 3); + kill(MSG_M112_KILL, 3); break; //! ### M140 - Set bed temperature @@ -8626,7 +8626,7 @@ if(0) if( (_millis() - previous_millis_cmd) > max_inactive_time ) if(max_inactive_time) - kill(_n(""), 4); + kill(_n("Inactivity Shutdown"), 4); if(stepper_inactive_time) { if( (_millis() - previous_millis_cmd) > stepper_inactive_time ) { @@ -8667,7 +8667,7 @@ if(0) // ---------------------------------------------------------------- if ( killCount >= KILL_DELAY) { - kill("", 5); + kill(NULL, 5); } #endif diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 047a2c761..545316d39 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -359,10 +359,10 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru { if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1) { - SERIAL_ERROR_START; - SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); - SERIAL_ERRORLN(SD_PROCEDURE_DEPTH); - kill("", 1); + // SERIAL_ERROR_START; + // SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); + // SERIAL_ERRORLN(SD_PROCEDURE_DEPTH); + kill(_n("trying to call sub-gcode files with too many levels."), 1); return; } diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index e17db42a3..c86935529 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -500,7 +500,7 @@ void get_command() //If command was e-stop process now if(strcmp(cmdbuffer+bufindw+CMDHDRSIZE, "M112") == 0) - kill("", 2); + kill(MSG_M112_KILL, 2); // Store the current line into buffer, move to the next line. // Store type of entry diff --git a/Firmware/messages.c b/Firmware/messages.c index bb2e9510a..1d8847e13 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -160,3 +160,4 @@ const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; //// const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; //// const char MSG_FANCHECK_EXTRUDER[] PROGMEM_N1 = "Err: EXTR. FAN ERROR"; ////c=20 const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20 +const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20 diff --git a/Firmware/messages.h b/Firmware/messages.h index 60a4cc1c1..1dfbfa50d 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -161,6 +161,7 @@ extern const char MSG_OCTOPRINT_RESUMED[]; extern const char MSG_OCTOPRINT_CANCEL[]; extern const char MSG_FANCHECK_EXTRUDER[]; extern const char MSG_FANCHECK_PRINT[]; +extern const char MSG_M112_KILL[]; #if defined(__cplusplus) } diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index a9373a54b..88674cf98 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -879,7 +879,7 @@ static float analog2temp(int raw, uint8_t e) { SERIAL_ERROR_START; SERIAL_ERROR((int)e); SERIAL_ERRORLNPGM(" - Invalid extruder number !"); - kill(PSTR(""), 6); + kill(NULL, 6); return 0.0; } #ifdef HEATER_0_USES_MAX6675 From 454e99dbb54086e2ce4a1ea7c1cb9317671c4668 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 15:50:21 +0100 Subject: [PATCH 18/26] Use lcd_print_stop() in M603, fix octoprint regression M603 shouldn't report a fatal error state. Use lcd_print_stop(). Regression introduced in PR #2274 --- Firmware/Marlin_main.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index fe94fab5b..4dc5e2d3e 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -7271,7 +7271,7 @@ Sigma_Exit: //! ### M603 - Stop print // ------------------------------- case 603: { - Stop(); + lcd_print_stop(); } break; @@ -8745,6 +8745,16 @@ void kill(const char *full_screen_message, unsigned char id) } // Wait for reset } +// Stop: Emergency stop used by overtemp functions which allows recovery +// +// In addition to stopping the print, this prevents subsequent G[0-3] commands to be +// processed via USB (using "Stopped") until the print is resumed via M999 or +// manually started from scratch with the LCD. +// +// Note that the current instruction is completely discarded, so resuming from Stop() +// will introduce either over/under extrusion on the current segment, and will not +// survive a power panic. Switching Stop() to use the pause machinery instead (with +// the addition of disabling the headers) could allow true recovery in the future. void Stop() { disable_heater(); From 4fce74140a55679318b09027d0e42ec7c0aa0cf6 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 19:35:29 +0100 Subject: [PATCH 19/26] Also abort planning in stop_and_save_print_to_ram Similarly to resume_print_from_ram_and_continue, abort any planning in mesh_plan_buffer_line already in stop_and_save_print_to_ram in case it is called for pausing only. --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index fe94fab5b..33f67684e 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -10249,6 +10249,7 @@ void stop_and_save_print_to_ram(float z_move, float e_move) memcpy(current_position, saved_pos, sizeof(saved_pos)); memcpy(destination, current_position, sizeof(destination)); #endif + waiting_inside_plan_buffer_line_print_aborted = true; //unroll the stack } } From 792d7ca6dc2029e7c6d81c6609eb89c06bb29ba7 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 19:54:06 +0100 Subject: [PATCH 20/26] Turn off heaters just prior to retraction to limit oozing --- Firmware/Marlin_main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 33f67684e..c8596bad6 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -9555,9 +9555,11 @@ float temp_compensation_pinda_thermistor_offset(float temperature_pinda) void long_pause() //long pause print { st_synchronize(); - start_pause_print = _millis(); + // Stop heaters + setAllTargetHotends(0); + //retract current_position[E_AXIS] -= default_retraction; plan_buffer_line_curposXYZE(400, active_extruder); @@ -9572,8 +9574,7 @@ void long_pause() //long pause print current_position[Y_AXIS] = Y_PAUSE_POS; plan_buffer_line_curposXYZE(50, active_extruder); - // Turn off the hotends and print fan - setAllTargetHotends(0); + // Turn off the print fan fanSpeed = 0; } From d60230e494e6e4a60387b7fceab8e8be24648b70 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 19:55:33 +0100 Subject: [PATCH 21/26] Add some documentation --- Firmware/Marlin_main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index c8596bad6..9924b61cb 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -10221,7 +10221,9 @@ void stop_and_save_print_to_ram(float z_move, float e_move) sei(); if ((z_move != 0) || (e_move != 0)) { // extruder or z move #if 1 - // Rather than calling plan_buffer_line directly, push the move into the command queue, + // Rather than calling plan_buffer_line directly, push the move into the command queue so that + // the caller can continue processing. This is used during powerpanic to save the state as we + // move away from the print. char buf[48]; // First unretract (relative extrusion) From 063d0421ac71801bf0d8eb31ca9e51ef3950737f Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 19:56:05 +0100 Subject: [PATCH 22/26] Call long_pause from the main loop (again) After calling stop_and_save_print_to_ram, perform the parking moves within the main loop as done before PR#1899 to avoid planning within an interrupted move (which would clear the abort flag too soon). --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index cbfe017fd..b9e86fc43 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1100,6 +1100,7 @@ void lcd_commands() lcd_setstatuspgm(_i("Print paused"));////MSG_PRINT_PAUSED c=20 r=1 lcd_commands_type = LcdCommands::Idle; lcd_commands_step = 0; + long_pause(); } } @@ -1656,9 +1657,8 @@ void lcd_return_to_status() //! @brief Pause print, disable nozzle heater, move to park position void lcd_pause_print() { - lcd_return_to_status(); stop_and_save_print_to_ram(0.0,0.0); - long_pause(); + lcd_return_to_status(); isPrintPaused = true; if (LcdCommands::Idle == lcd_commands_type) { From 8448b8d41390301a6cd3a5e4b31260d52bfff896 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 3 Dec 2019 20:17:08 +0100 Subject: [PATCH 23/26] Keep destination updated in an aborted plan as well When aborting the plan destination is updated anyway to reflect the latest position. There's no use in this additional check. --- Firmware/Marlin_main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 9924b61cb..5bdae1bb7 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8415,8 +8415,6 @@ void prepare_move() plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), active_extruder); #endif } - if (waiting_inside_plan_buffer_line_print_aborted) - return; set_current_to_destination(); } From 564bab7308f69bbe2857b806ecdd63e96a75067d Mon Sep 17 00:00:00 2001 From: Michal Fanta <45625875+michalxfanta@users.noreply.github.com> Date: Thu, 5 Dec 2019 11:42:42 +0100 Subject: [PATCH 24/26] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 31 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/enhancement.md | 20 +++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++++ .github/ISSUE_TEMPLATE/question.md | 12 +++++++++ 4 files changed, 83 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/enhancement.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..196d5756d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +Please, before you create a new bug report, please make sure you searched in open and closed issues and couldn't find anything that matches. + +**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2] +**Printer firmware version**- [e.g. 3.8.1, 3.8.1-RC1, ...] + +**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1] +**MMU upgrade firmware version [e.g. 1.0.6, 1.0.6-RC2, ...] + +**Describe the bug** + A clear and concise description of what the bug is. + +**To Reproduce** + Please describe steps to reproduce the behavior. + +**Expected behavior** + A clear and concise description of what you expected to happen. + +**G-code** + Please attach a G-code. This will make it easier for us to replicate the error. + +**Video** + Please attach a video. It usually helps to solve the problem. diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 000000000..1592c6fc6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,20 @@ +--- +name: Enhancement +about: Suggest an idea for this project +title: " [ENHANCEMENT]" +labels: enhancement +assignees: '' + +--- + +Please, before you create a new feature request, please make sure you searched in open and closed issues and couldn't find anything that matches. + +Enter what type of printer or upgrade the enhancement applies to. +**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2] +**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1] + +**Is your enhancement related to a problem? Please describe.** + A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** + A clear and concise description of what you want to happen. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..abc71cbb4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE REQUEST]" +labels: feature request +assignees: '' + +--- + +Please, before you create a new feature request, please make sure you searched in open and closed issues and couldn't find anything that matches. + +If it makes sense, enter what type of printer or upgrade the feature request applies to. +**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2] +**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1] + +**Is your feature request related to a problem? Please describe.** + A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** + A clear and concise description of what you want to happen. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 000000000..14ce734fe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,12 @@ +--- +name: Question +about: What do you want to know? +title: "[QUESTION]" +labels: question +assignees: '' + +--- + +Please, before you create a new question, please make sure you searched in open and closed issues and couldn't find anything that matches. + +**What is your question?** From 89dfb00b04bff7fd1f8656744ef8d74bd79a9a6a Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 8 Dec 2019 08:43:43 +0200 Subject: [PATCH 25/26] Fix optiboot erase function after address 0xFFFF --- Firmware/optiboot_w25x20cl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/optiboot_w25x20cl.cpp b/Firmware/optiboot_w25x20cl.cpp index e84bf639c..584c32fed 100644 --- a/Firmware/optiboot_w25x20cl.cpp +++ b/Firmware/optiboot_w25x20cl.cpp @@ -258,11 +258,11 @@ void optiboot_w25x20cl_enter() uint32_t addr = (((uint32_t)rampz) << 16) | address; // During a single bootloader run, only erase a 64kB block once. // An 8bit bitmask 'pages_erased' covers 512kB of FLASH memory. - if (address == 0 && (pages_erased & (1 << addr)) == 0) { + if ((address == 0) && (pages_erased & (1 << (addr >> 16))) == 0) { w25x20cl_wait_busy(); w25x20cl_enable_wr(); w25x20cl_block64_erase(addr); - pages_erased |= (1 << addr); + pages_erased |= (1 << (addr >> 16)); } w25x20cl_wait_busy(); w25x20cl_enable_wr(); From ed3a459090ccc4322dc0ba8dbe85064572b78884 Mon Sep 17 00:00:00 2001 From: DRracer Date: Wed, 23 Oct 2019 13:54:15 +0200 Subject: [PATCH 26/26] Revert "Skipped one translated sentence, because total translation size was >" This reverts commit 5c2b573415a19d57353463856017919e7376ffac. --- lang/lang_en_cz.txt | 2 +- lang/lang_en_de.txt | 2 +- lang/lang_en_es.txt | 2 +- lang/lang_en_fr.txt | 2 +- lang/lang_en_it.txt | 2 +- lang/lang_en_pl.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lang/lang_en_cz.txt b/lang/lang_en_cz.txt index 0fc920ad5..230055b12 100755 --- a/lang/lang_en_cz.txt +++ b/lang/lang_en_cz.txt @@ -1188,7 +1188,7 @@ # "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 chapter)." -"\x00" +"Tiskarna zacne tisknout lomenou caru. Otacenim tlacitka nastavte optimalni vysku. Postupujte podle obrazku v handbooku (kapitola Kalibrace)." # "Y-correct:" diff --git a/lang/lang_en_de.txt b/lang/lang_en_de.txt index 91107d8e8..11c36b407 100755 --- a/lang/lang_en_de.txt +++ b/lang/lang_en_de.txt @@ -1188,7 +1188,7 @@ # "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 chapter)." -"\x00" +"Der Drucker beginnt mit dem Drucken einer Zickzacklinie. Drehen Sie den Knopf, bis Sie die optimale Hoehe erreicht haben. Ueberpruefen Sie die Bilder im Handbuch (Kapitel Kalibrierung)." # "Y-correct:" diff --git a/lang/lang_en_es.txt b/lang/lang_en_es.txt index 565399669..8255bd792 100755 --- a/lang/lang_en_es.txt +++ b/lang/lang_en_es.txt @@ -1188,7 +1188,7 @@ # "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 chapter)." -"\x00" +"La impresora comenzara a imprimir una linea en zig-zag. Gira el dial hasta que la linea alcance la altura optima. Mira las fotos del manual (Capitulo de calibracion)." # "Y-correct:" diff --git a/lang/lang_en_fr.txt b/lang/lang_en_fr.txt index b0b62e9dc..f6add9480 100755 --- a/lang/lang_en_fr.txt +++ b/lang/lang_en_fr.txt @@ -1185,7 +1185,7 @@ # "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 chapter)." -"\x00" +"L'imprimante commencera a imprimer une ligne en zig-zag. Tournez le bouton jusqu'a atteindre la hauteur optimale. Consultez les photos dans le manuel (chapitre Calibration)." # "Y-correct:" diff --git a/lang/lang_en_it.txt b/lang/lang_en_it.txt index 44285a43f..672859a09 100755 --- a/lang/lang_en_it.txt +++ b/lang/lang_en_it.txt @@ -1187,7 +1187,7 @@ # "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 chapter)." -"\x00" +"La stampante iniziera a stampare una linea a zig-zag. Gira la manopola fino a che non hai raggiungo l'altezza ottimale. Verifica con le immagini nel manuale (capitolo sulla calibrazione):" # "Y-correct:" diff --git a/lang/lang_en_pl.txt b/lang/lang_en_pl.txt index 25c4d14f5..aa07cd75a 100755 --- a/lang/lang_en_pl.txt +++ b/lang/lang_en_pl.txt @@ -1187,7 +1187,7 @@ # "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 chapter)." -"\x00" +"Drukarka zacznie drukowanie linii w ksztalcie zygzaka. Ustaw optymalna wysokosc obracajac pokretlo. Porownaj z ilustracjami w Podreczniku (rozdzial Kalibracja)." # "Y-correct:"