From 683ccc8faa95a155bcb1d68599fc5dabe2738c7e Mon Sep 17 00:00:00 2001 From: InsanityAutomation Date: Mon, 21 Oct 2019 22:14:07 -0400 Subject: [PATCH] Bump --- .circleci/config.yml | 10 +- .travis.yml | 25 +- Marlin/Configuration.h | 65 +- Marlin/Configuration_adv.h | 84 +- Marlin/Version.h | 76 + Marlin/src/HAL/HAL.h | 6 + Marlin/src/HAL/HAL_AVR/HAL.h | 3 +- Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp | 9 +- Marlin/src/HAL/HAL_AVR/fast_pwm.cpp | 4 +- Marlin/src/HAL/HAL_AVR/pinsDebug.h | 15 +- Marlin/src/HAL/HAL_AVR/watchdog.h | 2 +- Marlin/src/HAL/HAL_DUE/HAL.cpp | 2 +- Marlin/src/HAL/HAL_DUE/HAL.h | 39 +- Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp | 3 +- Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp | 7 +- Marlin/src/HAL/HAL_DUE/timers.cpp | 2 +- Marlin/src/HAL/HAL_DUE/timers.h | 6 +- Marlin/src/HAL/HAL_DUE/usb/conf_usb.h | 15 +- Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp | 13 +- Marlin/src/HAL/HAL_DUE/watchdog.h | 2 +- Marlin/src/HAL/HAL_ESP32/HAL.cpp | 12 +- Marlin/src/HAL/HAL_ESP32/watchdog.h | 2 +- Marlin/src/HAL/HAL_LINUX/HAL.h | 6 +- Marlin/src/HAL/HAL_LINUX/arduino.cpp | 2 +- Marlin/src/HAL/HAL_LINUX/include/serial.h | 4 +- Marlin/src/HAL/HAL_LINUX/watchdog.cpp | 14 +- Marlin/src/HAL/HAL_LINUX/watchdog.h | 4 +- Marlin/src/HAL/HAL_LPC1768/HAL.cpp | 17 + Marlin/src/HAL/HAL_LPC1768/HAL.h | 4 + Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h | 2 +- Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp | 4 +- Marlin/src/HAL/HAL_LPC1768/main.cpp | 2 +- .../HAL/HAL_LPC1768/upload_extra_script.py | 4 +- Marlin/src/HAL/HAL_LPC1768/watchdog.cpp | 20 +- Marlin/src/HAL/HAL_LPC1768/watchdog.h | 7 +- Marlin/src/HAL/HAL_SAMD51/HAL.cpp | 2 +- Marlin/src/HAL/HAL_SAMD51/watchdog.cpp | 2 +- Marlin/src/HAL/HAL_SAMD51/watchdog.h | 2 +- Marlin/src/HAL/HAL_STM32/HAL.cpp | 14 +- Marlin/src/HAL/HAL_STM32/watchdog.cpp | 2 +- Marlin/src/HAL/HAL_STM32/watchdog.h | 2 +- Marlin/src/HAL/HAL_STM32F1/HAL.cpp | 4 +- Marlin/src/HAL/HAL_STM32F1/timers.cpp | 2 +- Marlin/src/HAL/HAL_STM32F1/timers.h | 9 +- Marlin/src/HAL/HAL_STM32F1/watchdog.cpp | 2 +- Marlin/src/HAL/HAL_STM32F1/watchdog.h | 2 +- Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h | 2 +- Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp | 2 +- Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h | 2 +- Marlin/src/HAL/HAL_TEENSY31_32/HAL.h | 2 +- Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h | 2 +- Marlin/src/HAL/HAL_TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h | 2 +- Marlin/src/HAL/shared/Delay.h | 2 +- Marlin/src/Marlin.cpp | 149 +- Marlin/src/Marlin.h | 9 +- Marlin/src/core/boards.h | 24 +- Marlin/src/core/enum.h | 63 - Marlin/src/core/language.h | 129 +- Marlin/src/core/macros.h | 48 +- Marlin/src/core/multi_language.cpp | 0 Marlin/src/core/multi_language.h | 79 + Marlin/src/core/serial.cpp | 7 +- Marlin/src/core/serial.h | 43 +- Marlin/src/core/types.h | 486 +++ Marlin/src/core/utility.cpp | 50 +- Marlin/src/core/utility.h | 26 +- Marlin/src/feature/I2CPositionEncoder.cpp | 39 +- Marlin/src/feature/I2CPositionEncoder.h | 2 - Marlin/src/feature/Max7219_Debug_LEDs.h | 2 +- Marlin/src/feature/babystep.cpp | 17 +- Marlin/src/feature/babystep.h | 27 +- Marlin/src/feature/backlash.cpp | 26 +- Marlin/src/feature/backlash.h | 8 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 162 +- Marlin/src/feature/bedlevel/abl/abl.h | 12 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 32 +- Marlin/src/feature/bedlevel/bedlevel.h | 22 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 55 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 32 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 5 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 47 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 510 ++- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 355 +-- Marlin/src/feature/binary_protocol.h | 5 + Marlin/src/feature/caselight.cpp | 8 +- Marlin/src/feature/dac/dac_mcp4728.cpp | 6 +- Marlin/src/feature/dac/dac_mcp4728.h | 4 +- Marlin/src/feature/dac/stepper_dac.cpp | 8 +- Marlin/src/feature/dac/stepper_dac.h | 2 +- .../src/feature/digipot/digipot_mcp4451.cpp | 2 +- Marlin/src/feature/fwretract.cpp | 14 +- Marlin/src/feature/host_actions.cpp | 4 +- Marlin/src/feature/joystick.cpp | 37 +- Marlin/src/feature/joystick.h | 4 +- Marlin/src/feature/leds/neopixel.h | 8 +- Marlin/src/feature/leds/pca9632.cpp | 3 +- Marlin/src/feature/mixing.h | 30 +- Marlin/src/feature/pause.cpp | 55 +- Marlin/src/feature/pause.h | 3 +- Marlin/src/feature/power_loss_recovery.cpp | 34 +- Marlin/src/feature/power_loss_recovery.h | 8 +- Marlin/src/feature/prusa_MMU2/mmu2.cpp | 22 +- Marlin/src/feature/runout.cpp | 75 + Marlin/src/feature/runout.h | 14 +- Marlin/src/feature/spindle_laser.cpp | 40 +- Marlin/src/feature/spindle_laser.h | 26 +- Marlin/src/feature/tmc_util.cpp | 4 +- Marlin/src/feature/tmc_util.h | 42 +- Marlin/src/gcode/bedlevel/G26.cpp | 311 +- Marlin/src/gcode/bedlevel/G42.cpp | 11 +- Marlin/src/gcode/bedlevel/M420.cpp | 12 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 320 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 8 +- Marlin/src/gcode/bedlevel/ubl/M421.cpp | 19 +- Marlin/src/gcode/calibrate/G28.cpp | 54 +- Marlin/src/gcode/calibrate/G33.cpp | 162 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 227 +- Marlin/src/gcode/calibrate/G425.cpp | 154 +- Marlin/src/gcode/calibrate/M48.cpp | 38 +- Marlin/src/gcode/calibrate/M665.cpp | 22 +- Marlin/src/gcode/calibrate/M852.cpp | 10 +- Marlin/src/gcode/config/M200-M205.cpp | 26 +- Marlin/src/gcode/config/M218.cpp | 14 +- Marlin/src/gcode/config/M43.cpp | 18 +- Marlin/src/gcode/config/M92.cpp | 6 +- Marlin/src/gcode/control/M108_M112_M410.cpp | 2 +- Marlin/src/gcode/control/M211.cpp | 12 +- Marlin/src/gcode/control/M3-M5.cpp | 26 +- Marlin/src/gcode/control/M605.cpp | 8 +- Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/gcode/feature/L6470/M916-918.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 32 +- .../src/gcode/feature/digipot/M907-M910.cpp | 6 +- Marlin/src/gcode/feature/leds/M7219.cpp | 2 +- Marlin/src/gcode/feature/pause/M125.cpp | 5 +- Marlin/src/gcode/feature/pause/M600.cpp | 6 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 36 +- Marlin/src/gcode/feature/trinamic/M122.cpp | 10 +- .../src/gcode/feature/trinamic/M911-M914.cpp | 16 +- Marlin/src/gcode/gcode.cpp | 21 +- Marlin/src/gcode/gcode.h | 4 +- Marlin/src/gcode/geometry/G53-G59.cpp | 4 +- Marlin/src/gcode/geometry/G92.cpp | 4 +- Marlin/src/gcode/geometry/M206_M428.cpp | 4 +- Marlin/src/gcode/host/M114.cpp | 40 +- Marlin/src/gcode/host/M16.cpp | 2 +- Marlin/src/gcode/lcd/M0_M1.cpp | 7 +- Marlin/src/gcode/lcd/M73.cpp | 7 +- Marlin/src/gcode/motion/G0_G1.cpp | 10 +- Marlin/src/gcode/motion/G2_G3.cpp | 110 +- Marlin/src/gcode/motion/G5.cpp | 16 +- Marlin/src/gcode/motion/M290.cpp | 58 +- Marlin/src/gcode/parser.cpp | 5 +- Marlin/src/gcode/parser.h | 6 +- Marlin/src/gcode/probe/G30.cpp | 11 +- Marlin/src/gcode/probe/G38.cpp | 7 +- Marlin/src/gcode/probe/M851.cpp | 12 +- Marlin/src/gcode/scara/M360-M364.cpp | 2 +- Marlin/src/gcode/temperature/M105.cpp | 15 +- Marlin/src/gcode/temperature/M140_M190.cpp | 2 +- Marlin/src/gcode/temperature/M141_M191.cpp | 12 +- Marlin/src/inc/Conditionals_LCD.h | 28 +- Marlin/src/inc/Conditionals_adv.h | 3 - Marlin/src/inc/Conditionals_post.h | 91 +- Marlin/src/inc/MarlinConfig.h | 2 +- Marlin/src/inc/MarlinConfigPre.h | 15 +- Marlin/src/inc/SanityCheck.h | 183 +- Marlin/src/inc/Version.h | 148 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 32 +- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- .../{langdata_el-gr.h => langdata_el_gr.h} | 0 .../src/lcd/dogm/fontdata/langdata_jp-kana.h | 116 - .../src/lcd/dogm/fontdata/langdata_jp_kana.h | 111 + .../{langdata_pt-br.h => langdata_pt_br.h} | 0 Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 129 +- .../lcd/dogm/status_screen_lite_ST7920.cpp | 14 +- .../src/lcd/dogm/status_screen_lite_ST7920.h | 3 +- .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp | 19 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 14 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 2 +- .../lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h | 4 +- .../extensible_ui/lib/dgus/DGUSDisplay.cpp | 20 +- .../lib/dgus/DGUSDisplayDefinition.cpp | 40 +- .../lib/dgus/DGUSDisplayDefinition.h | 58 +- .../lcd/extensible_ui/lib/lulzbot/compat.h | 5 - .../ftdi_eve_lib/extended/command_processor.h | 4 +- .../ftdi_eve_lib/extended/dl_cache.cpp | 4 +- .../lib/lulzbot/ftdi_eve_lib/extended/rgb_t.h | 40 + .../lib/lulzbot/language/language.h | 64 - .../lib/lulzbot/language/language_de.h | 2 - .../lib/lulzbot/language/language_en.h | 13 +- .../lib/lulzbot/language/language_fr.h | 2 - .../lib/lulzbot/language/languages.h | 26 - .../lib/lulzbot/marlin_events.cpp | 15 +- .../lib/lulzbot/screens/about_screen.cpp | 6 +- .../screens/advanced_settings_menu.cpp | 70 +- .../screens/backlash_compensation_screen.cpp | 18 +- .../base_numeric_adjustment_screen.cpp | 68 +- .../lulzbot/screens/bio_advanced_settings.cpp | 34 +- .../lulzbot/screens/bio_confirm_home_e.cpp | 8 +- .../lulzbot/screens/bio_confirm_home_xyz.cpp | 7 +- .../lib/lulzbot/screens/bio_main_menu.cpp | 37 +- .../screens/bio_printing_dialog_box.cpp | 3 +- .../lib/lulzbot/screens/bio_status_screen.cpp | 68 +- .../lib/lulzbot/screens/bio_tune_menu.cpp | 41 +- .../lib/lulzbot/screens/boot_screen.cpp | 13 +- .../screens/change_filament_screen.cpp | 44 +- .../confirm_abort_print_dialog_box.cpp | 2 +- .../confirm_auto_calibration_dialog_box.cpp | 2 +- .../confirm_erase_flash_dialog_box.cpp | 6 +- .../confirm_start_print_dialog_box.cpp | 70 + .../screens/default_acceleration_screen.cpp | 12 +- .../lulzbot/screens/dialog_box_base_class.cpp | 6 +- .../lulzbot/screens/display_tuning_screen.cpp | 10 +- .../lulzbot/screens/endstop_state_screen.cpp | 46 +- .../screens/feedrate_percent_screen.cpp | 6 +- .../lib/lulzbot/screens/filament_menu.cpp | 21 +- .../screens/filament_runout_screen.cpp | 10 +- .../lib/lulzbot/screens/files_screen.cpp | 28 +- .../screens/interface_settings_screen.cpp | 26 +- .../screens/interface_sounds_screen.cpp | 16 +- .../lib/lulzbot/screens/jerk_screen.cpp | 16 +- .../screens/junction_deviation_screen.cpp | 10 +- .../lib/lulzbot/screens/kill_screen.cpp | 6 +- .../lulzbot/screens/linear_advance_screen.cpp | 12 +- .../lib/lulzbot/screens/lock_screen.cpp | 22 +- .../lib/lulzbot/screens/main_menu.cpp | 40 +- .../screens/max_acceleration_screen.cpp | 20 +- .../lulzbot/screens/max_velocity_screen.cpp | 20 +- .../lib/lulzbot/screens/move_axis_screen.cpp | 24 +- .../lulzbot/screens/nozzle_offsets_screen.cpp | 12 +- .../lulzbot/screens/nudge_nozzle_screen.cpp | 35 +- .../screens/restore_failsafe_dialog_box.cpp | 4 +- .../screens/save_settings_dialog_box.cpp | 4 +- .../lib/lulzbot/screens/screen_data.h | 3 +- .../lib/lulzbot/screens/screens.cpp | 3 +- .../lib/lulzbot/screens/screens.h | 29 +- .../lulzbot/screens/spinner_dialog_box.cpp | 2 +- .../lib/lulzbot/screens/statistics_screen.cpp | 14 +- .../lib/lulzbot/screens/status_screen.cpp | 18 +- .../stepper_bump_sensitivity_screen.cpp | 14 +- .../screens/stepper_current_screen.cpp | 20 +- .../lib/lulzbot/screens/steps_screen.cpp | 20 +- .../lib/lulzbot/screens/string_format.cpp | 6 - .../lulzbot/screens/temperature_screen.cpp | 22 +- .../screens/touch_calibration_screen.cpp | 4 +- .../lib/lulzbot/screens/tune_menu.cpp | 39 +- .../lib/lulzbot/screens/z_offset_screen.cpp | 6 +- .../extensible_ui/lib/lulzbot/theme/colors.h | 138 +- Marlin/src/lcd/extensible_ui/ui_api.cpp | 139 +- Marlin/src/lcd/extensible_ui/ui_api.h | 14 +- Marlin/src/lcd/extui_dgus_lcd.cpp | 6 +- Marlin/src/lcd/extui_example.cpp | 6 +- Marlin/src/lcd/extui_malyan_lcd.cpp | 111 +- Marlin/src/lcd/language/language_an.h | 466 +-- Marlin/src/lcd/language/language_bg.h | 290 +- Marlin/src/lcd/language/language_ca.h | 475 +-- Marlin/src/lcd/language/language_cz.h | 1067 ++++--- Marlin/src/lcd/language/language_da.h | 411 ++- Marlin/src/lcd/language/language_de.h | 1169 +++---- Marlin/src/lcd/language/language_el-gr.h | 189 -- Marlin/src/lcd/language/language_el.h | 376 ++- Marlin/src/lcd/language/language_el_gr.h | 283 ++ Marlin/src/lcd/language/language_en.h | 2189 ++++--------- Marlin/src/lcd/language/language_es.h | 1110 ++++--- Marlin/src/lcd/language/language_eu.h | 706 ++--- Marlin/src/lcd/language/language_fi.h | 268 +- Marlin/src/lcd/language/language_fr.h | 1083 ++++--- Marlin/src/lcd/language/language_gl.h | 451 +-- Marlin/src/lcd/language/language_hr.h | 386 +-- Marlin/src/lcd/language/language_it.h | 1181 +++---- Marlin/src/lcd/language/language_jp-kana.h | 222 -- Marlin/src/lcd/language/language_jp_kana.h | 314 ++ Marlin/src/lcd/language/language_ko_KR.h | 482 +-- Marlin/src/lcd/language/language_nl.h | 504 +-- Marlin/src/lcd/language/language_pl.h | 882 ++++-- Marlin/src/lcd/language/language_pt-br.h | 444 --- Marlin/src/lcd/language/language_pt.h | 333 +- Marlin/src/lcd/language/language_pt_br.h | 492 +++ Marlin/src/lcd/language/language_ru.h | 926 +++--- Marlin/src/lcd/language/language_sk.h | 1171 ++++--- Marlin/src/lcd/language/language_test.h | 217 +- Marlin/src/lcd/language/language_tr.h | 874 +++--- Marlin/src/lcd/language/language_uk.h | 495 +-- Marlin/src/lcd/language/language_vi.h | 910 +++--- Marlin/src/lcd/language/language_zh_CN.h | 794 +++-- Marlin/src/lcd/language/language_zh_TW.h | 795 +++-- Marlin/src/lcd/menu/menu.cpp | 67 +- Marlin/src/lcd/menu/menu.h | 190 +- Marlin/src/lcd/menu/menu_advanced.cpp | 418 ++- Marlin/src/lcd/menu/menu_backlash.cpp | 8 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 18 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 52 +- Marlin/src/lcd/menu/menu_configuration.cpp | 195 +- Marlin/src/lcd/menu/menu_custom.cpp | 28 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 81 +- Marlin/src/lcd/menu/menu_filament.cpp | 370 +-- Marlin/src/lcd/menu/menu_game.cpp | 10 +- Marlin/src/lcd/menu/menu_info.cpp | 171 +- Marlin/src/lcd/menu/menu_job_recovery.cpp | 4 +- Marlin/src/lcd/menu/menu_led.cpp | 40 +- Marlin/src/lcd/menu/menu_main.cpp | 85 +- Marlin/src/lcd/menu/menu_media.cpp | 30 +- Marlin/src/lcd/menu/menu_mixer.cpp | 68 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 103 +- Marlin/src/lcd/menu/menu_motion.cpp | 221 +- Marlin/src/lcd/menu/menu_service.cpp | 12 +- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 10 +- Marlin/src/lcd/menu/menu_temperature.cpp | 271 +- Marlin/src/lcd/menu/menu_tmc.cpp | 195 +- Marlin/src/lcd/menu/menu_tune.cpp | 84 +- Marlin/src/lcd/menu/menu_ubl.cpp | 189 +- Marlin/src/lcd/ultralcd.cpp | 78 +- Marlin/src/lcd/ultralcd.h | 51 +- Marlin/src/libs/L6470/L6470_Marlin.cpp | 26 +- Marlin/src/libs/duration_t.h | 6 +- Marlin/src/libs/least_squares_fit.cpp | 2 +- Marlin/src/libs/least_squares_fit.h | 6 + Marlin/src/libs/nozzle.cpp | 77 +- Marlin/src/libs/nozzle.h | 19 +- Marlin/src/libs/numtostr.cpp | 70 +- Marlin/src/libs/numtostr.h | 51 +- Marlin/src/libs/point_t.h | 55 - Marlin/src/libs/vector_3.cpp | 94 +- Marlin/src/libs/vector_3.h | 35 +- Marlin/src/module/configuration_store.cpp | 226 +- Marlin/src/module/configuration_store.h | 2 +- Marlin/src/module/delta.cpp | 85 +- Marlin/src/module/delta.h | 41 +- Marlin/src/module/endstops.cpp | 54 +- Marlin/src/module/motion.cpp | 371 ++- Marlin/src/module/motion.h | 101 +- Marlin/src/module/planner.cpp | 567 ++-- Marlin/src/module/planner.h | 138 +- Marlin/src/module/planner_bezier.cpp | 54 +- Marlin/src/module/planner_bezier.h | 9 +- Marlin/src/module/probe.cpp | 90 +- Marlin/src/module/probe.h | 18 +- Marlin/src/module/scara.cpp | 43 +- Marlin/src/module/scara.h | 6 +- Marlin/src/module/stepper.cpp | 117 +- Marlin/src/module/stepper.h | 28 +- Marlin/src/module/stepper/trinamic.cpp | 91 +- Marlin/src/module/temperature.cpp | 147 +- Marlin/src/module/temperature.h | 119 +- Marlin/src/module/thermistor/thermistor_99.h | 64 + Marlin/src/module/thermistor/thermistors.h | 3 + Marlin/src/module/tool_change.cpp | 175 +- Marlin/src/module/tool_change.h | 3 +- .../src/pins/lpc1768/pins_BIGTREE_SKR_V1.3.h | 28 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 2 +- Marlin/src/pins/pins.h | 51 +- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 8 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 6 + Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI.h | 1 - .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 10 +- .../src/pins/stm32/pins_BIGTREE_SKR_E3_DIP.h | 8 +- .../src/pins/stm32/pins_BIGTREE_SKR_MINI_E3.h | 8 +- .../pins/stm32/pins_BIGTREE_SKR_MINI_V1_1.h | 15 +- .../pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h | 7 + .../pins/stm32/pins_BTT_SKR_MINI_E3_V1_2.h | 167 + Marlin/src/pins/stm32/pins_MALYAN_M200.h | 16 +- Marlin/src/pins/stm32/pins_MKS_ROBIN.h | 43 +- Marlin/src/sd/Sd2Card.cpp | 21 +- Marlin/src/sd/cardreader.cpp | 353 ++- Marlin/src/sd/cardreader.h | 157 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 12 +- .../sd/usb_flashdrive/lib-uhs2/parsetools.h | 2 +- .../UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h | 34 +- .../lib-uhs3/UHS_host/UHS_printf_HELPER.h | 4 +- .../lib-uhs3/UHS_host/macro_logic.h | 4 +- .../lib-uhs3/dyn_SWI/SWI_INLINE.h | 4 +- .../usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h | 8 +- README.md | 2 +- buildroot/bin/generate_version | 101 +- ...F1_SKR_MINI.ld => STM32F103RC_SKR_MINI.ld} | 0 ...{longer_STM32.ld => STM32F103VE_longer.ld} | 0 ...F1_SKR_MINI.py => STM32F103RC_SKR_MINI.py} | 2 +- ...2F103R_fysetc.py => STM32F103RC_fysetc.py} | 0 ...{longer_STM32.py => STM32F103VE_longer.py} | 2 +- .../share/PlatformIO/scripts/mks_robin.py | 3 + .../PlatformIO/scripts/mks_robin_lite.py | 3 + .../PlatformIO/scripts/mks_robin_mini.py | 3 + .../PlatformIO/scripts/mks_robin_nano.py | 3 + buildroot/share/fonts/genallfont.sh | 2 +- buildroot/share/fonts/marlin-6x12-3.bdf | 498 +-- buildroot/share/git/firstpush | 8 +- buildroot/share/git/mfdoc | 8 +- buildroot/share/git/mfpr | 8 +- buildroot/share/git/mfpub | 16 +- buildroot/share/git/mftest | 34 +- buildroot/share/tests/DUE-tests | 10 +- ...yanm200-tests => STM32F103CB_malyan-tests} | 2 +- ...igtree-tests => STM32F103RC_bigtree-tests} | 2 +- .../share/tests/STM32F103RC_bigtree_USB-tests | 19 + ..._fysetc-tests => STM32F103RC_fysetc-tests} | 2 +- .../{STM32F103R-tests => STM32F103RE-tests} | 2 +- ..._longer-tests => STM32F103VE_longer-tests} | 0 buildroot/share/tests/esp32-tests | 4 +- buildroot/share/tests/megaatmega1280-tests | 1 + buildroot/share/tests/megaatmega2560-tests | 36 +- buildroot/share/tests/teensy31-tests | 4 +- .../share/vscode/AutoBuildMarlin/README.md | 8 +- .../share/vscode/AutoBuildMarlin/extension.js | 30 +- .../share/vscode/AutoBuildMarlin/package.json | 68 +- config/default/Configuration.h | 55 +- config/default/Configuration_adv.h | 88 +- .../examples/3DFabXYZ/Migbot/Configuration.h | 55 +- .../3DFabXYZ/Migbot/Configuration_adv.h | 88 +- .../ADIMLab/Gantry v1/Configuration.h | 40 +- .../ADIMLab/Gantry v1/Configuration_adv.h | 88 +- .../ADIMLab/{ => Gantry v1}/_Bootscreen.h | 0 .../ADIMLab/Gantry v2/Configuration.h | 55 +- .../ADIMLab/Gantry v2/Configuration_adv.h | 88 +- .../examples/ADIMLab/Gantry v2/_Bootscreen.h | 86 + .../AlephObjects/TAZ4/Configuration.h | 55 +- .../AlephObjects/TAZ4/Configuration_adv.h | 88 +- .../Alfawise/U20-bltouch/Configuration.h | 78 +- .../Alfawise/U20-bltouch/Configuration_adv.h | 88 +- config/examples/Alfawise/U20/Configuration.h | 78 +- .../examples/Alfawise/U20/Configuration_adv.h | 88 +- .../AliExpress/CL-260/Configuration.h | 55 +- .../AliExpress/UM2pExt/Configuration.h | 55 +- .../AliExpress/UM2pExt/Configuration_adv.h | 88 +- config/examples/Anet/A2/Configuration.h | 55 +- config/examples/Anet/A2/Configuration_adv.h | 88 +- config/examples/Anet/A2plus/Configuration.h | 55 +- .../examples/Anet/A2plus/Configuration_adv.h | 88 +- config/examples/Anet/A6/Configuration.h | 65 +- config/examples/Anet/A6/Configuration_adv.h | 88 +- config/examples/Anet/A6/_Statusscreen.h | 56 + config/examples/Anet/A8/Configuration.h | 55 +- config/examples/Anet/A8/Configuration_adv.h | 88 +- config/examples/Anet/A8/_Statusscreen.h | 56 + config/examples/Anet/A8plus/Configuration.h | 55 +- .../examples/Anet/A8plus/Configuration_adv.h | 88 +- config/examples/Anet/A8plus/_Statusscreen.h | 66 + config/examples/Anet/E16/Configuration.h | 55 +- config/examples/Anet/E16/Configuration_adv.h | 88 +- config/examples/AnyCubic/i3/Configuration.h | 55 +- .../examples/AnyCubic/i3/Configuration_adv.h | 88 +- config/examples/ArmEd/Configuration.h | 55 +- config/examples/ArmEd/Configuration_adv.h | 88 +- config/examples/Azteeg/X5GT/Configuration.h | 55 +- .../BIBO/TouchX/cyclops/Configuration.h | 55 +- .../BIBO/TouchX/cyclops/Configuration_adv.h | 88 +- .../BIBO/TouchX/default/Configuration.h | 55 +- .../BIBO/TouchX/default/Configuration_adv.h | 88 +- config/examples/BQ/Hephestos/Configuration.h | 55 +- .../examples/BQ/Hephestos/Configuration_adv.h | 88 +- .../examples/BQ/Hephestos_2/Configuration.h | 55 +- .../BQ/Hephestos_2/Configuration_adv.h | 88 +- config/examples/BQ/WITBOX/Configuration.h | 55 +- config/examples/BQ/WITBOX/Configuration_adv.h | 88 +- config/examples/Cartesio/Configuration.h | 55 +- config/examples/Cartesio/Configuration_adv.h | 88 +- .../examples/Creality/CR-10/Configuration.h | 55 +- .../Creality/CR-10/Configuration_adv.h | 88 +- .../examples/Creality/CR-10S/Configuration.h | 55 +- .../Creality/CR-10S/Configuration_adv.h | 88 +- .../Creality/CR-10_5S/Configuration.h | 55 +- .../Creality/CR-10_5S/Configuration_adv.h | 88 +- .../Creality/CR-10mini/Configuration.h | 55 +- .../Creality/CR-10mini/Configuration_adv.h | 88 +- .../Creality/CR-20 Pro/Configuration.h | 55 +- .../Creality/CR-20 Pro/Configuration_adv.h | 88 +- .../examples/Creality/CR-20/Configuration.h | 55 +- .../Creality/CR-20/Configuration_adv.h | 88 +- config/examples/Creality/CR-8/Configuration.h | 55 +- .../Creality/CR-8/Configuration_adv.h | 88 +- .../examples/Creality/Ender-2/Configuration.h | 55 +- .../Creality/Ender-2/Configuration_adv.h | 88 +- .../examples/Creality/Ender-3/Configuration.h | 55 +- .../Creality/Ender-3/Configuration_adv.h | 88 +- .../examples/Creality/Ender-4/Configuration.h | 55 +- .../Creality/Ender-4/Configuration_adv.h | 88 +- .../examples/Creality/Ender-5/Configuration.h | 55 +- .../Creality/Ender-5/Configuration_adv.h | 88 +- .../Dagoma/Disco Ultimate/Configuration.h | 55 +- .../Dagoma/Disco Ultimate/Configuration_adv.h | 88 +- .../Sidewinder X1/Configuration.h | 55 +- .../Sidewinder X1/Configuration_adv.h | 88 +- config/examples/Einstart-S/Configuration.h | 55 +- .../examples/Einstart-S/Configuration_adv.h | 88 +- .../Cheetah 1.2/BLTouch/Configuration.h | 55 +- .../Cheetah 1.2/BLTouch/Configuration_adv.h | 88 +- .../FYSETC/Cheetah 1.2/base/Configuration.h | 55 +- .../Cheetah 1.2/base/Configuration_adv.h | 88 +- .../FYSETC/Cheetah/BLTouch/Configuration.h | 53 +- .../Cheetah/BLTouch/Configuration_adv.h | 88 +- .../FYSETC/Cheetah/base/Configuration.h | 55 +- .../FYSETC/Cheetah/base/Configuration_adv.h | 88 +- config/examples/Felix/DUAL/Configuration.h | 55 +- .../Felix/{ => DUAL}/Configuration_adv.h | 88 +- config/examples/Felix/{ => DUAL}/README.md | 0 .../Felix/{ => Single}/Configuration.h | 55 +- .../examples/Felix/Single/Configuration_adv.h | 2784 +++++++++++++++++ config/examples/Felix/Single/README.md | 60 + .../FlashForge/CreatorPro/Configuration.h | 55 +- .../FlashForge/CreatorPro/Configuration_adv.h | 88 +- .../FolgerTech/i3-2020/Configuration.h | 55 +- .../FolgerTech/i3-2020/Configuration_adv.h | 88 +- .../examples/Formbot/Raptor/Configuration.h | 55 +- .../Formbot/Raptor/Configuration_adv.h | 88 +- .../examples/Formbot/T_Rex_2+/Configuration.h | 55 +- .../Formbot/T_Rex_2+/Configuration_adv.h | 83 +- .../examples/Formbot/T_Rex_3/Configuration.h | 59 +- .../Formbot/T_Rex_3/Configuration_adv.h | 88 +- config/examples/Fysetc/AIO_II/Configuration.h | 55 +- .../Fysetc/AIO_II/Configuration_adv.h | 88 +- config/examples/Fysetc/F6_13/Configuration.h | 55 +- .../examples/Fysetc/F6_13/Configuration_adv.h | 88 +- config/examples/Geeetech/A10/Configuration.h | 55 +- .../examples/Geeetech/A10/Configuration_adv.h | 88 +- config/examples/Geeetech/A10M/Configuration.h | 55 +- .../Geeetech/A10M/Configuration_adv.h | 88 +- config/examples/Geeetech/A20M/Configuration.h | 55 +- .../Geeetech/A20M/Configuration_adv.h | 88 +- .../examples/Geeetech/GT2560/Configuration.h | 55 +- .../Geeetech/I3_Pro_X-GT2560/Configuration.h | 55 +- .../Geeetech/MeCreator2/Configuration.h | 59 +- .../Geeetech/MeCreator2/Configuration_adv.h | 88 +- .../Prusa i3 Pro B/bltouch/Configuration.h | 55 +- .../Prusa i3 Pro B/{ => bltouch}/README.md | 0 .../Prusa i3 Pro B/noprobe/Configuration.h | 55 +- .../Geeetech/Prusa i3 Pro B/noprobe/README.md | 54 + .../Geeetech/Prusa i3 Pro C/Configuration.h | 55 +- .../Prusa i3 Pro C/Configuration_adv.h | 88 +- .../Geeetech/Prusa i3 Pro W/Configuration.h | 55 +- .../Prusa i3 Pro W/Configuration_adv.h | 88 +- config/examples/HMS434/Configuration.h | 55 +- config/examples/HMS434/Configuration_adv.h | 88 +- .../examples/Infitary/i3-M508/Configuration.h | 55 +- .../Infitary/i3-M508/Configuration_adv.h | 88 +- config/examples/JGAurora/A1/Configuration.h | 40 +- .../examples/JGAurora/A1/Configuration_adv.h | 88 +- config/examples/JGAurora/A5/Configuration.h | 55 +- .../examples/JGAurora/A5/Configuration_adv.h | 88 +- config/examples/JGAurora/A5S/Configuration.h | 40 +- .../examples/JGAurora/A5S/Configuration_adv.h | 88 +- config/examples/MakerParts/Configuration.h | 81 +- .../examples/MakerParts/Configuration_adv.h | 88 +- config/examples/Malyan/M150/Configuration.h | 55 +- .../examples/Malyan/M150/Configuration_adv.h | 88 +- config/examples/Malyan/M200/Configuration.h | 92 +- .../examples/Malyan/M200/Configuration_adv.h | 96 +- .../Micromake/C1/basic/Configuration.h | 55 +- .../Micromake/C1/{ => basic}/README.md | 0 .../Micromake/C1/enhanced/Configuration.h | 55 +- .../Micromake/C1/enhanced/Configuration_adv.h | 88 +- .../examples/Micromake/C1/enhanced/README.md | 15 + config/examples/Mks/Robin/Configuration.h | 55 +- config/examples/Mks/Robin/Configuration_adv.h | 88 +- config/examples/Mks/Sbase/Configuration.h | 55 +- config/examples/Mks/Sbase/Configuration_adv.h | 88 +- ...raphic_Smart_Controller.txt => README.txt} | 0 .../Printrbot/PrintrboardG2/Configuration.h | 60 +- .../examples/RapideLite/RL200/Configuration.h | 57 +- .../RapideLite/RL200/Configuration_adv.h | 88 +- .../examples/RepRapPro/Huxley/Configuration.h | 55 +- .../RepRapWorld/Megatronics/Configuration.h | 55 +- config/examples/RigidBot/Configuration.h | 55 +- config/examples/RigidBot/Configuration_adv.h | 88 +- config/examples/SCARA/Configuration.h | 55 +- config/examples/SCARA/Configuration_adv.h | 88 +- .../STM32/Black_STM32F407VET6/Configuration.h | 55 +- .../Black_STM32F407VET6/Configuration_adv.h | 88 +- .../Configuration.h | 57 +- config/examples/STM32/STM32F4/Configuration.h | 55 +- .../STM32/stm32f103ret6/Configuration.h | 57 +- config/examples/Sanguinololu/Configuration.h | 55 +- .../examples/Sanguinololu/Configuration_adv.h | 88 +- .../Tevo/Michelangelo/Configuration.h | 55 +- .../Tevo/Michelangelo/Configuration_adv.h | 88 +- .../Tevo/Tarantula Pro/Configuration.h | 55 +- .../Tevo/Tarantula Pro/Configuration_adv.h | 92 +- .../Tornado/V1 (MKS Base)/Configuration.h | 40 +- .../Tornado/V1 (MKS Base)/Configuration_adv.h | 88 +- .../Tornado/V2 (MKS GEN-L)/Configuration.h | 40 +- .../V2 (MKS GEN-L)/Configuration_adv.h | 88 +- config/examples/TheBorg/Configuration.h | 55 +- config/examples/TheBorg/Configuration_adv.h | 88 +- config/examples/TinyBoy2/Configuration.h | 55 +- config/examples/TinyBoy2/Configuration_adv.h | 88 +- config/examples/Tronxy/X1/Configuration.h | 55 +- config/examples/Tronxy/X3A/Configuration.h | 55 +- .../examples/Tronxy/X3A/Configuration_adv.h | 88 +- config/examples/Tronxy/X5S-2E/Configuration.h | 55 +- .../Tronxy/X5S-2E/Configuration_adv.h | 88 +- config/examples/Tronxy/X5S/Configuration.h | 55 +- config/examples/Tronxy/XY100/Configuration.h | 55 +- .../UltiMachine/Archim1/Configuration.h | 55 +- .../UltiMachine/Archim1/Configuration_adv.h | 88 +- .../UltiMachine/Archim2/Configuration.h | 55 +- .../UltiMachine/Archim2/Configuration_adv.h | 88 +- config/examples/VORONDesign/Configuration.h | 55 +- .../examples/VORONDesign/Configuration_adv.h | 88 +- .../examples/Velleman/K8200/Configuration.h | 55 +- .../Velleman/K8200/Configuration_adv.h | 88 +- .../Velleman/K8400/Dual-head/Configuration.h | 55 +- .../K8400/{ => Dual-head}/Configuration_adv.h | 88 +- .../Velleman/K8400/{ => Dual-head}/README.md | 0 .../K8400/{ => Single-head}/Configuration.h | 55 +- .../K8400/Single-head/Configuration_adv.h | 2784 +++++++++++++++++ .../Velleman/K8400/Single-head/README.md | 15 + .../examples/WASP/PowerWASP/Configuration.h | 55 +- .../WASP/PowerWASP/Configuration_adv.h | 88 +- .../Wanhao/Duplicator 6/Configuration.h | 55 +- .../Wanhao/Duplicator 6/Configuration_adv.h | 88 +- .../Duplicator i3 2.1/Chippy_Bootscreen.h | 74 + .../Wanhao/Duplicator i3 2.1/Configuration.h | 2227 +++++++++++++ .../Duplicator i3 2.1/Configuration_adv.h | 2718 ++++++++++++++++ .../Wanhao/Duplicator i3 2.1/README.md | 21 + .../Wanhao/Duplicator i3 2.1/_Bootscreen.h | 72 + .../Wanhao/Duplicator i3 Mini/Configuration.h | 55 +- .../Duplicator i3 Mini/Configuration_adv.h | 88 +- .../examples/adafruit/ST7565/Configuration.h | 55 +- .../delta/Anycubic/Kossel/Configuration.h | 55 +- .../delta/Anycubic/Kossel/Configuration_adv.h | 88 +- .../delta/Dreammaker/Overlord/Configuration.h | 40 +- .../Dreammaker/Overlord/Configuration_adv.h | 88 +- .../Dreammaker/Overlord_Pro/Configuration.h | 40 +- .../Overlord_Pro/Configuration_adv.h | 88 +- .../FLSUN/auto_calibrate/Configuration.h | 55 +- .../FLSUN/auto_calibrate/Configuration_adv.h | 88 +- .../delta/FLSUN/kossel/Configuration.h | 55 +- .../delta/FLSUN/kossel/Configuration_adv.h | 88 +- .../delta/FLSUN/kossel_mini/Configuration.h | 55 +- .../FLSUN/kossel_mini/Configuration_adv.h | 88 +- .../Geeetech/Rostock 301/Configuration.h | 55 +- .../Geeetech/Rostock 301/Configuration_adv.h | 88 +- .../delta/Hatchbox_Alpha/Configuration.h | 55 +- .../examples/delta/MKS/SBASE/Configuration.h | 55 +- .../delta/MKS/SBASE/Configuration_adv.h | 88 +- .../delta/Tevo Little Monster/Configuration.h | 55 +- .../Tevo Little Monster/Configuration_adv.h | 88 +- config/examples/delta/generic/Configuration.h | 55 +- .../delta/generic/Configuration_adv.h | 88 +- .../delta/kossel_mini/Configuration.h | 55 +- .../delta/kossel_mini/Configuration_adv.h | 88 +- .../examples/delta/kossel_pro/Configuration.h | 55 +- .../examples/delta/kossel_xl/Configuration.h | 55 +- .../delta/kossel_xl/Configuration_adv.h | 88 +- .../examples/gCreate/gMax1.5+/Configuration.h | 55 +- .../gCreate/gMax1.5+/Configuration_adv.h | 88 +- config/examples/makibox/Configuration.h | 55 +- config/examples/makibox/Configuration_adv.h | 88 +- config/examples/tvrrug/Round2/Configuration.h | 55 +- .../tvrrug/Round2/Configuration_adv.h | 88 +- config/examples/wt150/Configuration.h | 55 +- config/examples/wt150/Configuration_adv.h | 88 +- platformio.ini | 30 +- 657 files changed, 40572 insertions(+), 24319 deletions(-) create mode 100644 Marlin/Version.h delete mode 100644 Marlin/src/core/enum.h create mode 100644 Marlin/src/core/multi_language.cpp create mode 100644 Marlin/src/core/multi_language.h create mode 100644 Marlin/src/core/types.h rename Marlin/src/lcd/dogm/fontdata/{langdata_el-gr.h => langdata_el_gr.h} (100%) delete mode 100644 Marlin/src/lcd/dogm/fontdata/langdata_jp-kana.h create mode 100644 Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h rename Marlin/src/lcd/dogm/fontdata/{langdata_pt-br.h => langdata_pt_br.h} (100%) delete mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/language/languages.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_start_print_dialog_box.cpp delete mode 100644 Marlin/src/lcd/language/language_el-gr.h create mode 100644 Marlin/src/lcd/language/language_el_gr.h delete mode 100644 Marlin/src/lcd/language/language_jp-kana.h create mode 100644 Marlin/src/lcd/language/language_jp_kana.h delete mode 100644 Marlin/src/lcd/language/language_pt-br.h create mode 100644 Marlin/src/lcd/language/language_pt_br.h delete mode 100644 Marlin/src/libs/point_t.h create mode 100644 Marlin/src/module/thermistor/thermistor_99.h create mode 100644 Marlin/src/pins/stm32/pins_BTT_SKR_MINI_E3_V1_2.h rename buildroot/share/PlatformIO/ldscripts/{STM32F1_SKR_MINI.ld => STM32F103RC_SKR_MINI.ld} (100%) rename buildroot/share/PlatformIO/ldscripts/{longer_STM32.ld => STM32F103VE_longer.ld} (100%) rename buildroot/share/PlatformIO/scripts/{STM32F1_SKR_MINI.py => STM32F103RC_SKR_MINI.py} (91%) rename buildroot/share/PlatformIO/scripts/{STM32F103R_fysetc.py => STM32F103RC_fysetc.py} (100%) rename buildroot/share/PlatformIO/scripts/{longer_STM32.py => STM32F103VE_longer.py} (97%) rename buildroot/share/tests/{malyanm200-tests => STM32F103CB_malyan-tests} (78%) rename buildroot/share/tests/{STM32F103R_bigtree-tests => STM32F103RC_bigtree-tests} (84%) create mode 100644 buildroot/share/tests/STM32F103RC_bigtree_USB-tests rename buildroot/share/tests/{STM32F103R_fysetc-tests => STM32F103RC_fysetc-tests} (85%) rename buildroot/share/tests/{STM32F103R-tests => STM32F103RE-tests} (94%) rename buildroot/share/tests/{STM32F103V_longer-tests => STM32F103VE_longer-tests} (100%) rename config/examples/ADIMLab/{ => Gantry v1}/_Bootscreen.h (100%) create mode 100644 config/examples/ADIMLab/Gantry v2/_Bootscreen.h create mode 100644 config/examples/Anet/A6/_Statusscreen.h create mode 100644 config/examples/Anet/A8/_Statusscreen.h create mode 100644 config/examples/Anet/A8plus/_Statusscreen.h rename config/examples/Felix/{ => DUAL}/Configuration_adv.h (98%) rename config/examples/Felix/{ => DUAL}/README.md (100%) rename config/examples/Felix/{ => Single}/Configuration.h (97%) create mode 100644 config/examples/Felix/Single/Configuration_adv.h create mode 100644 config/examples/Felix/Single/README.md rename config/examples/Geeetech/Prusa i3 Pro B/{ => bltouch}/README.md (100%) create mode 100644 config/examples/Geeetech/Prusa i3 Pro B/noprobe/README.md rename config/examples/Micromake/C1/{ => basic}/README.md (100%) create mode 100644 config/examples/Micromake/C1/enhanced/README.md rename config/examples/Mks/Sbase/{000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt => README.txt} (100%) rename config/examples/STM32/{STM32F103R => STM32F103RE}/Configuration.h (97%) rename config/examples/Velleman/K8400/{ => Dual-head}/Configuration_adv.h (98%) rename config/examples/Velleman/K8400/{ => Dual-head}/README.md (100%) rename config/examples/Velleman/K8400/{ => Single-head}/Configuration.h (97%) create mode 100644 config/examples/Velleman/K8400/Single-head/Configuration_adv.h create mode 100644 config/examples/Velleman/K8400/Single-head/README.md create mode 100644 config/examples/Wanhao/Duplicator i3 2.1/Chippy_Bootscreen.h create mode 100644 config/examples/Wanhao/Duplicator i3 2.1/Configuration.h create mode 100644 config/examples/Wanhao/Duplicator i3 2.1/Configuration_adv.h create mode 100644 config/examples/Wanhao/Duplicator i3 2.1/README.md create mode 100644 config/examples/Wanhao/Duplicator i3 2.1/_Bootscreen.h diff --git a/.circleci/config.yml b/.circleci/config.yml index cb8c31b22b..d474f034ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,8 +51,8 @@ jobs: export PATH=`pwd`/buildroot/bin/:${PATH} # Generate custom version include - generate_version ./Marlin/src/inc - cat ./Marlin/src/inc/_Version.h + generate_version ./Marlin/ + cat ./Marlin/Version.h # # Back up pins_RAMPS.h # @@ -240,10 +240,10 @@ jobs: build_marlin_pio ./ ${TEST_PLATFORM} restore_configs echo testing STM32F1 targets... - export TEST_PLATFORM="-e STM32F103R" + export TEST_PLATFORM="-e STM32F103RE" restore_configs - echo use_example_configs STM32/STM32F103R - use_example_configs STM32/STM32F103R + echo use_example_configs STM32/STM32F103RE + use_example_configs STM32/STM32F103RE build_marlin_pio ./ ${TEST_PLATFORM} restore_configs echo use_example_configs STM32/stm32f103ret6 diff --git a/.travis.yml b/.travis.yml index cfd6a67556..d3acf40cbf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,8 @@ env: - TEST_PLATFORM="DUE" - TEST_PLATFORM="esp32" - TEST_PLATFORM="linux_native" - - TEST_PLATFORM="LPC1768" - - TEST_PLATFORM="LPC1769" - TEST_PLATFORM="megaatmega2560" - - TEST_PLATFORM="STM32F103R" + - TEST_PLATFORM="STM32F103RE" - TEST_PLATFORM="teensy31" - TEST_PLATFORM="teensy35" @@ -31,22 +29,27 @@ env: - TEST_PLATFORM="ARMED" - TEST_PLATFORM="BIGTREE_BTT002" - TEST_PLATFORM="BIGTREE_SKR_PRO" - - TEST_PLATFORM="STM32F103R_bigtree" + - TEST_PLATFORM="STM32F103RC_bigtree" - TEST_PLATFORM="jgaurora_a5s_a1" - - TEST_PLATFORM="STM32F103V_longer" + - TEST_PLATFORM="STM32F103VE_longer" - TEST_PLATFORM="STM32F407VE_black" + - TEST_PLATFORM="mks_robin" + + # Put lengthy tests last + - TEST_PLATFORM="LPC1768" + - TEST_PLATFORM="LPC1769" # Non-working environment tests #- TEST_PLATFORM="at90usb1286_cdc" #- TEST_PLATFORM="at90usb1286_dfu" - #- TEST_PLATFORM="malyanm200" - #- TEST_PLATFORM="mks_robin" + #- TEST_PLATFORM="STM32F103CB_malyan" #- TEST_PLATFORM="mks_robin_lite" #- TEST_PLATFORM="mks_robin_mini" #- TEST_PLATFORM="mks_robin_nano" #- TEST_PLATFORM="SAMD51_grandcentral_m4" - #- TEST_PLATFORM="STM32F103R_bigtree" - #- TEST_PLATFORM="STM32F103R_fysetc" + #- TEST_PLATFORM="STM32F103RC_bigtree" + #- TEST_PLATFORM="STM32F103RC_bigtree_USB" + #- TEST_PLATFORM="STM32F103RC_fysetc" #- TEST_PLATFORM="STM32F4" #- TEST_PLATFORM="STM32F7" @@ -72,8 +75,8 @@ before_script: - cd ${TRAVIS_BUILD_DIR} # # Generate custom version include - - generate_version ${TRAVIS_BUILD_DIR}/Marlin/src/inc - - cat ${TRAVIS_BUILD_DIR}/Marlin/src/inc/_Version.h + - generate_version ${TRAVIS_BUILD_DIR}/Marlin/ + - cat ${TRAVIS_BUILD_DIR}/Marlin/Version.h # script: - run_tests ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0ea7198b3b..1d86709d9f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1,6 +1,6 @@ //#define PetsfangMicroswiss //#define BondtechBMG -//#define CR10SPro_GearedExtruder +#define CR10SPro_GearedExtruder //#define E3DV6 //#define FilamentSensorStd @@ -95,6 +95,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Tinymachines3D" // Who made the changes. +#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -412,6 +413,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -429,8 +431,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #if ENABLED(E3DV6) #define TEMP_SENSOR_0 5 @@ -558,7 +558,7 @@ #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current #if ENABLED(PIDTEMPBED) - + //#define MIN_BED_POWER 0 //#define PID_BED_DEBUG // Sends debug data to the serial port. //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) @@ -817,7 +817,12 @@ * Override with M203 * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ -#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 70 } + +#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 1000, 1000, 10, 150 } // ...or, set your own edit limits +#endif /** * Default Max Acceleration (change/s) change = mm/s @@ -827,6 +832,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 4000, 2000, 100, 2000 } +#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 7000, 4000, 200, 5000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -840,35 +850,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.06 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.06 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1691,10 +1704,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en @@ -1744,8 +1757,8 @@ * Enable one of the following items for a slower SPI transfer speed. * This may be required to resolve "volume init" errors. */ -#define SPI_SPEED SPI_HALF_SPEED -//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_HALF_SPEED +#define SPI_SPEED SPI_QUARTER_SPEED //#define SPI_SPEED SPI_EIGHTH_SPEED /** diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b347d15614..543f204200 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -607,12 +608,26 @@ #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] #if ENABLED(SX2) - #define Z_STEPPER_ALIGN_X { 50, 225 } - #define Z_STEPPER_ALIGN_Y { 100, 100 } + #define Z_STEPPER_ALIGN_XY { { 50, 100 }, { 225, 100 } } #else - #define Z_STEPPER_ALIGN_X { 50, 350 } - #define Z_STEPPER_ALIGN_Y { 200, 200 } + #define Z_STEPPER_ALIGN_XY { { 50, 200 }, { 350, 200 } } #endif + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 6 // Enable to restore leveling setup after operation @@ -621,10 +636,6 @@ // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 15 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -899,6 +910,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1816,91 +1832,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2126,7 +2142,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2134,7 +2150,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2142,7 +2158,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2150,7 +2166,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2158,7 +2174,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2166,7 +2182,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2174,7 +2190,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2182,7 +2198,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2190,7 +2206,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2198,7 +2214,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2206,7 +2222,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2214,7 +2230,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2222,7 +2238,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/Marlin/Version.h b/Marlin/Version.h new file mode 100644 index 0000000000..3cff3b6629 --- /dev/null +++ b/Marlin/Version.h @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +//////////////////////////// +// VENDOR VERSION EXAMPLE // +//////////////////////////// + +/** + * Marlin release version identifier + */ +#define SHORT_BUILD_VERSION "2.0.x_SX4H" + +/** + * Verbose version identifier which should contain a reference to the location + * from where the binary was downloaded or the source code was compiled. + */ +#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " TM3D" + +/** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ +#define STRING_DISTRIBUTION_DATE "2019-10-19" + +/** + * Defines a generic printer name to be output to the LCD after booting Marlin. + */ +#define MACHINE_NAME "TM3D SX4" + +/** + * The SOURCE_CODE_URL is the location where users will find the Marlin Source + * Code which is installed on the device. In most cases —unless the manufacturer + * has a distinct Github fork— the Source Code URL should just be the main + * Marlin repository. + */ +#define SOURCE_CODE_URL "https://github.com/InsanityAutomation/Marlin/tree/TM_SX4_2.0" + +/** + * Default generic printer UUID. + */ +//#define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" + +/** + * The WEBSITE_URL is the location where users can get more information such as + * documentation about a specific Marlin release. + */ +#define WEBSITE_URL "tinymachines3d.com" + +/** + * Set the vendor info the serial USB interface, if changable + * Currently only supported by DUE platform + */ +//#define USB_DEVICE_VENDOR_ID 0x0000 +//#define USB_DEVICE_PRODUCT_ID 0x0000 +//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index f3946902c8..cecdd8b67b 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -24,3 +24,9 @@ #include "platforms.h" #include HAL_PATH(.,HAL.h) + +inline void watchdog_refresh() { + #if ENABLED(USE_WATCHDOG) + HAL_watchdog_refresh(); + #endif +} diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h index 9c34dc1f54..246353677f 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL.h +++ b/Marlin/src/HAL/HAL_AVR/HAL.h @@ -146,8 +146,7 @@ extern "C" { #define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) #define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) -FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - UNUSED(frequency); +FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) { switch (timer_num) { case STEP_TIMER_NUM: // waveform generation = 0100 = CTC diff --git a/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp b/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp index 68e21aae53..7a0f7246ee 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/HAL_AVR/HAL_SPI.cpp @@ -184,15 +184,10 @@ void spiBegin() { // nop to tune soft SPI timing #define nop asm volatile ("\tnop\n") - // Set SPI rate - void spiInit(uint8_t spiRate) { - UNUSED(spiRate); // nothing to do - } + void spiInit(uint8_t) { /* do nothing */ } // Begin SPI transaction, set clock, bit order, data mode - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - UNUSED(spiBeginTransaction); // nothing to do - } + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ } // Soft SPI receive byte uint8_t spiRec() { diff --git a/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp b/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp index 282b70de71..4884ede63f 100644 --- a/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp +++ b/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp @@ -23,7 +23,7 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(FAST_PWM_FAN) +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_PWM #include "HAL.h" @@ -278,5 +278,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 } } -#endif // FAST_PWM_FAN +#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM #endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/pinsDebug.h b/Marlin/src/HAL/HAL_AVR/pinsDebug.h index fa70180947..e4738e0332 100644 --- a/Marlin/src/HAL/HAL_AVR/pinsDebug.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug.h @@ -227,18 +227,9 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); void com_print(uint8_t N, uint8_t Z) { const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); SERIAL_ECHOPGM(" COM"); - SERIAL_CHAR(N + '0'); - switch (Z) { - case 'A': - SERIAL_ECHOPAIR("A: ", ((*TCCRA & (_BV(7) | _BV(6))) >> 6)); - break; - case 'B': - SERIAL_ECHOPAIR("B: ", ((*TCCRA & (_BV(5) | _BV(4))) >> 4)); - break; - case 'C': - SERIAL_ECHOPAIR("C: ", ((*TCCRA & (_BV(3) | _BV(2))) >> 2)); - break; - } + SERIAL_CHAR('0' + N); + SERIAL_CHAR('A' + Z); + SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); } void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout diff --git a/Marlin/src/HAL/HAL_AVR/watchdog.h b/Marlin/src/HAL/HAL_AVR/watchdog.h index 5190d2c55a..efd725d7d7 100644 --- a/Marlin/src/HAL/HAL_AVR/watchdog.h +++ b/Marlin/src/HAL/HAL_AVR/watchdog.h @@ -28,4 +28,4 @@ void watchdog_init(); // Reset watchdog. MUST be called at least every 4 seconds after the // first watchdog_init or AVR will go into emergency procedures. -inline void watchdog_reset() { wdt_reset(); } +inline void HAL_watchdog_refresh() { wdt_reset(); } diff --git a/Marlin/src/HAL/HAL_DUE/HAL.cpp b/Marlin/src/HAL/HAL_DUE/HAL.cpp index 735ccc6317..130779896d 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL.cpp +++ b/Marlin/src/HAL/HAL_DUE/HAL.cpp @@ -87,7 +87,7 @@ extern "C" { // Return free memory between end of heap (or end bss) and whatever is current int freeMemory() { int free_memory, heap_end = (int)_sbrk(0); - return (int)&free_memory - (heap_end ? heap_end : (int)&_ebss); + return (int)&free_memory - (heap_end ?: (int)&_ebss); } // ------------------------ diff --git a/Marlin/src/HAL/HAL_DUE/HAL.h b/Marlin/src/HAL/HAL_DUE/HAL.h index 2be95b683a..54ade88e75 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL.h +++ b/Marlin/src/HAL/HAL_DUE/HAL.h @@ -38,22 +38,39 @@ #include -// Serial ports -#if !WITHIN(SERIAL_PORT, -1, 3) - #error "SERIAL_PORT must be from -1 to 3" +// Define MYSERIAL0/1 before MarlinSerial includes! +#if SERIAL_PORT == -1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#else + #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif -// MYSERIAL0 required before MarlinSerial includes! -#define MYSERIAL0 customizedSerial1 - #ifdef SERIAL_PORT_2 - #if !WITHIN(SERIAL_PORT_2, -1, 3) - #error "SERIAL_PORT_2 must be from -1 to 3" - #elif SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #if SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration." + #endif + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 0 + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 Serial3 + #else + #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif #define NUM_SERIAL 2 - #define MYSERIAL1 customizedSerial2 #else #define NUM_SERIAL 1 #endif diff --git a/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp b/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp index f942ff8082..35763a5ec7 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/HAL_DUE/HAL_SPI.cpp @@ -151,13 +151,12 @@ (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4) // run at ~8 .. ~10Mhz - Rx version (Tx line not altered) - static uint8_t spiTransferRx0(uint8_t bout) { // using Mode 0 + static uint8_t spiTransferRx0(uint8_t) { // using Mode 0 uint32_t bin = 0; uint32_t work = 0; uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ uint32_t SCK_MASK = PIN_MASK(SCK_PIN); - UNUSED(bout); /* The software SPI routine */ __asm__ __volatile__( diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp index 1bce07e53f..f7f48d5f42 100644 --- a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB.cpp @@ -55,12 +55,9 @@ static int pending_char = -1; #endif // Public Methods -void MarlinSerialUSB::begin(const long baud_setting) { - UNUSED(baud_setting); -} +void MarlinSerialUSB::begin(const long) {} -void MarlinSerialUSB::end() { -} +void MarlinSerialUSB::end() {} int MarlinSerialUSB::peek() { if (pending_char >= 0) diff --git a/Marlin/src/HAL/HAL_DUE/timers.cpp b/Marlin/src/HAL/HAL_DUE/timers.cpp index 57dd9f924f..6925f93498 100644 --- a/Marlin/src/HAL/HAL_DUE/timers.cpp +++ b/Marlin/src/HAL/HAL_DUE/timers.cpp @@ -50,7 +50,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] { TC0, 1, TC1_IRQn, 0}, // 1 { TC0, 2, TC2_IRQn, 2}, // 2 - stepper - { TC1, 0, TC3_IRQn, 0}, // 3 + { TC1, 0, TC3_IRQn, 0}, // 3 - stepper for BOARD_ARCHIM1 { TC1, 1, TC4_IRQn, 15}, // 4 - temperature { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3] { TC2, 0, TC6_IRQn, 14}, // 6 - tone diff --git a/Marlin/src/HAL/HAL_DUE/timers.h b/Marlin/src/HAL/HAL_DUE/timers.h index ba1eccb2f9..b7b2cf7341 100644 --- a/Marlin/src/HAL/HAL_DUE/timers.h +++ b/Marlin/src/HAL/HAL_DUE/timers.h @@ -39,7 +39,9 @@ typedef uint32_t hal_timer_t; #define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals +#ifndef STEP_TIMER_NUM #define STEP_TIMER_NUM 2 // index of timer to use for stepper +#endif #define TEMP_TIMER_NUM 4 // index of timer to use for temperature #define PULSE_TIMER_NUM STEP_TIMER_NUM #define TONE_TIMER_NUM 6 // index of timer to use for beeper tones @@ -61,7 +63,9 @@ typedef uint32_t hal_timer_t; #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) -#define HAL_STEP_TIMER_ISR() void TC2_Handler() +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void TC2_Handler() +#endif #define HAL_TEMP_TIMER_ISR() void TC4_Handler() #define HAL_TONE_TIMER_ISR() void TC6_Handler() diff --git a/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h index 6934494e57..8d5924d375 100644 --- a/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h @@ -48,9 +48,7 @@ #define _CONF_USB_H_ #undef UNUSED /* To avoid a macro clash as macros.h already defines it */ -#include "../../../core/macros.h" /* For ENABLED()/DISABLED() */ -#include "../../../core/boards.h" /* For MB() */ -#include "../../../../Configuration.h" /* For CUSTOM_MACHINE_NAME definition - We just need the name, no C++ allowed! */ +#include "../../../inc/MarlinConfigPre.h" #include "compiler.h" /** @@ -59,8 +57,6 @@ */ //! Device definition (mandatory) -#define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ -#define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ #define USB_DEVICE_MAJOR_VERSION 1 #define USB_DEVICE_MINOR_VERSION 0 #define USB_DEVICE_POWER 100 // Consumption on Vbus line (mA) @@ -70,15 +66,6 @@ // (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) // (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) -//! USB Device string definitions (Optional) -#define USB_DEVICE_MANUFACTURE_NAME "marlinfw.org" -#ifdef CUSTOM_MACHINE_NAME - #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME -#else - #define USB_DEVICE_PRODUCT_NAME "3D Printer" -#endif -#define USB_DEVICE_SERIAL_NAME "123985739853" - /** * Device speeds support * Low speed not supported by CDC and MSC diff --git a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp index 7699f2724f..b85a2b09a1 100644 --- a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp +++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp @@ -33,19 +33,12 @@ Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { return CTRL_GOOD; } -bool sd_mmc_spi_unload(bool unload) { - UNUSED(unload); - return true; -} +bool sd_mmc_spi_unload(bool) { return true; } -bool sd_mmc_spi_wr_protect() { - return false; -} +bool sd_mmc_spi_wr_protect() { return false; } bool sd_mmc_spi_removal() { - if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) - return true; - return false; + return (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()); } #if ACCESS_USB == true diff --git a/Marlin/src/HAL/HAL_DUE/watchdog.h b/Marlin/src/HAL/HAL_DUE/watchdog.h index 14832a9c3c..6e70adef81 100644 --- a/Marlin/src/HAL/HAL_DUE/watchdog.h +++ b/Marlin/src/HAL/HAL_DUE/watchdog.h @@ -30,4 +30,4 @@ void watchdog_init(); // Reset watchdog. MUST be called at least every 4 seconds after the // first watchdog_init or AVR will go into emergency procedures. -inline void watchdog_reset() { watchdogReset(); } +inline void HAL_watchdog_refresh() { watchdogReset(); } diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.cpp b/Marlin/src/HAL/HAL_ESP32/HAL.cpp index 9bf41c2e84..81567eeede 100644 --- a/Marlin/src/HAL/HAL_ESP32/HAL.cpp +++ b/Marlin/src/HAL/HAL_ESP32/HAL.cpp @@ -187,19 +187,21 @@ void HAL_adc_start_conversion(uint8_t adc_pin) { const adc1_channel_t chan = get_channel(adc_pin); uint32_t mv; esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv); + HAL_adc_result = mv * 1023.0 / 3300.0; // Change the attenuation level based on the new reading adc_atten_t atten; if (mv < thresholds[ADC_ATTEN_DB_0] - 100) - adc1_set_attenuation(chan, ADC_ATTEN_DB_0); + atten = ADC_ATTEN_DB_0; else if (mv > thresholds[ADC_ATTEN_DB_0] - 50 && mv < thresholds[ADC_ATTEN_DB_2_5] - 100) - adc1_set_attenuation(chan, ADC_ATTEN_DB_2_5); + atten = ADC_ATTEN_DB_2_5; else if (mv > thresholds[ADC_ATTEN_DB_2_5] - 50 && mv < thresholds[ADC_ATTEN_DB_6] - 100) - adc1_set_attenuation(chan, ADC_ATTEN_DB_6); + atten = ADC_ATTEN_DB_6; else if (mv > thresholds[ADC_ATTEN_DB_6] - 50) - adc1_set_attenuation(chan, ADC_ATTEN_DB_11); + atten = ADC_ATTEN_DB_11; + else return; - HAL_adc_result = mv * 1023.0 / 3300.0; + adc1_set_attenuation(chan, atten); } void analogWrite(pin_t pin, int value) { diff --git a/Marlin/src/HAL/HAL_ESP32/watchdog.h b/Marlin/src/HAL/HAL_ESP32/watchdog.h index e5dd3b46d3..6647ecefe6 100644 --- a/Marlin/src/HAL/HAL_ESP32/watchdog.h +++ b/Marlin/src/HAL/HAL_ESP32/watchdog.h @@ -25,4 +25,4 @@ void watchdog_init(); // Reset watchdog. -inline void watchdog_reset() { } +inline void HAL_watchdog_refresh() {} diff --git a/Marlin/src/HAL/HAL_LINUX/HAL.h b/Marlin/src/HAL/HAL_LINUX/HAL.h index 39d68a7a10..5bd283e5c1 100644 --- a/Marlin/src/HAL/HAL_LINUX/HAL.h +++ b/Marlin/src/HAL/HAL_LINUX/HAL.h @@ -78,7 +78,7 @@ extern HalSerial usb_serial; #define ENABLE_ISRS() #define DISABLE_ISRS() -inline void HAL_init() { } +inline void HAL_init() {} // Utility functions #pragma GCC diagnostic push @@ -97,6 +97,10 @@ void HAL_adc_enable_channel(int pin); void HAL_adc_start_conversion(const uint8_t adc_pin); uint16_t HAL_adc_get_result(); +// Reset source +inline void HAL_clear_reset_source(void) {} +inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } + /* ---------------- Delay in cycles */ FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { Clock::delayCycles(x); diff --git a/Marlin/src/HAL/HAL_LINUX/arduino.cpp b/Marlin/src/HAL/HAL_LINUX/arduino.cpp index 7915d685ea..88128dd91a 100644 --- a/Marlin/src/HAL/HAL_LINUX/arduino.cpp +++ b/Marlin/src/HAL/HAL_LINUX/arduino.cpp @@ -29,7 +29,7 @@ // Interrupts void cli() { } // Disable -void sei() { } // Enable +void sei() { } // Enable // Time functions void _delay_ms(const int delay_ms) { diff --git a/Marlin/src/HAL/HAL_LINUX/include/serial.h b/Marlin/src/HAL/HAL_LINUX/include/serial.h index 268bdeeeca..c6da82ad5a 100644 --- a/Marlin/src/HAL/HAL_LINUX/include/serial.h +++ b/Marlin/src/HAL/HAL_LINUX/include/serial.h @@ -83,9 +83,9 @@ public: HalSerial() { host_connected = true; } - void begin(int32_t baud) { } + void begin(int32_t) {} - void end() { } + void end() {} int peek() { uint8_t value; diff --git a/Marlin/src/HAL/HAL_LINUX/watchdog.cpp b/Marlin/src/HAL/HAL_LINUX/watchdog.cpp index a1ecac1cb5..6338ea3b1d 100644 --- a/Marlin/src/HAL/HAL_LINUX/watchdog.cpp +++ b/Marlin/src/HAL/HAL_LINUX/watchdog.cpp @@ -29,18 +29,8 @@ #include "watchdog.h" void watchdog_init() {} +void HAL_watchdog_refresh() {} -void HAL_clear_reset_source() {} - -uint8_t HAL_get_reset_source() { - return RST_POWER_ON; -} - -void watchdog_reset() {} - -#else - void HAL_clear_reset_source() {} - uint8_t HAL_get_reset_source() { return RST_POWER_ON; } -#endif // USE_WATCHDOG +#endif #endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/HAL_LINUX/watchdog.h b/Marlin/src/HAL/HAL_LINUX/watchdog.h index 5bc06f04f1..51d30c8437 100644 --- a/Marlin/src/HAL/HAL_LINUX/watchdog.h +++ b/Marlin/src/HAL/HAL_LINUX/watchdog.h @@ -24,6 +24,4 @@ #define WDT_TIMEOUT 4000000 // 4 second timeout void watchdog_init(); -void watchdog_reset(); -void HAL_clear_reset_source(); -uint8_t HAL_get_reset_source(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp index b684145e99..2607ecfb46 100644 --- a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp @@ -26,6 +26,10 @@ #include "../shared/Delay.h" #include "../../../gcode/parser.h" +#if ENABLED(USE_WATCHDOG) + #include "watchdog.h" +#endif + // U8glib required functions extern "C" void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); @@ -65,4 +69,17 @@ void flashFirmware(int16_t value) { NVIC_SystemReset(); } +void HAL_clear_reset_source(void) { + #if ENABLED(USE_WATCHDOG) + watchdog_clear_timeout_flag(); + #endif +} + +uint8_t HAL_get_reset_source(void) { + #if ENABLED(USE_WATCHDOG) + if (watchdog_timed_out()) return RST_WATCHDOG; + #endif + return RST_POWER_ON; +} + #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.h b/Marlin/src/HAL/HAL_LPC1768/HAL.h index cf2576de25..7ea6d288be 100644 --- a/Marlin/src/HAL/HAL_LPC1768/HAL.h +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.h @@ -164,3 +164,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired); * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] */ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); + +// Reset source +void HAL_clear_reset_source(void); +uint8_t HAL_get_reset_source(void); diff --git a/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h b/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h index 1f282f64a3..8050685538 100644 --- a/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/HAL_LPC1768/MarlinSerial.h @@ -49,7 +49,7 @@ public: { } - void end() { } + void end() {} #if ENABLED(EMERGENCY_PARSER) bool recv_callback(const char c) override { diff --git a/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp b/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp index 7af3a07eea..1cc2032778 100644 --- a/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/fast_pwm.cpp @@ -24,7 +24,7 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(FAST_PWM_FAN) +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_PWM #include @@ -36,5 +36,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); } -#endif // FAST_PWM_FAN +#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/main.cpp b/Marlin/src/HAL/HAL_LPC1768/main.cpp index ab5b184b47..b20841bdeb 100644 --- a/Marlin/src/HAL/HAL_LPC1768/main.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/main.cpp @@ -155,7 +155,7 @@ void HAL_idletask() { // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but // this will not reliably detect delete operations. To be safe we will lock - // the disk if Marlin has it mounted. Unfortuately there is currently no way + // the disk if Marlin has it mounted. Unfortunately there is currently no way // to unmount the disk from the LCD menu. // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) if (card.isMounted()) diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py index 44e0f09ad0..7f2a023630 100644 --- a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py @@ -31,7 +31,7 @@ try: # import subprocess # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' - driveStr = subprocess.check_output("fsutil fsinfo drives") + driveStr = subprocess.check_output("fsutil fsinfo drives").decode('utf8') # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' driveStr = driveStr.strip().lstrip('Drives: ') # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', @@ -44,7 +44,7 @@ try: for drive in drives: final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' try: - volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT) + volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT).decode('utf8') except Exception as e: continue else: diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp index 55e3628603..f122bf9984 100644 --- a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp @@ -56,28 +56,16 @@ void watchdog_init() { WDT_Start(WDT_TIMEOUT); } -void HAL_clear_reset_source() { - WDT_ClrTimeOutFlag(); -} - -uint8_t HAL_get_reset_source() { - if (TEST(WDT_ReadTimeOutFlag(), 0)) return RST_WATCHDOG; - return RST_POWER_ON; -} - -void watchdog_reset() { +void HAL_watchdog_refresh() { WDT_Feed(); #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) TOGGLE(LED_PIN); // heartbeat indicator #endif } -#else - -void watchdog_init() {} -void watchdog_reset() {} -void HAL_clear_reset_source() {} -uint8_t HAL_get_reset_source() { return RST_POWER_ON; } +// Timeout state +bool watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); } +void watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); } #endif // USE_WATCHDOG diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.h b/Marlin/src/HAL/HAL_LPC1768/watchdog.h index 5bc06f04f1..dd6617ea31 100644 --- a/Marlin/src/HAL/HAL_LPC1768/watchdog.h +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.h @@ -24,6 +24,7 @@ #define WDT_TIMEOUT 4000000 // 4 second timeout void watchdog_init(); -void watchdog_reset(); -void HAL_clear_reset_source(); -uint8_t HAL_get_reset_source(); +void HAL_watchdog_refresh(); + +bool watchdog_timed_out(); +void watchdog_clear_timeout_flag(); diff --git a/Marlin/src/HAL/HAL_SAMD51/HAL.cpp b/Marlin/src/HAL/HAL_SAMD51/HAL.cpp index d80dd17aab..1d7521270f 100644 --- a/Marlin/src/HAL/HAL_SAMD51/HAL.cpp +++ b/Marlin/src/HAL/HAL_SAMD51/HAL.cpp @@ -414,7 +414,7 @@ extern "C" { // Return free memory between end of heap (or end bss) and whatever is current int freeMemory() { int free_memory, heap_end = (int)_sbrk(0); - return (int)&free_memory - (heap_end ? heap_end : (int)&__bss_end__); + return (int)&free_memory - (heap_end ?: (int)&__bss_end__); } // ------------------------ diff --git a/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp b/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp index a60bcedd8a..69a6de4ef7 100644 --- a/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp +++ b/Marlin/src/HAL/HAL_SAMD51/watchdog.cpp @@ -42,7 +42,7 @@ WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset - watchdog_reset(); + HAL_watchdog_refresh(); WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode SYNC(WDT->SYNCBUSY.bit.ENABLE); diff --git a/Marlin/src/HAL/HAL_SAMD51/watchdog.h b/Marlin/src/HAL/HAL_SAMD51/watchdog.h index 1c4e7542f2..b626b0b06a 100644 --- a/Marlin/src/HAL/HAL_SAMD51/watchdog.h +++ b/Marlin/src/HAL/HAL_SAMD51/watchdog.h @@ -25,7 +25,7 @@ void watchdog_init(); // Reset watchdog. MUST be called at least every 4 seconds after the // first watchdog_init or SAMD will go into emergency procedures. -inline void watchdog_reset() { +inline void HAL_watchdog_refresh() { SYNC(WDT->SYNCBUSY.bit.CLEAR); // Test first if previous is 'ongoing' to save time waiting for command execution WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; } diff --git a/Marlin/src/HAL/HAL_STM32/HAL.cpp b/Marlin/src/HAL/HAL_STM32/HAL.cpp index 6ecde3ef35..edc161a5d3 100644 --- a/Marlin/src/HAL/HAL_STM32/HAL.cpp +++ b/Marlin/src/HAL/HAL_STM32/HAL.cpp @@ -104,17 +104,11 @@ extern "C" { // ADC // ------------------------ -void HAL_adc_start_conversion(const uint8_t adc_pin) { - HAL_adc_result = analogRead(adc_pin); -} +// TODO: Make sure this doesn't cause any delay +void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } -uint16_t HAL_adc_get_result() { - return HAL_adc_result; -} +uint16_t HAL_adc_get_result() { return HAL_adc_result; } -void flashFirmware(int16_t value) { - UNUSED(value); - NVIC_SystemReset(); -} +void flashFirmware(int16_t) { NVIC_SystemReset(); } #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/HAL_STM32/watchdog.cpp b/Marlin/src/HAL/HAL_STM32/watchdog.cpp index 8963d55cfc..4defadaa77 100644 --- a/Marlin/src/HAL/HAL_STM32/watchdog.cpp +++ b/Marlin/src/HAL/HAL_STM32/watchdog.cpp @@ -33,7 +33,7 @@ void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout - void watchdog_reset() { + void HAL_watchdog_refresh() { IWatchdog.reload(); #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) TOGGLE(LED_PIN); // heartbeat indicator diff --git a/Marlin/src/HAL/HAL_STM32/watchdog.h b/Marlin/src/HAL/HAL_STM32/watchdog.h index f062d8a2e6..6855016737 100644 --- a/Marlin/src/HAL/HAL_STM32/watchdog.h +++ b/Marlin/src/HAL/HAL_STM32/watchdog.h @@ -22,4 +22,4 @@ #pragma once void watchdog_init(); -void watchdog_reset(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp index e1f2e21ffd..cba41dd3c2 100644 --- a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp +++ b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp @@ -27,8 +27,8 @@ #ifdef __STM32F1__ -#include "HAL.h" #include "../../inc/MarlinConfig.h" +#include "HAL.h" #include @@ -233,7 +233,7 @@ void HAL_idletask() { // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but // this will not reliably detect delete operations. To be safe we will lock - // the disk if Marlin has it mounted. Unfortuately there is currently no way + // the disk if Marlin has it mounted. Unfortunately there is currently no way // to unmount the disk from the LCD menu. // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) /* copy from lpc1768 framework, should be fixed later for process SHARED_SD_CARD*/ diff --git a/Marlin/src/HAL/HAL_STM32F1/timers.cpp b/Marlin/src/HAL/HAL_STM32F1/timers.cpp index a21dc12c12..a1f5f1e453 100644 --- a/Marlin/src/HAL/HAL_STM32F1/timers.cpp +++ b/Marlin/src/HAL/HAL_STM32F1/timers.cpp @@ -26,8 +26,8 @@ #ifdef __STM32F1__ +#include "../../inc/MarlinConfig.h" #include "HAL.h" - #include "timers.h" // ------------------------ diff --git a/Marlin/src/HAL/HAL_STM32F1/timers.h b/Marlin/src/HAL/HAL_STM32F1/timers.h index 69793f4302..aba619fd10 100644 --- a/Marlin/src/HAL/HAL_STM32F1/timers.h +++ b/Marlin/src/HAL/HAL_STM32F1/timers.h @@ -27,6 +27,7 @@ #include #include +#include "../../core/boards.h" // ------------------------ // Defines @@ -54,7 +55,13 @@ typedef uint16_t hal_timer_t; #define TEMP_TIMER_NUM 2 // index of timer to use for temperature //#define TEMP_TIMER_NUM 4 // 2->4, Timer 2 for Stepper Current PWM #define PULSE_TIMER_NUM STEP_TIMER_NUM -#define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH + +#if MB(BIGTREE_SKR_MINI_E3, BIGTREE_SKR_E3_DIP, BTT_SKR_MINI_E3_V1_2, MKS_ROBIN_LITE) + // SKR Mini E3 boards use PA8 as FAN_PIN, so TIMER 1 is used for Fan PWM. + #define SERVO0_TIMER_NUM 8 +#else + #define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH +#endif #define STEP_TIMER_IRQ_PRIO 1 #define TEMP_TIMER_IRQ_PRIO 2 diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp b/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp index 5696939f30..17f5aa9725 100644 --- a/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog.cpp @@ -33,7 +33,7 @@ #include #include "watchdog.h" -void watchdog_reset() { +void HAL_watchdog_refresh() { #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) TOGGLE(LED_PIN); // heartbeat indicator #endif diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog.h b/Marlin/src/HAL/HAL_STM32F1/watchdog.h index 4f3a8deb0d..21f97dd7a1 100644 --- a/Marlin/src/HAL/HAL_STM32F1/watchdog.h +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog.h @@ -41,4 +41,4 @@ void watchdog_init(); // Reset watchdog. MUST be called at least every 4 seconds after the // first watchdog_init or STM32F1 will reset. -void watchdog_reset(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h b/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h index 1effe2d752..d4ca01e022 100644 --- a/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/HAL_STM32_F4_F7/HAL.h @@ -150,7 +150,7 @@ extern uint16_t HAL_adc_result; // Memory related #define __bss_end __bss_end__ -inline void HAL_init() { } +inline void HAL_init() {} // Clear reset reason void HAL_clear_reset_source(); diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp index e078d7a104..e51af618c9 100644 --- a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp +++ b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.cpp @@ -44,7 +44,7 @@ } } - void watchdog_reset() { + void HAL_watchdog_refresh() { /* Refresh IWDG: reload counter */ if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { /* Refresh Error */ diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h index cc02fda24f..9e2a2dc21c 100644 --- a/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h +++ b/Marlin/src/HAL/HAL_STM32_F4_F7/watchdog.h @@ -24,4 +24,4 @@ extern IWDG_HandleTypeDef hiwdg; void watchdog_init(); -void watchdog_reset(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h index 4813d60d69..e2df8df86b 100644 --- a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h @@ -87,7 +87,7 @@ typedef int8_t pin_t; #undef pgm_read_word #define pgm_read_word(addr) (*((uint16_t*)(addr))) -inline void HAL_init() { } +inline void HAL_init() {} // Clear the reset reason void HAL_clear_reset_source(); diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h index ceb041b457..861afcbc91 100644 --- a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h +++ b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog.h @@ -27,7 +27,7 @@ void watchdog_init(); -inline void watchdog_reset() { +inline void HAL_watchdog_refresh() { // Watchdog refresh sequence WDOG_REFRESH = 0xA602; WDOG_REFRESH = 0xB480; diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h index e218174ad3..9fc4ff6633 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h @@ -93,7 +93,7 @@ typedef int8_t pin_t; #undef pgm_read_word #define pgm_read_word(addr) (*((uint16_t*)(addr))) -inline void HAL_init() { } +inline void HAL_init() {} // Clear reset reason void HAL_clear_reset_source(); diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h index d2efaab372..7c27260906 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog.h @@ -23,7 +23,7 @@ void watchdog_init(); -inline void watchdog_reset() { +inline void HAL_watchdog_refresh() { // Watchdog refresh sequence WDOG_REFRESH = 0xA602; WDOG_REFRESH = 0xB480; diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index 1c2ee47c29..b3f8f246fb 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -53,7 +53,7 @@ FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) { const uint32_t endCycles = getCycleCount() + x; - while (PENDING(getCycleCount(), endCycles)) { } + while (PENDING(getCycleCount(), endCycles)) {} } #else diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp index 89501e9bfa..f130221821 100644 --- a/Marlin/src/Marlin.cpp +++ b/Marlin/src/Marlin.cpp @@ -173,10 +173,6 @@ #include "feature/prusa_MMU2/mmu2.h" #endif -#if ENABLED(EXTENSIBLE_UI) - #include "lcd/extensible_ui/ui_api.h" -#endif - #if HAS_DRIVER(L6470) #include "libs/L6470/L6470_Marlin.h" #endif @@ -279,6 +275,10 @@ void quickstop_stepper() { sync_plan_position(); } +void enable_e_steppers() { + enable_E0(); enable_E1(); enable_E2(); enable_E3(); enable_E4(); enable_E5(); +} + void enable_all_steppers() { #if ENABLED(AUTO_POWER_CONTROL) powerManager.power_on(); @@ -286,30 +286,11 @@ void enable_all_steppers() { enable_X(); enable_Y(); enable_Z(); - enable_E0(); - enable_E1(); - enable_E2(); - enable_E3(); - enable_E4(); - enable_E5(); -} - -void enable_e_steppers() { - enable_E0(); - enable_E1(); - enable_E2(); - enable_E3(); - enable_E4(); - enable_E5(); + enable_e_steppers(); } void disable_e_steppers() { - disable_E0(); - disable_E1(); - disable_E2(); - disable_E3(); - disable_E4(); - disable_E5(); + disable_E0(); disable_E1(); disable_E2(); disable_E3(); disable_E4(); disable_E5(); } void disable_e_stepper(const uint8_t e) { @@ -330,71 +311,6 @@ void disable_all_steppers() { disable_e_steppers(); } -#if HAS_FILAMENT_SENSOR - - void event_filament_runout() { - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout. - #endif - - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onFilamentRunout(ExtUI::getActiveTool()); - #endif - - #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; - #endif - - //action:out_of_filament - #if ENABLED(HOST_PROMPT_SUPPORT) - host_prompt_reason = PROMPT_FILAMENT_RUNOUT; - host_action_prompt_end(); - host_action_prompt_begin(PSTR("FilamentRunout T"), false); - SERIAL_CHAR(tool); - SERIAL_EOL(); - host_action_prompt_show(); - #endif - - const bool run_runout_script = !runout.host_handling; - - #if ENABLED(HOST_ACTION_COMMANDS) - if (run_runout_script - && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600") - || strstr(FILAMENT_RUNOUT_SCRIPT, "M125") - #if ENABLED(ADVANCED_PAUSE_FEATURE) - || strstr(FILAMENT_RUNOUT_SCRIPT, "M25") - #endif - ) - ) { - host_action_paused(false); - } - else { - // Legacy Repetier command for use until newer version supports standard dialog - // To be removed later when pause command also triggers dialog - #ifdef ACTION_ON_FILAMENT_RUNOUT - host_action(PSTR(ACTION_ON_FILAMENT_RUNOUT " T"), false); - SERIAL_CHAR(tool); - SERIAL_EOL(); - #endif - - host_action_pause(false); - } - SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " "); - SERIAL_CHAR(tool); - SERIAL_EOL(); - #endif // HOST_ACTION_COMMANDS - - if (run_runout_script) - queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); - } - -#endif // HAS_FILAMENT_SENSOR - #if ENABLED(G29_RETRY_AND_RECOVER) void event_probe_failure() { @@ -408,7 +324,7 @@ void disable_all_steppers() { #ifdef ACTION_ON_CANCEL host_action_cancel(); #endif - kill(PSTR(MSG_ERR_PROBING_FAILED)); + kill(GET_TEXT(MSG_LCD_PROBING_FAILED)); #endif } @@ -426,6 +342,20 @@ void disable_all_steppers() { #endif +/** + * Printing is active when the print job timer is running + */ +bool printingIsActive() { + return print_job_timer.isRunning() || IS_SD_PRINTING(); +} + +/** + * Printing is paused according to SD or host indicators + */ +bool printingIsPaused() { + return print_job_timer.isPaused() || IS_SD_PAUSED(); +} + /** * Manage several activities: * - Check for Filament Runout @@ -582,10 +512,10 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { } #endif // !SWITCHING_EXTRUDER - const float olde = current_position[E_AXIS]; - current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; - planner.buffer_line(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); - current_position[E_AXIS] = olde; + const float olde = current_position.e; + current_position.e += EXTRUDER_RUNOUT_EXTRUDE; + line_to_current_position(MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED)); + current_position.e = olde; planner.set_e_position_mm(olde); planner.synchronize(); @@ -629,7 +559,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { // travel moves have been received so enact them delayed_move_time = 0xFFFFFFFFUL; // force moves to be done - set_destination_from_current(); + destination = current_position; prepare_move_to_destination(); } #endif @@ -756,15 +686,16 @@ void idle( * Kill all activity and lock the machine. * After this the machine will need to be reset. */ -void kill(PGM_P const lcd_msg/*=nullptr*/, const bool steppers_off/*=false*/) { +void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) { thermalManager.disable_all_heaters(); SERIAL_ERROR_MSG(MSG_ERR_KILLED); #if HAS_DISPLAY - ui.kill_screen(lcd_msg ? lcd_msg : PSTR(MSG_KILLED)); + ui.kill_screen(lcd_error ?: GET_TEXT(MSG_KILLED), lcd_component); #else - UNUSED(lcd_msg); + UNUSED(lcd_error); + UNUSED(lcd_component); #endif #ifdef ACTION_ON_KILL @@ -801,29 +732,17 @@ void minkill(const bool steppers_off/*=false*/) { #if HAS_KILL // Wait for kill to be released - while (!READ(KILL_PIN)) { - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif - } + while (!READ(KILL_PIN)) watchdog_refresh(); // Wait for kill to be pressed - while (READ(KILL_PIN)) { - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif - } + while (READ(KILL_PIN)) watchdog_refresh(); void (*resetFunc)() = 0; // Declare resetFunc() at address 0 resetFunc(); // Jump to address 0 #else // !HAS_KILL - for (;;) { - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif - } // Wait for reset + for (;;) watchdog_refresh(); // Wait for reset #endif // !HAS_KILL } @@ -1002,7 +921,7 @@ void setup() { #if HAS_M206_COMMAND // Initialize current position based on home_offset - LOOP_XYZ(a) current_position[a] += home_offset[a]; + current_position += home_offset; #endif // Vital to init stepper/planner equivalent for current_position diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h index 1a9acc0075..391c453e01 100644 --- a/Marlin/src/Marlin.h +++ b/Marlin/src/Marlin.h @@ -322,7 +322,7 @@ void disable_e_stepper(const uint8_t e); void disable_e_steppers(); void disable_all_steppers(); -void kill(PGM_P const lcd_msg=nullptr, const bool steppers_off=false); +void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false); void minkill(const bool steppers_off=false); void quickstop_stepper(); @@ -331,6 +331,9 @@ extern bool Running; inline bool IsRunning() { return Running; } inline bool IsStopped() { return !Running; } +bool printingIsActive(); +bool printingIsPaused(); + extern bool wait_for_heatup; #if HAS_RESUME_CONTINUE @@ -368,10 +371,6 @@ void protected_pin_err(); inline void suicide() { OUT_WRITE(SUICIDE_PIN, LOW); } #endif -#if HAS_FILAMENT_SENSOR - void event_filament_runout(); -#endif - #if ENABLED(G29_RETRY_AND_RECOVER) void event_probe_recover(); void event_probe_failure(); diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 89f1f0d20d..939cf5f756 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -21,6 +21,8 @@ */ #pragma once +#include "macros.h" + #define BOARD_UNKNOWN -1 // @@ -255,9 +257,9 @@ // STM32 ARM Cortex-M3 // -#define BOARD_STM32F103R 4000 // STM32F103R Libmaple-based STM32F1 controller +#define BOARD_STM32F103RE 4000 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_MALYAN_M200 4001 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_STM3R_MINI 4002 // STM32F103R Libmaple-based STM32F1 controller +#define BOARD_STM3R_MINI 4002 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_GTM32_PRO_VB 4003 // STM32F103VET6 controller #define BOARD_MORPHEUS 4004 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller #define BOARD_CHITU3D 4005 // Chitu3D (STM32F103RET6) @@ -268,11 +270,12 @@ #define BOARD_BIGTREE_SKR_MINI_V1_1 4010 // BigTreeTech SKR Mini v1.1 (STM32F103RC) #define BOARD_BIGTREE_SKR_MINI_E3 4011 // BigTreeTech SKR Mini E3 (STM32F103RC) #define BOARD_BIGTREE_SKR_E3_DIP 4012 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC) -#define BOARD_JGAURORA_A5S_A1 4013 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4014 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4015 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4016 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4017 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_BTT_SKR_MINI_E3_V1_2 4013 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) +#define BOARD_JGAURORA_A5S_A1 4014 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4015 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4016 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4017 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4018 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 // // ARM Cortex-M4F @@ -307,7 +310,7 @@ // // Espressif ESP32 WiFi // -#define BOARD_ESP32 6000 +#define BOARD_ESPRESSIF_ESP32 6000 // // Simulations @@ -315,4 +318,7 @@ #define BOARD_LINUX_RAMPS 9999 -#define MB(board) (defined(BOARD_##board) && MOTHERBOARD==BOARD_##board) +#define _MB_1(B) (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B) +#define MB(V...) DO(MB,||,V) + +#define IS_MELZI MB(MELZI, MELZI_CREALITY, MELZI_MAKR3D, MELZI_MALYAN, MELZI_TRONXY) diff --git a/Marlin/src/core/enum.h b/Marlin/src/core/enum.h deleted file mode 100644 index 15118f7b28..0000000000 --- a/Marlin/src/core/enum.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Axis indices as enumerated constants - * - * - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space - * - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians - * - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics - */ -enum AxisEnum : unsigned char { - X_AXIS = 0, - A_AXIS = 0, - Y_AXIS = 1, - B_AXIS = 1, - Z_AXIS = 2, - C_AXIS = 2, - E_AXIS = 3, - X_HEAD = 4, - Y_HEAD = 5, - Z_HEAD = 6, - E0_AXIS = 3, - E1_AXIS = 4, - E2_AXIS = 5, - E3_AXIS = 6, - E4_AXIS = 7, - E5_AXIS = 8, - ALL_AXES = 0xFE, - NO_AXIS = 0xFF -}; - -#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) -#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) -#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) -#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) - -#define LOOP_NA(VAR) LOOP_L_N(VAR, NUM_AXIS) -#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) -#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) -#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) -#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) -#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS) -#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index ee4e23fa76..df3092fd99 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -49,7 +49,7 @@ // da Danish // de German // el Greek -// el-gr Greek (Greece) +// el_gr Greek (Greece) // en English // es Spanish // eu Basque-Euskera @@ -58,12 +58,12 @@ // gl Galician // hr Croatian // it Italian -// jp-kana Japanese +// jp_kana Japanese // ko_KR Korean (South Korea) // nl Dutch // pl Polish // pt Portuguese -// pt-br Portuguese (Brazilian) +// pt_br Portuguese (Brazilian) // ru Russian // sk Slovak // tr Turkish @@ -97,7 +97,20 @@ // #define STRING_SPLASH_LINE3 WEBSITE_URL //#endif -#if HAS_GRAPHICAL_LCD +#if HAS_CHARACTER_LCD + + // Custom characters defined in the first 8 characters of the LCD + #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! + #define LCD_STR_DEGREE "\x01" + #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation + #define LCD_STR_UPLEVEL "\x03" + #define LCD_STR_REFRESH "\x04" + #define LCD_STR_FOLDER "\x05" + #define LCD_STR_FEEDRATE "\x06" + #define LCD_STR_CLOCK "\x07" + #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ + +#else // // Custom characters from Marlin_symbols.fon which was merged into ISO10646-0-3.bdf // \x00 intentionally skipped to avoid problems in strings @@ -120,19 +133,6 @@ #define LCD_STR_FILAM_DIA "\xF8" #define LCD_STR_FILAM_MUL "\xA4" -#elif HAS_CHARACTER_LCD - - // Custom characters defined in the first 8 characters of the LCD - #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! - #define LCD_STR_DEGREE "\x01" - #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation - #define LCD_STR_UPLEVEL "\x03" - #define LCD_STR_REFRESH "\x04" - #define LCD_STR_FOLDER "\x05" - #define LCD_STR_FEEDRATE "\x06" - #define LCD_STR_CLOCK "\x07" - #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ - #endif // Common LCD messages @@ -168,7 +168,6 @@ #define MSG_INVALID_E_STEPPER "Invalid E stepper" #define MSG_E_STEPPER_NOT_SPECIFIED "E stepper not specified" #define MSG_INVALID_SOLENOID "Invalid solenoid" -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" #define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID #define MSG_COUNT_X " Count X:" #define MSG_COUNT_A " Count A:" @@ -243,10 +242,9 @@ #define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" #define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" #define MSG_ERR_HOTEND_TOO_COLD "Hotend too cold" +#define MSG_ERR_Z_HOMING_SER "Home XY first" +#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!" -#define MSG_FILAMENT_CHANGE_HEAT "Press button (or M108) to heat nozzle" -#define MSG_FILAMENT_CHANGE_INSERT "Insert filament and press button (or M108)" -#define MSG_FILAMENT_CHANGE_WAIT "Press button (or M108) to resume" #define MSG_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" #define MSG_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button" #define MSG_FILAMENT_CHANGE_WAIT_LCD "Press button to resume" @@ -254,8 +252,6 @@ #define MSG_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108" #define MSG_FILAMENT_CHANGE_WAIT_M108 "Send M108 to resume" -#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!" - #define MSG_STOP_BLTOUCH "STOP called because of BLTouch error - restart with M999" #define MSG_STOP_UNHOMED "STOP called because of unhomed error - restart with M999" #define MSG_KILL_INACTIVE_TIME "KILL caused by too much inactive time - current command: " @@ -298,6 +294,8 @@ #define MSG_T_THERMAL_RUNAWAY "Thermal Runaway" #define MSG_T_MAXTEMP "MAXTEMP triggered" #define MSG_T_MINTEMP "MINTEMP triggered" +#define MSG_ERR_PROBING_FAILED "Probing Failed" +#define MSG_ZPROBE_OUT_SER "Z Probe Past Bed" // Debug #define MSG_DEBUG_PREFIX "DEBUG:" @@ -313,11 +311,9 @@ #define LANGUAGE_DATA_INCL_(M) STRINGIFY_(fontdata/langdata_##M.h) #define LANGUAGE_DATA_INCL(M) LANGUAGE_DATA_INCL_(M) -#define INCLUDE_LANGUAGE_DATA LANGUAGE_DATA_INCL(LCD_LANGUAGE) #define LANGUAGE_INCL_(M) STRINGIFY_(../lcd/language/language_##M.h) #define LANGUAGE_INCL(M) LANGUAGE_INCL_(M) -#define INCLUDE_LANGUAGE LANGUAGE_INCL(LCD_LANGUAGE) // Never translate these strings #define MSG_X "X" @@ -337,38 +333,52 @@ #define MSG_Y2 "Y2" #define MSG_Z2 "Z2" #define MSG_Z3 "Z3" -#define MSG_H1 "1" -#define MSG_H2 "2" -#define MSG_H3 "3" -#define MSG_H4 "4" -#define MSG_H5 "5" -#define MSG_H6 "6" -#define MSG_LCD_N0 " 1" -#define MSG_LCD_N1 " 2" -#define MSG_LCD_N2 " 3" -#define MSG_LCD_N3 " 4" -#define MSG_LCD_N4 " 5" -#define MSG_LCD_N5 " 6" -#define MSG_E1 "E1" -#define MSG_E2 "E2" -#define MSG_E3 "E3" -#define MSG_E4 "E4" -#define MSG_E5 "E5" -#define MSG_E6 "E6" -#define MSG_MOVE_E1 "1" -#define MSG_MOVE_E2 "2" -#define MSG_MOVE_E3 "3" -#define MSG_MOVE_E4 "4" -#define MSG_MOVE_E5 "5" -#define MSG_MOVE_E6 "6" -#define MSG_DIAM_E1 " 1" -#define MSG_DIAM_E2 " 2" -#define MSG_DIAM_E3 " 3" -#define MSG_DIAM_E4 " 4" -#define MSG_DIAM_E5 " 5" -#define MSG_DIAM_E6 " 6" -#include INCLUDE_LANGUAGE +#define LCD_STR_A MSG_A +#define LCD_STR_B MSG_B +#define LCD_STR_C MSG_C +#define LCD_STR_E MSG_E + +/** + * Tool indexes for LCD display only + * + * By convention the LCD shows "E1" for the first extruder. + * However, internal to Marlin E0/T0 is the first tool, and + * most board silkscreens say "E0." Zero-based labels will + * make these indexes consistent but this defies expectation. + * + */ +#if ENABLED(NUMBER_TOOLS_FROM_0) + #define LCD_STR_N0 "0" + #define LCD_STR_N1 "1" + #define LCD_STR_N2 "2" + #define LCD_STR_N3 "3" + #define LCD_STR_N4 "4" + #define LCD_STR_N5 "5" +#else + #define LCD_STR_N0 "1" + #define LCD_STR_N1 "2" + #define LCD_STR_N2 "3" + #define LCD_STR_N3 "4" + #define LCD_STR_N4 "5" + #define LCD_STR_N5 "6" +#endif + +#define LCD_STR_E0 "E" LCD_STR_N0 +#define LCD_STR_E1 "E" LCD_STR_N1 +#define LCD_STR_E2 "E" LCD_STR_N2 +#define LCD_STR_E3 "E" LCD_STR_N3 +#define LCD_STR_E4 "E" LCD_STR_N4 +#define LCD_STR_E5 "E" LCD_STR_N5 + +#include "multi_language.h" // Allow multiple languages + +#include "../lcd/language/language_en.h" +#include LANGUAGE_INCL(LCD_LANGUAGE) +#include LANGUAGE_INCL(LCD_LANGUAGE_2) +#include LANGUAGE_INCL(LCD_LANGUAGE_3) +#include LANGUAGE_INCL(LCD_LANGUAGE_4) +#include LANGUAGE_INCL(LCD_LANGUAGE_5) #if NONE(DISPLAY_CHARSET_ISO10646_1, \ DISPLAY_CHARSET_ISO10646_5, \ @@ -381,10 +391,3 @@ DISPLAY_CHARSET_ISO10646_SK) #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. #endif - -#include "../lcd/language/language_en.h" - -#ifdef CUSTOM_USER_MENU_TITLE - #undef MSG_USER_MENU - #define MSG_USER_MENU CUSTOM_USER_MENU_TITLE -#endif diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 73a8ec5823..b93bae79f6 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -21,11 +21,11 @@ */ #pragma once -#define NUM_AXIS 4 #define ABCE 4 #define XYZE 4 #define ABC 3 #define XYZ 3 +#define XY 2 #define _AXIS(A) (A##_AXIS) @@ -205,25 +205,29 @@ }while(0) // Macros for initializing arrays -#define ARRAY_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P } -#define ARRAY_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O } -#define ARRAY_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) { A,B,C,D,E,F,G,H,I,J,K,L,M,N } -#define ARRAY_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) { A,B,C,D,E,F,G,H,I,J,K,L,M } -#define ARRAY_12(A,B,C,D,E,F,G,H,I,J,K,L,...) { A,B,C,D,E,F,G,H,I,J,K,L } -#define ARRAY_11(A,B,C,D,E,F,G,H,I,J,K,...) { A,B,C,D,E,F,G,H,I,J,K } -#define ARRAY_10(A,B,C,D,E,F,G,H,I,J,...) { A,B,C,D,E,F,G,H,I,J } -#define ARRAY_9( A,B,C,D,E,F,G,H,I,...) { A,B,C,D,E,F,G,H,I } -#define ARRAY_8( A,B,C,D,E,F,G,H,...) { A,B,C,D,E,F,G,H } -#define ARRAY_7( A,B,C,D,E,F,G,...) { A,B,C,D,E,F,G } -#define ARRAY_6( A,B,C,D,E,F,...) { A,B,C,D,E,F } -#define ARRAY_5( A,B,C,D,E,...) { A,B,C,D,E } -#define ARRAY_4( A,B,C,D,...) { A,B,C,D } -#define ARRAY_3( A,B,C,...) { A,B,C } -#define ARRAY_2( A,B,...) { A,B } -#define ARRAY_1( A,...) { A } +#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P +#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O +#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N +#define LIST_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) A,B,C,D,E,F,G,H,I,J,K,L,M +#define LIST_12(A,B,C,D,E,F,G,H,I,J,K,L,...) A,B,C,D,E,F,G,H,I,J,K,L +#define LIST_11(A,B,C,D,E,F,G,H,I,J,K,...) A,B,C,D,E,F,G,H,I,J,K +#define LIST_10(A,B,C,D,E,F,G,H,I,J,...) A,B,C,D,E,F,G,H,I,J +#define LIST_9( A,B,C,D,E,F,G,H,I,...) A,B,C,D,E,F,G,H,I +#define LIST_8( A,B,C,D,E,F,G,H,...) A,B,C,D,E,F,G,H +#define LIST_7( A,B,C,D,E,F,G,...) A,B,C,D,E,F,G +#define LIST_6( A,B,C,D,E,F,...) A,B,C,D,E,F +#define LIST_5( A,B,C,D,E,...) A,B,C,D,E +#define LIST_4( A,B,C,D,...) A,B,C,D +#define LIST_3( A,B,C,...) A,B,C +#define LIST_2( A,B,...) A,B +#define LIST_1( A,...) A -#define _ARRAY_N(N,V...) ARRAY_##N(V) -#define ARRAY_N(N,V...) _ARRAY_N(N,V) +#define _LIST_N(N,V...) LIST_##N(V) +#define LIST_N(N,V...) _LIST_N(N,V) +#define ARRAY_N(N,V...) { _LIST_N(N,V) } + +#define _JOIN_1(O) (O) +#define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V))) // Macros for adding #define INC_0 1 @@ -251,12 +255,6 @@ #define DECREMENT_(n) DEC_##n #define DECREMENT(n) DECREMENT_(n) -// Feedrate -typedef float feedRate_t; -#define MMM_TO_MMS(MM_M) ((MM_M)/60.0f) -#define MMS_TO_MMM(MM_S) ((MM_S)*60.0f) -#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) - #define NOOP (void(0)) #define CEILING(x,y) (((x) + (y) - 1) / (y)) diff --git a/Marlin/src/core/multi_language.cpp b/Marlin/src/core/multi_language.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h new file mode 100644 index 0000000000..98020b1e8d --- /dev/null +++ b/Marlin/src/core/multi_language.h @@ -0,0 +1,79 @@ +/******************** + * multi_language.h * + ********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ +#pragma once + +typedef const char Language_Str[]; + +#if defined(LCD_LANGUAGE_5) + #define NUM_LANGUAGES 5 +#elif defined(LCD_LANGUAGE_4) + #define NUM_LANGUAGES 4 +#elif defined(LCD_LANGUAGE_3) + #define NUM_LANGUAGES 3 +#elif defined(LCD_LANGUAGE_2) + #define NUM_LANGUAGES 2 +#else + #define NUM_LANGUAGES 1 +#endif + +// Setting the unused languages equal to each other allows +// the compiler to optimize away the conditionals + +#ifndef LCD_LANGUAGE_2 + #define LCD_LANGUAGE_2 LCD_LANGUAGE +#endif + +#ifndef LCD_LANGUAGE_3 + #define LCD_LANGUAGE_3 LCD_LANGUAGE_2 +#endif + +#ifndef LCD_LANGUAGE_4 + #define LCD_LANGUAGE_4 LCD_LANGUAGE_3 +#endif + +#ifndef LCD_LANGUAGE_5 + #define LCD_LANGUAGE_5 LCD_LANGUAGE_4 +#endif + +#define _GET_LANG(LANG) Language_##LANG +#define GET_LANG(LANG) _GET_LANG(LANG) + +#if NUM_LANGUAGES > 1 + extern uint8_t lang; + #define GET_TEXT(MSG) ( \ + lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \ + lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ + lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ + lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ + GET_LANG(LCD_LANGUAGE_5)::MSG \ + ) + #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_5)::CHARSIZE) +#else + #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG + #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE +#endif +#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG) + +#define MSG_CONCAT(A,B) pgm_p_pair_t(GET_TEXT(A),GET_TEXT(B)) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index a468802ecc..2369c3acbf 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -22,7 +22,6 @@ #include "serial.h" #include "language.h" -#include "enum.h" uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE; @@ -68,12 +67,8 @@ void print_bin(const uint16_t val) { } } -void print_xyz(PGM_P const prefix, PGM_P const suffix, const float &x, const float &y, const float &z) { +void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { serialprintPGM(prefix); SERIAL_ECHOPAIR(" " MSG_X, x, " " MSG_Y, y, " " MSG_Z, z); if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); } - -void print_xyz(PGM_P const prefix, PGM_P const suffix, const float xyz[]) { - print_xyz(prefix, suffix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]); -} diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 23f6240e1e..f4c2570ca7 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -139,14 +139,41 @@ extern uint8_t marlin_debug_flags; #define _SELP_21(a,b,V...) do{ _SEP_2(a,b); _SELP_19(V); }while(0) #define _SELP_22(a,b,V...) do{ _SEP_2(a,b); _SELP_20(V); }while(0) #define _SELP_23(a,b,V...) do{ _SEP_2(a,b); _SELP_21(V); }while(0) -#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0) +#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0) // Use up two, pass the rest up #define SERIAL_ECHOLNPAIR(V...) _SELP_N(NUM_ARGS(V),V) +// Print up to 20 comma-separated pairs of values +#define __SLST_N(N,V...) _SLST_##N(V) +#define _SLST_N(N,V...) __SLST_N(N,V) +#define _SLST_1(a) SERIAL_ECHO(a) +#define _SLST_2(a,b) do{ SERIAL_ECHO(a); SERIAL_ECHOPAIR(", ",b); }while(0) +#define _SLST_3(a,b,c) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_1(c); }while(0) +#define _SLST_4(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_2(V); }while(0) +#define _SLST_5(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_3(V); }while(0) +#define _SLST_6(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_4(V); }while(0) +#define _SLST_7(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_5(V); }while(0) +#define _SLST_8(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_6(V); }while(0) +#define _SLST_9(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_7(V); }while(0) +#define _SLST_10(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_8(V); }while(0) +#define _SLST_11(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_9(V); }while(0) +#define _SLST_12(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_10(V); }while(0) +#define _SLST_13(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_11(V); }while(0) +#define _SLST_14(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_12(V); }while(0) +#define _SLST_15(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_13(V); }while(0) +#define _SLST_16(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_14(V); }while(0) +#define _SLST_17(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_15(V); }while(0) +#define _SLST_18(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_16(V); }while(0) +#define _SLST_19(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_17(V); }while(0) +#define _SLST_20(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_18(V); }while(0) // Use up two, pass the rest up + +#define SERIAL_ECHOLIST(pre,V...) do{ SERIAL_ECHOPGM(pre); _SLST_N(NUM_ARGS(V),V); }while(0) +#define SERIAL_ECHOLIST_N(N,V...) _SLST_N(N,LIST_N(N,V)) + #define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S))) #define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n"))) -#define SERIAL_ECHOPAIR_F(S, V...) do{ SERIAL_ECHOPGM(S); SERIAL_ECHO_F(V); }while(0) +#define SERIAL_ECHOPAIR_F(S,V...) do{ SERIAL_ECHOPGM(S); SERIAL_ECHO_F(V); }while(0) #define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0) #define SERIAL_ECHO_START() serial_echo_start() @@ -186,7 +213,11 @@ void serial_spaces(uint8_t count); void print_bin(const uint16_t val); -void print_xyz(PGM_P const prefix, PGM_P const suffix, const float xyz[]); -void print_xyz(PGM_P const prefix, PGM_P const suffix, const float &x, const float &y, const float &z); -#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n"), VAR); }while(0) -#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(PSTR(PREFIX), nullptr, V); }while(0) +void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); + +inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) { + print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix); +} + +#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(VAR, PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n")); }while(0) +#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(V, PSTR(PREFIX), nullptr); }while(0) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h new file mode 100644 index 0000000000..567b35c8b9 --- /dev/null +++ b/Marlin/src/core/types.h @@ -0,0 +1,486 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include + +#include "millis_t.h" + +// +// Enumerated axis indices +// +// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space +// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians +// - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics +// +enum AxisEnum : uint8_t { + X_AXIS = 0, A_AXIS = 0, + Y_AXIS = 1, B_AXIS = 1, + Z_AXIS = 2, C_AXIS = 2, + E_AXIS = 3, + X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 6, + E0_AXIS = 3, + E1_AXIS = 4, + E2_AXIS = 5, + E3_AXIS = 6, + E4_AXIS = 7, + E5_AXIS = 8, + ALL_AXES = 0xFE, NO_AXIS = 0xFF +}; + +// +// Loop over XYZE axes +// + +#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) +#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) +#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) +#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) + +#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) +#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) +#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) +#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) +#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS) +#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N) + +// +// Conditional type assignment magic. For example... +// +// typename IF<(MYOPT==12), int, float>::type myvar; +// +template +struct IF { typedef R type; }; +template +struct IF { typedef L type; }; + +// +// feedRate_t is just a humble float +// +typedef float feedRate_t; + +// Conversion macros +#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) +#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) +#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) + +// +// Coordinates structures for XY, XYZ, XYZE... +// + +// Helpers +#define _RECIP(N) ((N) ? 1.0f / float(N) : 0.0f) +#define _ABS(N) ((N) < 0 ? -(N) : (N)) +#define _LS(N) (N = (T)(uint32_t(N) << v)) +#define _RS(N) (N = (T)(uint32_t(N) >> v)) +#define FI FORCE_INLINE + +// Forward declarations +template struct XYval; +template struct XYZval; +template struct XYZEval; + +typedef struct XYval xy_bool_t; +typedef struct XYZval xyz_bool_t; +typedef struct XYZEval xyze_bool_t; + +typedef struct XYval xy_char_t; +typedef struct XYZval xyz_char_t; +typedef struct XYZEval xyze_char_t; + +typedef struct XYval xy_uchar_t; +typedef struct XYZval xyz_uchar_t; +typedef struct XYZEval xyze_uchar_t; + +typedef struct XYval xy_int8_t; +typedef struct XYZval xyz_int8_t; +typedef struct XYZEval xyze_int8_t; + +typedef struct XYval xy_uint8_t; +typedef struct XYZval xyz_uint8_t; +typedef struct XYZEval xyze_uint8_t; + +typedef struct XYval xy_int_t; +typedef struct XYZval xyz_int_t; +typedef struct XYZEval xyze_int_t; + +typedef struct XYval xy_uint_t; +typedef struct XYZval xyz_uint_t; +typedef struct XYZEval xyze_uint_t; + +typedef struct XYval xy_long_t; +typedef struct XYZval xyz_long_t; +typedef struct XYZEval xyze_long_t; + +typedef struct XYval xy_ulong_t; +typedef struct XYZval xyz_ulong_t; +typedef struct XYZEval xyze_ulong_t; + +typedef struct XYZval xyz_vlong_t; +typedef struct XYZEval xyze_vlong_t; + +typedef struct XYval xy_float_t; +typedef struct XYZval xyz_float_t; +typedef struct XYZEval xyze_float_t; + +typedef struct XYval xy_feedrate_t; +typedef struct XYZval xyz_feedrate_t; +typedef struct XYZEval xyze_feedrate_t; + +typedef xy_uint8_t xy_byte_t; +typedef xyz_uint8_t xyz_byte_t; +typedef xyze_uint8_t xyze_byte_t; + +typedef xyz_long_t abc_long_t; +typedef xyze_long_t abce_long_t; +typedef xyz_ulong_t abc_ulong_t; +typedef xyze_ulong_t abce_ulong_t; + +typedef xy_float_t xy_pos_t; +typedef xyz_float_t xyz_pos_t; +typedef xyze_float_t xyze_pos_t; + +typedef xy_float_t ab_float_t; +typedef xyz_float_t abc_float_t; +typedef xyze_float_t abce_float_t; + +typedef ab_float_t ab_pos_t; +typedef abc_float_t abc_pos_t; +typedef abce_float_t abce_pos_t; + +// External conversion methods +void toLogical(xy_pos_t &raw); +void toLogical(xyz_pos_t &raw); +void toLogical(xyze_pos_t &raw); +void toNative(xy_pos_t &raw); +void toNative(xyz_pos_t &raw); +void toNative(xyze_pos_t &raw); + +// +// XY coordinates, counters, etc. +// +template +struct XYval { + union { + struct { T x, y; }; + struct { T a, b; }; + T pos[2]; + }; + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void reset() { x = y = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y); } + FI operator T* () { return pos; } + FI operator bool() { return x || y; } + FI XYval copy() const { return *this; } + FI XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; } + FI XYval asInt() { return { int16_t(x), int16_t(y) }; } + FI XYval asInt() const { return { int16_t(x), int16_t(y) }; } + FI XYval asLong() { return { int32_t(x), int32_t(y) }; } + FI XYval asLong() const { return { int32_t(x), int32_t(y) }; } + FI XYval asFloat() { return { float(x), float(y) }; } + FI XYval asFloat() const { return { float(x), float(y) }; } + FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } + FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } + FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } + FI operator XYZval() { return { x, y }; } + FI operator XYZval() const { return { x, y }; } + FI operator XYZEval() { return { x, y }; } + FI operator XYZEval() const { return { x, y }; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYval& operator= (const T v) { set(v, v ); return *this; } + FI XYval& operator= (const XYZval &rs) { set(rs.x, rs.y); return *this; } + FI XYval& operator= (const XYZEval &rs) { set(rs.x, rs.y); return *this; } + FI XYval operator+ (const XYval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator+ (const XYZval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYZval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYZval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYZval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYZval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYZval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYZval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYZval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator+ (const XYZEval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYZEval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYZEval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYZEval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYZEval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYZEval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYZEval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYZEval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator* (const float &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const float &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const int &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const int &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator/ (const float &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const float &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const int &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const int &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator>>(const int &v) const { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } + FI XYval operator>>(const int &v) { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } + FI XYval operator<<(const int &v) const { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } + FI XYval operator<<(const int &v) { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } + FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator*=(const float &v) { x *= v; y *= v; return *this; } + FI XYval& operator*=(const int &v) { x *= v; y *= v; return *this; } + FI XYval& operator>>=(const int &v) { _RS(x); _RS(y); return *this; } + FI XYval& operator<<=(const int &v) { _LS(x); _LS(y); return *this; } + FI bool operator==(const XYval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator!=(const XYval &rs) { return !operator==(rs); } + FI bool operator!=(const XYZval &rs) { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } + FI bool operator!=(const XYval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI XYval operator-() { XYval o = *this; o.x = -x; o.y = -y; return o; } + FI const XYval operator-() const { XYval o = *this; o.x = -x; o.y = -y; return o; } +}; + +// +// XYZ coordinates, counters, etc. +// +template +struct XYZval { + union { + struct { T x, y, z; }; + struct { T a, b, c; }; + T pos[3]; + }; + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } + FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } + FI void reset() { x = y = z = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z); } + FI operator T* () { return pos; } + FI operator bool() { return z || x || y; } + FI XYZval copy() const { XYZval o = *this; return o; } + FI XYZval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)) }; } + FI XYZval asInt() { return { int16_t(x), int16_t(y), int16_t(z) }; } + FI XYZval asInt() const { return { int16_t(x), int16_t(y), int16_t(z) }; } + FI XYZval asLong() { return { int32_t(x), int32_t(y), int32_t(z) }; } + FI XYZval asLong() const { return { int32_t(x), int32_t(y), int32_t(z) }; } + FI XYZval asFloat() { return { float(x), float(y), float(z) }; } + FI XYZval asFloat() const { return { float(x), float(y), float(z) }; } + FI XYZval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z) }; } + FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } + FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } + FI operator XYval&() { return *(XYval*)this; } + FI operator const XYval&() const { return *(const XYval*)this; } + FI operator XYZEval() const { return { x, y, z }; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYZval& operator= (const T v) { set(v, v, v ); return *this; } + FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y ); return *this; } + FI XYZval& operator= (const XYZEval &rs) { set(rs.x, rs.y, rs.z); return *this; } + FI XYZval operator+ (const XYval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZval operator+ (const XYval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZval operator- (const XYval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZval operator- (const XYval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZval operator* (const XYval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZval operator* (const XYval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZval operator/ (const XYval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZval operator/ (const XYval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZval operator+ (const XYZval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator+ (const XYZval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator- (const XYZval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator- (const XYZval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator* (const XYZval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator* (const XYZval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator/ (const XYZval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator/ (const XYZval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator+ (const XYZEval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator+ (const XYZEval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator- (const XYZEval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator- (const XYZEval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator* (const XYZEval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator* (const XYZEval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator/ (const XYZEval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator/ (const XYZEval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator* (const float &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= z; return ls; } + FI XYZval operator* (const float &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= z; return ls; } + FI XYZval operator* (const int &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= z; return ls; } + FI XYZval operator* (const int &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= z; return ls; } + FI XYZval operator/ (const float &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= z; return ls; } + FI XYZval operator/ (const float &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= z; return ls; } + FI XYZval operator/ (const int &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= z; return ls; } + FI XYZval operator/ (const int &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= z; return ls; } + FI XYZval operator>>(const int &v) const { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } + FI XYZval operator>>(const int &v) { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } + FI XYZval operator<<(const int &v) const { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } + FI XYZval operator<<(const int &v) { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } + FI XYZval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYZval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYZval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYZval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } + FI XYZval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZval& operator*=(const float &v) { x *= v; y *= v; z *= v; return *this; } + FI XYZval& operator*=(const int &v) { x *= v; y *= v; z *= v; return *this; } + FI XYZval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); return *this; } + FI XYZval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); return *this; } + FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } + FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI XYZval operator-() { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } + FI const XYZval operator-() const { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } +}; + +// +// XYZE coordinates, counters, etc. +// +template +struct XYZEval { + union { + struct{ T x, y, z, e; }; + struct{ T a, b, c; }; + T pos[4]; + }; + FI void reset() { x = y = z = e = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z + e*e); } + FI operator T* () { return pos; } + FI operator bool() { return e || z || x || y; } + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } + FI void set(const T px, const T py, const T pz, const T pe) { x = px; y = py; z = pz; e = pe; } + FI void set(const XYval pxy) { x = pxy.x; y = pxy.y; } + FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } + FI void set(const XYZval pxyz) { x = pxyz.x; y = pxyz.y; z = pxyz.z; } + FI void set(const XYval pxy, const T pz, const T pe) { x = pxy.x; y = pxy.y; z = pz; e = pe; } + FI void set(const XYval pxy, const XYval pze) { x = pxy.x; y = pxy.y; z = pze.z; e = pze.e; } + FI void set(const XYZval pxyz, const T pe) { x = pxyz.x; y = pxyz.y; z = pxyz.z; e = pe; } + FI XYZEval copy() const { return *this; } + FI XYZEval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(e)) }; } + FI XYZEval asInt() { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } + FI XYZEval asInt() const { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } + FI XYZEval asLong() const { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } + FI XYZEval asLong() { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } + FI XYZEval asFloat() { return { float(x), float(y), float(z), float(e) }; } + FI XYZEval asFloat() const { return { float(x), float(y), float(z), float(e) }; } + FI XYZEval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(e) }; } + FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } + FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } + FI operator XYval&() { return *(XYval*)this; } + FI operator const XYval&() const { return *(const XYval*)this; } + FI operator XYZval&() { return *(XYZval*)this; } + FI operator const XYZval&() const { return *(const XYZval*)this; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYZEval& operator= (const T v) { set(v, v, v, v); return *this; } + FI XYZEval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } + FI XYZEval& operator= (const XYZval &rs) { set(rs.x, rs.y, rs.z); return *this; } + FI XYZEval operator+ (const XYval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZEval operator+ (const XYval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZEval operator- (const XYval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZEval operator- (const XYval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZEval operator* (const XYval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZEval operator* (const XYval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZEval operator/ (const XYval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZEval operator/ (const XYval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZEval operator+ (const XYZval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZEval operator+ (const XYZval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZEval operator- (const XYZval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZEval operator- (const XYZval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZEval operator* (const XYZval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZEval operator* (const XYZval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZEval operator/ (const XYZval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZEval operator/ (const XYZval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZEval operator+ (const XYZEval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } + FI XYZEval operator+ (const XYZEval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } + FI XYZEval operator- (const XYZEval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } + FI XYZEval operator- (const XYZEval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } + FI XYZEval operator* (const XYZEval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } + FI XYZEval operator* (const XYZEval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } + FI XYZEval operator/ (const XYZEval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } + FI XYZEval operator/ (const XYZEval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } + FI XYZEval operator* (const float &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const float &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const int &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const int &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator/ (const float &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const float &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const int &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const int &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator>>(const int &v) const { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } + FI XYZEval operator>>(const int &v) { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } + FI XYZEval operator<<(const int &v) const { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } + FI XYZEval operator<<(const int &v) { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } + FI XYZEval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYZEval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYZEval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYZEval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } + FI XYZEval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZEval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZEval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZEval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZEval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; e += rs.e; return *this; } + FI XYZEval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; e -= rs.e; return *this; } + FI XYZEval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; e *= rs.e; return *this; } + FI XYZEval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; e /= rs.e; return *this; } + FI XYZEval& operator*=(const T &v) { x *= v; y *= v; z *= v; e *= v; return *this; } + FI XYZEval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); _RS(e); return *this; } + FI XYZEval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); _LS(e); return *this; } + FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZval &rs) { return !operator==(rs); } + FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI XYZEval operator-() { return { -x, -y, -z, -e }; } + FI const XYZEval operator-() const { return { -x, -y, -z, -e }; } +}; + +#undef _RECIP +#undef _ABS +#undef _LS +#undef _RS +#undef FI + +const xyze_char_t axis_codes { 'X', 'Y', 'Z', 'E' }; diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 5ebd84afd1..ca8cd67ccf 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -79,36 +79,36 @@ void safe_delay(millis_t ms) { ); #if HAS_BED_PROBE - SERIAL_ECHOPAIR("Probe Offset X:", probe_offset[X_AXIS], " Y:", probe_offset[Y_AXIS], " Z:", probe_offset[Z_AXIS]); - if (probe_offset[X_AXIS] > 0) + SERIAL_ECHOPAIR("Probe Offset X", probe_offset.x, " Y", probe_offset.y, " Z", probe_offset.z); + if (probe_offset.x > 0) SERIAL_ECHOPGM(" (Right"); - else if (probe_offset[X_AXIS] < 0) + else if (probe_offset.x < 0) SERIAL_ECHOPGM(" (Left"); - else if (probe_offset[Y_AXIS] != 0) + else if (probe_offset.y != 0) SERIAL_ECHOPGM(" (Middle"); else SERIAL_ECHOPGM(" (Aligned With"); - if (probe_offset[Y_AXIS] > 0) { + if (probe_offset.y > 0) { #if IS_SCARA SERIAL_ECHOPGM("-Distal"); #else SERIAL_ECHOPGM("-Back"); #endif } - else if (probe_offset[Y_AXIS] < 0) { + else if (probe_offset.y < 0) { #if IS_SCARA SERIAL_ECHOPGM("-Proximal"); #else SERIAL_ECHOPGM("-Front"); #endif } - else if (probe_offset[X_AXIS] != 0) + else if (probe_offset.x != 0) SERIAL_ECHOPGM("-Center"); - if (probe_offset[Z_AXIS] < 0) + if (probe_offset.z < 0) SERIAL_ECHOPGM(" & Below"); - else if (probe_offset[Z_AXIS] > 0) + else if (probe_offset.z > 0) SERIAL_ECHOPGM(" & Above"); else SERIAL_ECHOPGM(" & Same Z as"); @@ -134,24 +134,18 @@ void safe_delay(millis_t ms) { SERIAL_ECHOLNPAIR("Z Fade: ", planner.z_fade_height); #endif #if ABL_PLANAR - const float diff[XYZ] = { - planner.get_axis_position_mm(X_AXIS) - current_position[X_AXIS], - planner.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS], - planner.get_axis_position_mm(Z_AXIS) - current_position[Z_AXIS] - }; SERIAL_ECHOPGM("ABL Adjustment X"); - if (diff[X_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[X_AXIS]); - SERIAL_ECHOPGM(" Y"); - if (diff[Y_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[Y_AXIS]); - SERIAL_ECHOPGM(" Z"); - if (diff[Z_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[Z_AXIS]); + LOOP_XYZ(a) { + float v = planner.get_axis_position_mm(AxisEnum(a)) - current_position[a]; + SERIAL_CHAR(' '); + SERIAL_CHAR('X' + char(a)); + if (v > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(v); + } #else #if ENABLED(AUTO_BED_LEVELING_UBL) SERIAL_ECHOPGM("UBL Adjustment Z"); - const float rz = ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]); + const float rz = ubl.get_z_correction(current_position); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) SERIAL_ECHOPGM("ABL Adjustment Z"); const float rz = bilinear_z_offset(current_position); @@ -159,7 +153,7 @@ void safe_delay(millis_t ms) { SERIAL_ECHO(ftostr43sign(rz, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { - SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position[Z_AXIS]), '+')); + SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+')); SERIAL_CHAR(')'); } #endif @@ -175,15 +169,11 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM("Mesh Bed Leveling"); if (planner.leveling_active) { SERIAL_ECHOLNPGM(" (enabled)"); - SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS] - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , 1.0 - #endif - ), '+')); + SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position), '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { SERIAL_ECHOPAIR(" (", ftostr43sign( - mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS], planner.fade_scaling_factor_for_z(current_position[Z_AXIS])), '+' + mbl.get_z(current_position, planner.fade_scaling_factor_for_z(current_position.z)), '+' )); SERIAL_CHAR(')'); } diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 4ae6a96713..2956f92892 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -22,8 +22,7 @@ #pragma once #include "../inc/MarlinConfigPre.h" - -constexpr char axis_codes[XYZE] = { 'X', 'Y', 'Z', 'E' }; +#include "../core/types.h" // Delay that ensures heaters and watchdog are kept alive void safe_delay(millis_t ms); @@ -37,10 +36,25 @@ inline void serial_delay(const millis_t ms) { #endif } -// 16x16 bit arrays -FORCE_INLINE void bitmap_clear(uint16_t bits[16], const uint8_t x, const uint8_t y) { CBI(bits[y], x); } -FORCE_INLINE void bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { SBI(bits[y], x); } -FORCE_INLINE bool is_bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } +#if GRID_MAX_POINTS_X && GRID_MAX_POINTS_Y + + // 16x16 bit arrays + template + struct FlagBits { + typename IF<(W>8), uint16_t, uint8_t>::type bits[H]; + void fill() { memset(bits, 0xFF, sizeof(bits)); } + void reset() { memset(bits, 0x00, sizeof(bits)); } + void unmark(const uint8_t x, const uint8_t y) { CBI(bits[y], x); } + void mark(const uint8_t x, const uint8_t y) { SBI(bits[y], x); } + bool marked(const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } + inline void unmark(const xy_int8_t &xy) { unmark(xy.y, xy.x); } + inline void mark(const xy_int8_t &xy) { mark(xy.y, xy.x); } + inline bool marked(const xy_int8_t &xy) { return marked(xy.y, xy.x); } + }; + + typedef FlagBits MeshFlags; + +#endif #if ENABLED(DEBUG_LEVELING_FEATURE) void log_machine_info(); diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp index 1f73f1417b..c3b182c72a 100644 --- a/Marlin/src/feature/I2CPositionEncoder.cpp +++ b/Marlin/src/feature/I2CPositionEncoder.cpp @@ -326,25 +326,23 @@ bool I2CPositionEncoder::test_axis() { //only works on XYZ cartesian machines for the time being if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; - float startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; - - const float startPosition = soft_endstop[encoderAxis].min + 10, - endPosition = soft_endstop[encoderAxis].max - 10; + const float startPosition = soft_endstop.min[encoderAxis] + 10, + endPosition = soft_endstop.max[encoderAxis] - 10; const feedRate_t fr_mm_s = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); ec = false; - LOOP_XYZ(i) { - startCoord[i] = planner.get_axis_position_mm((AxisEnum)i); - endCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + xyze_pos_t startCoord, endCoord; + LOOP_XYZ(a) { + startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); + endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); } startCoord[encoderAxis] = startPosition; endCoord[encoderAxis] = endPosition; planner.synchronize(); - - planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], - planner.get_axis_position_mm(E_AXIS), fr_mm_s, 0); + startCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(startCoord, fr_mm_s, 0); planner.synchronize(); // if the module isn't currently trusted, wait until it is (or until it should be if things are working) @@ -355,8 +353,8 @@ bool I2CPositionEncoder::test_axis() { } if (trusted) { // if trusted, commence test - planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], - planner.get_axis_position_mm(E_AXIS), fr_mm_s, 0); + endCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(endCoord, fr_mm_s, 0); planner.synchronize(); } @@ -376,8 +374,7 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { float old_steps_mm, new_steps_mm, startDistance, endDistance, - travelDistance, travelledDistance, total = 0, - startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; + travelDistance, travelledDistance, total = 0; int32_t startCount, stopCount; @@ -387,31 +384,31 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { ec = false; startDistance = 20; - endDistance = soft_endstop[encoderAxis].max - 20; + endDistance = soft_endstop.max[encoderAxis] - 20; travelDistance = endDistance - startDistance; + xyze_pos_t startCoord, endCoord; LOOP_XYZ(a) { startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); } - startCoord[encoderAxis] = startDistance; endCoord[encoderAxis] = endDistance; planner.synchronize(); LOOP_L_N(i, iter) { - planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], - planner.get_axis_position_mm(E_AXIS), fr_mm_s, 0); + startCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(startCoord, fr_mm_s, 0); planner.synchronize(); delay(250); startCount = get_position(); - //do_blocking_move_to(endCoord[X_AXIS],endCoord[Y_AXIS],endCoord[Z_AXIS]); + //do_blocking_move_to(endCoord); - planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], - planner.get_axis_position_mm(E_AXIS), fr_mm_s, 0); + endCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(endCoord, fr_mm_s, 0); planner.synchronize(); //Read encoder distance diff --git a/Marlin/src/feature/I2CPositionEncoder.h b/Marlin/src/feature/I2CPositionEncoder.h index ad3e30a513..25350b2787 100644 --- a/Marlin/src/feature/I2CPositionEncoder.h +++ b/Marlin/src/feature/I2CPositionEncoder.h @@ -93,8 +93,6 @@ #define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) #define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) -extern const char axis_codes[XYZE]; - typedef union { volatile int32_t val = 0; uint8_t bval[4]; diff --git a/Marlin/src/feature/Max7219_Debug_LEDs.h b/Marlin/src/feature/Max7219_Debug_LEDs.h index 02f7c1888b..9462fb23d9 100644 --- a/Marlin/src/feature/Max7219_Debug_LEDs.h +++ b/Marlin/src/feature/Max7219_Debug_LEDs.h @@ -75,7 +75,7 @@ class Max7219 { public: static uint8_t led_line[MAX7219_LINES]; - Max7219() { } + Max7219() {} static void init(); static void register_setup(); diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index e16912d69e..1fc2499110 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -36,13 +36,10 @@ Babystep babystep; volatile int16_t Babystep::steps[BS_TODO_AXIS(Z_AXIS) + 1]; - -#if HAS_LCD_MENU || ENABLED(EXTENSIBLE_UI) - int16_t Babystep::accum; - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - int16_t Babystep::axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]; - #endif +#if ENABLED(BABYSTEP_DISPLAY_TOTAL) + int16_t Babystep::axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]; #endif +int16_t Babystep::accum; void Babystep::step_axis(const AxisEnum axis) { const int16_t curTodo = steps[BS_TODO_AXIS(axis)]; // get rid of volatile for performance @@ -75,11 +72,9 @@ void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { if (!CAN_BABYSTEP(axis)) return; - #if HAS_LCD_MENU || ENABLED(EXTENSIBLE_UI) - accum += distance; // Count up babysteps for the UI - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - axis_total[BS_TOTAL_AXIS(axis)] += distance; - #endif + accum += distance; // Count up babysteps for the UI + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + axis_total[BS_TOTAL_AXIS(axis)] += distance; #endif #if ENABLED(BABYSTEP_ALWAYS_AVAILABLE) diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h index 617108316f..fbf04a03f9 100644 --- a/Marlin/src/feature/babystep.h +++ b/Marlin/src/feature/babystep.h @@ -29,7 +29,7 @@ #define BS_TODO_AXIS(A) 0 #endif -#if (HAS_LCD_MENU || ENABLED(EXTENSIBLE_UI)) && ENABLED(BABYSTEP_DISPLAY_TOTAL) +#if ENABLED(BABYSTEP_DISPLAY_TOTAL) #if ENABLED(BABYSTEP_XY) #define BS_TOTAL_AXIS(A) A #else @@ -40,22 +40,17 @@ class Babystep { public: static volatile int16_t steps[BS_TODO_AXIS(Z_AXIS) + 1]; + static int16_t accum; // Total babysteps in current edit - #if HAS_LCD_MENU || ENABLED(EXTENSIBLE_UI) - - static int16_t accum; // Total babysteps in current edit - - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - static int16_t axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]; // Total babysteps since G28 - static inline void reset_total(const AxisEnum axis) { - if (true - #if ENABLED(BABYSTEP_XY) - && axis == Z_AXIS - #endif - ) axis_total[BS_TOTAL_AXIS(axis)] = 0; - } - #endif - + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + static int16_t axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]; // Total babysteps since G28 + static inline void reset_total(const AxisEnum axis) { + if (true + #if ENABLED(BABYSTEP_XY) + && axis == Z_AXIS + #endif + ) axis_total[BS_TOTAL_AXIS(axis)] = 0; + } #endif static void add_steps(const AxisEnum axis, const int16_t distance); diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index 8f708c14f6..43e6d36bec 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -31,9 +31,9 @@ #ifdef BACKLASH_DISTANCE_MM #if ENABLED(BACKLASH_GCODE) - float Backlash::distance_mm[XYZ] = BACKLASH_DISTANCE_MM; + xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; #else - const float Backlash::distance_mm[XYZ] = BACKLASH_DISTANCE_MM; + const xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; #endif #endif @@ -45,8 +45,8 @@ #endif #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - float Backlash::measured_mm[XYZ] = { 0 }; - uint8_t Backlash::measured_count[XYZ] = { 0 }; + xyz_float_t Backlash::measured_mm{0}; + xyz_uint8_t Backlash::measured_count{0}; #endif Backlash backlash; @@ -80,12 +80,12 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const // Residual error carried forward across multiple segments, so correction can be applied // to segments where there is no direction change. - static int32_t residual_error[XYZ] = { 0 }; + static xyz_long_t residual_error{0}; #else // No direction change, no correction. if (!changed_dir) return; // No leftover residual error from segment to segment - int32_t residual_error[XYZ] = { 0 }; + xyz_long_t residual_error{0}; #endif const float f_corr = float(correction) / 255.0f; @@ -123,7 +123,7 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const } #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN #define TEST_PROBE_PIN (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) #else #define TEST_PROBE_PIN (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) @@ -131,15 +131,15 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const // Measure Z backlash by raising nozzle in increments until probe deactivates void Backlash::measure_with_probe() { - if (measured_count[Z_AXIS] == 255) return; + if (measured_count.z == 255) return; - float start_height = current_position[Z_AXIS]; - while (current_position[Z_AXIS] < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN) - do_blocking_move_to_z(current_position[Z_AXIS] + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE)); + const float start_height = current_position.z; + while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN) + do_blocking_move_to_z(current_position.z + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE)); // The backlash from all probe points is averaged, so count the number of measurements - measured_mm[Z_AXIS] += current_position[Z_AXIS] - start_height; - measured_count[Z_AXIS]++; + measured_mm.z += current_position.z - start_height; + measured_count.z++; } #endif diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index 19d6534917..0ded86565b 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -29,7 +29,7 @@ constexpr uint8_t all_on = 0xFF, all_off = 0x00; class Backlash { public: #if ENABLED(BACKLASH_GCODE) - static float distance_mm[XYZ]; + static xyz_float_t distance_mm; static uint8_t correction; #ifdef BACKLASH_SMOOTHING_MM static float smoothing_mm; @@ -39,7 +39,7 @@ public: static inline float get_correction() { return float(ui8_to_percent(correction)) / 100.0f; } #else static constexpr uint8_t correction = (BACKLASH_CORRECTION) * 0xFF; - static const float distance_mm[XYZ]; + static const xyz_float_t distance_mm; #ifdef BACKLASH_SMOOTHING_MM static constexpr float smoothing_mm = BACKLASH_SMOOTHING_MM; #endif @@ -47,8 +47,8 @@ public: #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) private: - static float measured_mm[XYZ]; - static uint8_t measured_count[XYZ]; + static xyz_float_t measured_mm; + static xyz_uint8_t measured_count; public: static void measure_with_probe(); #endif diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index d1857af112..d5c5532ad4 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -35,9 +35,9 @@ #include "../../../lcd/extensible_ui/ui_api.h" #endif -int bilinear_grid_spacing[2], bilinear_start[2]; -float bilinear_grid_factor[2], - z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; +xy_int_t bilinear_grid_spacing, bilinear_start; +xy_float_t bilinear_grid_factor; +bed_mesh_t z_values; /** * Extrapolate a single point from its neighbors @@ -153,8 +153,8 @@ void print_bilinear_leveling_grid() { #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; - int bilinear_grid_spacing_virt[2] = { 0 }; - float bilinear_grid_factor_virt[2] = { 0 }; + xy_int_t bilinear_grid_spacing_virt; + xy_float_t bilinear_grid_factor_virt; void print_bilinear_leveling_grid_virt() { SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); @@ -207,7 +207,7 @@ void print_bilinear_leveling_grid() { + p[i] * (2 - 5 * sq(t) + 3 * t * sq(t)) + p[i+1] * t * (1 + 4 * t - 3 * sq(t)) - p[i+2] * sq(t) * (1 - t) - ) * 0.5; + ) * 0.5f; } static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { @@ -222,10 +222,8 @@ void print_bilinear_leveling_grid() { } void bed_level_virt_interpolate() { - bilinear_grid_spacing_virt[X_AXIS] = bilinear_grid_spacing[X_AXIS] / (BILINEAR_SUBDIVISIONS); - bilinear_grid_spacing_virt[Y_AXIS] = bilinear_grid_spacing[Y_AXIS] / (BILINEAR_SUBDIVISIONS); - bilinear_grid_factor_virt[X_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[X_AXIS]); - bilinear_grid_factor_virt[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[Y_AXIS]); + bilinear_grid_spacing_virt = bilinear_grid_spacing / (BILINEAR_SUBDIVISIONS); + bilinear_grid_factor_virt = bilinear_grid_spacing_virt.reciprocal(); for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ty++) @@ -245,40 +243,38 @@ void print_bilinear_leveling_grid() { // Refresh after other values have been updated void refresh_bed_level() { - bilinear_grid_factor[X_AXIS] = RECIPROCAL(bilinear_grid_spacing[X_AXIS]); - bilinear_grid_factor[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing[Y_AXIS]); + bilinear_grid_factor = bilinear_grid_spacing.reciprocal(); #if ENABLED(ABL_BILINEAR_SUBDIVISION) bed_level_virt_interpolate(); #endif } #if ENABLED(ABL_BILINEAR_SUBDIVISION) - #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt[A] - #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt[A] + #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt.A + #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt.A #define ABL_BG_POINTS_X ABL_GRID_POINTS_VIRT_X #define ABL_BG_POINTS_Y ABL_GRID_POINTS_VIRT_Y #define ABL_BG_GRID(X,Y) z_values_virt[X][Y] #else - #define ABL_BG_SPACING(A) bilinear_grid_spacing[A] - #define ABL_BG_FACTOR(A) bilinear_grid_factor[A] + #define ABL_BG_SPACING(A) bilinear_grid_spacing.A + #define ABL_BG_FACTOR(A) bilinear_grid_factor.A #define ABL_BG_POINTS_X GRID_MAX_POINTS_X #define ABL_BG_POINTS_Y GRID_MAX_POINTS_Y #define ABL_BG_GRID(X,Y) z_values[X][Y] #endif // Get the Z adjustment for non-linear bed leveling -float bilinear_z_offset(const float raw[XYZ]) { +float bilinear_z_offset(const xy_pos_t &raw) { - static float z1, d2, z3, d4, L, D, ratio_x, ratio_y, - last_x = -999.999, last_y = -999.999; + static float z1, d2, z3, d4, L, D; + + static xy_pos_t prev { -999.999, -999.999 }, ratio; // Whole units for the grid line indices. Constrained within bounds. - static int8_t gridx, gridy, nextx, nexty, - last_gridx = -99, last_gridy = -99; + static xy_int8_t thisg, nextg, lastg { -99, -99 }; // XY relative to the probed area - const float rx = raw[X_AXIS] - bilinear_start[X_AXIS], - ry = raw[Y_AXIS] - bilinear_start[Y_AXIS]; + xy_pos_t rel = raw - bilinear_start.asFloat(); #if ENABLED(EXTRAPOLATE_BEYOND_GRID) #define FAR_EDGE_OR_BOX 2 // Keep using the last grid box @@ -286,63 +282,62 @@ float bilinear_z_offset(const float raw[XYZ]) { #define FAR_EDGE_OR_BOX 1 // Just use the grid far edge #endif - if (last_x != rx) { - last_x = rx; - ratio_x = rx * ABL_BG_FACTOR(X_AXIS); - const float gx = constrain(FLOOR(ratio_x), 0, ABL_BG_POINTS_X - (FAR_EDGE_OR_BOX)); - ratio_x -= gx; // Subtract whole to get the ratio within the grid box + if (prev.x != rel.x) { + prev.x = rel.x; + ratio.x = rel.x * ABL_BG_FACTOR(x); + const float gx = constrain(FLOOR(ratio.x), 0, ABL_BG_POINTS_X - (FAR_EDGE_OR_BOX)); + ratio.x -= gx; // Subtract whole to get the ratio within the grid box #if DISABLED(EXTRAPOLATE_BEYOND_GRID) // Beyond the grid maintain height at grid edges - NOLESS(ratio_x, 0); // Never < 0.0. (> 1.0 is ok when nextx==gridx.) + NOLESS(ratio.x, 0); // Never <0 (>1 is ok when nextg.x==thisg.x) #endif - gridx = gx; - nextx = _MIN(gridx + 1, ABL_BG_POINTS_X - 1); + thisg.x = gx; + nextg.x = _MIN(thisg.x + 1, ABL_BG_POINTS_X - 1); } - if (last_y != ry || last_gridx != gridx) { + if (prev.y != rel.y || lastg.x != thisg.x) { - if (last_y != ry) { - last_y = ry; - ratio_y = ry * ABL_BG_FACTOR(Y_AXIS); - const float gy = constrain(FLOOR(ratio_y), 0, ABL_BG_POINTS_Y - (FAR_EDGE_OR_BOX)); - ratio_y -= gy; + if (prev.y != rel.y) { + prev.y = rel.y; + ratio.y = rel.y * ABL_BG_FACTOR(y); + const float gy = constrain(FLOOR(ratio.y), 0, ABL_BG_POINTS_Y - (FAR_EDGE_OR_BOX)); + ratio.y -= gy; #if DISABLED(EXTRAPOLATE_BEYOND_GRID) // Beyond the grid maintain height at grid edges - NOLESS(ratio_y, 0); // Never < 0.0. (> 1.0 is ok when nexty==gridy.) + NOLESS(ratio.y, 0); // Never < 0.0. (> 1.0 is ok when nextg.y==thisg.y.) #endif - gridy = gy; - nexty = _MIN(gridy + 1, ABL_BG_POINTS_Y - 1); + thisg.y = gy; + nextg.y = _MIN(thisg.y + 1, ABL_BG_POINTS_Y - 1); } - if (last_gridx != gridx || last_gridy != gridy) { - last_gridx = gridx; - last_gridy = gridy; + if (lastg != thisg) { + lastg = thisg; // Z at the box corners - z1 = ABL_BG_GRID(gridx, gridy); // left-front - d2 = ABL_BG_GRID(gridx, nexty) - z1; // left-back (delta) - z3 = ABL_BG_GRID(nextx, gridy); // right-front - d4 = ABL_BG_GRID(nextx, nexty) - z3; // right-back (delta) + z1 = ABL_BG_GRID(thisg.x, thisg.y); // left-front + d2 = ABL_BG_GRID(thisg.x, nextg.y) - z1; // left-back (delta) + z3 = ABL_BG_GRID(nextg.x, thisg.y); // right-front + d4 = ABL_BG_GRID(nextg.x, nextg.y) - z3; // right-back (delta) } - // Bilinear interpolate. Needed since ry or gridx has changed. - L = z1 + d2 * ratio_y; // Linear interp. LF -> LB - const float R = z3 + d4 * ratio_y; // Linear interp. RF -> RB + // Bilinear interpolate. Needed since rel.y or thisg.x has changed. + L = z1 + d2 * ratio.y; // Linear interp. LF -> LB + const float R = z3 + d4 * ratio.y; // Linear interp. RF -> RB D = R - L; } - const float offset = L + ratio_x * D; // the offset almost always changes + const float offset = L + ratio.x * D; // the offset almost always changes /* static float last_offset = 0; if (ABS(last_offset - offset) > 0.2) { - SERIAL_ECHOLNPAIR("Sudden Shift at x=", rx, " / ", bilinear_grid_spacing[X_AXIS], " -> gridx=", gridx); - SERIAL_ECHOLNPAIR(" y=", ry, " / ", bilinear_grid_spacing[Y_AXIS], " -> gridy=", gridy); - SERIAL_ECHOLNPAIR(" ratio_x=", ratio_x, " ratio_y=", ratio_y); + SERIAL_ECHOLNPAIR("Sudden Shift at x=", rel.x, " / ", bilinear_grid_spacing.x, " -> thisg.x=", thisg.x); + SERIAL_ECHOLNPAIR(" y=", rel.y, " / ", bilinear_grid_spacing.y, " -> thisg.y=", thisg.y); + SERIAL_ECHOLNPAIR(" ratio.x=", ratio.x, " ratio.y=", ratio.y); SERIAL_ECHOLNPAIR(" z1=", z1, " z2=", z2, " z3=", z3, " z4=", z4); SERIAL_ECHOLNPAIR(" L=", L, " R=", R, " offset=", offset); } @@ -354,7 +349,7 @@ float bilinear_z_offset(const float raw[XYZ]) { #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - #define CELL_INDEX(A,V) ((V - bilinear_start[_AXIS(A)]) * ABL_BG_FACTOR(_AXIS(A))) + #define CELL_INDEX(A,V) ((V - bilinear_start.A) * ABL_BG_FACTOR(A)) /** * Prepare a bilinear-leveled linear move on Cartesian, @@ -362,62 +357,61 @@ float bilinear_z_offset(const float raw[XYZ]) { */ void bilinear_line_to_destination(const feedRate_t scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { // Get current and destination cells for this line - int cx1 = CELL_INDEX(X, current_position[X_AXIS]), - cy1 = CELL_INDEX(Y, current_position[Y_AXIS]), - cx2 = CELL_INDEX(X, destination[X_AXIS]), - cy2 = CELL_INDEX(Y, destination[Y_AXIS]); - LIMIT(cx1, 0, ABL_BG_POINTS_X - 2); - LIMIT(cy1, 0, ABL_BG_POINTS_Y - 2); - LIMIT(cx2, 0, ABL_BG_POINTS_X - 2); - LIMIT(cy2, 0, ABL_BG_POINTS_Y - 2); + xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, + c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; + LIMIT(c1.x, 0, ABL_BG_POINTS_X - 2); + LIMIT(c1.y, 0, ABL_BG_POINTS_Y - 2); + LIMIT(c2.x, 0, ABL_BG_POINTS_X - 2); + LIMIT(c2.y, 0, ABL_BG_POINTS_Y - 2); // Start and end in the same cell? No split needed. - if (cx1 == cx2 && cy1 == cy2) { - set_current_from_destination(); + if (c1 == c2) { + current_position = destination; line_to_current_position(scaled_fr_mm_s); return; } - #define LINE_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) + #define LINE_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) - float normalized_dist, end[XYZE]; - const int8_t gcx = _MAX(cx1, cx2), gcy = _MAX(cy1, cy2); + float normalized_dist; + xyze_pos_t end; + const xy_int8_t gc { _MAX(c1.x, c2.x), _MAX(c1.y, c2.y) }; // Crosses on the X and not already split on this X? // The x_splits flags are insurance against rounding errors. - if (cx2 != cx1 && TEST(x_splits, gcx)) { + if (c2.x != c1.x && TEST(x_splits, gc.x)) { // Split on the X grid line - CBI(x_splits, gcx); - COPY(end, destination); - destination[X_AXIS] = bilinear_start[X_AXIS] + ABL_BG_SPACING(X_AXIS) * gcx; - normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); - destination[Y_AXIS] = LINE_SEGMENT_END(Y); + CBI(x_splits, gc.x); + end = destination; + destination.x = bilinear_start.x + ABL_BG_SPACING(x) * gc.x; + normalized_dist = (destination.x - current_position.x) / (end.x - current_position.x); + destination.y = LINE_SEGMENT_END(y); } // Crosses on the Y and not already split on this Y? - else if (cy2 != cy1 && TEST(y_splits, gcy)) { + else if (c2.y != c1.y && TEST(y_splits, gc.y)) { // Split on the Y grid line - CBI(y_splits, gcy); - COPY(end, destination); - destination[Y_AXIS] = bilinear_start[Y_AXIS] + ABL_BG_SPACING(Y_AXIS) * gcy; - normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); - destination[X_AXIS] = LINE_SEGMENT_END(X); + CBI(y_splits, gc.y); + end = destination; + destination.y = bilinear_start.y + ABL_BG_SPACING(y) * gc.y; + normalized_dist = (destination.y - current_position.y) / (end.y - current_position.y); + destination.x = LINE_SEGMENT_END(x); } else { // Must already have been split on these border(s) // This should be a rare case. - set_current_from_destination(); + current_position = destination; line_to_current_position(scaled_fr_mm_s); return; } - destination[Z_AXIS] = LINE_SEGMENT_END(Z); - destination[E_AXIS] = LINE_SEGMENT_END(E); + destination.z = LINE_SEGMENT_END(z); + destination.e = LINE_SEGMENT_END(e); // Do the split and look for more borders bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); // Restore destination from stack - COPY(destination, end); + destination = end; bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); } diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h index 71c7d83632..84ab853f8f 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.h +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -23,10 +23,10 @@ #include "../../../inc/MarlinConfigPre.h" -extern int bilinear_grid_spacing[2], bilinear_start[2]; -extern float bilinear_grid_factor[2], - z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; -float bilinear_z_offset(const float raw[XYZ]); +extern xy_int_t bilinear_grid_spacing, bilinear_start; +extern xy_float_t bilinear_grid_factor; +extern bed_mesh_t z_values; +float bilinear_z_offset(const xy_pos_t &raw); void extrapolate_unprobed_bed_level(); void print_bilinear_leveling_grid(); @@ -40,6 +40,6 @@ void refresh_bed_level(); void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); #endif -#define _GET_MESH_X(I) (bilinear_start[X_AXIS] + (I) * bilinear_grid_spacing[X_AXIS]) -#define _GET_MESH_Y(J) (bilinear_start[Y_AXIS] + (J) * bilinear_grid_spacing[Y_AXIS]) +#define _GET_MESH_X(I) float(bilinear_start.x + (I) * bilinear_grid_spacing.x) +#define _GET_MESH_Y(J) float(bilinear_start.y + (J) * bilinear_grid_spacing.y) #define Z_VALUES_ARR z_values diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index f4a17b0035..ef8cfd3455 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -51,7 +51,7 @@ bool leveling_is_valid() { #if ENABLED(MESH_BED_LEVELING) mbl.has_mesh() #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - !!bilinear_grid_spacing[X_AXIS] + !!bilinear_grid_spacing.x #elif ENABLED(AUTO_BED_LEVELING_UBL) ubl.mesh_is_valid() #else // 3POINT, LINEAR @@ -81,13 +81,13 @@ void set_bed_leveling_enabled(const bool enable/*=true*/) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) // Force bilinear_z_offset to re-calculate next time - const float reset[XYZ] = { -9999.999, -9999.999, 0 }; + const xyz_pos_t reset { -9999.999, -9999.999, 0 }; (void)bilinear_z_offset(reset); #endif if (planner.leveling_active) { // leveling from on to off // change unleveled current_position to physical current_position without moving steppers. - planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); + planner.apply_leveling(current_position); planner.leveling_active = false; // disable only AFTER calling apply_leveling } else { // leveling from off to on @@ -116,9 +116,9 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( planner.set_z_fade_height(zfh); if (leveling_was_active) { - const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + const xyz_pos_t oldpos = current_position; set_bed_leveling_enabled(true); - if (do_report && memcmp(oldpos, current_position, sizeof(oldpos))) + if (do_report && oldpos != current_position) report_current_position(); } } @@ -137,8 +137,8 @@ void reset_bed_level() { #if ENABLED(MESH_BED_LEVELING) mbl.reset(); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_start[X_AXIS] = bilinear_start[Y_AXIS] = - bilinear_grid_spacing[X_AXIS] = bilinear_grid_spacing[Y_AXIS] = 0; + bilinear_start.reset(); + bilinear_grid_spacing.reset(); for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { z_values[x][y] = NAN; @@ -223,25 +223,25 @@ void reset_bed_level() { #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) - void _manual_goto_xy(const float &rx, const float &ry) { + void _manual_goto_xy(const xy_pos_t &pos) { #ifdef MANUAL_PROBE_START_Z + constexpr float startz = _MAX(0, MANUAL_PROBE_START_Z); #if MANUAL_PROBE_HEIGHT > 0 - do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); - do_blocking_move_to_z(_MAX(0,MANUAL_PROBE_START_Z)); + do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); + do_blocking_move_to_z(startz); #else - do_blocking_move_to(rx, ry, _MAX(0,MANUAL_PROBE_START_Z)); + do_blocking_move_to_xy_z(pos, startz); #endif #elif MANUAL_PROBE_HEIGHT > 0 - const float prev_z = current_position[Z_AXIS]; - do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); + const float prev_z = current_position.z; + do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); do_blocking_move_to_z(prev_z); #else - do_blocking_move_to_xy(rx, ry); + do_blocking_move_to_xy(pos); #endif - current_position[X_AXIS] = rx; - current_position[Y_AXIS] = ry; + current_position = pos; #if ENABLED(LCD_BED_LEVELING) ui.wait_for_bl_move = false; diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index d01751407a..6ba0948880 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -38,7 +38,7 @@ void reset_bed_level(); #endif #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) - void _manual_goto_xy(const float &x, const float &y); + void _manual_goto_xy(const xy_pos_t &pos); #endif /** @@ -57,11 +57,6 @@ class TemporaryBedLevelingState { typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - typedef struct { - int8_t x_index, y_index; - float distance; // When populated, the distance from the search location - } mesh_index_pair; - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) #include "abl/abl.h" #elif ENABLED(AUTO_BED_LEVELING_UBL) @@ -71,6 +66,7 @@ class TemporaryBedLevelingState { #endif #define Z_VALUES(X,Y) Z_VALUES_ARR[X][Y] + #define _GET_MESH_POS(M) { _GET_MESH_X(M.a), _GET_MESH_Y(M.b) } #if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) @@ -85,4 +81,18 @@ class TemporaryBedLevelingState { #endif + struct mesh_index_pair { + xy_int8_t pos; + float distance; // When populated, the distance from the search location + void invalidate() { pos = -1; } + bool valid() const { return pos.x >= 0 && pos.y >= 0; } + #if ENABLED(AUTO_BED_LEVELING_UBL) + xy_pos_t meshpos() { + return { ubl.mesh_index_to_xpos(pos.x), ubl.mesh_index_to_ypos(pos.y) }; + } + #endif + operator xy_int8_t&() { return pos; } + operator const xy_int8_t&() const { return pos; } + }; + #endif diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index b3a1a13529..af9c671d6a 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -24,10 +24,9 @@ #if ENABLED(MESH_BED_LEVELING) - #include "mesh_bed_leveling.h" + #include "../bedlevel.h" #include "../../../module/motion.h" - #include "../../../feature/bedlevel/bedlevel.h" #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extensible_ui/ui_api.h" @@ -66,62 +65,60 @@ */ void mesh_bed_leveling::line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line - int cx1 = cell_index_x(current_position[X_AXIS]), - cy1 = cell_index_y(current_position[Y_AXIS]), - cx2 = cell_index_x(destination[X_AXIS]), - cy2 = cell_index_y(destination[Y_AXIS]); - NOMORE(cx1, GRID_MAX_POINTS_X - 2); - NOMORE(cy1, GRID_MAX_POINTS_Y - 2); - NOMORE(cx2, GRID_MAX_POINTS_X - 2); - NOMORE(cy2, GRID_MAX_POINTS_Y - 2); + xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); + NOMORE(scel.x, GRID_MAX_POINTS_X - 2); + NOMORE(scel.y, GRID_MAX_POINTS_Y - 2); + NOMORE(ecel.x, GRID_MAX_POINTS_X - 2); + NOMORE(ecel.y, GRID_MAX_POINTS_Y - 2); // Start and end in the same cell? No split needed. - if (cx1 == cx2 && cy1 == cy2) { + if (scel == ecel) { line_to_destination(scaled_fr_mm_s); - set_current_from_destination(); + current_position = destination; return; } - #define MBL_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) + #define MBL_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) - float normalized_dist, end[XYZE]; - const int8_t gcx = _MAX(cx1, cx2), gcy = _MAX(cy1, cy2); + float normalized_dist; + xyze_pos_t dest; + const int8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y); // Crosses on the X and not already split on this X? // The x_splits flags are insurance against rounding errors. - if (cx2 != cx1 && TEST(x_splits, gcx)) { + if (ecel.x != scel.x && TEST(x_splits, gcx)) { // Split on the X grid line CBI(x_splits, gcx); - COPY(end, destination); - destination[X_AXIS] = index_to_xpos[gcx]; - normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); - destination[Y_AXIS] = MBL_SEGMENT_END(Y); + dest = destination; + destination.x = index_to_xpos[gcx]; + normalized_dist = (destination.x - current_position.x) / (dest.x - current_position.x); + destination.y = MBL_SEGMENT_END(y); } // Crosses on the Y and not already split on this Y? - else if (cy2 != cy1 && TEST(y_splits, gcy)) { + else if (ecel.y != scel.y && TEST(y_splits, gcy)) { // Split on the Y grid line CBI(y_splits, gcy); - COPY(end, destination); - destination[Y_AXIS] = index_to_ypos[gcy]; - normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); - destination[X_AXIS] = MBL_SEGMENT_END(X); + dest = destination; + destination.y = index_to_ypos[gcy]; + normalized_dist = (destination.y - current_position.y) / (dest.y - current_position.y); + destination.x = MBL_SEGMENT_END(x); } else { // Must already have been split on these border(s) // This should be a rare case. line_to_destination(scaled_fr_mm_s); - set_current_from_destination(); + current_position = destination; return; } - destination[Z_AXIS] = MBL_SEGMENT_END(Z); - destination[E_AXIS] = MBL_SEGMENT_END(E); + destination.z = MBL_SEGMENT_END(z); + destination.e = MBL_SEGMENT_END(e); // Do the split and look for more borders line_to_destination(scaled_fr_mm_s, x_splits, y_splits); // Restore destination from stack - COPY(destination, end); + destination = dest; line_to_destination(scaled_fr_mm_s, x_splits, y_splits); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index def380399e..3009f4aea4 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -76,21 +76,27 @@ public: int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); } - static int8_t cell_index_y(const float &y) { int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); } + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } static int8_t probe_index_x(const float &x) { int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t probe_index_y(const float &y) { int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } + static inline xy_int8_t probe_indexes(const float &x, const float &y) { + return { probe_index_x(x), probe_index_y(y) }; + } + static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { const float delta_z = (z2 - z1) / (a2 - a1), @@ -98,21 +104,21 @@ public: return z1 + delta_a * delta_z; } - static float get_z(const float &x0, const float &y0 + static float get_z(const xy_pos_t &pos #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , const float &factor + , const float &factor=1.0f #endif ) { - const int8_t cx = cell_index_x(x0), cy = cell_index_y(y0); - const float z1 = calc_z0(x0, index_to_xpos[cx], z_values[cx][cy], index_to_xpos[cx + 1], z_values[cx + 1][cy]), - z2 = calc_z0(x0, index_to_xpos[cx], z_values[cx][cy + 1], index_to_xpos[cx + 1], z_values[cx + 1][cy + 1]), - z0 = calc_z0(y0, index_to_ypos[cy], z1, index_to_ypos[cy + 1], z2); + #if DISABLED(ENABLE_LEVELING_FADE_HEIGHT) + constexpr float factor = 1.0f; + #endif + const xy_int8_t ind = cell_indexes(pos); + const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1], + y1 = index_to_xpos[ind.y], y2 = index_to_xpos[ind.y+1], + z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]), + z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]); - return z_offset + z0 - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - * factor - #endif - ; + return z_offset + calc_z0(pos.y, y1, z1, y2, z2) * factor; } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 4cdc4721b5..259ee10966 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -176,8 +176,7 @@ // Add XY probe offset from extruder because probe_at_point() subtracts them when // moving to the XY position to be measured. This ensures better agreement between // the current Z position after G28 and the mesh values. - const float current_xi = find_closest_x_index(current_position[X_AXIS] + probe_offset[X_AXIS]), - current_yi = find_closest_y_index(current_position[Y_AXIS] + probe_offset[Y_AXIS]); + const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + xy_pos_t(probe_offset)); if (!lcd) SERIAL_EOL(); for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { @@ -193,7 +192,7 @@ for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { // Opening Brace or Space - const bool is_current = i == current_xi && j == current_yi; + const bool is_current = i == curr.x && j == curr.y; if (human) SERIAL_CHAR(is_current ? '[' : ' '); // Z Value at current I, J diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 6897217c38..2202bb6524 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -32,15 +32,12 @@ #define UBL_OK false #define UBL_ERR true -#define USE_NOZZLE_AS_REFERENCE 0 -#define USE_PROBE_AS_REFERENCE 1 - -// ubl_G29.cpp - enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; // External references +struct mesh_index_pair; + #define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) #define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) @@ -52,10 +49,11 @@ class unified_bed_leveling { g29_repetition_cnt, g29_storage_slot, g29_map_type; - static bool g29_c_flag, g29_x_flag, g29_y_flag; - static float g29_x_pos, g29_y_pos, - g29_card_thickness, + static bool g29_c_flag; + static float g29_card_thickness, g29_constant; + static xy_pos_t g29_pos; + static xy_bool_t xy_seen; #if HAS_BED_PROBE static int g29_grid_size; @@ -65,16 +63,19 @@ class unified_bed_leveling { static void move_z_with_encoder(const float &multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(float in_height); - static void manually_probe_remaining_mesh(const float&, const float&, const float&, const float&, const bool) _O0; - static void fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) _O0; + static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif static bool g29_parameter_parsing() _O0; static void shift_mesh_height(); - static void probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; + static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); + static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { + return smart_fill_one(pos.x, pos.y, dir.x, dir.y); + } static void smart_fill_mesh(); #if ENABLED(UBL_DEVEL_DEBUGGING) @@ -91,7 +92,7 @@ class unified_bed_leveling { static void save_ubl_active_state_and_disable(); static void restore_ubl_active_state_and_leave(); static void display_map(const int) _O0; - static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const float&, const float&, const bool, uint16_t[16]) _O0; + static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; static void reset(); static void invalidate(); @@ -118,14 +119,14 @@ class unified_bed_leveling { FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } - static int8_t get_cell_index_x(const float &x) { + static int8_t cell_index_x(const float &x) { const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX } // position. But with this defined this way, it is possible // to extrapolate off of this point even further out. Probably // that is OK because something else should be keeping that from // happening and should not be worried about at this level. - static int8_t get_cell_index_y(const float &y) { + static int8_t cell_index_y(const float &y) { const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX } // position. But with this defined this way, it is possible @@ -133,15 +134,22 @@ class unified_bed_leveling { // that is OK because something else should be keeping that from // happening and should not be worried about at this level. - static int8_t find_closest_x_index(const float &x) { + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + + static int8_t closest_x_index(const float &x) { const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - - static int8_t find_closest_y_index(const float &y) { + static int8_t closest_y_index(const float &y) { const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } + static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { + return { closest_x_index(xy.x), closest_y_index(xy.y) }; + } /** * z2 --| @@ -228,8 +236,7 @@ class unified_bed_leveling { * on the Y position within the cell. */ static float get_z_correction(const float &rx0, const float &ry0) { - const int8_t cx = get_cell_index_x(rx0), - cy = get_cell_index_y(ry0); // return values are clamped + const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped /** * Check if the requested location is off the mesh. If so, and @@ -275,11 +282,11 @@ class unified_bed_leveling { } return z0; } + static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } static inline float mesh_index_to_xpos(const uint8_t i) { return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); } - static inline float mesh_index_to_ypos(const uint8_t i) { return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 54c7666bac..69c3d2d997 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -53,8 +53,6 @@ #define UBL_G29_P31 - extern float destination[XYZE], current_position[XYZE]; - #if HAS_LCD_MENU void _lcd_ubl_output_map_lcd(); #endif @@ -67,13 +65,11 @@ unified_bed_leveling::g29_repetition_cnt, unified_bed_leveling::g29_storage_slot = 0, unified_bed_leveling::g29_map_type; - bool unified_bed_leveling::g29_c_flag, - unified_bed_leveling::g29_x_flag, - unified_bed_leveling::g29_y_flag; - float unified_bed_leveling::g29_x_pos, - unified_bed_leveling::g29_y_pos, - unified_bed_leveling::g29_card_thickness = 0, + bool unified_bed_leveling::g29_c_flag; + float unified_bed_leveling::g29_card_thickness = 0, unified_bed_leveling::g29_constant = 0; + xy_bool_t unified_bed_leveling::xy_seen; + xy_pos_t unified_bed_leveling::g29_pos; #if HAS_BED_PROBE int unified_bed_leveling::g29_grid_size; @@ -330,18 +326,19 @@ else { while (g29_repetition_cnt--) { if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair location = find_closest_mesh_point_of_type(REAL, g29_x_pos, g29_y_pos, USE_NOZZLE_AS_REFERENCE, nullptr); - if (location.x_index < 0) { - // No more REACHABLE mesh points to invalidate, so we ASSUME the user + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL mesh points to invalidate, so we ASSUME the user // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REACHABLE points. + // find_closest_mesh_point loop which only returns REAL points. set_all_mesh_points_to_value(NAN); SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); break; // No more invalid Mesh Points to populate } - z_values[location.x_index][location.y_index] = NAN; + z_values[cpos.x][cpos.y] = NAN; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(location.x_index, location.y_index, 0); + ExtUI::onMeshUpdate(closest, 0); #endif cnt++; } @@ -448,13 +445,13 @@ SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); } if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_x_pos); + SERIAL_ECHOPAIR("Probing around (", g29_pos.x); SERIAL_CHAR(','); - SERIAL_ECHO(g29_y_pos); + SERIAL_ECHO(g29_pos.y); SERIAL_ECHOLNPGM(").\n"); } - probe_entire_mesh(g29_x_pos + probe_offset[X_AXIS], g29_y_pos + probe_offset[Y_AXIS], - parser.seen('T'), parser.seen('E'), parser.seen('U')); + const xy_pos_t near = g29_pos + probe_offset; + probe_entire_mesh(near, parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); probe_deployed = true; @@ -470,7 +467,7 @@ SERIAL_ECHOLNPGM("Manually probing unreachable mesh locations."); do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); - if (parser.seen('C') && !g29_x_flag && !g29_y_flag) { + if (parser.seen('C') && !xy_seen) { /** * Use a good default location for the path. * The flipped > and < operators in these comparisons is intentional. @@ -478,13 +475,14 @@ * It may make sense to have Delta printers default to the center of the bed. * Until that is decided, this can be forced with the X and Y parameters. */ - #if IS_KINEMATIC - g29_x_pos = X_HOME_POS; - g29_y_pos = Y_HOME_POS; - #else // cartesian - g29_x_pos = probe_offset[X_AXIS] > 0 ? X_BED_SIZE : 0; - g29_y_pos = probe_offset[Y_AXIS] < 0 ? Y_BED_SIZE : 0; - #endif + g29_pos.set( + #if IS_KINEMATIC + X_HOME_POS, Y_HOME_POS + #else + probe_offset.x > 0 ? X_BED_SIZE : 0, + probe_offset.y < 0 ? Y_BED_SIZE : 0 + #endif + ); } if (parser.seen('B')) { @@ -496,13 +494,13 @@ probe_deployed = true; } - if (!position_is_reachable(g29_x_pos, g29_y_pos)) { + if (!position_is_reachable(g29_pos)) { SERIAL_ECHOLNPGM("XY outside printable radius."); return; } const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_x_pos, g29_y_pos, height, g29_card_thickness, parser.seen('T')); + manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); SERIAL_ECHOLNPGM("G29 P2 finished."); @@ -530,20 +528,22 @@ } else { while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair location = find_closest_mesh_point_of_type(INVALID, g29_x_pos, g29_y_pos, USE_NOZZLE_AS_REFERENCE, nullptr); - if (location.x_index < 0) { - // No more REACHABLE INVALID mesh points to populate, so we ASSUME + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) - if (isnan(z_values[x][y])) - z_values[x][y] = g29_constant; + if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; break; // No more invalid Mesh Points to populate } - z_values[location.x_index][location.y_index] = g29_constant; - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(location.x_index, location.y_index, z_values[location.x_index][location.y_index]); - #endif + else { + z_values[cpos.x][cpos.y] = g29_constant; + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(closest, g29_constant); + #endif + } } } } @@ -576,7 +576,7 @@ case 4: // Fine Tune (i.e., Edit) the Mesh #if HAS_LCD_MENU - fine_tune_mesh(g29_x_pos, g29_y_pos, parser.seen('T')); + fine_tune_mesh(g29_pos, parser.seen('T')); #else SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); return; @@ -740,9 +740,7 @@ * Probe all invalidated locations of the mesh that can be reached by the probe. * This attempts to fill in locations closest to the nozzle's start location first. */ - void unified_bed_leveling::probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { - mesh_index_pair location; - + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { #if HAS_LCD_MENU ui.capture(); #endif @@ -752,13 +750,14 @@ uint8_t count = GRID_MAX_POINTS; + mesh_index_pair best; do { if (do_ubl_mesh_map) display_map(g29_map_type); const int point_num = (GRID_MAX_POINTS) - count + 1; SERIAL_ECHOLNPAIR("\nProbing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".\n"); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_PROBING_MESH " %i/%i"), point_num, int(GRID_MAX_POINTS)); + ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS)); #endif #if HAS_LCD_MENU @@ -773,23 +772,23 @@ } #endif - if (do_furthest) - location = find_furthest_invalid_mesh_point(); - else - location = find_closest_mesh_point_of_type(INVALID, rx, ry, USE_PROBE_AS_REFERENCE, nullptr); + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, near, true); - if (location.x_index >= 0) { // mesh point found and is reachable by probe - const float rawx = mesh_index_to_xpos(location.x_index), - rawy = mesh_index_to_ypos(location.y_index), - measured_z = probe_at_point(rawx, rawy, stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling - z_values[location.x_index][location.y_index] = measured_z; + if (best.pos.x >= 0) { // mesh point found and is reachable by probe + const float measured_z = probe_at_point( + best.meshpos(), + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + ); + z_values[best.pos.x][best.pos.y] = measured_z; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(location.x_index, location.y_index, measured_z); + ExtUI::onMeshUpdate(best, measured_z); #endif } SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (location.x_index >= 0 && --count); + } while (best.pos.x >= 0 && --count); STOW_PROBE(); @@ -800,8 +799,8 @@ restore_ubl_active_state_and_leave(); do_blocking_move_to_xy( - constrain(rx - probe_offset[X_AXIS], MESH_MIN_X, MESH_MAX_X), - constrain(ry - probe_offset[Y_AXIS], MESH_MIN_Y, MESH_MAX_Y) + constrain(near.x - probe_offset.x, MESH_MIN_X, MESH_MAX_X), + constrain(near.y - probe_offset.y, MESH_MIN_Y, MESH_MAX_Y) ); } @@ -835,7 +834,7 @@ idle(); gcode.reset_stepper_timeout(); // Keep steppers powered if (encoder_diff) { - do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * multiplier); + do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); encoder_diff = 0; } } @@ -844,7 +843,7 @@ float unified_bed_leveling::measure_point_with_encoder() { KEEPALIVE_STATE(PAUSED_FOR_USER); move_z_with_encoder(0.01f); - return current_position[Z_AXIS]; + return current_position.z; } static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } @@ -863,7 +862,7 @@ echo_and_take_a_measurement(); const float z1 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position[Z_AXIS] + SIZE_OF_LITTLE_RAISE); + do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); planner.synchronize(); SERIAL_ECHOPGM("Remove shim"); @@ -872,7 +871,7 @@ const float z2 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); const float thickness = ABS(z1 - z2); @@ -888,29 +887,33 @@ return thickness; } - void unified_bed_leveling::manually_probe_remaining_mesh(const float &rx, const float &ry, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { + void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { ui.capture(); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], z_clearance); + do_blocking_move_to_xy_z(current_position, z_clearance); ui.return_to_status(); mesh_index_pair location; + xy_int8_t &lpos = location.pos; do { - location = find_closest_mesh_point_of_type(INVALID, rx, ry, USE_NOZZLE_AS_REFERENCE, nullptr); + location = find_closest_mesh_point_of_type(INVALID, pos); // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. - if (location.x_index < 0 && location.y_index < 0) continue; + if (!location.valid()) continue; - const float xProbe = mesh_index_to_xpos(location.x_index), - yProbe = mesh_index_to_ypos(location.y_index); + const xyz_pos_t ppos = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; - if (!position_is_reachable(xProbe, yProbe)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) + if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); - do_blocking_move_to(xProbe, yProbe, Z_CLEARANCE_BETWEEN_PROBES); + do_blocking_move_to(ppos); do_blocking_move_to_z(z_clearance); KEEPALIVE_STATE(PAUSED_FOR_USER); @@ -918,7 +921,7 @@ if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - serialprintPGM(parser.seen('B') ? PSTR(MSG_UBL_BC_INSERT) : PSTR(MSG_UBL_BC_INSERT2)); + serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click @@ -932,20 +935,20 @@ return restore_ubl_active_state_and_leave(); } - z_values[location.x_index][location.y_index] = current_position[Z_AXIS] - thick; + z_values[lpos.x][lpos.y] = current_position.z - thick; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(location.x_index, location.y_index, z_values[location.x_index][location.y_index]); + ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y]); #endif if (g29_verbose_level > 2) - SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[location.x_index][location.y_index], 6); + SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (location.x_index >= 0 && location.y_index >= 0); + } while (location.valid()); if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing restore_ubl_active_state_and_leave(); - do_blocking_move_to(rx, ry, Z_CLEARANCE_DEPLOY_PROBE); + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); } inline void set_message_with_feedback(PGM_P const msg_P) { @@ -956,11 +959,11 @@ void abort_fine_tune() { ui.return_to_status(); do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(PSTR(MSG_EDITING_STOPPED)); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); } - void unified_bed_leveling::fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. #if ENABLED(UBL_MESH_EDIT_MOVES_Z) @@ -973,7 +976,7 @@ mesh_index_pair location; - if (!position_is_reachable(rx, ry)) { + if (!position_is_reachable(pos)) { SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); return; } @@ -981,76 +984,78 @@ save_ubl_active_state_and_disable(); LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); - ui.capture(); // Take over control of the LCD encoder + ui.capture(); // Take over control of the LCD encoder - do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset + do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset #endif - uint16_t not_done[16]; - memset(not_done, 0xFF, sizeof(not_done)); + MeshFlags done_flags{0}; + xy_int8_t &lpos = location.pos; do { - location = find_closest_mesh_point_of_type(SET_IN_BITMAP, rx, ry, USE_NOZZLE_AS_REFERENCE, not_done); + location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); - if (location.x_index < 0) break; // Stop when there are no more reachable points + if (lpos.x < 0) break; // Stop when there are no more reachable points - bitmap_clear(not_done, location.x_index, location.y_index); // Mark this location as 'adjusted' so a new - // location is used on the next loop + done_flags.mark(lpos); // Mark this location as 'adjusted' so a new + // location is used on the next loop + const xyz_pos_t raw = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; - const float rawx = mesh_index_to_xpos(location.x_index), - rawy = mesh_index_to_ypos(location.y_index); + if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) - if (!position_is_reachable(rawx, rawy)) break; // SHOULD NOT OCCUR because find_closest_mesh_point_of_type will only return reachable - - do_blocking_move_to(rawx, rawy, Z_CLEARANCE_BETWEEN_PROBES); // Move the nozzle to the edit point with probe clearance + do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset before editing + do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset before editing #endif KEEPALIVE_STATE(PAUSED_FOR_USER); - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point ui.refresh(); - float new_z = z_values[location.x_index][location.y_index]; - if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 - new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place + float new_z = z_values[lpos.x][lpos.y]; + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place lcd_mesh_edit_setup(new_z); do { new_z = lcd_mesh_edit(); #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - do_blocking_move_to_z(h_offset + new_z); // Move the nozzle as the point is edited + do_blocking_move_to_z(h_offset + new_z); // Move the nozzle as the point is edited #endif idle(); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (!ui.button_pressed()); - if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status + if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing - z_values[location.x_index][location.y_index] = new_z; // Save the updated Z value + z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(location.x_index, location.y_index, new_z); + ExtUI::onMeshUpdate(location, new_z); #endif - serial_delay(20); // No switch noise + serial_delay(20); // No switch noise ui.refresh(); - } while (location.x_index >= 0 && --g29_repetition_cnt > 0); + } while (lpos.x >= 0 && --g29_repetition_cnt > 0); ui.release(); if (do_ubl_mesh_map) display_map(g29_map_type); restore_ubl_active_state_and_leave(); - do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES); + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); SERIAL_ECHOLNPGM("Done Editing Mesh"); @@ -1067,17 +1072,12 @@ bool err_flag = false; #if HAS_LCD_MENU - set_message_with_feedback(PSTR(MSG_UBL_DOING_G29)); + set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29)); #endif g29_constant = 0; g29_repetition_cnt = 0; - g29_x_flag = parser.seenval('X'); - g29_x_pos = g29_x_flag ? parser.value_float() : current_position[X_AXIS]; - g29_y_flag = parser.seenval('Y'); - g29_y_pos = g29_y_flag ? parser.value_float() : current_position[Y_AXIS]; - if (parser.seen('R')) { g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); @@ -1124,17 +1124,24 @@ #endif } - if (g29_x_flag != g29_y_flag) { + xy_seen.x = parser.seenval('X'); + float sx = xy_seen.x ? parser.value_float() : current_position.x; + xy_seen.y = parser.seenval('Y'); + float sy = xy_seen.y ? parser.value_float() : current_position.y; + + if (xy_seen.x != xy_seen.y) { SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); err_flag = true; } // If X or Y are not valid, use center of the bed values - if (!WITHIN(g29_x_pos, X_MIN_BED, X_MAX_BED)) g29_x_pos = X_CENTER; - if (!WITHIN(g29_y_pos, Y_MIN_BED, Y_MAX_BED)) g29_y_pos = Y_CENTER; + if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; if (err_flag) return UBL_ERR; + g29_pos.set(sx, sy); + /** * Activate or deactivate UBL * Note: UBL's G29 restores the state set here when done. @@ -1189,7 +1196,7 @@ if (ubl_state_recursion_chk != 1) { SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); #if HAS_LCD_MENU - set_message_with_feedback(PSTR(MSG_UBL_SAVE_ERROR)); + set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR)); #endif return; } @@ -1203,7 +1210,7 @@ if (--ubl_state_recursion_chk) { SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); #if HAS_LCD_MENU - set_message_with_feedback(PSTR(MSG_UBL_RESTORE_ERROR)); + set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR)); #endif return; } @@ -1213,26 +1220,22 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { - bool found_a_NAN = false, found_a_real = false; + bool found_a_NAN = false, found_a_real = false; - mesh_index_pair out_mesh; - out_mesh.x_index = out_mesh.y_index = -1; - out_mesh.distance = -99999.99f; + mesh_index_pair farthest { -1, -1, -99999.99 }; for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - if (isnan(z_values[i][j])) { // Check to see if this location holds an invalid mesh point + if (isnan(z_values[i][j])) { // Invalid mesh point? - const float mx = mesh_index_to_xpos(i), - my = mesh_index_to_ypos(j); - - if (!position_is_reachable_by_probe(mx, my)) // make sure the probe can get to the mesh point + // Skip points the probe can't reach + if (!position_is_reachable_by_probe(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) continue; found_a_NAN = true; - int8_t closest_x = -1, closest_y = -1; + xy_int8_t near { -1, -1 }; float d1, d2 = 99999.9f; for (int8_t k = 0; k < GRID_MAX_POINTS_X; k++) { for (int8_t l = 0; l < GRID_MAX_POINTS_Y; l++) { @@ -1245,84 +1248,75 @@ d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); - if (d1 < d2) { // found a closer distance from invalid mesh point at (i,j) to defined mesh point at (k,l) - d2 = d1; // found a closer location with - closest_x = i; // an assigned mesh point value - closest_y = j; + if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) + d2 = d1; + near.set(i, j); } } } } // - // At this point d2 should have the closest defined mesh point to invalid mesh point (i,j) + // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) // - if (found_a_real && (closest_x >= 0) && (d2 > out_mesh.distance)) { - out_mesh.distance = d2; // found an invalid location with a greater distance - out_mesh.x_index = closest_x; // to a defined mesh point - out_mesh.y_index = closest_y; + if (found_a_real && near.x >= 0 && d2 > farthest.distance) { + farthest.pos = near; // Found an invalid location farther from the defined mesh point + farthest.distance = d2; } } } // for j } // for i if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing - out_mesh.x_index = GRID_MAX_POINTS_X / 2; - out_mesh.y_index = GRID_MAX_POINTS_Y / 2; - out_mesh.distance = 1; + farthest.pos.set(GRID_MAX_POINTS_X / 2, GRID_MAX_POINTS_Y / 2); + farthest.distance = 1; } - return out_mesh; + return farthest; } - mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const float &rx, const float &ry, const bool probe_as_reference, uint16_t bits[16]) { - mesh_index_pair out_mesh; - out_mesh.x_index = out_mesh.y_index = -1; - out_mesh.distance = -99999.9f; + mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; - // Get our reference position. Either the nozzle or probe location. - const float px = rx + (probe_as_reference == USE_PROBE_AS_REFERENCE ? probe_offset[X_AXIS] : 0), - py = ry + (probe_as_reference == USE_PROBE_AS_REFERENCE ? probe_offset[Y_AXIS] : 0); + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe_offset : pos; float best_so_far = 99999.99f; for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - - if ( (type == INVALID && isnan(z_values[i][j])) // Check to see if this location holds the right thing - || (type == REAL && !isnan(z_values[i][j])) - || (type == SET_IN_BITMAP && is_bitmap_set(bits, i, j)) + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) ) { - // We only get here if we found a Mesh Point of the specified type - - const float mx = mesh_index_to_xpos(i), - my = mesh_index_to_ypos(j); + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; // If using the probe as the reference there are some unreachable locations. // Also for round beds, there are grid points outside the bed the nozzle can't reach. // Prune them from the list and ignore them till the next Phase (manual nozzle probing). - if (probe_as_reference ? !position_is_reachable_by_probe(mx, my) : !position_is_reachable(mx, my)) + if (probe_relative ? !position_is_reachable_by_probe(mpos) : !position_is_reachable(mpos)) continue; // Reachable. Check if it's the best_so_far location to the nozzle. - float distance = HYPOT(px - mx, py - my); + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; // factor in the distance from the current location for the normal case // so the nozzle isn't running all over the bed. - distance += HYPOT(current_position[X_AXIS] - mx, current_position[Y_AXIS] - my) * 0.1f; if (distance < best_so_far) { - best_so_far = distance; // We found a closer location with - out_mesh.x_index = i; // the specified type of mesh value. - out_mesh.y_index = j; - out_mesh.distance = best_so_far; + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; } } } // for j } // for i - return out_mesh; + return closest; } /** @@ -1332,20 +1326,20 @@ */ bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - const int8_t x1 = x + xdir, x2 = x1 + xdir, - y1 = y + ydir, y2 = y1 + ydir; - // A NAN next to a pair of real values? - if (isnan(z_values[x][y]) && !isnan(z_values[x1][y1]) && !isnan(z_values[x2][y2])) { - if (z_values[x1][y1] < z_values[x2][y2]) // Angled downward? - z_values[x][y] = z_values[x1][y1]; // Use nearest (maybe a little too high.) - else - z_values[x][y] = 2.0f * z_values[x1][y1] - z_values[x2][y2]; // Angled upward... - - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(x, y, z_values[x][y]); - #endif - - return true; + const float v = z_values[x][y]; + if (isnan(v)) { // A NAN... + const int8_t dx = x + xdir, dy = y + ydir; + const float v1 = z_values[dx][dy]; + if (!isnan(v1)) { // ...next to a pair of real values? + const float v2 = z_values[dx + xdir][dy + ydir]; + if (!isnan(v2)) { + z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(x, y, z_values[pos.x][pos.y]); + #endif + return true; + } + } } return false; } @@ -1391,15 +1385,15 @@ dx = (x_max - x_min) / (g29_grid_size - 1), dy = (y_max - y_min) / (g29_grid_size - 1); - vector_3 points[3] = { + const vector_3 points[3] = { #if ENABLED(HAS_FIXED_3POINT) - vector_3(PROBE_PT_1_X, PROBE_PT_1_Y, 0), - vector_3(PROBE_PT_2_X, PROBE_PT_2_Y, 0), - vector_3(PROBE_PT_3_X, PROBE_PT_3_Y, 0) + { PROBE_PT_1_X, PROBE_PT_1_Y, 0 }, + { PROBE_PT_2_X, PROBE_PT_2_Y, 0 }, + { PROBE_PT_3_X, PROBE_PT_3_Y, 0 } #else - vector_3(x_min, y_min, 0), - vector_3(x_max, y_min, 0), - vector_3((x_max - x_min) / 2, y_max, 0) + { x_min, y_min, 0 }, + { x_max, y_min, 0 }, + { (x_max - x_min) / 2, y_max, 0 } #endif }; @@ -1416,14 +1410,14 @@ if (do_3_pt_leveling) { SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_LCD_TILTING_MESH " 1/3")); + ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH)); #endif - measured_z = probe_at_point(points[0].x, points[0].y, PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[0].x, points[0].y); + measured_z -= get_z_correction(points[0]); #ifdef VALIDATE_MESH_TILT z1 = measured_z; #endif @@ -1431,50 +1425,50 @@ serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[0].x, points[0].y, measured_z); + incremental_LSF(&lsf_results, points[0], measured_z); } if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_LCD_TILTING_MESH " 2/3")); + ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH)); #endif - measured_z = probe_at_point(points[1].x, points[1].y, PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); #ifdef VALIDATE_MESH_TILT z2 = measured_z; #endif if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[1].x, points[1].y); + measured_z -= get_z_correction(points[1]); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[1].x, points[1].y, measured_z); + incremental_LSF(&lsf_results, points[1], measured_z); } } if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_LCD_TILTING_MESH " 3/3")); + ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH)); #endif - measured_z = probe_at_point(points[2].x, points[2].y, PROBE_PT_STOW, g29_verbose_level); + measured_z = probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); #ifdef VALIDATE_MESH_TILT z3 = measured_z; #endif if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[2].x, points[2].y); + measured_z -= get_z_correction(points[2]); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[2].x, points[2].y, measured_z); + incremental_LSF(&lsf_results, points[2], measured_z); } } @@ -1494,35 +1488,36 @@ uint16_t total_points = g29_grid_size * g29_grid_size, point_num = 1; + xy_pos_t rpos; for (uint8_t ix = 0; ix < g29_grid_size; ix++) { - const float rx = x_min + ix * dx; + rpos.x = x_min + ix * dx; for (int8_t iy = 0; iy < g29_grid_size; iy++) { - const float ry = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); + rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_LCD_TILTING_MESH " %i/%i"), point_num, total_points); + ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points); #endif - measured_z = probe_at_point(rx, ry, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + measured_z = probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling abort_flag = isnan(measured_z); if (DEBUGGING(LEVELING)) { + const xy_pos_t lpos = rpos.asLogical(); DEBUG_CHAR('('); - DEBUG_ECHO_F(rx, 7); + DEBUG_ECHO_F(rpos.x, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(ry, 7); - DEBUG_ECHOPGM(") logical: ("); - DEBUG_ECHO_F(LOGICAL_X_POSITION(rx), 7); + DEBUG_ECHO_F(rpos.y, 7); + DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(LOGICAL_Y_POSITION(ry), 7); + DEBUG_ECHO_F(lpos.y, 7); DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); - DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rx, ry), 7); + DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); } - measured_z -= get_z_correction(rx, ry) /* + probe_offset[Z_AXIS] */ ; + measured_z -= get_z_correction(rpos) /* + probe_offset.z */ ; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); @@ -1530,7 +1525,7 @@ serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, rx, ry, measured_z); + incremental_LSF(&lsf_results, rpos, measured_z); } point_num++; @@ -1564,33 +1559,33 @@ for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - float x_tmp = mesh_index_to_xpos(i), - y_tmp = mesh_index_to_ypos(j), - z_tmp = z_values[i][j]; + float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j), + mz = z_values[i][j]; if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("before rotation = [", x_tmp, 7); + DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(y_tmp, 7); + DEBUG_ECHO_F(my, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(z_tmp, 7); + DEBUG_ECHO_F(mz, 7); DEBUG_ECHOPGM("] ---> "); DEBUG_DELAY(20); } - apply_rotation_xyz(rotation, x_tmp, y_tmp, z_tmp); + apply_rotation_xyz(rotation, mx, my, mz); if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("after rotation = [", x_tmp, 7); + DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(y_tmp, 7); + DEBUG_ECHO_F(my, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(z_tmp, 7); + DEBUG_ECHO_F(mz, 7); DEBUG_ECHOLNPGM("]"); - DEBUG_DELAY(55); + DEBUG_DELAY(20); } - z_values[i][j] = z_tmp - lsf_results.D; + z_values[i][j] = mz - lsf_results.D; #if ENABLED(EXTENSIBLE_UI) ExtUI::onMeshUpdate(i, j, z_values[i][j]); #endif @@ -1613,41 +1608,32 @@ DEBUG_EOL(); /** - * The following code can be used to check the validity of the mesh tilting algorithm. - * When a 3-Point Mesh Tilt is done, the same algorithm is used as the grid based tilting. - * The only difference is just 3 points are used in the calculations. That fact guarantees - * each probed point should have an exact match when a get_z_correction() for that location - * is calculated. The Z error between the probed point locations and the get_z_correction() + * Use the code below to check the validity of the mesh tilting algorithm. + * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only + * three points are used in the calculation. This guarantees that each probed point + * has an exact match when get_z_correction() for that location is calculated. + * The Z error between the probed point locations and the get_z_correction() * numbers for those locations should be 0. */ #ifdef VALIDATE_MESH_TILT - float t, t1, d; - t = normal.x * x_min + normal.y * y_min; - d = t + normal.z * z1; - DEBUG_ECHOPAIR_F("D from 1st point: ", d, 6); - DEBUG_ECHOLNPAIR_F(" Z error: ", normal.z * z1 - get_z_correction(x_min, y_min), 6); - - t = normal.x * x_max + normal.y * y_min; - d = t + normal.z * z2; - DEBUG_EOL(); - DEBUG_ECHOPAIR_F("D from 2nd point: ", d, 6); - DEBUG_ECHOLNPAIR_F(" Z error: ", normal.z * z2 - get_z_correction(x_max, y_min), 6); - - t = normal.x * ((x_max - x_min) / 2) + normal.y * (y_min); - d = t + normal.z * z3; - DEBUG_ECHOPAIR_F("D from 3rd point: ", d, 6); - DEBUG_ECHOLNPAIR_F(" Z error: ", normal.z * z3 - get_z_correction((x_max - x_min) / 2, y_max), 6); - - t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); - d = t + normal.z * 0; - DEBUG_ECHOLNPAIR_F("D from home location with Z=0 : ", d, 6); - - t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); - d = t + get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT); // normal.z * 0; - DEBUG_ECHOPAIR_F("D from home location using mesh value for Z: ", d, 6); - + auto d_from = []() { DEBUG_ECHOPGM("D from "); }; + auto normed = [&](const xy_pos_t &pos, const float &zadd) { + return normal.x * pos.x + normal.y * pos.y + zadd; + }; + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + d_from(); serialprintPGM(pre); + DEBUG_ECHO_F(normed(pos, zadd), 6); + DEBUG_ECHOLNPAIR_F(" Z error: ", zadd - get_z_correction(pos), 6); + }; + debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); + debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); + debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); DEBUG_ECHOPAIR(" Z error: (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); - DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT), 6); + DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); #endif } // DEBUGGING(LEVELING) @@ -1676,21 +1662,23 @@ if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + xy_pos_t ppos; for (uint8_t ix = 0; ix < GRID_MAX_POINTS_X; ix++) { - const float px = mesh_index_to_xpos(ix); + ppos.x = mesh_index_to_xpos(ix); for (uint8_t iy = 0; iy < GRID_MAX_POINTS_Y; iy++) { - const float py = mesh_index_to_ypos(iy); + ppos.y = mesh_index_to_ypos(iy); if (isnan(z_values[ix][iy])) { - // undefined mesh point at (px,py), compute weighted LSF from original valid mesh points. + // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. incremental_LSF_reset(&lsf_results); + xy_pos_t rpos; for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) { - const float rx = mesh_index_to_xpos(jx); + rpos.x = mesh_index_to_xpos(jx); for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++) { if (TEST(bitmap[jx], jy)) { - const float ry = mesh_index_to_ypos(jy), - rz = z_values[jx][jy], - w = 1 + weight_scaled / HYPOT((rx - px), (ry - py)); - incremental_WLSF(&lsf_results, rx, ry, rz, w); + rpos.y = mesh_index_to_ypos(jy); + const float rz = z_values[jx][jy], + w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); + incremental_WLSF(&lsf_results, rpos, rz, w); } } } @@ -1698,12 +1686,12 @@ SERIAL_ECHOLNPGM("Insufficient data"); return; } - const float ez = -lsf_results.D - lsf_results.A * px - lsf_results.B * py; + const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; z_values[ix][iy] = ez; #if ENABLED(EXTENSIBLE_UI) ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy]); #endif - idle(); // housekeeping + idle(); // housekeeping } } } @@ -1734,7 +1722,7 @@ adjust_mesh_to_mean(g29_c_flag, g29_constant); #if HAS_BED_PROBE - SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe_offset[Z_AXIS], 7); + SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe_offset.z, 7); #endif SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index fcce41169a..a0d5518c45 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -35,12 +35,6 @@ #include "../../../Marlin.h" #include -#if AVR_AT90USB1286_FAMILY // Teensyduino & Printrboard IDE extensions have compile errors without this - inline void set_current_from_destination() { COPY(current_position, destination); } -#else - extern void set_current_from_destination(); -#endif - #if !UBL_SEGMENTED void unified_bed_leveling::line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t extruder) { @@ -50,60 +44,57 @@ * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave */ #if HAS_POSITION_MODIFIERS - float start[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }, - end[XYZE] = { destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS] }; + xyze_pos_t start = current_position, end = destination; planner.apply_modifiers(start); planner.apply_modifiers(end); #else - const float (&start)[XYZE] = current_position, - (&end)[XYZE] = destination; + const xyze_pos_t &start = current_position, &end = destination; #endif - const int cell_start_xi = get_cell_index_x(start[X_AXIS]), - cell_start_yi = get_cell_index_y(start[Y_AXIS]), - cell_dest_xi = get_cell_index_x(end[X_AXIS]), - cell_dest_yi = get_cell_index_y(end[Y_AXIS]); + const xy_int8_t istart = cell_indexes(start), iend = cell_indexes(end); // A move within the same cell needs no splitting - if (cell_start_xi == cell_dest_xi && cell_start_yi == cell_dest_yi) { + if (istart == iend) { // For a move off the bed, use a constant Z raise - if (!WITHIN(cell_dest_xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cell_dest_yi, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) { // Note: There is no Z Correction in this case. We are off the grid and don't know what // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. - const float z_raise = 0.0 - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - + UBL_Z_RAISE_WHEN_OFF_MESH - #endif - ; - planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + z_raise, end[E_AXIS], scaled_fr_mm_s, extruder); - set_current_from_destination(); + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + end.z += UBL_Z_RAISE_WHEN_OFF_MESH; + #endif + planner.buffer_segment(end, scaled_fr_mm_s, extruder); + current_position = destination; return; } FINAL_MOVE: // The distance is always MESH_X_DIST so multiply by the constant reciprocal. - const float xratio = (end[X_AXIS] - mesh_index_to_xpos(cell_dest_xi)) * RECIPROCAL(MESH_X_DIST); + const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST); - float z1 = z_values[cell_dest_xi ][cell_dest_yi ] + xratio * - (z_values[cell_dest_xi + 1][cell_dest_yi ] - z_values[cell_dest_xi][cell_dest_yi ]), - z2 = z_values[cell_dest_xi ][cell_dest_yi + 1] + xratio * - (z_values[cell_dest_xi + 1][cell_dest_yi + 1] - z_values[cell_dest_xi][cell_dest_yi + 1]); - - if (cell_dest_xi >= GRID_MAX_POINTS_X - 1) z1 = z2 = 0.0; + float z1, z2; + if (iend.x >= GRID_MAX_POINTS_X - 1) + z1 = z2 = 0.0; + else { + z1 = z_values[iend.x ][iend.y ] + xratio * + (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]), + z2 = z_values[iend.x ][iend.y + 1] + xratio * + (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]); + } // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. - const float yratio = (end[Y_AXIS] - mesh_index_to_ypos(cell_dest_yi)) * RECIPROCAL(MESH_Y_DIST), - z0 = cell_dest_yi < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end[Z_AXIS]) : 0.0; + const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST), + z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0; // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + (isnan(z0) ? 0.0 : z0), end[E_AXIS], scaled_fr_mm_s, extruder); - set_current_from_destination(); + if (!isnan(z0)) end.z += z0; + planner.buffer_segment(end, scaled_fr_mm_s, extruder); + current_position = destination; return; } @@ -112,17 +103,11 @@ * case - crossing only one X or Y line - after details are worked out to reduce computation. */ - const float dx = end[X_AXIS] - start[X_AXIS], - dy = end[Y_AXIS] - start[Y_AXIS]; - - const int left_flag = dx < 0.0 ? 1 : 0, - down_flag = dy < 0.0 ? 1 : 0; - - const float adx = left_flag ? -dx : dx, - ady = down_flag ? -dy : dy; - - const int dxi = cell_start_xi == cell_dest_xi ? 0 : left_flag ? -1 : 1, - dyi = cell_start_yi == cell_dest_yi ? 0 : down_flag ? -1 : 1; + const xy_float_t dist = end - start; + const xy_bool_t neg { dist.x < 0, dist.y < 0 }; + const xy_int8_t ineg { int8_t(neg.x), int8_t(neg.y) }; + const xy_float_t sign { neg.x ? -1.0f : 1.0f, neg.y ? -1.0f : 1.0f }; + const xy_int8_t iadd { int8_t(iend.x == istart.x ? 0 : sign.x), int8_t(iend.y == istart.y ? 0 : sign.y) }; /** * Compute the extruder scaling factor for each partial move, checking for @@ -132,64 +117,64 @@ * components. The larger of the two is used to preserve precision. */ - const bool use_x_dist = adx > ady; + const xy_float_t ad = sign * dist; + const bool use_x_dist = ad.x > ad.y; - float on_axis_distance = use_x_dist ? dx : dy, - e_position = end[E_AXIS] - start[E_AXIS], - z_position = end[Z_AXIS] - start[Z_AXIS]; + float on_axis_distance = use_x_dist ? dist.x : dist.y, + e_position = end.e - start.e, + z_position = end.z - start.z; - const float e_normalized_dist = e_position / on_axis_distance, + const float e_normalized_dist = e_position / on_axis_distance, // Allow divide by zero z_normalized_dist = z_position / on_axis_distance; - int current_xi = cell_start_xi, - current_yi = cell_start_yi; + xy_int8_t icell = istart; - const float m = dy / dx, - c = start[Y_AXIS] - m * start[X_AXIS]; + const float ratio = dist.y / dist.x, // Allow divide by zero + c = start.y - ratio * start.x; - const bool inf_normalized_flag = (isinf(e_normalized_dist) != 0), - inf_m_flag = (isinf(m) != 0); + const bool inf_normalized_flag = isinf(e_normalized_dist), + inf_ratio_flag = isinf(ratio); /** * Handle vertical lines that stay within one column. * These need not be perfectly vertical. */ - if (dxi == 0) { // Vertical line? - current_yi += down_flag; // Line going down? Just go to the bottom. - while (current_yi != cell_dest_yi + down_flag) { - current_yi += dyi; - const float next_mesh_line_y = mesh_index_to_ypos(current_yi); + if (iadd.x == 0) { // Vertical line? + icell.y += ineg.y; // Line going down? Just go to the bottom. + while (icell.y != iend.y + ineg.y) { + icell.y += iadd.y; + const float next_mesh_line_y = mesh_index_to_ypos(icell.y); /** * Skip the calculations for an infinite slope. * For others the next X is the same so this can continue. * Calculate X at the next Y mesh line. */ - const float rx = inf_m_flag ? start[X_AXIS] : (next_mesh_line_y - c) / m; + const float rx = inf_ratio_flag ? start.x : (next_mesh_line_y - c) / ratio; - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi, current_yi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x, icell.y) + * planner.fade_scaling_factor_for_z(end.z); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; - const float ry = mesh_index_to_ypos(current_yi); + const float ry = mesh_index_to_ypos(icell.y); /** * Without this check, it's possible to generate a zero length move, as in the case where * the line is heading down, starting exactly on a mesh line boundary. Since this is rare * it might be fine to remove this check and let planner.buffer_segment() filter it out. */ - if (ry != start[Y_AXIS]) { - if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + if (ry != start.y) { + if (!inf_normalized_flag) { // fall-through faster than branch + on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; } else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; + e_position = end.e; + z_position = end.z; } planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder); @@ -197,10 +182,10 @@ } // At the final destination? Usually not, but when on a Y Mesh Line it's completed. - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + if (xy_pos_t(current_position) != xy_pos_t(end)) goto FINAL_MOVE; - set_current_from_destination(); + current_position = destination; return; } @@ -208,36 +193,34 @@ * Handle horizontal lines that stay within one row. * These need not be perfectly horizontal. */ - if (dyi == 0) { // Horizontal line? - current_xi += left_flag; // Heading left? Just go to the left edge of the cell for the first move. - while (current_xi != cell_dest_xi + left_flag) { - current_xi += dxi; - const float next_mesh_line_x = mesh_index_to_xpos(current_xi), - ry = m * next_mesh_line_x + c; // Calculate Y at the next X mesh line + if (iadd.y == 0) { // Horizontal line? + icell.x += ineg.x; // Heading left? Just go to the left edge of the cell for the first move. + while (icell.x != iend.x + ineg.x) { + icell.x += iadd.x; + const float rx = mesh_index_to_xpos(icell.x); + const float ry = ratio * rx + c; // Calculate Y at the next X mesh line - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi, current_yi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x, icell.y) + * planner.fade_scaling_factor_for_z(end.z); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; - const float rx = mesh_index_to_xpos(current_xi); - /** * Without this check, it's possible to generate a zero length move, as in the case where * the line is heading left, starting exactly on a mesh line boundary. Since this is rare * it might be fine to remove this check and let planner.buffer_segment() filter it out. */ - if (rx != start[X_AXIS]) { + if (rx != start.x) { if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move + z_position = start.z + on_axis_distance * z_normalized_dist; } else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; + e_position = end.e; + z_position = end.z; } if (!planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) @@ -245,93 +228,88 @@ } //else printf("FIRST MOVE PRUNED "); } - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + if (xy_pos_t(current_position) != xy_pos_t(end)) goto FINAL_MOVE; - set_current_from_destination(); + current_position = destination; return; } /** * - * Handle the generic case of a line crossing both X and Y Mesh lines. + * Generic case of a line crossing both X and Y Mesh lines. * */ - int xi_cnt = cell_start_xi - cell_dest_xi, - yi_cnt = cell_start_yi - cell_dest_yi; + xy_int8_t cnt = (istart - iend).ABS(); - if (xi_cnt < 0) xi_cnt = -xi_cnt; - if (yi_cnt < 0) yi_cnt = -yi_cnt; + icell += ineg; - current_xi += left_flag; - current_yi += down_flag; + while (cnt) { - while (xi_cnt || yi_cnt) { + const float next_mesh_line_x = mesh_index_to_xpos(icell.x + iadd.x), + next_mesh_line_y = mesh_index_to_ypos(icell.y + iadd.y), + ry = ratio * next_mesh_line_x + c, // Calculate Y at the next X mesh line + rx = (next_mesh_line_y - c) / ratio; // Calculate X at the next Y mesh line + // (No need to worry about ratio == 0. + // In that case, it was already detected + // as a vertical line move above.) - const float next_mesh_line_x = mesh_index_to_xpos(current_xi + dxi), - next_mesh_line_y = mesh_index_to_ypos(current_yi + dyi), - ry = m * next_mesh_line_x + c, // Calculate Y at the next X mesh line - rx = (next_mesh_line_y - c) / m; // Calculate X at the next Y mesh line - // (No need to worry about m being zero. - // If that was the case, it was already detected - // as a vertical line move above.) - - if (left_flag == (rx > next_mesh_line_x)) { // Check if we hit the Y line first + if (neg.x == (rx > next_mesh_line_x)) { // Check if we hit the Y line first // Yes! Crossing a Y Mesh Line next - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi - left_flag, current_yi + dyi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x - ineg.x, icell.y + iadd.y) + * planner.fade_scaling_factor_for_z(end.z); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : next_mesh_line_y - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? rx - start.x : next_mesh_line_y - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; } else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; + e_position = end.e; + z_position = end.z; } if (!planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, scaled_fr_mm_s, extruder)) break; - current_yi += dyi; - yi_cnt--; + icell.y += iadd.y; + cnt.y--; } else { // Yes! Crossing a X Mesh Line next - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi + dxi, current_yi - down_flag) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x + iadd.x, icell.y - ineg.y) + * planner.fade_scaling_factor_for_z(end.z); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? next_mesh_line_x - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? next_mesh_line_x - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; } else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; + e_position = end.e; + z_position = end.z; } if (!planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) break; - current_xi += dxi; - xi_cnt--; + icell.x += iadd.x; + cnt.x--; } - if (xi_cnt < 0 || yi_cnt < 0) break; // Too far! Exit the loop and go to FINAL_MOVE + if (cnt.x < 0 || cnt.y < 0) break; // Too far! Exit the loop and go to FINAL_MOVE } - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + if (xy_pos_t(current_position) != xy_pos_t(end)) goto FINAL_MOVE; - set_current_from_destination(); + current_position = destination; } #else // UBL_SEGMENTED @@ -356,56 +334,42 @@ bool _O2 unified_bed_leveling::line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s) { - if (!position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) // fail if moving outside reachable boundary - return true; // did not move, so current_position still accurate + if (!position_is_reachable(destination)) // fail if moving outside reachable boundary + return true; // did not move, so current_position still accurate - const float total[XYZE] = { - destination[X_AXIS] - current_position[X_AXIS], - destination[Y_AXIS] - current_position[Y_AXIS], - destination[Z_AXIS] - current_position[Z_AXIS], - destination[E_AXIS] - current_position[E_AXIS] - }; + const xyze_pos_t total = destination - current_position; - const float cartesian_xy_mm = HYPOT(total[X_AXIS], total[Y_AXIS]); // total horizontal xy distance + const float cart_xy_mm_2 = HYPOT2(total.x, total.y), + cart_xy_mm = SQRT(cart_xy_mm_2); // Total XY distance #if IS_KINEMATIC - const float seconds = cartesian_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate - uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate - seglimit = LROUND(cartesian_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length - NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) + const float seconds = cart_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate + uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate + seglimit = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length + NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) #else - uint16_t segments = LROUND(cartesian_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // cartesian fixed segment length + uint16_t segments = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Cartesian fixed segment length #endif - NOLESS(segments, 1U); // must have at least one segment - const float inv_segments = 1.0f / segments; // divide once, multiply thereafter + NOLESS(segments, 1U); // Must have at least one segment + const float inv_segments = 1.0f / segments, // Reciprocal to save calculation + segment_xyz_mm = SQRT(cart_xy_mm_2 + sq(total.z)) * inv_segments; // Length of each segment - const float segment_xyz_mm = HYPOT(cartesian_xy_mm, total[Z_AXIS]) * inv_segments; // length of each segment #if ENABLED(SCARA_FEEDRATE_SCALING) const float inv_duration = scaled_fr_mm_s / segment_xyz_mm; #endif - const float diff[XYZE] = { - total[X_AXIS] * inv_segments, - total[Y_AXIS] * inv_segments, - total[Z_AXIS] * inv_segments, - total[E_AXIS] * inv_segments - }; + xyze_float_t diff = total * inv_segments; // Note that E segment distance could vary slightly as z mesh height // changes for each segment, but small enough to ignore. - float raw[XYZE] = { - current_position[X_AXIS], - current_position[Y_AXIS], - current_position[Z_AXIS], - current_position[E_AXIS] - }; + xyze_pos_t raw = current_position; // Just do plain segmentation if UBL is inactive or the target is above the fade height - if (!planner.leveling_active || !planner.leveling_active_at_z(destination[Z_AXIS])) { + if (!planner.leveling_active || !planner.leveling_active_at_z(destination.z)) { while (--segments) { - LOOP_XYZE(i) raw[i] += diff[i]; + raw += diff; planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, segment_xyz_mm #if ENABLED(SCARA_FEEDRATE_SCALING) , inv_duration @@ -417,17 +381,17 @@ , inv_duration #endif ); - return false; // moved but did not set_current_from_destination(); + return false; // Did not set current from destination } // Otherwise perform per-segment leveling #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = planner.fade_scaling_factor_for_z(destination[Z_AXIS]); + const float fade_scaling_factor = planner.fade_scaling_factor_for_z(destination.z); #endif - // increment to first segment destination - LOOP_XYZE(i) raw[i] += diff[i]; + // Move to first segment destination + raw += diff; for (;;) { // for each mesh cell encountered during the move @@ -438,75 +402,68 @@ // in top of loop and again re-find same adjacent cell and use it, just less efficient // for mesh inset area. - int8_t cell_xi = (raw[X_AXIS] - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST), - cell_yi = (raw[Y_AXIS] - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); + xy_int8_t icell = { + int8_t((raw.x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)), + int8_t((raw.y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)) + }; + LIMIT(icell.x, 0, (GRID_MAX_POINTS_X) - 1); + LIMIT(icell.y, 0, (GRID_MAX_POINTS_Y) - 1); - LIMIT(cell_xi, 0, (GRID_MAX_POINTS_X) - 1); - LIMIT(cell_yi, 0, (GRID_MAX_POINTS_Y) - 1); - - const float x0 = mesh_index_to_xpos(cell_xi), // 64 byte table lookup avoids mul+add - y0 = mesh_index_to_ypos(cell_yi); - - float z_x0y0 = z_values[cell_xi ][cell_yi ], // z at lower left corner - z_x1y0 = z_values[cell_xi+1][cell_yi ], // z at upper left corner - z_x0y1 = z_values[cell_xi ][cell_yi+1], // z at lower right corner - z_x1y1 = z_values[cell_xi+1][cell_yi+1]; // z at upper right corner + float z_x0y0 = z_values[icell.x ][icell.y ], // z at lower left corner + z_x1y0 = z_values[icell.x+1][icell.y ], // z at upper left corner + z_x0y1 = z_values[icell.x ][icell.y+1], // z at lower right corner + z_x1y1 = z_values[icell.x+1][icell.y+1]; // z at upper right corner if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points - float cx = raw[X_AXIS] - x0, // cell-relative x and y - cy = raw[Y_AXIS] - y0; + const xy_pos_t pos = { mesh_index_to_xpos(icell.x), mesh_index_to_ypos(icell.y) }; + xy_pos_t cell = raw - pos; const float z_xmy0 = (z_x1y0 - z_x0y0) * RECIPROCAL(MESH_X_DIST), // z slope per x along y0 (lower left to lower right) z_xmy1 = (z_x1y1 - z_x0y1) * RECIPROCAL(MESH_X_DIST); // z slope per x along y1 (upper left to upper right) - float z_cxy0 = z_x0y0 + z_xmy0 * cx; // z height along y0 at cx (changes for each cx in cell) + float z_cxy0 = z_x0y0 + z_xmy0 * cell.x; // z height along y0 at cell.x (changes for each cell.x in cell) - const float z_cxy1 = z_x0y1 + z_xmy1 * cx, // z height along y1 at cx - z_cxyd = z_cxy1 - z_cxy0; // z height difference along cx from y0 to y1 + const float z_cxy1 = z_x0y1 + z_xmy1 * cell.x, // z height along y1 at cell.x + z_cxyd = z_cxy1 - z_cxy0; // z height difference along cell.x from y0 to y1 - float z_cxym = z_cxyd * RECIPROCAL(MESH_Y_DIST); // z slope per y along cx from y0 to y1 (changes for each cx in cell) + float z_cxym = z_cxyd * RECIPROCAL(MESH_Y_DIST); // z slope per y along cell.x from pos.y to y1 (changes for each cell.x in cell) - // float z_cxcy = z_cxy0 + z_cxym * cy; // interpolated mesh z height along cx at cy (do inside the segment loop) + // float z_cxcy = z_cxy0 + z_cxym * cell.y; // interpolated mesh z height along cell.x at cell.y (do inside the segment loop) // As subsequent segments step through this cell, the z_cxy0 intercept will change - // and the z_cxym slope will change, both as a function of cx within the cell, and + // and the z_cxym slope will change, both as a function of cell.x within the cell, and // each change by a constant for fixed segment lengths. - const float z_sxy0 = z_xmy0 * diff[X_AXIS], // per-segment adjustment to z_cxy0 - z_sxym = (z_xmy1 - z_xmy0) * RECIPROCAL(MESH_Y_DIST) * diff[X_AXIS]; // per-segment adjustment to z_cxym + const float z_sxy0 = z_xmy0 * diff.x, // per-segment adjustment to z_cxy0 + z_sxym = (z_xmy1 - z_xmy0) * RECIPROCAL(MESH_Y_DIST) * diff.x; // per-segment adjustment to z_cxym for (;;) { // for all segments within this mesh cell - if (--segments == 0) COPY(raw, destination); // if this is last segment, use destination for exact + if (--segments == 0) raw = destination; // if this is last segment, use destination for exact - const float z_cxcy = (z_cxy0 + z_cxym * cy) // interpolated mesh z height along cx at cy + const float z_cxcy = (z_cxy0 + z_cxym * cell.y) // interpolated mesh z height along cell.x at cell.y #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) * fade_scaling_factor // apply fade factor to interpolated mesh height #endif ; - const float z = raw[Z_AXIS]; - raw[Z_AXIS] += z_cxcy; - planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, segment_xyz_mm + planner.buffer_line(raw.x, raw.y, raw.z + z_cxcy, raw.e, scaled_fr_mm_s, active_extruder, segment_xyz_mm #if ENABLED(SCARA_FEEDRATE_SCALING) , inv_duration #endif ); - raw[Z_AXIS] = z; if (segments == 0) // done with last segment - return false; // did not set_current_from_destination() + return false; // didn't set current from destination - LOOP_XYZE(i) raw[i] += diff[i]; + raw += diff; + cell += diff; - cx += diff[X_AXIS]; - cy += diff[Y_AXIS]; - - if (!WITHIN(cx, 0, MESH_X_DIST) || !WITHIN(cy, 0, MESH_Y_DIST)) // done within this cell, break to next + if (!WITHIN(cell.x, 0, MESH_X_DIST) || !WITHIN(cell.y, 0, MESH_Y_DIST)) // done within this cell, break to next break; // Next segment still within same mesh cell, adjust the per-segment diff --git a/Marlin/src/feature/binary_protocol.h b/Marlin/src/feature/binary_protocol.h index 58817f66ba..c558a3eeae 100644 --- a/Marlin/src/feature/binary_protocol.h +++ b/Marlin/src/feature/binary_protocol.h @@ -306,6 +306,9 @@ public: PORT_REDIRECT(card.transfer_port_index); #endif + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" + while (PENDING(millis(), transfer_window)) { switch (stream_state) { /** @@ -439,6 +442,8 @@ public: break; } } + + #pragma GCC diagnostic pop } void dispatch() { diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 81eb4aaac4..8c58d8452a 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -71,7 +71,13 @@ void update_case_light() { #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) if (PWM_PIN(CASE_LIGHT_PIN)) - analogWrite(pin_t(CASE_LIGHT_PIN), n10ct); + analogWrite(pin_t(CASE_LIGHT_PIN), + #if CASE_LIGHT_MAX_PWM == 255 + n10ct + #else + map(n10ct, 0, 255, 0, CASE_LIGHT_MAX_PWM) + #endif + ); else #endif { diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index cfe36dd39f..19f8d5f643 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -36,7 +36,7 @@ #include "dac_mcp4728.h" -uint16_t mcp4728_values[XYZE]; +xyze_uint_t mcp4728_values; /** * Begin I2C, get current values (input register and eeprom) of mcp4728 @@ -121,8 +121,8 @@ uint8_t mcp4728_getDrvPct(const uint8_t channel) { return uint8_t(100.0 * mcp472 * Receives all Drive strengths as 0-100 percent values, updates * DAC Values array and calls fastwrite to update the DAC. */ -void mcp4728_setDrvPct(uint8_t pct[XYZE]) { - LOOP_XYZE(i) mcp4728_values[i] = 0.01 * pct[i] * (DAC_STEPPER_MAX); +void mcp4728_setDrvPct(xyze_uint8_t &pct) { + mcp4728_values *= 0.01 * pct * (DAC_STEPPER_MAX); mcp4728_fastWrite(); } diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index c814829456..92e28ffb2b 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -25,6 +25,8 @@ * Arduino library for MicroChip MCP4728 I2C D/A converter. */ +#include "../../core/types.h" + #include #define defaultVDD DAC_STEPPER_MAX //was 5000 but differs with internal Vref @@ -54,4 +56,4 @@ uint16_t mcp4728_getValue(const uint8_t channel); uint8_t mcp4728_fastWrite(); uint8_t mcp4728_simpleCommand(const byte simpleCommand); uint8_t mcp4728_getDrvPct(const uint8_t channel); -void mcp4728_setDrvPct(uint8_t pct[XYZE]); +void mcp4728_setDrvPct(xyze_uint8_t &pct); diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp index d1e101bd50..565b62a392 100644 --- a/Marlin/src/feature/dac/stepper_dac.cpp +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -31,8 +31,8 @@ #include "stepper_dac.h" bool dac_present = false; -const uint8_t dac_order[NUM_AXIS] = DAC_STEPPER_ORDER; -uint8_t dac_channel_pct[XYZE] = DAC_MOTOR_CURRENT_DEFAULT; +constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER; +xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; int dac_init() { #if PIN_EXISTS(DAC_DISABLE) @@ -77,8 +77,8 @@ void dac_current_raw(uint8_t channel, uint16_t val) { static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } static float dac_amps(int8_t n) { return mcp4728_getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } -uint8_t dac_current_get_percent(AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } -void dac_current_set_percents(const uint8_t pct[XYZE]) { +uint8_t dac_current_get_percent(const AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } +void dac_current_set_percents(xyze_uint8_t &pct) { LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; mcp4728_setDrvPct(dac_channel_pct); } diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h index 8ad51ee781..3496ebec48 100644 --- a/Marlin/src/feature/dac/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -33,4 +33,4 @@ void dac_current_raw(uint8_t channel, uint16_t val); void dac_print_values(); void dac_commit_eeprom(); uint8_t dac_current_get_percent(AxisEnum axis); -void dac_current_set_percents(const uint8_t pct[XYZE]); +void dac_current_set_percents(xyze_uint8_t &pct); diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 1b9672251f..b04406f4be 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -35,7 +35,7 @@ #if MB(5DPRINT) #define DIGIPOT_I2C_FACTOR 117.96 #define DIGIPOT_I2C_MAX_CURRENT 1.736 -#elif MB(AZTEEG_X5_MINI) || MB(AZTEEG_X5_MINI_WIFI) +#elif MB(AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) #define DIGIPOT_I2C_FACTOR 113.5 #define DIGIPOT_I2C_MAX_CURRENT 2.0 #else diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index b4302cb17a..896e602950 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -123,8 +123,8 @@ void FWRetract::retract(const bool retracting SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); #endif } - SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); - SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); + SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); + SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ @@ -136,7 +136,7 @@ void FWRetract::retract(const bool retracting ); // The current position will be the destination for E and Z moves - set_destination_from_current(); + destination = current_position; #if ENABLED(RETRACT_SYNC_MIXING) const uint8_t old_mixing_tool = mixer.get_current_vtool(); @@ -147,7 +147,7 @@ void FWRetract::retract(const bool retracting if (retracting) { // Retract by moving from a faux E position back to the current E position current_retract[active_extruder] = base_retract; - prepare_internal_move_to_destination( // set_current_to_destination + prepare_internal_move_to_destination( // set current to destination settings.retract_feedrate_mm_s #if ENABLED(RETRACT_SYNC_MIXING) * (MIXING_STEPPERS) @@ -171,7 +171,7 @@ void FWRetract::retract(const bool retracting const float extra_recover = swapping ? settings.swap_retract_recover_extra : settings.retract_recover_extra; if (extra_recover) { - current_position[E_AXIS] -= extra_recover; // Adjust the current E position by the extra amount to recover + current_position.e -= extra_recover; // Adjust the current E position by the extra amount to recover sync_plan_position_e(); // Sync the planner position so the extra amount is recovered } @@ -207,8 +207,8 @@ void FWRetract::retract(const bool retracting SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); #endif } - SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); - SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); + SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); + SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ } diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index b39b0fbc3c..8c09faeaa3 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -102,8 +102,8 @@ void host_action(const char * const pstr, const bool eol) { void host_response_handler(const uint8_t response) { #ifdef DEBUG_HOST_ACTIONS - SERIAL_ECHOLNPAIR("M86 Handle Reason: ", host_prompt_reason); - SERIAL_ECHOLNPAIR("M86 Handle Response: ", response); + SERIAL_ECHOLNPAIR("M876 Handle Reason: ", host_prompt_reason); + SERIAL_ECHOLNPAIR("M876 Handle Response: ", response); #endif const char *msg = PSTR("UNKNOWN STATE"); const PromptReason hpr = host_prompt_reason; diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp index bb54ff1d6d..7ae3f1389e 100644 --- a/Marlin/src/feature/joystick.cpp +++ b/Marlin/src/feature/joystick.cpp @@ -71,35 +71,35 @@ Joystick joystick; #if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z - void Joystick::calculate(float (&norm_jog)[XYZ]) { + void Joystick::calculate(xyz_float_t &norm_jog) { // Do nothing if enable pin (active-low) is not LOW #if HAS_JOY_ADC_EN if (READ(JOY_EN_PIN)) return; #endif - auto _normalize_joy = [](float &norm_jog, const int16_t raw, const int16_t (&joy_limits)[4]) { + auto _normalize_joy = [](float &axis_jog, const int16_t raw, const int16_t (&joy_limits)[4]) { if (WITHIN(raw, joy_limits[0], joy_limits[3])) { // within limits, check deadzone if (raw > joy_limits[2]) - norm_jog = (raw - joy_limits[2]) / float(joy_limits[3] - joy_limits[2]); + axis_jog = (raw - joy_limits[2]) / float(joy_limits[3] - joy_limits[2]); else if (raw < joy_limits[1]) - norm_jog = (raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value + axis_jog = (raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value // Map normal to jog value via quadratic relationship - norm_jog = SIGN(norm_jog) * sq(norm_jog); + axis_jog = SIGN(axis_jog) * sq(axis_jog); } }; #if HAS_JOY_ADC_X static constexpr int16_t joy_x_limits[4] = JOY_X_LIMITS; - _normalize_joy(norm_jog[X_AXIS], x.raw, joy_x_limits); + _normalize_joy(norm_jog.x, x.raw, joy_x_limits); #endif #if HAS_JOY_ADC_Y static constexpr int16_t joy_y_limits[4] = JOY_Y_LIMITS; - _normalize_joy(norm_jog[Y_AXIS], y.raw, joy_y_limits); + _normalize_joy(norm_jog.y, y.raw, joy_y_limits); #endif #if HAS_JOY_ADC_Z static constexpr int16_t joy_z_limits[4] = JOY_Z_LIMITS; - _normalize_joy(norm_jog[Z_AXIS], z.raw, joy_z_limits); + _normalize_joy(norm_jog.z, z.raw, joy_z_limits); #endif } @@ -112,10 +112,10 @@ Joystick joystick; static bool injecting_now; // = false; if (injecting_now) return; - static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements - static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag - seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second - static constexpr millis_t timer_limit_ms = millis_t(seg_time * 500); // 25 ms minimum delay between insertions + static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements + static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag + seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second + static constexpr millis_t timer_limit_ms = millis_t(seg_time * 500); // 25 ms minimum delay between insertions // The planner can merge/collapse small moves, so the movement queue is unreliable to control the lag static millis_t next_run = 0; @@ -129,7 +129,7 @@ Joystick joystick; // Normalized jog values are 0 for no movement and -1 or +1 for as max feedrate (nonlinear relationship) // Jog are initialized to zero and handling input can update values but doesn't have to // You could use a two-axis joystick and a one-axis keypad and they might work together - float norm_jog[XYZ] = { 0 }; + xyz_float_t norm_jog{0}; // Use ADC values and defined limits. The active zone is normalized: -1..0 (dead) 0..1 #if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z @@ -143,16 +143,13 @@ Joystick joystick; ExtUI::_joystick_update(norm_jog); #endif - #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - constexpr float manual_feedrate[XYZE] = MANUAL_FEEDRATE; - #endif - // norm_jog values of [-1 .. 1] maps linearly to [-feedrate .. feedrate] - float move_dist[XYZ] = { 0 }, hypot2 = 0; + xyz_float_t move_dist{0}; + float hypot2 = 0; LOOP_XYZ(i) if (norm_jog[i]) { move_dist[i] = seg_time * norm_jog[i] * #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - MMM_TO_MMS(manual_feedrate[i]); + MMM_TO_MMS(manual_feedrate_mm_m[i]); #else planner.settings.max_feedrate_mm_s[i]; #endif @@ -160,7 +157,7 @@ Joystick joystick; } if (!UNEAR_ZERO(hypot2)) { - LOOP_XYZ(i) current_position[i] += move_dist[i]; + current_position += move_dist; const float length = sqrt(hypot2); injecting_now = true; planner.buffer_line(current_position, length / seg_time, active_extruder, length); diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index e96120517e..50196374a7 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -25,6 +25,8 @@ * joystick.h - joystick input / jogging */ +#include "../inc/MarlinConfigPre.h" +#include "../core/types.h" #include "../core/macros.h" #include "../module/temperature.h" @@ -46,7 +48,7 @@ class Joystick { #if ENABLED(JOYSTICK_DEBUG) static void report(); #endif - static void calculate(float (&norm_jog)[XYZ]); + static void calculate(xyz_float_t &norm_jog); static void inject_jog_moves(); }; diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index b8c8b12ad6..e0a3d7c389 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -66,11 +66,9 @@ public: static void set_color_startup(const uint32_t c); static void set_color(const uint32_t c); - static void set_color_background(); - //bool set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); #ifdef NEOPIXEL_BKGD_LED_INDEX - static void set_pixel_color(const uint16_t n, const uint32_t c); + static void set_color_background(); #endif static inline void begin() { @@ -107,6 +105,10 @@ public: #endif } + #if 0 + bool set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); + #endif + // Accessors static inline uint16_t pixels() { return adaneo1.numPixels(); } static inline uint8_t brightness() { return adaneo1.getBrightness(); } diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index 87589a9bcd..fc0da10f70 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -138,8 +138,7 @@ void pca9632_set_led_color(const LEDColor &color) { #if ENABLED(PCA9632_BUZZER) - void pca9632_buzz(const long duration, const uint16_t freq) { - UNUSED(duration); UNUSED(freq); + void pca9632_buzz(const long, const uint16_t) { uint8_t data[] = PCA9632_BUZZER_DATA; Wire.beginTransmission(I2C_ADDRESS(PCA9632_ADDRESS)); Wire.write(data, sizeof(data)); diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 55b54f96c1..095f22d13b 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -142,13 +142,19 @@ class Mixer { static inline void copy_mix_to_color(mixer_comp_t (&tcolor)[MIXING_STEPPERS]) { // Scale each component to the largest one in terms of COLOR_A_MASK // So the largest component will be COLOR_A_MASK and the other will be in proportion to it - const float scale = (COLOR_A_MASK) * RECIPROCAL(float(_MAX(mix[0], mix[1]))); + const float scale = (COLOR_A_MASK) * RECIPROCAL(_MAX( + LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]) + )); // Scale all values so their maximum is COLOR_A_MASK MIXER_STEPPER_LOOP(i) tcolor[i] = mix[i] * scale; #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOLNPAIR("Mix [", int(mix[0]), ", ", int(mix[1]), "] to Color [", int(tcolor[0]), ", ", int(tcolor[1]), "]"); + SERIAL_ECHOPGM("Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOPGM(" ] to Color [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(tcolor[0]), int(tcolor[1]), int(tcolor[2]), int(tcolor[3]), int(tcolor[4]), int(tcolor[5])); + SERIAL_ECHOLNPGM(" ]"); #endif } @@ -156,10 +162,14 @@ class Mixer { float ctot = 0; MIXER_STEPPER_LOOP(i) ctot += color[j][i]; //MIXER_STEPPER_LOOP(i) mix[i] = 100.0f * color[j][i] / ctot; - mix[0] = mixer_perc_t(100.0f * color[j][0] / ctot); - mix[1] = 100 - mix[0]; + MIXER_STEPPER_LOOP(i) mix[i] = mixer_perc_t(100.0f * color[j][i] / ctot); + #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOLNPAIR("V-tool ", int(j), " [", int(color[j][0]), ", ", int(color[j][1]), "] to Mix [", int(mix[0]), ", ", int(mix[1]), "]"); + SERIAL_ECHOPAIR("V-tool ", int(j), " [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(color[j][0]), int(color[j][1]), int(color[j][2]), int(color[j][3]), int(color[j][4]), int(color[j][5])); + SERIAL_ECHOPGM(" ] to Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLNPGM(" ]"); #endif } @@ -199,10 +209,14 @@ class Mixer { static inline void update_mix_from_gradient() { float ctot = 0; MIXER_STEPPER_LOOP(i) ctot += gradient.color[i]; - mix[0] = (mixer_perc_t)CEIL(100.0f * gradient.color[0] / ctot); - mix[1] = 100 - mix[0]; + MIXER_STEPPER_LOOP(i) mix[i] = (mixer_perc_t)CEIL(100.0f * gradient.color[i] / ctot); + #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOLNPAIR("Gradient [", int(gradient.color[0]), ", ", int(gradient.color[1]), "] to Mix [", int(mix[0]), ", ", int(mix[1]), "]"); + SERIAL_ECHOPGM("Gradient [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(gradient.color[0]), int(gradient.color[1]), int(gradient.color[2]), int(gradient.color[3]), int(gradient.color[4]), int(gradient.color[5])); + SERIAL_ECHOPGM(" ] to Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLNPGM(" ]"); #endif } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index ff200d0afb..07f1d7d1b2 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -53,6 +53,7 @@ #include "../lcd/extensible_ui/ui_api.h" #endif +#include "../core/language.h" #include "../lcd/ultralcd.h" #if HAS_BUZZER @@ -64,7 +65,7 @@ // private: -static float resume_position[XYZE]; +static xyze_pos_t resume_position; PauseMode pause_mode = PAUSE_MODE_PAUSE_PRINT; @@ -76,6 +77,12 @@ fil_change_settings_t fc_settings[EXTRUDERS]; #include "../sd/cardreader.h" #endif +#if ENABLED(EMERGENCY_PARSER) + #define _PMSG(L) L##_M108 +#else + #define _PMSG(L) L##_LCD +#endif + #if HAS_BUZZER static void filament_change_beep(const int8_t max_beep_count, const bool init=false) { if (pause_mode == PAUSE_MODE_PAUSE_PRINT) return; @@ -126,8 +133,8 @@ void do_pause_e_move(const float &length, const feedRate_t &fr_mm_s) { #if HAS_FILAMENT_SENSOR runout.reset(); #endif - current_position[E_AXIS] += length / planner.e_factor[active_extruder]; - planner.buffer_line(current_position, fr_mm_s, active_extruder); + current_position.e += length / planner.e_factor[active_extruder]; + line_to_current_position(fr_mm_s); planner.synchronize(); } @@ -163,7 +170,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l #if HAS_LCD_MENU if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_INSERT, mode); #endif - SERIAL_ECHO_MSG(MSG_FILAMENT_CHANGE_INSERT); + SERIAL_ECHO_MSG(_PMSG(MSG_FILAMENT_CHANGE_INSERT)); #if HAS_BUZZER filament_change_beep(max_beep_count, true); @@ -188,7 +195,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l host_action_prompt_show(); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("Load Filament")); + ExtUI::onUserConfirmRequired_P(PSTR("Load Filament")); #endif while (wait_for_user) { #if HAS_BUZZER @@ -240,10 +247,10 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l wait_for_user = true; #if ENABLED(HOST_PROMPT_SUPPORT) - host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Continuous Purge Running..."), PSTR("Continue")); + host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Filament Purge Running..."), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("Continuous Purge Running...")); + ExtUI::onUserConfirmRequired_P(PSTR("Filament Purge Running...")); #endif for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) do_pause_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); @@ -381,11 +388,11 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, * - Park the nozzle at the given position * - Call unload_filament (if a length was specified) * - * Returns 'true' if pause was completed, 'false' for abort + * Return 'true' if pause was completed, 'false' for abort */ uint8_t did_pause_print = 0; -bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { +bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { #if !HAS_LCD_MENU UNUSED(show_lcd); @@ -432,7 +439,7 @@ bool pause_print(const float &retract, const point_t &park_point, const float &u print_job_timer.pause(); // Save current position - COPY(resume_position, current_position); + resume_position = current_position; // Wait for buffered blocks to complete planner.synchronize(); @@ -481,14 +488,6 @@ bool pause_print(const float &retract, const point_t &park_point, const float &u * Used by M125 and M600 */ -#if (HAS_LCD_MENU || ENABLED(EXTENSIBLE_UI)) && ENABLED(EMERGENCY_PARSER) - #define _PMSG(L) L -#elif ENABLED(EMERGENCY_PARSER) - #define _PMSG(L) L##_M108 -#else - #define _PMSG(L) L##_LCD -#endif - void show_continue_prompt(const bool is_reload) { #if HAS_LCD_MENU lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); @@ -527,7 +526,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Nozzle Parked"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("Nozzle Parked")); + ExtUI::onUserConfirmRequired_P(PSTR("Nozzle Parked")); #endif while (wait_for_user) { #if HAS_BUZZER @@ -551,7 +550,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("HeaterTimeout")); + ExtUI::onUserConfirmRequired_P(PSTR("HeaterTimeout")); #endif // Wait for LCD click or M108 @@ -581,7 +580,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Reheat Done"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired("Reheat finished."); + ExtUI::onUserConfirmRequired_P(PSTR("Reheat finished.")); #endif wait_for_user = true; nozzle_timed_out = false; @@ -603,7 +602,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep /** * Resume or Start print procedure * - * - Abort if not paused + * - If not paused, do nothing and return * - Reset heater idle timers * - Load filament if specified, but only if: * - a nozzle timed out, or @@ -611,10 +610,10 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Display "wait for print to resume" * - Re-prime the nozzle... * - FWRETRACT: Recover/prime from the prior G10. - * - !FWRETRACT: Retract by resume_position[E], if negative. + * - !FWRETRACT: Retract by resume_position.e, if negative. * Not sure how this logic comes into use. * - Move the nozzle back to resume_position - * - Sync the planner E to resume_position[E] + * - Sync the planner E to resume_position.e * - Send host action for resume, if configured * - Resume the current SD print job, if any */ @@ -652,13 +651,13 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le #endif // If resume_position is negative - if (resume_position[E_AXIS] < 0) do_pause_e_move(resume_position[E_AXIS], feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); + if (resume_position.e < 0) do_pause_e_move(resume_position.e, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position[X_AXIS], resume_position[Y_AXIS], feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position[Z_AXIS], feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); #if ADVANCED_PAUSE_RESUME_PRIME != 0 do_pause_e_move(ADVANCED_PAUSE_RESUME_PRIME, feedRate_t(ADVANCED_PAUSE_PURGE_FEEDRATE)); @@ -666,7 +665,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Now all extrusion positions are resumed and ready to be confirmed // Set extruder to saved position - planner.set_e_position_mm((destination[E_AXIS] = current_position[E_AXIS] = resume_position[E_AXIS])); + planner.set_e_position_mm((destination.e = current_position.e = resume_position.e)); #if HAS_LCD_MENU lcd_pause_show_message(PAUSE_MESSAGE_STATUS); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index deb19f46a8..42f70cc601 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -39,6 +39,7 @@ typedef struct { enum PauseMode : char { PAUSE_MODE_SAME, PAUSE_MODE_PAUSE_PRINT, + PAUSE_MODE_CHANGE_FILAMENT, PAUSE_MODE_LOAD_FILAMENT, PAUSE_MODE_UNLOAD_FILAMENT }; @@ -83,7 +84,7 @@ extern uint8_t did_pause_print; void do_pause_e_move(const float &length, const feedRate_t &fr_mm_s); -bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); +bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); diff --git a/Marlin/src/feature/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp index 3420f205f6..99f8d5dc4a 100644 --- a/Marlin/src/feature/power_loss_recovery.cpp +++ b/Marlin/src/feature/power_loss_recovery.cpp @@ -156,7 +156,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*= || ELAPSED(ms, next_save_ms) #endif // Save if Z is above the last-saved position by some minimum height - || current_position[Z_AXIS] > info.current_position[Z_AXIS] + POWER_LOSS_MIN_Z_CHANGE + || current_position.z > info.current_position.z + POWER_LOSS_MIN_Z_CHANGE #endif ) { @@ -170,12 +170,12 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*= info.valid_foot = info.valid_head; // Machine state - COPY(info.current_position, current_position); + info.current_position = current_position; #if HAS_HOME_OFFSET - COPY(info.home_offset, home_offset); + info.home_offset = home_offset; #endif #if HAS_POSITION_SHIFT - COPY(info.position_shift, position_shift); + info.position_shift = position_shift; #endif info.feedrate = uint16_t(feedrate_mm_s * 60.0f); @@ -228,7 +228,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*= #if PIN_EXISTS(POWER_LOSS) void PrintJobRecovery::_outage() { save(true); - kill(PSTR(MSG_OUTAGE_RECOVERY)); + kill(GET_TEXT(MSG_OUTAGE_RECOVERY)); } #endif @@ -361,13 +361,13 @@ void PrintJobRecovery::resume() { // Move back to the saved XY sprintf_P(cmd, PSTR("G1 X%s Y%s F3000"), - dtostrf(info.current_position[X_AXIS], 1, 3, str_1), - dtostrf(info.current_position[Y_AXIS], 1, 3, str_2) + dtostrf(info.current_position.x, 1, 3, str_1), + dtostrf(info.current_position.y, 1, 3, str_2) ); gcode.process_subcommands_now(cmd); // Move back to the saved Z - dtostrf(info.current_position[Z_AXIS], 1, 3, str_1); + dtostrf(info.current_position.z, 1, 3, str_1); #if Z_HOME_DIR > 0 sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); #else @@ -388,22 +388,20 @@ void PrintJobRecovery::resume() { gcode.process_subcommands_now(cmd); // Restore E position with G92.9 - sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position[E_AXIS], 1, 3, str_1)); + sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1)); gcode.process_subcommands_now(cmd); // Relative axis modes gcode.axis_relative = info.axis_relative; + #if HAS_HOME_OFFSET + home_offset = info.home_offset; + #endif + #if HAS_POSITION_SHIFT + position_shift = info.position_shift; + #endif #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT - LOOP_XYZ(i) { - #if HAS_HOME_OFFSET - home_offset[i] = info.home_offset[i]; - #endif - #if HAS_POSITION_SHIFT - position_shift[i] = info.position_shift[i]; - #endif - update_workspace_offset((AxisEnum)i); - } + LOOP_XYZ(i) update_workspace_offset((AxisEnum)i); #endif // Resume the SD file from the last position diff --git a/Marlin/src/feature/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h index 58b6c1dc7a..9f947701e3 100644 --- a/Marlin/src/feature/power_loss_recovery.h +++ b/Marlin/src/feature/power_loss_recovery.h @@ -44,13 +44,13 @@ typedef struct { uint8_t valid_head; // Machine state - float current_position[NUM_AXIS]; + xyze_pos_t current_position; #if HAS_HOME_OFFSET - float home_offset[XYZ]; + xyz_pos_t home_offset; #endif #if HAS_POSITION_SHIFT - float position_shift[XYZ]; + xyz_pos_t position_shift; #endif uint16_t feedrate; @@ -169,7 +169,7 @@ class PrintJobRecovery { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) static void debug(PGM_P const prefix); #else - static inline void debug(PGM_P const prefix) { UNUSED(prefix); } + static inline void debug(PGM_P const) {} #endif private: diff --git a/Marlin/src/feature/prusa_MMU2/mmu2.cpp b/Marlin/src/feature/prusa_MMU2/mmu2.cpp index 8f5537ba9c..66b3877f0c 100644 --- a/Marlin/src/feature/prusa_MMU2/mmu2.cpp +++ b/Marlin/src/feature/prusa_MMU2/mmu2.cpp @@ -433,7 +433,7 @@ bool MMU2::rx_ok() { void MMU2::check_version() { if (buildnr < MMU_REQUIRED_FW_BUILDNR) { SERIAL_ERROR_MSG("Invalid MMU2 firmware. Version >= " STRINGIFY(MMU_REQUIRED_FW_BUILDNR) " required."); - kill(MSG_MMU2_WRONG_FIRMWARE); + kill(GET_TEXT(MSG_MMU2_WRONG_FIRMWARE)); } } @@ -449,7 +449,7 @@ void MMU2::tool_change(uint8_t index) { if (index != extruder) { disable_E0(); - ui.status_printf_P(0, PSTR(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); command(MMU_CMD_T0 + index); @@ -550,10 +550,10 @@ bool MMU2::get_response() { */ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { + constexpr xyz_pos_t park_point = NOZZLE_PARK_POINT; bool response = false; mmu_print_saved = false; - point_t park_point = NOZZLE_PARK_POINT; - float resume_position[XYZE]; + xyz_pos_t resume_position; int16_t resume_hotend_temp; KEEPALIVE_STATE(PAUSED_FOR_USER); @@ -572,7 +572,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { SERIAL_ECHOLNPGM("MMU not responding"); resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); - COPY(resume_position, current_position); + resume_position = current_position; if (move_axes && all_axes_homed()) nozzle.park(2, park_point /*= NOZZLE_PARK_POINT*/); @@ -604,10 +604,10 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { BUZZ(200, 404); // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position[X_AXIS], resume_position[Y_AXIS], feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position[Z_AXIS], feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); } else { BUZZ(200, 404); @@ -698,8 +698,8 @@ void MMU2::filament_runout() { LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT); enable_E0(); - current_position[E_AXIS] -= MMU2_FILAMENTCHANGE_EJECT_FEED; - planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2500 / 60, active_extruder); + current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; + line_to_current_position(2500 / 60); planner.synchronize(); command(MMU_CMD_E0 + index); manage_response(false, false); @@ -712,7 +712,7 @@ void MMU2::filament_runout() { host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("MMU2 Eject Recover")); + ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover")); #endif while (wait_for_user) idle(); BUZZ(200, 404); @@ -787,7 +787,7 @@ void MMU2::filament_runout() { DEBUG_ECHO_START(); DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m); - current_position[E_AXIS] += es; + current_position.e += es; line_to_current_position(MMM_TO_MMS(fr_mm_m)); planner.synchronize(); diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index a4172fc086..6b8905c3b9 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -58,4 +58,79 @@ void FilamentSensorBase::filament_present(const uint8_t extruder) { int8_t RunoutResponseDebounced::runout_count; // = 0 #endif +// +// Filament Runout event handler +// +#include "../Marlin.h" +#include "../gcode/queue.h" + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "host_actions.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extensible_ui/ui_api.h" +#endif + +void event_filament_runout() { + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout. + #endif + + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onFilamentRunout(ExtUI::getActiveTool()); + #endif + + #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) + const char tool = '0' + #if NUM_RUNOUT_SENSORS > 1 + + active_extruder + #endif + ; + #endif + + //action:out_of_filament + #if ENABLED(HOST_PROMPT_SUPPORT) + host_prompt_reason = PROMPT_FILAMENT_RUNOUT; + host_action_prompt_end(); + host_action_prompt_begin(PSTR("FilamentRunout T"), false); + SERIAL_CHAR(tool); + SERIAL_EOL(); + host_action_prompt_show(); + #endif + + const bool run_runout_script = !runout.host_handling; + + #if ENABLED(HOST_ACTION_COMMANDS) + if (run_runout_script + && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600") + || strstr(FILAMENT_RUNOUT_SCRIPT, "M125") + #if ENABLED(ADVANCED_PAUSE_FEATURE) + || strstr(FILAMENT_RUNOUT_SCRIPT, "M25") + #endif + ) + ) { + host_action_paused(false); + } + else { + // Legacy Repetier command for use until newer version supports standard dialog + // To be removed later when pause command also triggers dialog + #ifdef ACTION_ON_FILAMENT_RUNOUT + host_action(PSTR(ACTION_ON_FILAMENT_RUNOUT " T"), false); + SERIAL_CHAR(tool); + SERIAL_EOL(); + #endif + + host_action_pause(false); + } + SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " "); + SERIAL_CHAR(tool); + SERIAL_EOL(); + #endif // HOST_ACTION_COMMANDS + + if (run_runout_script) + queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); +} + #endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index ab92c1f7c1..4fed18e359 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -46,6 +46,8 @@ #define FILAMENT_RUNOUT_THRESHOLD 5 #endif +void event_filament_runout(); + class FilamentMonitorBase { public: static bool enabled, filament_ran_out; @@ -98,7 +100,7 @@ class TFilamentMonitor : public FilamentMonitorBase { // Give the response a chance to update its counter. static inline void run() { - if (enabled && !filament_ran_out && (IS_SD_PRINTING() || print_job_timer.isRunning() + if (enabled && !filament_ran_out && (printingIsActive() #if ENABLED(ADVANCED_PAUSE_FEATURE) || did_pause_print #endif @@ -266,7 +268,7 @@ class FilamentSensorBase { } public: - static inline void block_completed(const block_t* const b) { UNUSED(b); } + static inline void block_completed(const block_t* const) {} static inline void run() { const bool out = poll_runout_state(active_extruder); @@ -327,14 +329,14 @@ class FilamentSensorBase { } static inline void block_completed(const block_t* const b) { - if (b->steps[X_AXIS] || b->steps[Y_AXIS] || b->steps[Z_AXIS] + if (b->steps.x || b->steps.y || b->steps.z #if ENABLED(ADVANCED_PAUSE_FEATURE) || did_pause_print // Allow pause purge move to re-trigger runout state #endif ) { // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. const uint8_t e = b->extruder; - const int32_t steps = b->steps[E_AXIS]; + const int32_t steps = b->steps.e; runout_mm_countdown[e] -= (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.steps_to_mm[E_AXIS_N(e)]; } } @@ -353,8 +355,8 @@ class FilamentSensorBase { static inline void reset() { runout_count = runout_threshold; } static inline void run() { if (runout_count >= 0) runout_count--; } static inline bool has_run_out() { return runout_count < 0; } - static inline void block_completed(const block_t* const b) { UNUSED(b); } - static inline void filament_present(const uint8_t extruder) { runout_count = runout_threshold; UNUSED(extruder); } + static inline void block_completed(const block_t* const) { } + static inline void filament_present(const uint8_t) { runout_count = runout_threshold; } }; #endif // !FILAMENT_RUNOUT_DISTANCE_MM diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 81865fddb6..775e7a864a 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -34,14 +34,16 @@ SpindleLaser cutter; cutter_power_t SpindleLaser::power; // = 0 +#define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) + void SpindleLaser::init() { OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Init spindle to off #if ENABLED(SPINDLE_CHANGE_DIR) OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3) #endif - #if ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if ENABLED(SPINDLE_LASER_PWM) SET_PWM(SPINDLE_LASER_PWM_PIN); - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_INVERT ? 255 : 0); // set to lowest speed + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // set to lowest speed #endif } @@ -54,34 +56,34 @@ void SpindleLaser::init() { */ void SpindleLaser::set_ocr(const uint8_t ocr) { WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_HIGH); // turn spindle on (active low) - #if ENABLED(SPINDLE_LASER_PWM) - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), (SPINDLE_LASER_PWM_INVERT) ? 255 - ocr : ocr); - #endif + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); } #endif -void SpindleLaser::update_output() { - const bool ena = enabled(); +void SpindleLaser::apply_power(const cutter_power_t inpow) { + static cutter_power_t last_power_applied = 0; + if (inpow == last_power_applied) return; + last_power_applied = inpow; #if ENABLED(SPINDLE_LASER_PWM) - if (ena) { + if (enabled()) { + #define _scaled(F) ((F - (SPEED_POWER_INTERCEPT)) * inv_slope) constexpr float inv_slope = RECIPROCAL(SPEED_POWER_SLOPE), - min_ocr = (SPEED_POWER_MIN - (SPEED_POWER_INTERCEPT)) * inv_slope, // Minimum allowed - max_ocr = (SPEED_POWER_MAX - (SPEED_POWER_INTERCEPT)) * inv_slope; // Maximum allowed + min_ocr = _scaled(SPEED_POWER_MIN), + max_ocr = _scaled(SPEED_POWER_MAX); int16_t ocr_val; - if (power <= SPEED_POWER_MIN) ocr_val = min_ocr; // Use minimum if set below - else if (power >= SPEED_POWER_MAX) ocr_val = max_ocr; // Use maximum if set above - else ocr_val = (power - (SPEED_POWER_INTERCEPT)) * inv_slope; // Use calculated OCR value - set_ocr(ocr_val & 0xFF); // ...limited to Atmel PWM max + if (inpow <= SPEED_POWER_MIN) ocr_val = min_ocr; // Use minimum if set below + else if (inpow >= SPEED_POWER_MAX) ocr_val = max_ocr; // Use maximum if set above + else ocr_val = _scaled(inpow); // Use calculated OCR value + set_ocr(ocr_val & 0xFF); // ...limited to Atmel PWM max } - else { // Convert RPM to PWM duty cycle - WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off (active low) - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_INVERT ? 255 : 0); // Only write low byte + else { + WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off (active low) + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte } #else - WRITE(SPINDLE_LASER_ENA_PIN, ena ? SPINDLE_LASER_ACTIVE_HIGH : !SPINDLE_LASER_ACTIVE_HIGH); + WRITE(SPINDLE_LASER_ENA_PIN, (SPINDLE_LASER_ACTIVE_HIGH) ? enabled() : !enabled()); #endif - power_delay(ena); } #if ENABLED(SPINDLE_CHANGE_DIR) diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index ddc89b5add..80b57be314 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -36,10 +36,10 @@ #define MSG_CUTTER(M) _MSG_CUTTER(M) #if SPEED_POWER_MAX > 255 - #define cutter_power_t uint16_t + typedef uint16_t cutter_power_t; #define CUTTER_MENU_TYPE uint16_5 #else - #define cutter_power_t uint8_t + typedef uint8_t cutter_power_t; #define CUTTER_MENU_TYPE uint8 #endif @@ -51,9 +51,17 @@ public: static inline bool enabled() { return !!power; } - static inline void set_power(const uint8_t pwr) { power = pwr; update_output(); } + static inline void set_power(const cutter_power_t pwr) { power = pwr; } - static inline void set_enabled(const bool enable) { set_power(enable ? 255 : 0); } + static inline void refresh() { apply_power(power); } + + static inline void set_enabled(const bool enable) { + const bool was = enabled(); + set_power(enable ? 255 : 0); + if (was != enable) power_delay(); + } + + static void apply_power(const cutter_power_t inpow); //static bool active() { return READ(SPINDLE_LASER_ENA_PIN) == SPINDLE_LASER_ACTIVE_HIGH; } @@ -61,16 +69,20 @@ public: #if ENABLED(SPINDLE_LASER_PWM) static void set_ocr(const uint8_t ocr); - static inline void set_ocr_power(const uint8_t pwr) { power = pwr; set_ocr(pwr); } + static inline void set_ocr_power(const cutter_power_t pwr) { power = pwr; set_ocr(pwr); } #endif // Wait for spindle to spin up or spin down - static inline void power_delay(const bool on) { safe_delay(on ? SPINDLE_LASER_POWERUP_DELAY : SPINDLE_LASER_POWERDOWN_DELAY); } + static inline void power_delay() { + #if SPINDLE_LASER_POWERUP_DELAY || SPINDLE_LASER_POWERDOWN_DELAY + safe_delay(enabled() ? SPINDLE_LASER_POWERUP_DELAY : SPINDLE_LASER_POWERDOWN_DELAY); + #endif + } #if ENABLED(SPINDLE_CHANGE_DIR) static void set_direction(const bool reverse); #else - static inline void set_direction(const bool reverse) { UNUSED(reverse); } + static inline void set_direction(const bool) {} #endif static inline void disable() { set_enabled(false); } diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 329c511ecd..618fdd81f5 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -507,7 +507,7 @@ case TMC_GLOBAL_SCALER: { uint16_t value = st.GLOBAL_SCALER(); - SERIAL_PRINT(value ? value : 256, DEC); + SERIAL_PRINT(value ?: 256, DEC); SERIAL_ECHOPGM("/256"); } break; @@ -1118,7 +1118,7 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z #endif } - if (axis_connection) ui.set_status_P(PSTR(MSG_ERROR_TMC)); + if (axis_connection) ui.set_status_P(GET_TEXT(MSG_ERROR_TMC)); } #endif // HAS_TRINAMIC diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index b5b45089b9..e0c9170ae5 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -103,9 +103,15 @@ class TMCMarlin : public TMC, public TMCStorage { TMCMarlin(const uint16_t cs_pin, const float RS) : TMC(cs_pin, RS) {} + TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t axis_chain_index) : + TMC(cs_pin, RS, axis_chain_index) + {} TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK) : TMC(CS, RS, pinMOSI, pinMISO, pinSCK) {} + TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) : + TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index) + {} inline uint16_t rms_current() { return TMC::rms_current(); } inline void rms_current(uint16_t mA) { this->val_mA = mA; @@ -267,10 +273,10 @@ class TMCMarlin : public TMC220 template class TMCMarlin : public TMC2660Stepper, public TMCStorage { public: - TMCMarlin(const uint16_t cs_pin, const float RS) : + TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t) : TMC2660Stepper(cs_pin, RS) {} - TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK) : + TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t) : TMC2660Stepper(CS, RS, pinMOSI, pinMISO, pinSCK) {} inline uint16_t rms_current() { return TMC2660Stepper::rms_current(); } @@ -367,9 +373,9 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z constexpr uint16_t default_sg_guard_duration = 400; struct slow_homing_t { - struct { uint32_t x, y; } acceleration; + xy_ulong_t acceleration; #if HAS_CLASSIC_JERK - struct { float x, y; } jerk; + xy_float_t jerk_xy; #endif }; #endif @@ -387,34 +393,16 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z template bool TMCMarlin::test_stall_status() { - uint16_t sg_result = 0; - this->switchCSpin(LOW); - if (this->TMC_SW_SPI != nullptr) { - this->TMC_SW_SPI->transfer(TMC2130_n::DRV_STATUS_t::address); - this->TMC_SW_SPI->transfer16(0); - // We only care about the last 10 bits - sg_result = this->TMC_SW_SPI->transfer(0); - sg_result <<= 8; - sg_result |= this->TMC_SW_SPI->transfer(0); - } - else { - SPI.beginTransaction(SPISettings(16000000/8, MSBFIRST, SPI_MODE3)); - // Read DRV_STATUS - SPI.transfer(TMC2130_n::DRV_STATUS_t::address); - SPI.transfer16(0); - // We only care about the last 10 bits - sg_result = SPI.transfer(0); - sg_result <<= 8; - sg_result |= SPI.transfer(0); - SPI.endTransaction(); - } + // read stallGuard flag from TMC library, will handle HW and SW SPI + TMC2130_n::DRV_STATUS_t drv_status{0}; + drv_status.sr = this->DRV_STATUS(); + this->switchCSpin(HIGH); - return (sg_result & 0x3FF) == 0; + return drv_status.stallGuard; } - #endif // SPI_ENDSTOPS #endif // USE_SENSORLESS diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index f98ffc88cb..467b71059c 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -62,7 +62,7 @@ #define G26_ERR true #if ENABLED(ARC_SUPPORT) - void plan_arc(const float (&cart)[XYZE], const float (&offset)[2], const uint8_t clockwise); + void plan_arc(const xyze_pos_t &cart, const ab_float_t &offset, const uint8_t clockwise); #endif /** @@ -142,7 +142,7 @@ // Private functions -static uint16_t circle_flags[16], horizontal_mesh_line_flags[16], vertical_mesh_line_flags[16]; +static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; float g26_e_axis_feedrate = 0.025, random_deviation = 0.0; @@ -154,7 +154,7 @@ float g26_extrusion_multiplier, g26_layer_height, g26_prime_length; -float g26_x_pos = 0, g26_y_pos = 0; +xy_pos_t g26_pos; // = { 0, 0 } int16_t g26_bed_temp, g26_hotend_temp; @@ -168,7 +168,7 @@ int8_t g26_prime_flag; */ bool user_canceled() { if (!ui.button_pressed()) return false; // Return if the button isn't pressed - ui.set_status_P(PSTR(MSG_G26_CANCELED), 99); + ui.set_status_P(GET_TEXT(MSG_G26_CANCELED), 99); #if HAS_LCD_MENU ui.quick_feedback(); #endif @@ -178,85 +178,85 @@ int8_t g26_prime_flag; #endif -mesh_index_pair find_closest_circle_to_print(const float &X, const float &Y) { +mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { float closest = 99999.99; - mesh_index_pair return_val; + mesh_index_pair out_point; - return_val.x_index = return_val.y_index = -1; + out_point.pos = -1; for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - if (!is_bitmap_set(circle_flags, i, j)) { - const float mx = _GET_MESH_X(i), // We found a circle that needs to be printed - my = _GET_MESH_Y(j); + if (!circle_flags.marked(i, j)) { + // We found a circle that needs to be printed + const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; // Get the distance to this intersection - float f = HYPOT(X - mx, Y - my); + float f = (pos - m).magnitude(); // It is possible that we are being called with the values // to let us find the closest circle to the start position. // But if this is not the case, add a small weighting to the // distance calculation to help it choose a better place to continue. - f += HYPOT(g26_x_pos - mx, g26_y_pos - my) / 15.0; + f += (g26_pos - m).magnitude() / 15.0f; - // Add in the specified amount of Random Noise to our search - if (random_deviation > 1.0) - f += random(0.0, random_deviation); + // Add the specified amount of Random Noise to our search + if (random_deviation > 1.0) f += random(0.0, random_deviation); if (f < closest) { - closest = f; // We found a closer location that is still - return_val.x_index = i; // un-printed --- save the data for it - return_val.y_index = j; - return_val.distance = closest; + closest = f; // Found a closer un-printed location + out_point.pos.set(i, j); // Save its data + out_point.distance = closest; } } } } - bitmap_set(circle_flags, return_val.x_index, return_val.y_index); // Mark this location as done. - return return_val; + circle_flags.mark(out_point); // Mark this location as done. + return out_point; } void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { static float last_z = -999.99; - bool has_xy_component = (rx != current_position[X_AXIS] || ry != current_position[Y_AXIS]); // Check if X or Y is involved in the movement. + const xy_pos_t dest = { rx, ry }; + + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + + destination = current_position; if (z != last_z) { - last_z = z; + last_z = destination.z = z; const feedRate_t feed_value = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate - - destination[X_AXIS] = current_position[X_AXIS]; - destination[Y_AXIS] = current_position[Y_AXIS]; - destination[Z_AXIS] = z; // We know the last_z!=z or we wouldn't be in this block of code. - destination[E_AXIS] = current_position[E_AXIS]; - prepare_internal_move_to_destination(feed_value); - set_destination_from_current(); + destination = current_position; } // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. + destination = dest; + destination.e += e_delta; const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; - - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; - destination[E_AXIS] += e_delta; - prepare_internal_move_to_destination(feed_value); - set_destination_from_current(); + destination = current_position; } -FORCE_INLINE void move_to(const float (&where)[XYZE], const float &de) { move_to(where[X_AXIS], where[Y_AXIS], where[Z_AXIS], de); } +FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } -void retract_filament(const float (&where)[XYZE]) { +void retract_filament(const xyz_pos_t &where) { if (!g26_retracted) { // Only retract if we are not already retracted! g26_retracted = true; - move_to(where, -1.0 * g26_retraction_multiplier); + move_to(where, -1.0f * g26_retraction_multiplier); } } -void recover_filament(const float (&where)[XYZE]) { +// TODO: Parameterize the Z lift with a define +void retract_lift_move(const xyz_pos_t &s) { + retract_filament(destination); + move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0); // Z lift to minimize scraping + move_to(s.x, s.y, s.z + 0.5f, 0.0); // Get to the starting point with no extrusion while lifted +} + +void recover_filament(const xyz_pos_t &where) { if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2 * g26_retraction_multiplier); + move_to(where, 1.2f * g26_retraction_multiplier); g26_retracted = false; } } @@ -276,41 +276,34 @@ void recover_filament(const float (&where)[XYZE]) { * segment of a 'circle'. The time this requires is very short and is easily saved by the other * cases where the optimization comes into play. */ -void print_line_from_here_to_there(const float &sx, const float &sy, const float &sz, const float &ex, const float &ey, const float &ez) { - const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual line segment - dy_s = current_position[Y_AXIS] - sy, - dist_start = HYPOT2(dx_s, dy_s), // We don't need to do a sqrt(), we can compare the distance^2 - // to save computation time - dx_e = current_position[X_AXIS] - ex, // find our distance from the end of the actual line segment - dy_e = current_position[Y_AXIS] - ey, - dist_end = HYPOT2(dx_e, dy_e), +void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { - line_length = HYPOT(ex - sx, ey - sy); + // Distances to the start / end of the line + xy_float_t svec = current_position - s, evec = current_position - e; + + const float dist_start = HYPOT2(svec.x, svec.y), + dist_end = HYPOT2(evec.x, evec.y), + line_length = HYPOT(e.x - s.x, e.y - s.y); // If the end point of the line is closer to the nozzle, flip the direction, // moving from the end to the start. On very small lines the optimization isn't worth it. if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) - return print_line_from_here_to_there(ex, ey, ez, sx, sy, sz); + return print_line_from_here_to_there(e, s); - // Decide whether to retract & bump + // Decide whether to retract & lift + if (dist_start > 2.0) retract_lift_move(s); - if (dist_start > 2.0) { - retract_filament(destination); - //todo: parameterize the bump height with a define - move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping - move_to(sx, sy, sz + 0.500, 0.0); // Get to the starting point with no extrusion while bumped - } - - move_to(sx, sy, sz, 0.0); // Get to the starting point with no extrusion / un-Z bump + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; recover_filament(destination); - move_to(ex, ey, ez, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion + move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion } inline bool look_for_lines_to_connect() { - float sx, sy, ex, ey; + xyz_pos_t s, e; + s.z = e.z = g26_layer_height; for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { @@ -319,43 +312,43 @@ inline bool look_for_lines_to_connect() { if (user_canceled()) return true; #endif - if (i < GRID_MAX_POINTS_X) { // Can't connect to anything to the right than GRID_MAX_POINTS_X. - // Already a half circle at the edge of the bed. + if (i < GRID_MAX_POINTS_X) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. + // Already a half circle at the edge of the bed. - if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i + 1, j)) { // check if we can do a line to the left - if (!is_bitmap_set(horizontal_mesh_line_flags, i, j)) { + if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done + if (!horizontal_mesh_line_flags.marked(i, j)) { // Two circles need a horizontal line to connect them - sx = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge - ex = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge + s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge + e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - LIMIT(sx, X_MIN_POS + 1, X_MAX_POS - 1); - sy = ey = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(ex, X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); - if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) - print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); - bitmap_set(horizontal_mesh_line_flags, i, j); // Mark done, even if skipped + horizontal_mesh_line_flags.mark(i, j); // Mark done, even if skipped } } if (j < GRID_MAX_POINTS_Y) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. // Already a half circle at the edge of the bed. - if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i, j + 1)) { // check if we can do a line straight down - if (!is_bitmap_set( vertical_mesh_line_flags, i, j)) { + if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done + if (!vertical_mesh_line_flags.marked(i, j)) { // Two circles that need a vertical line to connect them - sy = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge - ey = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge + s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge + e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - sx = ex = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(sy, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(ey, Y_MIN_POS + 1, Y_MAX_POS - 1); + s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) - print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); - bitmap_set(vertical_mesh_line_flags, i, j); // Mark done, even if skipped + vertical_mesh_line_flags.mark(i, j); // Mark done, even if skipped } } } @@ -377,7 +370,7 @@ inline bool turn_on_heaters() { if (g26_bed_temp > 25) { #if HAS_SPI_LCD - ui.set_status_P(PSTR(MSG_G26_HEATING_BED), 99); + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); ui.quick_feedback(); #if HAS_LCD_MENU ui.capture(); @@ -398,7 +391,7 @@ inline bool turn_on_heaters() { // Start heating the active nozzle #if HAS_SPI_LCD - ui.set_status_P(PSTR(MSG_G26_HEATING_NOZZLE), 99); + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); ui.quick_feedback(); #endif thermalManager.setTargetHotend(g26_hotend_temp, active_extruder); @@ -433,22 +426,22 @@ inline bool prime_nozzle() { if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged ui.capture(); - ui.set_status_P(PSTR(MSG_G26_MANUAL_PRIME), 99); + ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); ui.chirp(); - set_destination_from_current(); + destination = current_position; recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). while (!ui.button_pressed()) { ui.chirp(); - destination[E_AXIS] += 0.25; + destination.e += 0.25; #if ENABLED(PREVENT_LENGTHY_EXTRUDE) Total_Prime += 0.25; if (Total_Prime >= EXTRUDE_MAXLENGTH) return G26_ERR; #endif prepare_internal_move_to_destination(fr_slow_e); - set_destination_from_current(); + destination = current_position; planner.synchronize(); // Without this synchronize, the purge is more consistent, // but because the planner has a buffer, we won't be able // to stop as quickly. So we put up with the less smooth @@ -457,7 +450,7 @@ inline bool prime_nozzle() { ui.wait_for_release(); - ui.set_status_P(PSTR(MSG_G26_PRIME_DONE), 99); + ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); ui.quick_feedback(); ui.release(); } @@ -465,13 +458,13 @@ inline bool prime_nozzle() { #endif { #if HAS_SPI_LCD - ui.set_status_P(PSTR(MSG_G26_FIXED_LENGTH), 99); + ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); ui.quick_feedback(); #endif - set_destination_from_current(); - destination[E_AXIS] += g26_prime_length; + destination = current_position; + destination.e += g26_prime_length; prepare_internal_move_to_destination(fr_slow_e); - set_destination_from_current(); + destination.e -= g26_prime_length; retract_filament(destination); } @@ -630,9 +623,9 @@ void GcodeSuite::G26() { return; } - g26_x_pos = parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position[X_AXIS]; - g26_y_pos = parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position[Y_AXIS]; - if (!position_is_reachable(g26_x_pos, g26_y_pos)) { + g26_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, + parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); + if (!position_is_reachable(g26_pos.x, g26_pos.y)) { SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); return; } @@ -642,9 +635,9 @@ void GcodeSuite::G26() { */ set_bed_leveling_enabled(!parser.seen('D')); - if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) { + if (current_position.z < Z_CLEARANCE_BETWEEN_PROBES) { do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); - set_current_from_destination(); + current_position = destination; } #if DISABLED(NO_VOLUMETRICS) @@ -655,7 +648,7 @@ void GcodeSuite::G26() { if (turn_on_heaters() != G26_OK) goto LEAVE; - current_position[E_AXIS] = 0.0; + current_position.e = 0.0; sync_plan_position_e(); if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; @@ -670,13 +663,13 @@ void GcodeSuite::G26() { * It's "Show Time" !!! */ - ZERO(circle_flags); - ZERO(horizontal_mesh_line_flags); - ZERO(vertical_mesh_line_flags); + circle_flags.reset(); + horizontal_mesh_line_flags.reset(); + vertical_mesh_line_flags.reset(); // Move nozzle to the specified height for the first layer - set_destination_from_current(); - destination[Z_AXIS] = g26_layer_height; + destination = current_position; + destination.z = g26_layer_height; move_to(destination, 0.0); move_to(destination, g26_ooze_amount); @@ -706,71 +699,68 @@ void GcodeSuite::G26() { mesh_index_pair location; do { - location = g26_continue_with_closest - ? find_closest_circle_to_print(current_position[X_AXIS], current_position[Y_AXIS]) - : find_closest_circle_to_print(g26_x_pos, g26_y_pos); // Find the closest Mesh Intersection to where we are now. + // Find the nearest confluence + location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_pos); - if (location.x_index >= 0 && location.y_index >= 0) { - const float circle_x = _GET_MESH_X(location.x_index), - circle_y = _GET_MESH_Y(location.y_index); + if (location.valid()) { + const xy_pos_t circle = _GET_MESH_POS(location.pos); // If this mesh location is outside the printable_radius, skip it. - if (!position_is_reachable(circle_x, circle_y)) continue; + if (!position_is_reachable(circle)) continue; // Determine where to start and end the circle, // which is always drawn counter-clockwise. - const uint8_t xi = location.x_index, yi = location.y_index; - const bool f = yi == 0, r = xi >= GRID_MAX_POINTS_X - 1, b = yi >= GRID_MAX_POINTS_Y - 1; + const xy_int8_t st = location; + const bool f = st.y == 0, + r = st.x >= GRID_MAX_POINTS_X - 1, + b = st.y >= GRID_MAX_POINTS_Y - 1; #if ENABLED(ARC_SUPPORT) #define ARC_LENGTH(quarters) (INTERSECTION_CIRCLE_RADIUS * M_PI * (quarters) / 2) #define INTERSECTION_CIRCLE_DIAM ((INTERSECTION_CIRCLE_RADIUS) * 2) - float sx = circle_x + INTERSECTION_CIRCLE_RADIUS, // default to full circle - ex = circle_x + INTERSECTION_CIRCLE_RADIUS, - sy = circle_y, ey = circle_y, - arc_length = ARC_LENGTH(4); + + xy_float_t e = { circle.x + INTERSECTION_CIRCLE_RADIUS, circle.y }; + xyz_float_t s = e; // Figure out where to start and end the arc - we always print counterclockwise - if (xi == 0) { // left edge - if (!f) { sx = circle_x; sy -= INTERSECTION_CIRCLE_RADIUS; } - if (!b) { ex = circle_x; ey += INTERSECTION_CIRCLE_RADIUS; } + float arc_length = ARC_LENGTH(4); + if (st.x == 0) { // left edge + if (!f) { s.x = circle.x; s.y -= INTERSECTION_CIRCLE_RADIUS; } + if (!b) { e.x = circle.x; e.y += INTERSECTION_CIRCLE_RADIUS; } arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } else if (r) { // right edge - sx = b ? circle_x - (INTERSECTION_CIRCLE_RADIUS) : circle_x; - ex = f ? circle_x - (INTERSECTION_CIRCLE_RADIUS) : circle_x; - sy = b ? circle_y : circle_y + INTERSECTION_CIRCLE_RADIUS; - ey = f ? circle_y : circle_y - (INTERSECTION_CIRCLE_RADIUS); + if (b) s.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); + else s.set(circle.x, circle.y + INTERSECTION_CIRCLE_RADIUS); + if (f) e.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); + else e.set(circle.x, circle.y - (INTERSECTION_CIRCLE_RADIUS)); arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } else if (f) { - ex -= INTERSECTION_CIRCLE_DIAM; + e.x -= INTERSECTION_CIRCLE_DIAM; arc_length = ARC_LENGTH(2); } else if (b) { - sx -= INTERSECTION_CIRCLE_DIAM; + s.x -= INTERSECTION_CIRCLE_DIAM; arc_length = ARC_LENGTH(2); } - const float arc_offset[2] = { circle_x - sx, circle_y - sy }, - dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual circle - dy_s = current_position[Y_AXIS] - sy, - dist_start = HYPOT2(dx_s, dy_s), - endpoint[XYZE] = { - ex, ey, - g26_layer_height, - current_position[E_AXIS] + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) - }; + const ab_float_t arc_offset = circle - s; + const xy_float_t dist = current_position - s; // Distance from the start of the actual circle + const float dist_start = HYPOT2(dist.x, dist.y); + const xyze_pos_t endpoint = { + e.x, e.y, g26_layer_height, + current_position.e + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + }; if (dist_start > 2.0) { - retract_filament(destination); - //todo: parameterize the bump height with a define - move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping - move_to(sx, sy, g26_layer_height + 0.500, 0.0); // Get to the starting point with no extrusion while bumped + s.z = g26_layer_height + 0.5f; + retract_lift_move(s); } - move_to(sx, sy, g26_layer_height, 0.0); // Get to the starting point with no extrusion / un-Z bump + s.z = g26_layer_height; + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift recover_filament(destination); @@ -778,7 +768,7 @@ void GcodeSuite::G26() { feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; plan_arc(endpoint, arc_offset, false); // Draw a counter-clockwise arc feedrate_mm_s = old_feedrate; - set_destination_from_current(); + destination = current_position; #if HAS_LCD_MENU if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation @@ -787,7 +777,7 @@ void GcodeSuite::G26() { #else // !ARC_SUPPORT int8_t start_ind = -2, end_ind = 9; // Assume a full circle (from 5:00 to 5:00) - if (xi == 0) { // Left edge? Just right half. + if (st.x == 0) { // Left edge? Just right half. start_ind = f ? 0 : -3; // 03:00 to 12:00 for front-left end_ind = b ? 0 : 2; // 06:00 to 03:00 for back-left } @@ -810,23 +800,21 @@ void GcodeSuite::G26() { if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation #endif - float rx = circle_x + _COS(ind), // For speed, these are now a lookup table entry - ry = circle_y + _SIN(ind), - xe = circle_x + _COS(ind + 1), - ye = circle_y + _SIN(ind + 1); + xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26_layer_height }, + q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26_layer_height }; #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. - if (!position_is_reachable(rx, ry) || !position_is_reachable(xe, ye)) continue; - #else // not, we need to skip - LIMIT(rx, X_MIN_POS + 1, X_MAX_POS - 1); // This keeps us from bumping the endstops - LIMIT(ry, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(xe, X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(ye, Y_MIN_POS + 1, Y_MAX_POS - 1); + if (!position_is_reachable(p) || !position_is_reachable(q)) continue; + #else + LIMIT(p.x, X_MIN_POS + 1, X_MAX_POS - 1); // Prevent hitting the endstops + LIMIT(p.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(q.x, X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(q.y, Y_MIN_POS + 1, Y_MAX_POS - 1); #endif - print_line_from_here_to_there(rx, ry, g26_layer_height, xe, ye, g26_layer_height); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + print_line_from_here_to_there(p, q); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } #endif // !ARC_SUPPORT @@ -836,19 +824,18 @@ void GcodeSuite::G26() { SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (--g26_repeats && location.x_index >= 0 && location.y_index >= 0); + } while (--g26_repeats && location.valid()); LEAVE: - ui.set_status_P(PSTR(MSG_G26_LEAVING), -1); + ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); retract_filament(destination); - destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; + destination.z = Z_CLEARANCE_BETWEEN_PROBES; move_to(destination, 0); // Raise the nozzle - destination[X_AXIS] = g26_x_pos; // Move back to the starting position - destination[Y_AXIS] = g26_y_pos; - //destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is + destination.set(g26_pos.x, g26_pos.y); // Move back to the starting position + //destination.z = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is move_to(destination, 0); // Move back to the starting position diff --git a/Marlin/src/gcode/bedlevel/G42.cpp b/Marlin/src/gcode/bedlevel/G42.cpp index 55bc82317c..424e5a6995 100644 --- a/Marlin/src/gcode/bedlevel/G42.cpp +++ b/Marlin/src/gcode/bedlevel/G42.cpp @@ -27,6 +27,7 @@ #include "../gcode.h" #include "../../Marlin.h" // for IsRunning() #include "../../module/motion.h" +#include "../../module/probe.h" // for probe_offset #include "../../feature/bedlevel/bedlevel.h" /** @@ -44,15 +45,15 @@ void GcodeSuite::G42() { return; } - set_destination_from_current(); + destination = current_position; - if (hasI) destination[X_AXIS] = _GET_MESH_X(ix); - if (hasJ) destination[Y_AXIS] = _GET_MESH_Y(iy); + if (hasI) destination.x = _GET_MESH_X(ix); + if (hasJ) destination.y = _GET_MESH_Y(iy); #if HAS_BED_PROBE if (parser.boolval('P')) { - if (hasI) destination[X_AXIS] -= probe_offset[X_AXIS]; - if (hasJ) destination[Y_AXIS] -= probe_offset[Y_AXIS]; + if (hasI) destination.x -= probe_offset.x; + if (hasJ) destination.y -= probe_offset.y; } #endif diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index d3d94a99cc..9e4de215ed 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -27,6 +27,7 @@ #include "../gcode.h" #include "../../feature/bedlevel/bedlevel.h" #include "../../module/planner.h" +#include "../../module/probe.h" #if ENABLED(EEPROM_SETTINGS) #include "../../module/configuration_store.h" @@ -66,10 +67,9 @@ void GcodeSuite::M420() { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) const float x_min = probe_min_x(), x_max = probe_max_x(), y_min = probe_min_y(), y_max = probe_max_y(); - bilinear_start[X_AXIS] = x_min; - bilinear_start[Y_AXIS] = y_min; - bilinear_grid_spacing[X_AXIS] = (x_max - x_min) / (GRID_MAX_POINTS_X - 1); - bilinear_grid_spacing[Y_AXIS] = (y_max - y_min) / (GRID_MAX_POINTS_Y - 1); + bilinear_start.set(x_min, y_min); + bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), + (y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); #endif for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { @@ -91,7 +91,7 @@ void GcodeSuite::M420() { // (Don't disable for just M420 or M420 V) if (seen_S && !to_enable) set_bed_leveling_enabled(false); - const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + xyz_pos_t oldpos = current_position; #if ENABLED(AUTO_BED_LEVELING_UBL) @@ -251,7 +251,7 @@ void GcodeSuite::M420() { #endif // Report change in position - if (memcmp(oldpos, current_position, sizeof(oldpos))) + if (oldpos != current_position) report_current_position(); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 45eec2805d..9ca621d7cd 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -61,15 +61,15 @@ #if ABL_GRID #if ENABLED(PROBE_Y_FIRST) - #define PR_OUTER_VAR xCount - #define PR_OUTER_END abl_grid_points_x - #define PR_INNER_VAR yCount - #define PR_INNER_END abl_grid_points_y + #define PR_OUTER_VAR meshCount.x + #define PR_OUTER_END abl_grid_points.x + #define PR_INNER_VAR meshCount.y + #define PR_INNER_END abl_grid_points.y #else - #define PR_OUTER_VAR yCount - #define PR_OUTER_END abl_grid_points_y - #define PR_INNER_VAR xCount - #define PR_INNER_END abl_grid_points_x + #define PR_OUTER_VAR meshCount.y + #define PR_OUTER_END abl_grid_points.y + #define PR_INNER_VAR meshCount.x + #define PR_INNER_END abl_grid_points.x #endif #endif @@ -210,7 +210,8 @@ G29_TYPE GcodeSuite::G29() { #endif ABL_VAR int verbose_level; - ABL_VAR float xProbe, yProbe, measured_z; + ABL_VAR xy_pos_t probePos; + ABL_VAR float measured_z; ABL_VAR bool dryrun, abl_should_enable; #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) @@ -224,20 +225,17 @@ G29_TYPE GcodeSuite::G29() { #if ABL_GRID #if ENABLED(PROBE_MANUALLY) - ABL_VAR uint8_t PR_OUTER_VAR; - ABL_VAR int8_t PR_INNER_VAR; + ABL_VAR xy_int8_t meshCount; #endif - ABL_VAR int left_probe_bed_position, right_probe_bed_position, front_probe_bed_position, back_probe_bed_position; - ABL_VAR float xGridSpacing = 0, yGridSpacing = 0; + ABL_VAR xy_int_t probe_position_lf, probe_position_rb; + ABL_VAR xy_float_t gridSpacing = { 0, 0 }; #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR uint8_t abl_grid_points_x = GRID_MAX_POINTS_X, - abl_grid_points_y = GRID_MAX_POINTS_Y; ABL_VAR bool do_topography_map; + ABL_VAR xy_uint8_t abl_grid_points; #else // Bilinear - uint8_t constexpr abl_grid_points_x = GRID_MAX_POINTS_X, - abl_grid_points_y = GRID_MAX_POINTS_Y; + constexpr xy_uint8_t abl_grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) @@ -269,15 +267,15 @@ G29_TYPE GcodeSuite::G29() { const float x_min = probe_min_x(), x_max = probe_max_x(), y_min = probe_min_y(), y_max = probe_max_y(); ABL_VAR vector_3 points[3] = { - #if ENABLED(HAS_FIXED_3POINT) - vector_3(PROBE_PT_1_X, PROBE_PT_1_Y, 0), - vector_3(PROBE_PT_2_X, PROBE_PT_2_Y, 0), - vector_3(PROBE_PT_3_X, PROBE_PT_3_Y, 0) - #else - vector_3(x_min, y_min, 0), - vector_3(x_max, y_min, 0), - vector_3((x_max - x_min) / 2, y_max, 0) - #endif + #if ENABLED(HAS_FIXED_3POINT) + { PROBE_PT_1_X, PROBE_PT_1_Y, 0 }, + { PROBE_PT_2_X, PROBE_PT_2_Y, 0 }, + { PROBE_PT_3_X, PROBE_PT_3_Y, 0 } + #else + { x_min, y_min, 0 }, + { x_max, y_min, 0 }, + { (x_max - x_min) / 2, y_max, 0 } + #endif }; #endif // AUTO_BED_LEVELING_3POINT @@ -311,7 +309,7 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(false); } - const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position[Z_AXIS]; + const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position.z; if (!WITHIN(rz, -10, 10)) { SERIAL_ERROR_MSG("Bad Z value"); G29_RETURN(false); @@ -323,8 +321,8 @@ G29_TYPE GcodeSuite::G29() { if (!isnan(rx) && !isnan(ry)) { // Get nearest i / j from rx / ry - i = (rx - bilinear_start[X_AXIS] + 0.5 * xGridSpacing) / xGridSpacing; - j = (ry - bilinear_start[Y_AXIS] + 0.5 * yGridSpacing) / yGridSpacing; + i = (rx - bilinear_start.x + 0.5 * gridSpacing.x) / gridSpacing.x; + j = (ry - bilinear_start.y + 0.5 * gridSpacing.y) / gridSpacing.y; LIMIT(i, 0, GRID_MAX_POINTS_X - 1); LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); } @@ -373,20 +371,22 @@ G29_TYPE GcodeSuite::G29() { // X and Y specify points in each direction, overriding the default // These values may be saved with the completed mesh - abl_grid_points_x = parser.intval('X', GRID_MAX_POINTS_X); - abl_grid_points_y = parser.intval('Y', GRID_MAX_POINTS_Y); - if (parser.seenval('P')) abl_grid_points_x = abl_grid_points_y = parser.value_int(); + abl_grid_points.set( + parser.byteval('X', GRID_MAX_POINTS_X), + parser.byteval('Y', GRID_MAX_POINTS_Y) + ); + if (parser.seenval('P')) abl_grid_points.x = abl_grid_points.y = parser.value_int(); - if (!WITHIN(abl_grid_points_x, 2, GRID_MAX_POINTS_X)) { + if (!WITHIN(abl_grid_points.x, 2, GRID_MAX_POINTS_X)) { SERIAL_ECHOLNPGM("?Probe points (X) implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); G29_RETURN(false); } - if (!WITHIN(abl_grid_points_y, 2, GRID_MAX_POINTS_Y)) { + if (!WITHIN(abl_grid_points.y, 2, GRID_MAX_POINTS_Y)) { SERIAL_ECHOLNPGM("?Probe points (Y) implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); G29_RETURN(false); } - abl_points = abl_grid_points_x * abl_grid_points_y; + abl_points = abl_grid_points.x * abl_grid_points.y; mean = 0; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -404,27 +404,35 @@ G29_TYPE GcodeSuite::G29() { if (parser.seen('H')) { const int16_t size = (int16_t)parser.value_linear_units(); - left_probe_bed_position = _MAX(X_CENTER - size / 2, x_min); - right_probe_bed_position = _MIN(left_probe_bed_position + size, x_max); - front_probe_bed_position = _MAX(Y_CENTER - size / 2, y_min); - back_probe_bed_position = _MIN(front_probe_bed_position + size, y_max); + probe_position_lf.set( + _MAX(X_CENTER - size / 2, x_min), + _MAX(Y_CENTER - size / 2, y_min) + ); + probe_position_rb.set( + _MIN(probe_position_lf.x + size, x_max), + _MIN(probe_position_lf.y + size, y_max) + ); } else { - left_probe_bed_position = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MAX(X_CENTER - X_BED_SIZE / 2, x_min); - right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MIN(left_probe_bed_position + X_BED_SIZE, x_max); - front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MAX(Y_CENTER - Y_BED_SIZE / 2, y_min); - back_probe_bed_position = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MIN(front_probe_bed_position + Y_BED_SIZE, y_max); + probe_position_lf.set( + parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MAX(X_CENTER - (X_BED_SIZE) / 2, x_min), + parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MAX(Y_CENTER - (Y_BED_SIZE) / 2, y_min) + ); + probe_position_rb.set( + parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : _MIN(probe_position_lf.x + X_BED_SIZE, x_max), + parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : _MIN(probe_position_lf.y + Y_BED_SIZE, y_max) + ); } if ( #if IS_SCARA || ENABLED(DELTA) - !position_is_reachable_by_probe(left_probe_bed_position, 0) - || !position_is_reachable_by_probe(right_probe_bed_position, 0) - || !position_is_reachable_by_probe(0, front_probe_bed_position) - || !position_is_reachable_by_probe(0, back_probe_bed_position) + !position_is_reachable_by_probe(probe_position_lf.x, 0) + || !position_is_reachable_by_probe(probe_position_rb.x, 0) + || !position_is_reachable_by_probe(0, probe_position_lf.y) + || !position_is_reachable_by_probe(0, probe_position_rb.y) #else - !position_is_reachable_by_probe(left_probe_bed_position, front_probe_bed_position) - || !position_is_reachable_by_probe(right_probe_bed_position, back_probe_bed_position) + !position_is_reachable_by_probe(probe_position_lf) + || !position_is_reachable_by_probe(probe_position_rb) #endif ) { SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); @@ -432,8 +440,8 @@ G29_TYPE GcodeSuite::G29() { } // probe at the points of a lattice grid - xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (abl_grid_points_x - 1); - yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (abl_grid_points_y - 1); + gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), + (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); #endif // ABL_GRID @@ -464,19 +472,13 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(PROBE_MANUALLY) if (!no_action) #endif - if ( xGridSpacing != bilinear_grid_spacing[X_AXIS] - || yGridSpacing != bilinear_grid_spacing[Y_AXIS] - || left_probe_bed_position != bilinear_start[X_AXIS] - || front_probe_bed_position != bilinear_start[Y_AXIS] - ) { + if (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) { // Reset grid to 0.0 or "not probed". (Also disables ABL) reset_bed_level(); // Initialize a grid with the given dimensions - bilinear_grid_spacing[X_AXIS] = xGridSpacing; - bilinear_grid_spacing[Y_AXIS] = yGridSpacing; - bilinear_start[X_AXIS] = left_probe_bed_position; - bilinear_start[Y_AXIS] = front_probe_bed_position; + bilinear_grid_spacing = gridSpacing.asInt(); + bilinear_start = probe_position_lf; // Can't re-enable (on error) until the new grid is written abl_should_enable = false; @@ -546,17 +548,17 @@ G29_TYPE GcodeSuite::G29() { // For G29 after adjusting Z. // Save the previous Z before going to the next point - measured_z = current_position[Z_AXIS]; + measured_z = current_position.z; #if ENABLED(AUTO_BED_LEVELING_LINEAR) mean += measured_z; eqnBVector[index] = measured_z; - eqnAMatrix[index + 0 * abl_points] = xProbe; - eqnAMatrix[index + 1 * abl_points] = yProbe; + eqnAMatrix[index + 0 * abl_points] = probePos.x; + eqnAMatrix[index + 1 * abl_points] = probePos.y; eqnAMatrix[index + 2 * abl_points] = 1; - incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); + incremental_LSF(&lsf_results, probePos, measured_z); #elif ENABLED(AUTO_BED_LEVELING_3POINT) @@ -564,12 +566,13 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - z_values[xCount][yCount] = measured_z + zoffset; + const float newz = measured_z + zoffset; + z_values[meshCount.x][meshCount.y] = newz; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(xCount, yCount, z_values[xCount][yCount]); + ExtUI::onMeshUpdate(meshCount, newz); #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Save X", xCount, " Y", yCount, " Z", measured_z + zoffset); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Save X", meshCount.x, " Y", meshCount.y, " Z", measured_z + zoffset); #endif } @@ -583,7 +586,7 @@ G29_TYPE GcodeSuite::G29() { // Skip any unreachable points while (abl_probe_index < abl_points) { - // Set xCount, yCount based on abl_probe_index, with zig-zag + // Set meshCount.x, meshCount.y based on abl_probe_index, with zig-zag PR_OUTER_VAR = abl_probe_index / PR_INNER_END; PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); @@ -592,24 +595,23 @@ G29_TYPE GcodeSuite::G29() { if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; - const float xBase = xCount * xGridSpacing + left_probe_bed_position, - yBase = yCount * yGridSpacing + front_probe_bed_position; + const xy_pos_t base = probe_position_lf.asFloat() + gridSpacing * meshCount.asFloat(); - xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); - yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); + probePos.set(FLOOR(base.x + (base.x < 0 ? 0 : 0.5)), + FLOOR(base.y + (base.y < 0 ? 0 : 0.5))); #if ENABLED(AUTO_BED_LEVELING_LINEAR) - indexIntoAB[xCount][yCount] = abl_probe_index; + indexIntoAB[meshCount.x][meshCount.y] = abl_probe_index; #endif // Keep looping till a reachable point is found - if (position_is_reachable(xProbe, yProbe)) break; + if (position_is_reachable(probePos)) break; ++abl_probe_index; } // Is there a next point to move to? if (abl_probe_index < abl_points) { - _manual_goto_xy(xProbe, yProbe); // Can be used here too! + _manual_goto_xy(probePos); // Can be used here too! #if HAS_SOFTWARE_ENDSTOPS // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled @@ -633,9 +635,8 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points if (abl_probe_index < abl_points) { - xProbe = points[abl_probe_index].x; - yProbe = points[abl_probe_index].y; - _manual_goto_xy(xProbe, yProbe); + probePos = points[abl_probe_index]; + _manual_goto_xy(probePos); #if HAS_SOFTWARE_ENDSTOPS // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled @@ -654,11 +655,7 @@ G29_TYPE GcodeSuite::G29() { if (!dryrun) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); - if (planeNormal.z < 0) { - planeNormal.x *= -1; - planeNormal.y *= -1; - planeNormal.z *= -1; - } + if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written @@ -681,8 +678,11 @@ G29_TYPE GcodeSuite::G29() { measured_z = 0; + xy_int8_t meshCount; + + // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (uint8_t PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; @@ -703,29 +703,29 @@ G29_TYPE GcodeSuite::G29() { uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_END) + 1; // Inner loop is Y with PROBE_Y_FIRST enabled - for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { + // Inner loop is X with PROBE_Y_FIRST disabled + for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { - const float xBase = left_probe_bed_position + xGridSpacing * xCount, - yBase = front_probe_bed_position + yGridSpacing * yCount; + const xy_pos_t base = probe_position_lf.asFloat() + gridSpacing * meshCount.asFloat(); - xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); - yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); + probePos.set(FLOOR(base.x + (base.x < 0 ? 0 : 0.5)), + FLOOR(base.y + (base.y < 0 ? 0 : 0.5))); #if ENABLED(AUTO_BED_LEVELING_LINEAR) - indexIntoAB[xCount][yCount] = ++abl_probe_index; // 0... + indexIntoAB[meshCount.x][meshCount.y] = ++abl_probe_index; // 0... #endif #if IS_KINEMATIC // Avoid probing outside the round or hexagonal area - if (!position_is_reachable_by_probe(xProbe, yProbe)) continue; + if (!position_is_reachable_by_probe(probePos)) continue; #endif if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", int(GRID_MAX_POINTS), "."); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), PSTR(MSG_PROBING_MESH), int(pt_index), int(GRID_MAX_POINTS)); + ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(GRID_MAX_POINTS)); #endif - measured_z = faux ? 0.001 * random(-100, 101) : probe_at_point(xProbe, yProbe, raise_after, verbose_level); + measured_z = faux ? 0.001 * random(-100, 101) : probe_at_point(probePos, raise_after, verbose_level); if (isnan(measured_z)) { set_bed_leveling_enabled(abl_should_enable); @@ -736,17 +736,17 @@ G29_TYPE GcodeSuite::G29() { mean += measured_z; eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl_points] = xProbe; - eqnAMatrix[abl_probe_index + 1 * abl_points] = yProbe; + eqnAMatrix[abl_probe_index + 0 * abl_points] = probePos.x; + eqnAMatrix[abl_probe_index + 1 * abl_points] = probePos.y; eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; - incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); + incremental_LSF(&lsf_results, probePos, measured_z); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - z_values[xCount][yCount] = measured_z + zoffset; + z_values[meshCount.x][meshCount.y] = measured_z + zoffset; #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(xCount, yCount, z_values[xCount][yCount]); + ExtUI::onMeshUpdate(meshCount.x, meshCount.y, z_values[meshCount.x][meshCount.y]); #endif #endif @@ -764,13 +764,12 @@ G29_TYPE GcodeSuite::G29() { for (uint8_t i = 0; i < 3; ++i) { if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i), "/3."); #if HAS_DISPLAY - ui.status_printf_P(0, PSTR(MSG_PROBING_MESH " %i/3"), int(i)); + ui.status_printf_P(0, PSTR(S_FMT" %i/3"), GET_TEXT(MSG_PROBING_MESH)), int(i); #endif // Retain the last probe position - xProbe = points[i].x; - yProbe = points[i].y; - measured_z = faux ? 0.001 * random(-100, 101) : probe_at_point(xProbe, yProbe, raise_after, verbose_level); + probePos = points[i]; + measured_z = faux ? 0.001 * random(-100, 101) : probe_at_point(probePos, raise_after, verbose_level); if (isnan(measured_z)) { set_bed_leveling_enabled(abl_should_enable); break; @@ -845,19 +844,19 @@ G29_TYPE GcodeSuite::G29() { * plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0 * so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z */ - float plane_equation_coefficients[3]; + struct { float a, b, d; } plane_equation_coefficients; finish_incremental_LSF(&lsf_results); - plane_equation_coefficients[0] = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below - plane_equation_coefficients[1] = -lsf_results.B; // but that is not yet tested. - plane_equation_coefficients[2] = -lsf_results.D; + plane_equation_coefficients.a = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below + plane_equation_coefficients.b = -lsf_results.B; // but that is not yet tested. + plane_equation_coefficients.d = -lsf_results.D; mean /= abl_points; if (verbose_level) { - SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients[0], 8); - SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients[1], 8); - SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients[2], 8); + SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients.a, 8); + SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients.b, 8); + SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients.d, 8); if (verbose_level > 2) SERIAL_ECHOPAIR_F("\nMean of sampled points: ", mean, 8); SERIAL_EOL(); @@ -866,13 +865,34 @@ G29_TYPE GcodeSuite::G29() { // Create the matrix but don't correct the position yet if (!dryrun) planner.bed_level_matrix = matrix_3x3::create_look_at( - vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1) // We can eliminate the '-' here and up above + vector_3(-plane_equation_coefficients.a, -plane_equation_coefficients.b, 1) // We can eliminate the '-' here and up above ); // Show the Topography map if enabled if (do_topography_map) { - SERIAL_ECHOLNPGM("\nBed Height Topography:\n" + float min_diff = 999; + + auto print_topo_map = [&](PGM_P const title, const bool get_min) { + serialprintPGM(title); + for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { + for (uint8_t xx = 0; xx < abl_grid_points.x; xx++) { + const int ind = indexIntoAB[xx][yy]; + xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], + eqnAMatrix[ind + 1 * abl_points], 0 }; + apply_rotation_xyz(planner.bed_level_matrix, tmp); + if (get_min) NOMORE(min_diff, eqnBVector[ind] - tmp.z); + const float subval = get_min ? mean : tmp.z + min_diff, + diff = eqnBVector[ind] - subval; + SERIAL_CHAR(' '); if (diff >= 0.0) SERIAL_CHAR('+'); // Include + for column alignment + SERIAL_ECHO_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + }; + + print_topo_map(PSTR("\nBed Height Topography:\n" " +--- BACK --+\n" " | |\n" " L | (+) | R\n" @@ -882,56 +902,10 @@ G29_TYPE GcodeSuite::G29() { " | (-) | T\n" " | |\n" " O-- FRONT --+\n" - " (0,0)"); + " (0,0)\n"), true); + if (verbose_level > 3) + print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false); - float min_diff = 999; - - for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { - for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { - int ind = indexIntoAB[xx][yy]; - float diff = eqnBVector[ind] - mean, - x_tmp = eqnAMatrix[ind + 0 * abl_points], - y_tmp = eqnAMatrix[ind + 1 * abl_points], - z_tmp = 0; - - apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); - - NOMORE(min_diff, eqnBVector[ind] - z_tmp); - - if (diff >= 0.0) - SERIAL_ECHOPGM(" +"); // Include + for column alignment - else - SERIAL_CHAR(' '); - SERIAL_ECHO_F(diff, 5); - } // xx - SERIAL_EOL(); - } // yy - SERIAL_EOL(); - - if (verbose_level > 3) { - SERIAL_ECHOLNPGM("\nCorrected Bed Height vs. Bed Topology:"); - - for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { - for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { - int ind = indexIntoAB[xx][yy]; - float x_tmp = eqnAMatrix[ind + 0 * abl_points], - y_tmp = eqnAMatrix[ind + 1 * abl_points], - z_tmp = 0; - - apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); - - float diff = eqnBVector[ind] - z_tmp - min_diff; - if (diff >= 0.0) - SERIAL_ECHOPGM(" +"); - // Include + for column alignment - else - SERIAL_CHAR(' '); - SERIAL_ECHO_F(diff, 5); - } // xx - SERIAL_EOL(); - } // yy - SERIAL_EOL(); - } } //do_topography_map #endif // AUTO_BED_LEVELING_LINEAR @@ -950,24 +924,20 @@ G29_TYPE GcodeSuite::G29() { if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); - float converted[XYZ]; - COPY(converted, current_position); - - planner.leveling_active = true; - planner.unapply_leveling(converted); // use conversion machinery - planner.leveling_active = false; + xyze_pos_t converted = current_position; + planner.force_unapply_leveling(converted); // use conversion machinery // Use the last measured distance to the bed, if possible - if ( NEAR(current_position[X_AXIS], xProbe - probe_offset[X_AXIS]) - && NEAR(current_position[Y_AXIS], yProbe - probe_offset[Y_AXIS]) + if ( NEAR(current_position.x, probePos.x - probe_offset.x) + && NEAR(current_position.y, probePos.y - probe_offset.y) ) { - const float simple_z = current_position[Z_AXIS] - measured_z; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted[Z_AXIS], " Discrepancy ", simple_z - converted[Z_AXIS]); - converted[Z_AXIS] = simple_z; + const float simple_z = current_position.z - measured_z; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted.z, " Discrepancy ", simple_z - converted.z); + converted.z = simple_z; } // The rotated XY and corrected Z are now current_position - COPY(current_position, converted); + current_position = converted; if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); } @@ -975,13 +945,13 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) if (!dryrun) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position[Z_AXIS]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position.z); // Unapply the offset because it is going to be immediately applied // and cause compensation movement in Z - current_position[Z_AXIS] -= bilinear_z_offset(current_position); + current_position.z -= bilinear_z_offset(current_position); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(" corrected Z:", current_position[Z_AXIS]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(" corrected Z:", current_position.z); } #endif // ABL_PLANAR diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index eee542a6f5..944e8d3a69 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -110,7 +110,7 @@ void GcodeSuite::G29() { } else { // Save Z for the previous mesh position - mbl.set_zigzag_z(mbl_probe_index - 1, current_position[Z_AXIS]); + mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z); #if HAS_SOFTWARE_ENDSTOPS soft_endstops_enabled = saved_soft_endstops_state; #endif @@ -124,11 +124,11 @@ void GcodeSuite::G29() { #endif mbl.zigzag(mbl_probe_index++, ix, iy); - _manual_goto_xy(mbl.index_to_xpos[ix], mbl.index_to_ypos[iy]); + _manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] }); } else { // One last "return to the bed" (as originally coded) at completion - current_position[Z_AXIS] = MANUAL_PROBE_HEIGHT; + current_position.z = MANUAL_PROBE_HEIGHT; line_to_current_position(); planner.synchronize(); @@ -142,7 +142,7 @@ void GcodeSuite::G29() { set_bed_leveling_enabled(true); #if ENABLED(MESH_G28_REST_ORIGIN) - current_position[Z_AXIS] = 0; + current_position.z = 0; line_to_current_position(homing_feedrate(Z_AXIS)); planner.synchronize(); #endif diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 34afe78625..153e6018aa 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -46,28 +46,25 @@ * M421 C Q */ void GcodeSuite::M421() { - int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); - const bool hasI = ix >= 0, - hasJ = iy >= 0, + xy_int8_t ij = { int8_t(parser.intval('I', -1)), int8_t(parser.intval('J', -1)) }; + const bool hasI = ij.x >= 0, + hasJ = ij.y >= 0, hasC = parser.seen('C'), hasN = parser.seen('N'), hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); - if (hasC) { - const mesh_index_pair location = ubl.find_closest_mesh_point_of_type(REAL, current_position[X_AXIS], current_position[Y_AXIS], USE_NOZZLE_AS_REFERENCE, nullptr); - ix = location.x_index; - iy = location.y_index; - } + if (hasC) ij = ubl.find_closest_mesh_point_of_type(REAL, current_position); if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) SERIAL_ERROR_MSG(MSG_ERR_M421_PARAMETERS); - else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) + else if (!WITHIN(ij.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(ij.y, 0, GRID_MAX_POINTS_Y - 1)) SERIAL_ERROR_MSG(MSG_ERR_MESH_XY); else { - ubl.z_values[ix][iy] = hasN ? NAN : parser.value_linear_units() + (hasQ ? ubl.z_values[ix][iy] : 0); + float &zval = ubl.z_values[ij.x][ij.y]; + zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(ix, iy, ubl.z_values[ix][iy]); + ExtUI::onMeshUpdate(ij.x, ij.y, zval); #endif } } diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 514bb65891..8fcb74abc5 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -59,7 +59,7 @@ static void quick_home_xy() { // Pretend the current position is 0,0 - current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; + current_position.set(0.0, 0.0); sync_plan_position(); const int x_axis_home_dir = @@ -95,7 +95,7 @@ endstops.validate_homing_move(); - current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; + current_position.set(0.0, 0.0); #if ENABLED(SENSORLESS_HOMING) tmc_disable_stallguard(stepperX, stealth_states.x); @@ -118,7 +118,7 @@ // Disallow Z homing if X or Y are unknown if (!TEST(axis_known_position, X_AXIS) || !TEST(axis_known_position, Y_AXIS)) { LCD_MESSAGEPGM(MSG_ERR_Z_HOMING); - SERIAL_ECHO_MSG(MSG_ERR_Z_HOMING); + SERIAL_ECHO_MSG(MSG_ERR_Z_HOMING_SER); return; } @@ -128,17 +128,15 @@ /** * Move the Z probe (or just the nozzle) to the safe homing point + * (Z is already at the right height) */ - destination[X_AXIS] = Z_SAFE_HOMING_X_POINT; - destination[Y_AXIS] = Z_SAFE_HOMING_Y_POINT; - destination[Z_AXIS] = current_position[Z_AXIS]; // Z is already at the right height + destination.set(safe_homing_xy, current_position.z); #if HOMING_Z_WITH_PROBE - destination[X_AXIS] -= probe_offset[X_AXIS]; - destination[Y_AXIS] -= probe_offset[Y_AXIS]; + destination -= probe_offset; #endif - if (position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) { + if (position_is_reachable(destination)) { if (DEBUGGING(LEVELING)) DEBUG_POS("home_z_safely", destination); @@ -151,12 +149,12 @@ safe_delay(500); // Short delay needed to settle #endif - do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]); + do_blocking_move_to_xy(destination); homeaxis(Z_AXIS); } else { LCD_MESSAGEPGM(MSG_ZPROBE_OUT); - SERIAL_ECHO_MSG(MSG_ZPROBE_OUT); + SERIAL_ECHO_MSG(MSG_ZPROBE_OUT_SER); } if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< home_z_safely"); @@ -232,16 +230,14 @@ void GcodeSuite::G28(const bool always_home_all) { #endif #if ENABLED(IMPROVE_HOMING_RELIABILITY) - slow_homing_t slow_homing { 0 }; - slow_homing.acceleration.x = planner.settings.max_acceleration_mm_per_s2[X_AXIS]; - slow_homing.acceleration.y = planner.settings.max_acceleration_mm_per_s2[Y_AXIS]; + slow_homing_t slow_homing{0}; + slow_homing.acceleration.set(planner.settings.max_acceleration_mm_per_s2[X_AXIS], + planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); planner.settings.max_acceleration_mm_per_s2[X_AXIS] = 100; planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = 100; #if HAS_CLASSIC_JERK - slow_homing.jerk.x = planner.max_jerk[X_AXIS]; - slow_homing.jerk.y = planner.max_jerk[Y_AXIS]; - planner.max_jerk[X_AXIS] = 0; - planner.max_jerk[Y_AXIS] = 0; + slow_homing.jerk_xy = planner.max_jerk; + planner.max_jerk.set(0, 0); #endif planner.reset_acceleration_rates(); @@ -274,7 +270,7 @@ void GcodeSuite::G28(const bool always_home_all) { home_all = always_home_all || (homeX == homeY && homeX == homeZ), doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; - set_destination_from_current(); + destination = current_position; #if Z_HOME_DIR > 0 // If homing away from BED do Z first @@ -291,10 +287,10 @@ void GcodeSuite::G28(const bool always_home_all) { if (z_homing_height && (doX || doY)) { // Raise Z before homing any other axes and z is not already high enough (never lower z) - destination[Z_AXIS] = z_homing_height; - if (destination[Z_AXIS] > current_position[Z_AXIS]) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) to ", destination[Z_AXIS]); - do_blocking_move_to_z(destination[Z_AXIS]); + destination.z = z_homing_height; + if (destination.z > current_position.z) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) to ", destination.z); + do_blocking_move_to_z(destination.z); } } @@ -329,14 +325,14 @@ void GcodeSuite::G28(const bool always_home_all) { homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position[X_AXIS]; + inactive_extruder_x_pos = current_position.x; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); // Consider the active extruder to be parked - COPY(raised_parked_position, current_position); + raised_parked_position = current_position; delayed_move_time = 0; active_extruder_parked = true; @@ -390,14 +386,14 @@ void GcodeSuite::G28(const bool always_home_all) { homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position[X_AXIS]; + inactive_extruder_x_pos = current_position.x; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); // Consider the active extruder to be parked - COPY(raised_parked_position, current_position); + raised_parked_position = current_position; delayed_move_time = 0; active_extruder_parked = true; extruder_duplication_enabled = IDEX_saved_duplication_state; @@ -441,10 +437,8 @@ void GcodeSuite::G28(const bool always_home_all) { planner.settings.max_acceleration_mm_per_s2[X_AXIS] = slow_homing.acceleration.x; planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = slow_homing.acceleration.y; #if HAS_CLASSIC_JERK - planner.max_jerk[X_AXIS] = slow_homing.jerk.x; - planner.max_jerk[Y_AXIS] = slow_homing.jerk.y; + planner.max_jerk = slow_homing.jerk_xy; #endif - planner.reset_acceleration_rates(); #endif diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 1e3e84a1e4..f961302fb5 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -70,7 +70,7 @@ enum CalEnum : char { // the 7 main calibration points - #define AC_CLEANUP() ac_cleanup() #endif -float lcd_probe_pt(const float &rx, const float &ry); +float lcd_probe_pt(const xy_pos_t &xy); void ac_home() { endstops.enable(true); @@ -122,9 +122,9 @@ void print_signed_float(PGM_P const prefix, const float &f) { static void print_calibration_settings(const bool end_stops, const bool tower_angles) { SERIAL_ECHOPAIR(".Height:", delta_height); if (end_stops) { - print_signed_float(PSTR("Ex"), delta_endstop_adj[A_AXIS]); - print_signed_float(PSTR("Ey"), delta_endstop_adj[B_AXIS]); - print_signed_float(PSTR("Ez"), delta_endstop_adj[C_AXIS]); + print_signed_float(PSTR("Ex"), delta_endstop_adj.a); + print_signed_float(PSTR("Ey"), delta_endstop_adj.b); + print_signed_float(PSTR("Ez"), delta_endstop_adj.c); } if (end_stops && tower_angles) { SERIAL_ECHOPAIR(" Radius:", delta_radius); @@ -133,9 +133,9 @@ static void print_calibration_settings(const bool end_stops, const bool tower_an SERIAL_ECHO_SP(13); } if (tower_angles) { - print_signed_float(PSTR("Tx"), delta_tower_angle_trim[A_AXIS]); - print_signed_float(PSTR("Ty"), delta_tower_angle_trim[B_AXIS]); - print_signed_float(PSTR("Tz"), delta_tower_angle_trim[C_AXIS]); + print_signed_float(PSTR("Tx"), delta_tower_angle_trim.a); + print_signed_float(PSTR("Ty"), delta_tower_angle_trim.b); + print_signed_float(PSTR("Tz"), delta_tower_angle_trim.c); } if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR SERIAL_ECHOPAIR(" Radius:", delta_radius); @@ -188,12 +188,12 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool /** * - Probe a point */ -static float calibration_probe(const float &nx, const float &ny, const bool stow) { +static float calibration_probe(const xy_pos_t &xy, const bool stow) { #if HAS_BED_PROBE - return probe_at_point(nx, ny, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); + return probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); #else UNUSED(stow); - return lcd_probe_pt(nx, ny); + return lcd_probe_pt(xy); #endif } @@ -223,7 +223,8 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi if (!_0p_calibration) { if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center - z_pt[CEN] += calibration_probe(0, 0, stow_after_each); + const xy_pos_t center{0}; + z_pt[CEN] += calibration_probe(center, stow_after_each); if (isnan(z_pt[CEN])) return false; } @@ -233,7 +234,8 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi I_LOOP_CAL_PT(rad, start, steps) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), r = delta_calibration_radius * 0.1; - z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each); + const xy_pos_t vec = { cos(a), sin(a) }; + z_pt[CEN] += calibration_probe(vec * r, stow_after_each); if (isnan(z_pt[CEN])) return false; } z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); @@ -257,7 +259,8 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), interpol = FMOD(rad, 1); - const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each); + const xy_pos_t vec = { cos(a), sin(a) }; + const float z_temp = calibration_probe(vec * r, stow_after_each); if (isnan(z_temp)) return false; // split probe point to neighbouring calibration points z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); @@ -281,80 +284,69 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi * - formulae for approximative forward kinematics in the end-stop displacement matrix * - definition of the matrix scaling parameters */ -static void reverse_kinematics_probe_points(float z_pt[NPP + 1], float mm_at_pt_axis[NPP + 1][ABC]) { - float pos[XYZ] = { 0.0 }; +static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_at_pt_axis[NPP + 1]) { + xyz_pos_t pos{0}; LOOP_CAL_ALL(rad) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), r = (rad == CEN ? 0.0f : delta_calibration_radius); - pos[X_AXIS] = cos(a) * r; - pos[Y_AXIS] = sin(a) * r; - pos[Z_AXIS] = z_pt[rad]; + pos.set(cos(a) * r, sin(a) * r, z_pt[rad]); inverse_kinematics(pos); - LOOP_XYZ(axis) mm_at_pt_axis[rad][axis] = delta[axis]; + mm_at_pt_axis[rad] = delta; } } -static void forward_kinematics_probe_points(float mm_at_pt_axis[NPP + 1][ABC], float z_pt[NPP + 1]) { +static void forward_kinematics_probe_points(abc_float_t mm_at_pt_axis[NPP + 1], float z_pt[NPP + 1]) { const float r_quot = delta_calibration_radius / delta_radius; - #define ZPP(N,I,A) ((1 / 3.0f + r_quot * (N) / 3.0f ) * mm_at_pt_axis[I][A]) + #define ZPP(N,I,A) (((1.0f + r_quot * (N)) / 3.0f) * mm_at_pt_axis[I].A) #define Z00(I, A) ZPP( 0, I, A) #define Zp1(I, A) ZPP(+1, I, A) #define Zm1(I, A) ZPP(-1, I, A) #define Zp2(I, A) ZPP(+2, I, A) #define Zm2(I, A) ZPP(-2, I, A) - z_pt[CEN] = Z00(CEN, A_AXIS) + Z00(CEN, B_AXIS) + Z00(CEN, C_AXIS); - z_pt[__A] = Zp2(__A, A_AXIS) + Zm1(__A, B_AXIS) + Zm1(__A, C_AXIS); - z_pt[__B] = Zm1(__B, A_AXIS) + Zp2(__B, B_AXIS) + Zm1(__B, C_AXIS); - z_pt[__C] = Zm1(__C, A_AXIS) + Zm1(__C, B_AXIS) + Zp2(__C, C_AXIS); - z_pt[_BC] = Zm2(_BC, A_AXIS) + Zp1(_BC, B_AXIS) + Zp1(_BC, C_AXIS); - z_pt[_CA] = Zp1(_CA, A_AXIS) + Zm2(_CA, B_AXIS) + Zp1(_CA, C_AXIS); - z_pt[_AB] = Zp1(_AB, A_AXIS) + Zp1(_AB, B_AXIS) + Zm2(_AB, C_AXIS); + z_pt[CEN] = Z00(CEN, a) + Z00(CEN, b) + Z00(CEN, c); + z_pt[__A] = Zp2(__A, a) + Zm1(__A, b) + Zm1(__A, c); + z_pt[__B] = Zm1(__B, a) + Zp2(__B, b) + Zm1(__B, c); + z_pt[__C] = Zm1(__C, a) + Zm1(__C, b) + Zp2(__C, c); + z_pt[_BC] = Zm2(_BC, a) + Zp1(_BC, b) + Zp1(_BC, c); + z_pt[_CA] = Zp1(_CA, a) + Zm2(_CA, b) + Zp1(_CA, c); + z_pt[_AB] = Zp1(_AB, a) + Zp1(_AB, b) + Zm2(_AB, c); } -static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], float delta_e[ABC], float delta_r, float delta_t[ABC]) { +static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], abc_float_t delta_e, const float delta_r, abc_float_t delta_t) { const float z_center = z_pt[CEN]; - float diff_mm_at_pt_axis[NPP + 1][ABC], - new_mm_at_pt_axis[NPP + 1][ABC]; + abc_float_t diff_mm_at_pt_axis[NPP + 1], new_mm_at_pt_axis[NPP + 1]; reverse_kinematics_probe_points(z_pt, diff_mm_at_pt_axis); delta_radius += delta_r; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] += delta_t[axis]; + delta_tower_angle_trim += delta_t; recalc_delta_settings(); reverse_kinematics_probe_points(z_pt, new_mm_at_pt_axis); - LOOP_XYZ(axis) LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad][axis] -= new_mm_at_pt_axis[rad][axis] + delta_e[axis]; + LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad] -= new_mm_at_pt_axis[rad] + delta_e; forward_kinematics_probe_points(diff_mm_at_pt_axis, z_pt); LOOP_CAL_RAD(rad) z_pt[rad] -= z_pt[CEN] - z_center; z_pt[CEN] = z_center; delta_radius -= delta_r; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= delta_t[axis]; + delta_tower_angle_trim -= delta_t; recalc_delta_settings(); } static float auto_tune_h() { const float r_quot = delta_calibration_radius / delta_radius; - float h_fac = 0.0f; - - h_fac = r_quot / (2.0f / 3.0f); - h_fac = 1.0f / h_fac; // (2/3)/CR - return h_fac; + return RECIPROCAL(r_quot / (2.0f / 3.0f)); // (2/3)/CR } static float auto_tune_r() { - const float diff = 0.01f; - float r_fac = 0.0f, - z_pt[NPP + 1] = { 0.0f }, - delta_e[ABC] = { 0.0f }, - delta_r = { 0.0f }, - delta_t[ABC] = { 0.0f }; + constexpr float diff = 0.01f, delta_r = diff; + float r_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; + abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; - delta_r = diff; calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0f; r_fac = diff / r_fac / 3.0f; // 1/(3*delta_Z) @@ -362,14 +354,11 @@ static float auto_tune_r() { } static float auto_tune_a() { - const float diff = 0.01f; - float a_fac = 0.0f, - z_pt[NPP + 1] = { 0.0f }, - delta_e[ABC] = { 0.0f }, - delta_r = { 0.0f }, - delta_t[ABC] = { 0.0f }; + constexpr float diff = 0.01f, delta_r = 0.0f; + float a_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; + abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; - ZERO(delta_t); + delta_t.reset(); LOOP_XYZ(axis) { delta_t[axis] = diff; calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); @@ -453,21 +442,11 @@ void GcodeSuite::G33() { zero_std_dev = (verbose_level ? 999.0f : 0.0f), // 0.0 in dry-run mode : forced end zero_std_dev_min = zero_std_dev, zero_std_dev_old = zero_std_dev, - h_factor, - r_factor, - a_factor, - e_old[ABC] = { - delta_endstop_adj[A_AXIS], - delta_endstop_adj[B_AXIS], - delta_endstop_adj[C_AXIS] - }, + h_factor, r_factor, a_factor, r_old = delta_radius, - h_old = delta_height, - a_old[ABC] = { - delta_tower_angle_trim[A_AXIS], - delta_tower_angle_trim[B_AXIS], - delta_tower_angle_trim[C_AXIS] - }; + h_old = delta_height; + + abc_pos_t e_old = delta_endstop_adj, a_old = delta_tower_angle_trim; SERIAL_ECHOLNPGM("G33 Auto Calibrate"); @@ -520,15 +499,14 @@ void GcodeSuite::G33() { if (zero_std_dev < zero_std_dev_min) { // set roll-back point - COPY(e_old, delta_endstop_adj); + e_old = delta_endstop_adj; r_old = delta_radius; h_old = delta_height; - COPY(a_old, delta_tower_angle_trim); + a_old = delta_tower_angle_trim; } - float e_delta[ABC] = { 0.0f }, - r_delta = 0.0f, - t_delta[ABC] = { 0.0f }; + abc_float_t e_delta = { 0.0f }, t_delta = { 0.0f }; + float r_delta = 0.0f; /** * convergence matrices: @@ -563,42 +541,42 @@ void GcodeSuite::G33() { case 2: if (towers_set) { // see 4 point calibration (towers) matrix - e_delta[A_AXIS] = (+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN); - r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; + e_delta.set((+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN), + (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN), + (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN)); + r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; } else { // see 4 point calibration (opposites) matrix - e_delta[A_AXIS] = (-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN); - r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; + e_delta.set((-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN), + (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN), + (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN)); + r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; } break; default: // see 7 point calibration (towers & opposites) matrix - e_delta[A_AXIS] = (+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN); - r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; + e_delta.set((+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN), + (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN), + (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN)); + r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; if (towers_set) { // see 7 point tower angle calibration (towers & opposites) matrix - t_delta[A_AXIS] = (+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor; - t_delta[B_AXIS] = (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor; - t_delta[C_AXIS] = (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor; + t_delta.set((+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor, + (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor, + (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor); } break; } - LOOP_XYZ(axis) delta_endstop_adj[axis] += e_delta[axis]; + delta_endstop_adj += e_delta; delta_radius += r_delta; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] += t_delta[axis]; + delta_tower_angle_trim += t_delta; } else if (zero_std_dev >= test_precision) { // roll back - COPY(delta_endstop_adj, e_old); + delta_endstop_adj = e_old; delta_radius = r_old; delta_height = h_old; - COPY(delta_tower_angle_trim, a_old); + delta_tower_angle_trim = a_old; } if (verbose_level != 0) { // !dry run @@ -611,7 +589,7 @@ void GcodeSuite::G33() { } // adjust delta_height and endstops by the max amount - const float z_temp = _MAX(delta_endstop_adj[A_AXIS], delta_endstop_adj[B_AXIS], delta_endstop_adj[C_AXIS]); + const float z_temp = _MAX(delta_endstop_adj.a, delta_endstop_adj.b, delta_endstop_adj.c); delta_height -= z_temp; LOOP_XYZ(axis) delta_endstop_adj[axis] -= z_temp; } diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index b7b366a1cf..4bb37d2f85 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -25,28 +25,49 @@ #if ENABLED(Z_STEPPER_AUTO_ALIGN) #include "../gcode.h" -#include "../../module/delta.h" -#include "../../module/motion.h" +#include "../../module/planner.h" #include "../../module/stepper.h" -#include "../../module/endstops.h" +#include "../../module/motion.h" +#include "../../module/probe.h" #if HOTENDS > 1 #include "../../module/tool_change.h" #endif -#if HAS_BED_PROBE - #include "../../module/probe.h" -#endif - #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #include "../../libs/least_squares_fit.h" +#endif + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../../core/debug_out.h" -float z_auto_align_xpos[Z_STEPPER_COUNT] = Z_STEPPER_ALIGN_X, - z_auto_align_ypos[Z_STEPPER_COUNT] = Z_STEPPER_ALIGN_Y; +// Sanity-check the count of Z_STEPPER_ALIGN_XY points +constexpr xy_pos_t sanity_arr_z_align[] = Z_STEPPER_ALIGN_XY; +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + static_assert(COUNT(sanity_arr_z_align) >= Z_STEPPER_COUNT, + "Z_STEPPER_ALIGN_XY requires at least three {X,Y} entries (Z, Z2, Z3, ...)." + ); +#else + static_assert(COUNT(sanity_arr_z_align) == Z_STEPPER_COUNT, + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + "Z_STEPPER_ALIGN_XY requires three {X,Y} entries (Z, Z2, and Z3)." + #else + "Z_STEPPER_ALIGN_XY requires two {X,Y} entries (Z and Z2)." + #endif + ); +#endif + +static xy_pos_t z_auto_align_pos[Z_STEPPER_COUNT] = Z_STEPPER_ALIGN_XY; + +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + static xy_pos_t z_stepper_pos[] = Z_STEPPER_ALIGN_STEPPER_XY; +#endif + +#define G34_PROBE_COUNT COUNT(z_auto_align_pos) inline void set_all_z_lock(const bool lock) { stepper.set_z_lock(lock); @@ -59,7 +80,9 @@ inline void set_all_z_lock(const bool lock) { /** * G34: Z-Stepper automatic alignment * - * Parameters: I T A + * I + * T + * A */ void GcodeSuite::G34() { if (DEBUGGING(LEVELING)) { @@ -81,11 +104,18 @@ void GcodeSuite::G34() { break; } - const float z_auto_align_amplification = parser.floatval('A', Z_STEPPER_ALIGN_AMP); - if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { - SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); - break; - } + const float z_auto_align_amplification = + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + Z_STEPPER_ALIGN_AMP; + #else + parser.floatval('A', Z_STEPPER_ALIGN_AMP); + if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { + SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); + break; + } + #endif + + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; // Wait for planner moves to finish! planner.synchronize(); @@ -121,13 +151,15 @@ void GcodeSuite::G34() { #define Z_BASIC_CLEARANCE Z_CLEARANCE_BETWEEN_PROBES #endif + // Compute a worst-case clearance height to probe from. After the first + // iteration this will be re-calculated based on the actual bed position float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * ( #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) - SQRT(_MAX(HYPOT2(z_auto_align_xpos[0] - z_auto_align_ypos[0], z_auto_align_xpos[1] - z_auto_align_ypos[1]), - HYPOT2(z_auto_align_xpos[1] - z_auto_align_ypos[1], z_auto_align_xpos[2] - z_auto_align_ypos[2]), - HYPOT2(z_auto_align_xpos[2] - z_auto_align_ypos[2], z_auto_align_xpos[0] - z_auto_align_ypos[0]))) + SQRT(_MAX(HYPOT2(z_auto_align_pos[0].x - z_auto_align_pos[0].y, z_auto_align_pos[1].x - z_auto_align_pos[1].y), + HYPOT2(z_auto_align_pos[1].x - z_auto_align_pos[1].y, z_auto_align_pos[2].x - z_auto_align_pos[2].y), + HYPOT2(z_auto_align_pos[2].x - z_auto_align_pos[2].y, z_auto_align_pos[0].x - z_auto_align_pos[0].y))) #else - HYPOT(z_auto_align_xpos[0] - z_auto_align_ypos[0], z_auto_align_xpos[1] - z_auto_align_ypos[1]) + HYPOT(z_auto_align_pos[0].x - z_auto_align_pos[0].y, z_auto_align_pos[1].x - z_auto_align_pos[1].y) #endif ); @@ -135,15 +167,13 @@ void GcodeSuite::G34() { if (!all_axes_known()) home_all_axes(); // Move the Z coordinate realm towards the positive - dirty trick - current_position[Z_AXIS] -= z_probe * 0.5; + current_position.z -= z_probe * 0.5f; float last_z_align_move[Z_STEPPER_COUNT] = ARRAY_N(Z_STEPPER_COUNT, 10000.0f, 10000.0f, 10000.0f), - z_measured[Z_STEPPER_COUNT] = { 0 }, + z_measured[G34_PROBE_COUNT] = { 0 }, z_maxdiff = 0.0f, amplification = z_auto_align_amplification; - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - uint8_t iteration; bool err_break = false; for (iteration = 0; iteration < z_auto_align_iterations; ++iteration) { @@ -152,17 +182,19 @@ void GcodeSuite::G34() { SERIAL_ECHOLNPAIR("\nITERATION: ", int(iteration + 1)); // Initialize minimum value - float z_measured_min = 100000.0f; + float z_measured_min = 100000.0f, + z_measured_max = -100000.0f; + // Probe all positions (one per Z-Stepper) - for (uint8_t izstepper = 0; izstepper < Z_STEPPER_COUNT; ++izstepper) { + for (uint8_t i = 0; i < G34_PROBE_COUNT; ++i) { // iteration odd/even --> downward / upward stepper sequence - const uint8_t zstepper = (iteration & 1) ? Z_STEPPER_COUNT - 1 - izstepper : izstepper; + const uint8_t iprobe = (iteration & 1) ? G34_PROBE_COUNT - 1 - i : i; // Safe clearance even on an incline - if (iteration == 0 || izstepper > 0) do_blocking_move_to_z(z_probe); + if (iteration == 0 || i > 0) do_blocking_move_to_z(z_probe); // Probe a Z height for each stepper. - const float z_probed_height = probe_at_point(z_auto_align_xpos[zstepper], z_auto_align_ypos[zstepper], raise_after, 0, true); + const float z_probed_height = probe_at_point(z_auto_align_pos[i], raise_after, 0, true); if (isnan(z_probed_height)) { SERIAL_ECHOLNPGM("Probing failed."); err_break = true; @@ -171,35 +203,58 @@ void GcodeSuite::G34() { // Add height to each value, to provide a more useful target height for // the next iteration of probing. This allows adjustments to be made away from the bed. - z_measured[zstepper] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; + z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " measured position is ", z_measured[zstepper]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); // Remember the minimum measurement to calculate the correction later on - z_measured_min = _MIN(z_measured_min, z_measured[zstepper]); - } // for (zstepper) + z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); + z_measured_max = _MAX(z_measured_max, z_measured[iprobe]); + } // for (i) if (err_break) break; // Adapt the next probe clearance height based on the new measurements. // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. - #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) - z_maxdiff = _MAX(ABS(z_measured[0] - z_measured[1]), ABS(z_measured[1] - z_measured[2]), ABS(z_measured[2] - z_measured[0])); - z_probe = Z_BASIC_CLEARANCE + _MAX(z_measured[0], z_measured[1], z_measured[2]) + z_maxdiff; - #else - z_maxdiff = ABS(z_measured[0] - z_measured[1]); - z_probe = Z_BASIC_CLEARANCE + _MAX(z_measured[0], z_measured[1]) + z_maxdiff; + z_maxdiff = z_measured_max - z_measured_min; + z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Replace the initial values in z_measured with calculated heights at + // each stepper position. This allows the adjustment algorithm to be + // shared between both possible probing mechanisms. + + // This must be done after the next z_probe height is calculated, so that + // the height is calculated from actual print area positions, and not + // extrapolated motor movements. + + // Compute the least-squares fit for all probed points. + // Calculate the Z position of each stepper and store it in z_measured. + // This allows the actual adjustment logic to be shared by both algorithms. + linear_fit_data lfd; + incremental_LSF_reset(&lfd); + for (uint8_t i = 0; i < G34_PROBE_COUNT; ++i) { + SERIAL_ECHOLNPAIR("PROBEPT_", int(i + 1), ": ", z_measured[i]); + incremental_LSF(&lfd, z_auto_align_pos[i], z_measured[i]); + } + finish_incremental_LSF(&lfd); + + z_measured_min = 100000.0f; + for (uint8_t i = 0; i < Z_STEPPER_COUNT; ++i) { + z_measured[i] = -(lfd.A * z_stepper_pos[i].x + lfd.B * z_stepper_pos[i].y); + z_measured_min = _MIN(z_measured_min, z_measured[i]); + } + + SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]); #endif - SERIAL_ECHOPAIR("\n" + SERIAL_ECHOLNPAIR("\n" "DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1]) #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) , " Z2-Z3=", ABS(z_measured[1] - z_measured[2]) , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) #endif ); - SERIAL_EOL(); - SERIAL_EOL(); // The following correction actions are to be enabled for select Z-steppers only stepper.set_separate_multi_axis(true); @@ -211,8 +266,10 @@ void GcodeSuite::G34() { const float z_align_move = z_measured[zstepper] - z_measured_min, z_align_abs = ABS(z_align_move); - // Optimize one iterations correction based on the first measurements - if (z_align_abs > 0.0f) amplification = iteration == 1 ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Optimize one iteration's correction based on the first measurements + if (z_align_abs > 0.0f) amplification = iteration == 1 ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; + #endif // Check for less accuracy compared to last move if (last_z_align_move[zstepper] < z_align_abs - 1.0) { @@ -240,7 +297,7 @@ void GcodeSuite::G34() { } // Do a move to correct part of the misalignment for the current stepper - do_blocking_move_to_z(amplification * z_align_move + current_position[Z_AXIS]); + do_blocking_move_to_z(amplification * z_align_move + current_position.z); } // for (zstepper) // Back to normal stepper operations @@ -257,7 +314,6 @@ void GcodeSuite::G34() { SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " iterations of ", int(z_auto_align_iterations)); SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); - SERIAL_EOL(); // Restore the active tool after homing #if HOTENDS > 1 @@ -290,29 +346,82 @@ void GcodeSuite::G34() { } /** - * M422: Z-Stepper automatic alignment parameter selection + * M422: Set a Z-Stepper automatic alignment XY point. + * Use repeatedly to set multiple points. + * + * S : Index of the probe point to set + * + * With Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS: + * W : Index of the Z stepper position to set + * The W and S parameters may not be combined. + * + * S and W require an X and/or Y parameter + * X : X position to set (Unchanged if omitted) + * Y : Y position to set (Unchanged if omitted) */ void GcodeSuite::M422() { - const int8_t zstepper = parser.intval('S') - 1; - if (!WITHIN(zstepper, 0, Z_STEPPER_COUNT - 1)) { - SERIAL_ECHOLNPGM("?(S) Z-Stepper index invalid."); + if (!parser.seen_any()) { + for (uint8_t i = 0; i < G34_PROBE_COUNT; ++i) + SERIAL_ECHOLNPAIR("M422 S", i + 1, " X", z_auto_align_pos[i].x, " Y", z_auto_align_pos[i].y); + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + for (uint8_t i = 0; i < Z_STEPPER_COUNT; ++i) + SERIAL_ECHOLNPAIR("M422 W", i + 1, " X", z_stepper_pos[i].x, " Y", z_stepper_pos[i].y); + #endif return; } - const float x_pos = parser.floatval('X', z_auto_align_xpos[zstepper]); - if (!WITHIN(x_pos, X_MIN_POS, X_MAX_POS)) { - SERIAL_ECHOLNPGM("?(X) out of bounds."); - return; + const bool is_probe_point = parser.seen('S'); + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + if (is_probe_point && parser.seen('W')) { + SERIAL_ECHOLNPGM("?(S) and (W) may not be combined."); + return; + } + #endif + + xy_pos_t *pos_dest = ( + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + !is_probe_point ? z_stepper_pos : + #endif + z_auto_align_pos + ); + + // Get the Probe Position Index or Z Stepper Index + int8_t position_index; + if (is_probe_point) { + position_index = parser.intval('S') - 1; + if (!WITHIN(position_index, 0, int8_t(G34_PROBE_COUNT) - 1)) { + SERIAL_ECHOLNPGM("?(S) Z-ProbePosition index invalid."); + return; + } + } + else { + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + position_index = parser.intval('W') - 1; + if (!WITHIN(position_index, 0, Z_STEPPER_COUNT - 1)) { + SERIAL_ECHOLNPGM("?(W) Z-Stepper index invalid."); + return; + } + #endif } - const float y_pos = parser.floatval('Y', z_auto_align_ypos[zstepper]); - if (!WITHIN(y_pos, Y_MIN_POS, Y_MAX_POS)) { - SERIAL_ECHOLNPGM("?(Y) out of bounds."); - return; + const xy_pos_t pos = { + parser.floatval('X', pos_dest[position_index].x), + parser.floatval('Y', pos_dest[position_index].y) + }; + + if (is_probe_point) { + if (!position_is_reachable_by_probe(pos.x, Y_CENTER)) { + SERIAL_ECHOLNPGM("?(X) out of bounds."); + return; + } + if (!position_is_reachable_by_probe(pos)) { + SERIAL_ECHOLNPGM("?(Y) out of bounds."); + return; + } } - z_auto_align_xpos[zstepper] = x_pos; - z_auto_align_ypos[zstepper] = y_pos; + pos_dest[position_index] = pos; } #endif // Z_STEPPER_AUTO_ALIGN diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 5c4272346f..2b2c16657d 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -61,17 +61,17 @@ enum side_t : uint8_t { TOP, RIGHT, FRONT, LEFT, BACK, NUM_SIDES }; +static constexpr xyz_pos_t true_center CALIBRATION_OBJECT_CENTER; +static constexpr xyz_float_t dimensions CALIBRATION_OBJECT_DIMENSIONS; +static constexpr xy_float_t nod = { CALIBRATION_NOZZLE_OUTER_DIAMETER, CALIBRATION_NOZZLE_OUTER_DIAMETER }; + struct measurements_t { - static constexpr float dimensions[XYZ] = CALIBRATION_OBJECT_DIMENSIONS; - static constexpr float true_center[XYZ] = CALIBRATION_OBJECT_CENTER; + xyz_pos_t obj_center = true_center; // Non-static must be assigned from xyz_pos_t - float obj_center[XYZ] = CALIBRATION_OBJECT_CENTER; - float obj_side[NUM_SIDES]; + float obj_side[NUM_SIDES], backlash[NUM_SIDES]; + xyz_float_t pos_error; - float backlash[NUM_SIDES]; - float pos_error[XYZ]; - - float nozzle_outer_dimension[2] = {CALIBRATION_NOZZLE_OUTER_DIAMETER, CALIBRATION_NOZZLE_OUTER_DIAMETER}; + xy_float_t nozzle_outer_dimension = nod; }; #define TEMPORARY_SOFT_ENDSTOP_STATE(enable) REMEMBER(tes, soft_endstops_enabled, enable); @@ -88,29 +88,8 @@ struct measurements_t { #define TEMPORARY_BACKLASH_SMOOTHING(value) #endif -/** - * Move to a particular location. Up to three individual axes - * and their destinations can be specified, in any order. - */ -inline void move_to( - const AxisEnum a1 = NO_AXIS, const float p1 = 0, - const AxisEnum a2 = NO_AXIS, const float p2 = 0, - const AxisEnum a3 = NO_AXIS, const float p3 = 0 -) { - set_destination_from_current(); - - // Note: The order of p1, p2, p3 may not correspond to X, Y, Z - if (a1 != NO_AXIS) destination[a1] = p1; - if (a2 != NO_AXIS) destination[a2] = p2; - if (a3 != NO_AXIS) destination[a3] = p3; - - // Make sure coordinates are within bounds - destination[X_AXIS] = _MAX(_MIN(destination[X_AXIS], X_MAX_POS), X_MIN_POS); - destination[Y_AXIS] = _MAX(_MIN(destination[Y_AXIS], Y_MAX_POS), Y_MIN_POS); - destination[Z_AXIS] = _MAX(_MIN(destination[Z_AXIS], Z_MAX_POS), Z_MIN_POS); - - // Move to position - do_blocking_move_to(destination, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); +inline void calibration_move() { + do_blocking_move_to(current_position, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); } /** @@ -121,10 +100,12 @@ inline void move_to( */ inline void park_above_object(measurements_t &m, const float uncertainty) { // Move to safe distance above calibration object - move_to(Z_AXIS, m.obj_center[Z_AXIS] + m.dimensions[Z_AXIS] / 2 + uncertainty); + current_position.z = m.obj_center.z + dimensions.z / 2 + uncertainty; + calibration_move(); // Move to center of calibration object in XY - move_to(X_AXIS, m.obj_center[X_AXIS], Y_AXIS, m.obj_center[Y_AXIS]); + current_position = xy_pos_t(m.obj_center); + calibration_move(); } #if HOTENDS > 1 @@ -139,14 +120,9 @@ inline void park_above_object(measurements_t &m, const float uncertainty) { #if HAS_HOTEND_OFFSET inline void normalize_hotend_offsets() { - for (uint8_t e = 1; e < HOTENDS; e++) { - hotend_offset[X_AXIS][e] -= hotend_offset[X_AXIS][0]; - hotend_offset[Y_AXIS][e] -= hotend_offset[Y_AXIS][0]; - hotend_offset[Z_AXIS][e] -= hotend_offset[Z_AXIS][0]; - } - hotend_offset[X_AXIS][0] = 0; - hotend_offset[Y_AXIS][0] = 0; - hotend_offset[Z_AXIS][0] = 0; + for (uint8_t e = 1; e < HOTENDS; e++) + hotend_offset[e] -= hotend_offset[0]; + hotend_offset[0].reset(); } #endif @@ -175,7 +151,7 @@ float measuring_movement(const AxisEnum axis, const int dir, const bool stop_sta const feedRate_t mms = fast ? MMM_TO_MMS(CALIBRATION_FEEDRATE_FAST) : MMM_TO_MMS(CALIBRATION_FEEDRATE_SLOW); const float limit = fast ? 50 : 5; - set_destination_from_current(); + destination = current_position; for (float travel = 0; travel < limit; travel += step) { destination[axis] += dir * step; do_blocking_move_to(destination, mms); @@ -199,7 +175,7 @@ inline float measure(const AxisEnum axis, const int dir, const bool stop_state, const bool fast = uncertainty == CALIBRATION_MEASUREMENT_UNKNOWN; // Save position - set_destination_from_current(); + destination = current_position; const float start_pos = destination[axis]; const float measured_pos = measuring_movement(axis, dir, stop_state, fast); // Measure backlash @@ -223,7 +199,7 @@ inline float measure(const AxisEnum axis, const int dir, const bool stop_state, * to find out height of edge */ inline void probe_side(measurements_t &m, const float uncertainty, const side_t side, const bool probe_top_at_edge=false) { - const float dimensions[] = CALIBRATION_OBJECT_DIMENSIONS; + const xyz_float_t dimensions = CALIBRATION_OBJECT_DIMENSIONS; AxisEnum axis; float dir; @@ -232,7 +208,7 @@ inline void probe_side(measurements_t &m, const float uncertainty, const side_t switch (side) { case TOP: { const float measurement = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); - m.obj_center[Z_AXIS] = measurement - dimensions[Z_AXIS] / 2; + m.obj_center.z = measurement - dimensions.z / 2; m.obj_side[TOP] = measurement; return; } @@ -240,22 +216,24 @@ inline void probe_side(measurements_t &m, const float uncertainty, const side_t case FRONT: axis = Y_AXIS; dir = 1; break; case LEFT: axis = X_AXIS; dir = 1; break; case BACK: axis = Y_AXIS; dir = -1; break; - default: - return; + default: return; } if (probe_top_at_edge) { // Probe top nearest the side we are probing - move_to(axis, m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis])); + current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis]); + calibration_move(); m.obj_side[TOP] = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); - m.obj_center[Z_AXIS] = m.obj_side[TOP] - dimensions[Z_AXIS] / 2; + m.obj_center.z = m.obj_side[TOP] - dimensions.z / 2; } // Move to safe distance to the side of the calibration object - move_to(axis, m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty)); + current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty); + calibration_move(); // Plunge below the side of the calibration object and measure - move_to(Z_AXIS, m.obj_side[TOP] - CALIBRATION_NOZZLE_TIP_HEIGHT * 0.7); + current_position.z = m.obj_side[TOP] - CALIBRATION_NOZZLE_TIP_HEIGHT * 0.7; + calibration_move(); const float measurement = measure(axis, dir, true, &m.backlash[side], uncertainty); m.obj_center[axis] = measurement + dir * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2); m.obj_side[side] = measurement; @@ -294,36 +272,36 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { // Compute the measured center of the calibration object. #if HAS_X_CENTER - m.obj_center[X_AXIS] = (m.obj_side[LEFT] + m.obj_side[RIGHT]) / 2; + m.obj_center.x = (m.obj_side[LEFT] + m.obj_side[RIGHT]) / 2; #endif #if HAS_Y_CENTER - m.obj_center[Y_AXIS] = (m.obj_side[FRONT] + m.obj_side[BACK]) / 2; + m.obj_center.y = (m.obj_side[FRONT] + m.obj_side[BACK]) / 2; #endif // Compute the outside diameter of the nozzle at the height // at which it makes contact with the calibration object #if HAS_X_CENTER - m.nozzle_outer_dimension[X_AXIS] = m.obj_side[RIGHT] - m.obj_side[LEFT] - m.dimensions[X_AXIS]; + m.nozzle_outer_dimension.x = m.obj_side[RIGHT] - m.obj_side[LEFT] - dimensions.x; #endif #if HAS_Y_CENTER - m.nozzle_outer_dimension[Y_AXIS] = m.obj_side[BACK] - m.obj_side[FRONT] - m.dimensions[Y_AXIS]; + m.nozzle_outer_dimension.y = m.obj_side[BACK] - m.obj_side[FRONT] - dimensions.y; #endif park_above_object(m, uncertainty); // The difference between the known and the measured location // of the calibration object is the positional error - m.pos_error[X_AXIS] = (0 + m.pos_error.x = (0 #if HAS_X_CENTER - + m.true_center[X_AXIS] - m.obj_center[X_AXIS] + + true_center.x - m.obj_center.x #endif ); - m.pos_error[Y_AXIS] = (0 + m.pos_error.y = (0 #if HAS_Y_CENTER - + m.true_center[Y_AXIS] - m.obj_center[Y_AXIS] + + true_center.y - m.obj_center.y #endif ); - m.pos_error[Z_AXIS] = m.true_center[Z_AXIS] - m.obj_center[Z_AXIS]; + m.pos_error.z = true_center.z - m.obj_center.z; } #if ENABLED(CALIBRATION_REPORTING) @@ -348,12 +326,12 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { inline void report_measured_center(const measurements_t &m) { SERIAL_ECHOLNPGM("Center:"); #if HAS_X_CENTER - SERIAL_ECHOLNPAIR(" X", m.obj_center[X_AXIS]); + SERIAL_ECHOLNPAIR(" X", m.obj_center.x); #endif #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR(" Y", m.obj_center[Y_AXIS]); + SERIAL_ECHOLNPAIR(" Y", m.obj_center.y); #endif - SERIAL_ECHOLNPAIR(" Z", m.obj_center[Z_AXIS]); + SERIAL_ECHOLNPAIR(" Z", m.obj_center.z); SERIAL_EOL(); } @@ -380,12 +358,12 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { SERIAL_ECHO(int(active_extruder)); SERIAL_ECHOLNPGM(" Positional Error:"); #if HAS_X_CENTER - SERIAL_ECHOLNPAIR(" X", m.pos_error[X_AXIS]); + SERIAL_ECHOLNPAIR(" X", m.pos_error.x); #endif #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR(" Y", m.pos_error[Y_AXIS]); + SERIAL_ECHOLNPAIR(" Y", m.pos_error.y); #endif - SERIAL_ECHOLNPAIR(" Z", m.pos_error[Z_AXIS]); + SERIAL_ECHOLNPAIR(" Z", m.pos_error.z); SERIAL_EOL(); } @@ -393,10 +371,10 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { SERIAL_ECHOLNPGM("Nozzle Tip Outer Dimensions:"); #if HAS_X_CENTER || HAS_Y_CENTER #if HAS_X_CENTER - SERIAL_ECHOLNPAIR(" X", m.nozzle_outer_dimension[X_AXIS]); + SERIAL_ECHOLNPAIR(" X", m.nozzle_outer_dimension.x); #endif #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR(" Y", m.nozzle_outer_dimension[Y_AXIS]); + SERIAL_ECHOLNPAIR(" Y", m.nozzle_outer_dimension.y); #endif #else UNUSED(m); @@ -410,7 +388,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { // inline void report_hotend_offsets() { for (uint8_t e = 1; e < HOTENDS; e++) - SERIAL_ECHOLNPAIR("T", int(e), " Hotend Offset X", hotend_offset[X_AXIS][e], " Y", hotend_offset[Y_AXIS][e], " Z", hotend_offset[Z_AXIS][e]); + SERIAL_ECHOLNPAIR("T", int(e), " Hotend Offset X", hotend_offset[e].x, " Y", hotend_offset[e].y, " Z", hotend_offset[e].z); } #endif @@ -434,49 +412,40 @@ inline void calibrate_backlash(measurements_t &m, const float uncertainty) { #if ENABLED(BACKLASH_GCODE) #if HAS_X_CENTER - backlash.distance_mm[X_AXIS] = (m.backlash[LEFT] + m.backlash[RIGHT]) / 2; + backlash.distance_mm.x = (m.backlash[LEFT] + m.backlash[RIGHT]) / 2; #elif ENABLED(CALIBRATION_MEASURE_LEFT) - backlash.distance_mm[X_AXIS] = m.backlash[LEFT]; + backlash.distance_mm.x = m.backlash[LEFT]; #elif ENABLED(CALIBRATION_MEASURE_RIGHT) - backlash.distance_mm[X_AXIS] = m.backlash[RIGHT]; + backlash.distance_mm.x = m.backlash[RIGHT]; #endif #if HAS_Y_CENTER - backlash.distance_mm[Y_AXIS] = (m.backlash[FRONT] + m.backlash[BACK]) / 2; + backlash.distance_mm.y = (m.backlash[FRONT] + m.backlash[BACK]) / 2; #elif ENABLED(CALIBRATION_MEASURE_FRONT) - backlash.distance_mm[Y_AXIS] = m.backlash[FRONT]; + backlash.distance_mm.y = m.backlash[FRONT]; #elif ENABLED(CALIBRATION_MEASURE_BACK) - backlash.distance_mm[Y_AXIS] = m.backlash[BACK]; + backlash.distance_mm.y = m.backlash[BACK]; #endif - backlash.distance_mm[Z_AXIS] = m.backlash[TOP]; + backlash.distance_mm.z = m.backlash[TOP]; #endif } #if ENABLED(BACKLASH_GCODE) // Turn on backlash compensation and move in all // directions to take up any backlash - { // New scope for TEMPORARY_BACKLASH_CORRECTION TEMPORARY_BACKLASH_CORRECTION(all_on); TEMPORARY_BACKLASH_SMOOTHING(0.0f); - move_to( - X_AXIS, current_position[X_AXIS] + 3, - Y_AXIS, current_position[Y_AXIS] + 3, - Z_AXIS, current_position[Z_AXIS] + 3 - ); - move_to( - X_AXIS, current_position[X_AXIS] - 3, - Y_AXIS, current_position[Y_AXIS] - 3, - Z_AXIS, current_position[Z_AXIS] - 3 - ); + const xyz_float_t move = { 3, 3, 3 }; + current_position += move; calibration_move(); + current_position -= move; calibration_move(); } #endif } inline void update_measurements(measurements_t &m, const AxisEnum axis) { - const float true_center[XYZ] = CALIBRATION_OBJECT_CENTER; current_position[axis] += m.pos_error[axis]; m.obj_center[axis] = true_center[axis]; m.pos_error[axis] = 0; @@ -508,12 +477,12 @@ inline void calibrate_toolhead(measurements_t &m, const float uncertainty, const // Adjust the hotend offset #if HAS_HOTEND_OFFSET #if HAS_X_CENTER - hotend_offset[X_AXIS][extruder] += m.pos_error[X_AXIS]; + hotend_offset[extruder].x += m.pos_error.x; #endif #if HAS_Y_CENTER - hotend_offset[Y_AXIS][extruder] += m.pos_error[Y_AXIS]; + hotend_offset[extruder].y += m.pos_error.y; #endif - hotend_offset[Z_AXIS][extruder] += m.pos_error[Z_AXIS]; + hotend_offset[extruder].z += m.pos_error.z; normalize_hotend_offsets(); #endif @@ -589,7 +558,8 @@ inline void calibrate_all() { // Do a slow and precise calibration of the toolheads calibrate_all_toolheads(m, CALIBRATION_MEASUREMENT_UNCERTAIN); - move_to(X_AXIS, 150); // Park nozzle away from calibration object + current_position.x = X_CENTER; + calibration_move(); // Park nozzle away from calibration object } /** diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 49fc9982dc..ca30110670 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -74,13 +74,14 @@ void GcodeSuite::M48() { const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - float X_current = current_position[X_AXIS], - Y_current = current_position[Y_AXIS]; + xy_float_t next_pos = current_position; - const float X_probe_location = parser.linearval('X', X_current + probe_offset[X_AXIS]), - Y_probe_location = parser.linearval('Y', Y_current + probe_offset[Y_AXIS]); + const xy_pos_t probe_pos = { + parser.linearval('X', next_pos.x + probe_offset.x), + parser.linearval('Y', next_pos.y + probe_offset.y) + }; - if (!position_is_reachable_by_probe(X_probe_location, Y_probe_location)) { + if (!position_is_reachable_by_probe(probe_pos)) { SERIAL_ECHOLNPGM("? (X,Y) out of bounds."); return; } @@ -116,7 +117,7 @@ void GcodeSuite::M48() { float mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; // Move to the first point, deploy, and probe - const float t = probe_at_point(X_probe_location, Y_probe_location, raise_after, verbose_level); + const float t = probe_at_point(probe_pos, raise_after, verbose_level); bool probing_good = !isnan(t); if (probing_good) { @@ -125,7 +126,7 @@ void GcodeSuite::M48() { for (uint8_t n = 0; n < n_samples; n++) { #if HAS_SPI_LCD // Display M48 progress in the status bar - ui.status_printf_P(0, PSTR(MSG_M48_POINT ": %d/%d"), int(n + 1), int(n_samples)); + ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif if (n_legs) { const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise @@ -165,32 +166,31 @@ void GcodeSuite::M48() { while (angle < 0.0) angle += 360.0; // outside of this range. It looks like they behave correctly with // numbers outside of the range, but just to be safe we clamp them. - X_current = X_probe_location - probe_offset[X_AXIS] + cos(RADIANS(angle)) * radius; - Y_current = Y_probe_location - probe_offset[Y_AXIS] + sin(RADIANS(angle)) * radius; + next_pos.set(probe_pos.x - probe_offset.x + cos(RADIANS(angle)) * radius, + probe_pos.y - probe_offset.y + sin(RADIANS(angle)) * radius); #if DISABLED(DELTA) - LIMIT(X_current, X_MIN_POS, X_MAX_POS); - LIMIT(Y_current, Y_MIN_POS, Y_MAX_POS); + LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); + LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); #else // If we have gone out too far, we can do a simple fix and scale the numbers // back in closer to the origin. - while (!position_is_reachable_by_probe(X_current, Y_current)) { - X_current *= 0.8; - Y_current *= 0.8; + while (!position_is_reachable_by_probe(next_pos)) { + next_pos *= 0.8f; if (verbose_level > 3) - SERIAL_ECHOLNPAIR("Moving inward: X", X_current, " Y", Y_current); + SERIAL_ECHOLNPAIR("Moving inward: X", next_pos.x, " Y", next_pos.y); } #endif if (verbose_level > 3) - SERIAL_ECHOLNPAIR("Going to: X", X_current, " Y", Y_current, " Z", current_position[Z_AXIS]); + SERIAL_ECHOLNPAIR("Going to: X", next_pos.x, " Y", next_pos.y); - do_blocking_move_to_xy(X_current, Y_current); + do_blocking_move_to_xy(next_pos); } // n_legs loop } // n_legs // Probe a single point - sample_set[n] = probe_at_point(X_probe_location, Y_probe_location, raise_after, 0); + sample_set[n] = probe_at_point(probe_pos, raise_after, 0); // Break the loop if the probe fails probing_good = !isnan(sample_set[n]); @@ -252,7 +252,7 @@ void GcodeSuite::M48() { #if HAS_SPI_LCD // Display M48 results in the status bar char sigma_str[8]; - ui.status_printf_P(0, PSTR(MSG_M48_DEVIATION ": %s"), dtostrf(sigma, 2, 6, sigma_str)); + ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); #endif } diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 6422057ef8..1b37fa8bb6 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -43,14 +43,14 @@ * Z = Gamma (Tower 3) angle trim */ void GcodeSuite::M665() { - if (parser.seen('H')) delta_height = parser.value_linear_units(); - if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); - if (parser.seen('R')) delta_radius = parser.value_linear_units(); - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - if (parser.seen('B')) delta_calibration_radius = parser.value_float(); - if (parser.seen('X')) delta_tower_angle_trim[A_AXIS] = parser.value_float(); - if (parser.seen('Y')) delta_tower_angle_trim[B_AXIS] = parser.value_float(); - if (parser.seen('Z')) delta_tower_angle_trim[C_AXIS] = parser.value_float(); + if (parser.seen('H')) delta_height = parser.value_linear_units(); + if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seen('R')) delta_radius = parser.value_linear_units(); + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); + if (parser.seen('B')) delta_calibration_radius = parser.value_float(); + if (parser.seen('X')) delta_tower_angle_trim.a = parser.value_float(); + if (parser.seen('Y')) delta_tower_angle_trim.b = parser.value_float(); + if (parser.seen('Z')) delta_tower_angle_trim.c = parser.value_float(); recalc_delta_settings(); } @@ -76,13 +76,13 @@ #if HAS_SCARA_OFFSET - if (parser.seenval('Z')) scara_home_offset[Z_AXIS] = parser.value_linear_units(); + if (parser.seenval('Z')) scara_home_offset.z = parser.value_linear_units(); const bool hasA = parser.seenval('A'), hasP = parser.seenval('P'), hasX = parser.seenval('X'); const uint8_t sumAPX = hasA + hasP + hasX; if (sumAPX) { if (sumAPX == 1) - scara_home_offset[A_AXIS] = parser.value_float(); + scara_home_offset.a = parser.value_float(); else { SERIAL_ERROR_MSG("Only one of A, P, or X is allowed."); return; @@ -93,7 +93,7 @@ const uint8_t sumBTY = hasB + hasT + hasY; if (sumBTY) { if (sumBTY == 1) - scara_home_offset[B_AXIS] = parser.value_float(); + scara_home_offset.b = parser.value_float(); else { SERIAL_ERROR_MSG("Only one of B, T, or Y is allowed."); return; diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index 156d1f5bf6..4bb068e5b2 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -93,13 +93,13 @@ void GcodeSuite::M852() { if (!ijk) { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR_F(MSG_SKEW_FACTOR " XY: ", planner.skew_factor.xy, 6); + serialprintPGM(GET_TEXT(MSG_SKEW_FACTOR)); + SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6); #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPAIR(" XZ: ", planner.skew_factor.xz); - SERIAL_ECHOLNPAIR(" YZ: ", planner.skew_factor.yz); - #else - SERIAL_EOL(); + SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6); + SERIAL_ECHOPAIR_F(" YZ: ", planner.skew_factor.yz, 6); #endif + SERIAL_EOL(); } } diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index c43b889244..aeeb38c913 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -62,11 +62,9 @@ void GcodeSuite::M201() { LOOP_XYZE(i) { if (parser.seen(axis_codes[i])) { const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); - planner.settings.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a); + planner.set_max_acceleration(a, parser.value_axis_units((AxisEnum)a)); } } - - planner.reset_acceleration_rates(); } /** @@ -82,7 +80,7 @@ void GcodeSuite::M203() { LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); - planner.settings.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a); + planner.set_max_feedrate(a, parser.value_axis_units((AxisEnum)a)); } } @@ -119,10 +117,10 @@ void GcodeSuite::M204() { * Y = Max Y Jerk (units/sec^2) * Z = Max Z Jerk (units/sec^2) * E = Max E Jerk (units/sec^2) - * J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION) + * J = Junction Deviation (mm) (If not using CLASSIC_JERK) */ void GcodeSuite::M205() { - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) #define J_PARAM "J" #else #define J_PARAM @@ -138,7 +136,7 @@ void GcodeSuite::M205() { if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong(); if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units(); if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units(); - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) if (parser.seen('J')) { const float junc_dev = parser.value_linear_units(); if (WITHIN(junc_dev, 0.01f, 0.3f)) { @@ -152,17 +150,17 @@ void GcodeSuite::M205() { } #endif #if HAS_CLASSIC_JERK - if (parser.seen('X')) planner.max_jerk[X_AXIS] = parser.value_linear_units(); - if (parser.seen('Y')) planner.max_jerk[Y_AXIS] = parser.value_linear_units(); + if (parser.seen('X')) planner.set_max_jerk(X_AXIS, parser.value_linear_units()); + if (parser.seen('Y')) planner.set_max_jerk(Y_AXIS, parser.value_linear_units()); if (parser.seen('Z')) { - planner.max_jerk[Z_AXIS] = parser.value_linear_units(); - #if HAS_MESH - if (planner.max_jerk[Z_AXIS] <= 0.1f) + planner.set_max_jerk(Z_AXIS, parser.value_linear_units()); + #if HAS_MESH && DISABLED(LIMITED_JERK_EDITING) + if (planner.max_jerk.z <= 0.1f) SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); #endif } - #if !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); + #if HAS_CLASSIC_E_JERK + if (parser.seen('E')) planner.set_max_jerk(E_AXIS, parser.value_linear_units()); #endif #endif } diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp index d439911713..790d7714a3 100644 --- a/Marlin/src/gcode/config/M218.cpp +++ b/Marlin/src/gcode/config/M218.cpp @@ -44,27 +44,27 @@ void GcodeSuite::M218() { const int8_t target_extruder = get_target_extruder_from_command(); if (target_extruder < 0) return; - if (parser.seenval('X')) hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units(); - if (parser.seenval('Y')) hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units(); - if (parser.seenval('Z')) hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units(); + if (parser.seenval('X')) hotend_offset[target_extruder].x = parser.value_linear_units(); + if (parser.seenval('Y')) hotend_offset[target_extruder].y = parser.value_linear_units(); + if (parser.seenval('Z')) hotend_offset[target_extruder].z = parser.value_linear_units(); if (!parser.seen("XYZ")) { SERIAL_ECHO_START(); SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); HOTEND_LOOP() { SERIAL_CHAR(' '); - SERIAL_ECHO(hotend_offset[X_AXIS][e]); + SERIAL_ECHO(hotend_offset[e].x); SERIAL_CHAR(','); - SERIAL_ECHO(hotend_offset[Y_AXIS][e]); + SERIAL_ECHO(hotend_offset[e].y); SERIAL_CHAR(','); - SERIAL_ECHO_F(hotend_offset[Z_AXIS][e], 3); + SERIAL_ECHO_F(hotend_offset[e].z, 3); } SERIAL_EOL(); } #if ENABLED(DELTA) if (target_extruder == active_extruder) - do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.settings.max_feedrate_mm_s[X_AXIS]); + do_blocking_move_to_xy(current_position, planner.settings.max_feedrate_mm_s[X_AXIS]); #endif } diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index e26f6d8ee2..0fd213886d 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -50,12 +50,6 @@ #define GET_PIN_MAP_PIN_M43(Q) GET_PIN_MAP_PIN(Q) #endif -inline void _watchdog_reset() { - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif -} - inline void toggle_pins() { const bool ignore_protection = parser.boolval('I'); const int repeat = parser.intval('R', 1), @@ -71,7 +65,7 @@ inline void toggle_pins() { SERIAL_EOL(); } else { - _watchdog_reset(); + watchdog_refresh(); report_pin_state_extended(pin, ignore_protection, true, "Pulsing "); #if AVR_AT90USB1286_FAMILY // Teensy IDEs don't know about these pins so must use FASTIO if (pin == TEENSY_E2) { @@ -95,10 +89,10 @@ inline void toggle_pins() { { pinMode(pin, OUTPUT); for (int16_t j = 0; j < repeat; j++) { - _watchdog_reset(); extDigitalWrite(pin, 0); safe_delay(wait); - _watchdog_reset(); extDigitalWrite(pin, 1); safe_delay(wait); - _watchdog_reset(); extDigitalWrite(pin, 0); safe_delay(wait); - _watchdog_reset(); + watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); + watchdog_refresh(); extDigitalWrite(pin, 1); safe_delay(wait); + watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); + watchdog_refresh(); } } } @@ -340,7 +334,7 @@ void GcodeSuite::M43() { host_prompt_do(PROMPT_USER_CONTINUE, PSTR("M43 Wait Called"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("M43 Wait Called")); + ExtUI::onUserConfirmRequired_P(PSTR("M43 Wait Called")); #endif #endif diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index f0e27e82d1..622eb83b77 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -76,8 +76,8 @@ void GcodeSuite::M92() { const float value = parser.value_per_axis_units((AxisEnum)(E_AXIS_N(target_extruder))); if (value < 20) { float factor = planner.settings.axis_steps_per_mm[E_AXIS_N(target_extruder)] / value; // increase e constants if M92 E14 is given for netfab. - #if HAS_CLASSIC_JERK && !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - planner.max_jerk[E_AXIS] *= factor; + #if HAS_CLASSIC_E_JERK + planner.max_jerk.e *= factor; #endif planner.settings.max_feedrate_mm_s[E_AXIS_N(target_extruder)] *= factor; planner.max_acceleration_steps_per_s2[E_AXIS_N(target_extruder)] *= factor; @@ -98,7 +98,7 @@ void GcodeSuite::M92() { const float wanted = parser.floatval('L'); if (parser.seen('H') || wanted) { const uint16_t argH = parser.ushortval('H'), - micro_steps = argH ? argH : Z_MICROSTEPS; + micro_steps = argH ?: Z_MICROSTEPS; const float z_full_step_mm = micro_steps * planner.steps_to_mm[Z_AXIS]; SERIAL_ECHO_START(); SERIAL_ECHOPAIR("{ micro_steps:", micro_steps, ", z_full_step_mm:", z_full_step_mm); diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp index 9b6193bd93..50feb8276f 100644 --- a/Marlin/src/gcode/control/M108_M112_M410.cpp +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -41,7 +41,7 @@ void GcodeSuite::M108() { * M112: Full Shutdown */ void GcodeSuite::M112() { - kill(PSTR("M112 Shutdown"), true); + kill(PSTR("M112 Shutdown"), nullptr, true); } /** diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp index 64c2732755..432ab1379a 100644 --- a/Marlin/src/gcode/control/M211.cpp +++ b/Marlin/src/gcode/control/M211.cpp @@ -33,18 +33,14 @@ * Usage: M211 S1 to enable, M211 S0 to disable, M211 alone for report */ void GcodeSuite::M211() { + const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(), + l_soft_max = soft_endstop.max.asLogical(); SERIAL_ECHO_START(); SERIAL_ECHOPGM(MSG_SOFT_ENDSTOPS); if (parser.seen('S')) soft_endstops_enabled = parser.value_bool(); serialprint_onoff(soft_endstops_enabled); - SERIAL_ECHOPGM(MSG_SOFT_MIN); - SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop[X_AXIS].min)); - SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop[Y_AXIS].min)); - SERIAL_ECHOPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop[Z_AXIS].min)); - SERIAL_ECHOPGM(MSG_SOFT_MAX); - SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop[X_AXIS].max)); - SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop[Y_AXIS].max)); - SERIAL_ECHOLNPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop[Z_AXIS].max)); + print_xyz(l_soft_min, PSTR(MSG_SOFT_MIN), PSTR(" ")); + print_xyz(l_soft_max, PSTR(MSG_SOFT_MAX)); } #endif diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index b5e789a92f..81e1645193 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -29,10 +29,20 @@ #include "../../module/stepper.h" /** - * M3 - Cutter ON (Clockwise) - * M4 - Cutter ON (Counter-clockwise) + * Laser: * - * S - Set power. S0 turns it off. + * M3 - Laser ON/Power (Ramped power) + * M4 - Laser ON/Power (Continuous power) + * + * S - Set power. S0 will turn the laser off. + * O - Set power and OCR + * + * Spindle: + * + * M3 - Spindle ON (Clockwise) + * M4 - Spindle ON (Counter-clockwise) + * + * S - Set power. S0 will turn the spindle off. * O - Set power and OCR * * If no PWM pin is defined then M3/M4 just turns it on. @@ -61,12 +71,14 @@ */ void GcodeSuite::M3_M4(const bool is_M4) { - planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power + #if ENABLED(SPINDLE_FEATURE) + planner.synchronize(); // Wait for movement to complete before changing power + #endif cutter.set_direction(is_M4); #if ENABLED(SPINDLE_LASER_PWM) - if (parser.seen('O')) + if (parser.seenval('O')) cutter.set_ocr_power(parser.value_byte()); // The OCR is a value from 0 to 255 (uint8_t) else cutter.set_power(parser.intval('S', 255)); @@ -79,7 +91,9 @@ void GcodeSuite::M3_M4(const bool is_M4) { * M5 - Cutter OFF */ void GcodeSuite::M5() { - planner.synchronize(); + #if ENABLED(SPINDLE_FEATURE) + planner.synchronize(); + #endif cutter.set_enabled(false); } diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 84a75686a4..007c6fc6b8 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -79,9 +79,9 @@ } mirrored_duplication_mode = true; stepper.set_directions(); - float x_jog = current_position[X_AXIS] - .1; + float x_jog = current_position.x - .1; for (uint8_t i = 2; --i;) { - planner.buffer_line(x_jog, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate_mm_s, 0); + planner.buffer_line(x_jog, current_position.y, current_position.z, current_position.e, feedrate_mm_s, 0); x_jog += .1; } return; @@ -122,7 +122,7 @@ DEBUG_ECHOPAIR("\nActive Ext: ", int(active_extruder)); if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); DEBUG_ECHOPGM(" parked."); - DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position[X_AXIS]); + DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position.x); DEBUG_ECHOPAIR("\ninactive_extruder_x_pos: ", inactive_extruder_x_pos); DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); DEBUG_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); @@ -138,7 +138,7 @@ HOTEND_LOOP() { DEBUG_ECHOPAIR(" T", int(e)); - LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", axis_codes[a], "_AXIS][", int(e), "]=", hotend_offset[a][e]); + LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", int(e), "].", axis_codes[a] | 0x20, "=", hotend_offset[e][a]); DEBUG_EOL(); } DEBUG_EOL(); diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 03f73fe877..d7880358c4 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -110,6 +110,6 @@ void GcodeSuite::M81() { #endif #if HAS_LCD_MENU - LCD_MESSAGEPGM(MACHINE_NAME " " MSG_OFF "."); + LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " MSG_OFF ".")); #endif } diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp index 3b62a0f45e..2077e937b9 100644 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -258,7 +258,7 @@ void GcodeSuite::M917() { } DEBUG_ECHOLNPGM("."); reset_stepper_timeout(); // reset_stepper_timeout to keep steppers powered - watchdog_reset(); // beat the dog + watchdog_refresh(); safe_delay(5000); status_composite_temp = 0; for (j = 0; j < driver_count; j++) { diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index 3144126fe5..6fb68d454e 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -48,8 +48,8 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) do_pause_e_move(length, fr_mm_s); #else - current_position[E_AXIS] += length / planner.e_factor[active_extruder]; - planner.buffer_line(current_position, fr_mm_s, active_extruder); + current_position.e += length / planner.e_factor[active_extruder]; + line_to_current_position(fr_mm_s); #endif } } @@ -97,10 +97,10 @@ void GcodeSuite::M240() { if (axis_unhomed_error()) return; - const float old_pos[XYZ] = { - current_position[X_AXIS] + parser.linearval('A'), - current_position[Y_AXIS] + parser.linearval('B'), - current_position[Z_AXIS] + const xyz_pos_t old_pos = { + current_position.x + parser.linearval('A'), + current_position.y + parser.linearval('B'), + current_position.z }; #ifdef PHOTO_RETRACT_MM @@ -121,22 +121,22 @@ void GcodeSuite::M240() { feedRate_t fr_mm_s = MMM_TO_MMS(parser.linearval('F')); if (fr_mm_s) NOLESS(fr_mm_s, 10.0f); - constexpr float photo_position[XYZ] = PHOTO_POSITION; - float raw[XYZ] = { - parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : photo_position[X_AXIS], - parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_position[Y_AXIS], - (parser.seenval('Z') ? parser.value_linear_units() : photo_position[Z_AXIS]) + current_position[Z_AXIS] + constexpr xyz_pos_t photo_position = PHOTO_POSITION; + xyz_pos_t raw = { + parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : photo_position.x, + parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_position.y, + (parser.seenval('Z') ? parser.value_linear_units() : photo_position.z) + current_position.z }; apply_motion_limits(raw); do_blocking_move_to(raw, fr_mm_s); #ifdef PHOTO_SWITCH_POSITION - constexpr float photo_switch_position[2] = PHOTO_SWITCH_POSITION; - const float sraw[] = { - parser.seenval('I') ? RAW_X_POSITION(parser.value_linear_units()) : photo_switch_position[X_AXIS], - parser.seenval('J') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_switch_position[Y_AXIS] + constexpr xy_pos_t photo_switch_position = PHOTO_SWITCH_POSITION; + const xy_pos_t sraw = { + parser.seenval('I') ? RAW_X_POSITION(parser.value_linear_units()) : photo_switch_position.x, + parser.seenval('J') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_switch_position.y }; - do_blocking_move_to_xy(sraw[X_AXIS], sraw[Y_AXIS], get_homing_bump_feedrate(X_AXIS)); + do_blocking_move_to_xy(sraw, get_homing_bump_feedrate(X_AXIS)); #if PHOTO_SWITCH_MS > 0 safe_delay(parser.intval('D', PHOTO_SWITCH_MS)); #endif diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index 4f48bb77ed..a7546b2833 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -65,8 +65,10 @@ void GcodeSuite::M907() { #if ENABLED(DIGIPOT_I2C) // this one uses actual amps in floating point LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) digipot_i2c_set_current(i, parser.value_float()); - // for each additional extruder (named B,C,D,E..., channels 4,5,6,7...) - for (uint8_t i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (parser.seenval('B' + i - (NUM_AXIS))) digipot_i2c_set_current(i, parser.value_float()); + // Additional extruders use B,C,D for channels 4,5,6. + // TODO: Change these parameters because 'E' is used. B? + for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++) + if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c_set_current(i, parser.value_float()); #endif #if ENABLED(DAC_STEPPER_CURRENT) diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index c8257f6581..c3d2643535 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -71,7 +71,7 @@ void GcodeSuite::M7219() { } else if (parser.seen('D')) { const uint8_t uline = parser.value_byte() & 0x7, - line = uline + parser.byteval('U') << 3; + line = uline + (parser.byteval('U') << 3); if (line < MAX7219_LINES) { max7219.led_line[line] = v; return max7219.refresh_line(line); diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index 86e8f61c1c..22aaf2c446 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -58,7 +58,7 @@ void GcodeSuite::M125() { #endif ); - point_t park_point = NOZZLE_PARK_POINT; + xyz_pos_t park_point = NOZZLE_PARK_POINT; // Move XY axes to filament change position or given position if (parser.seenval('X')) park_point.x = RAW_X_POSITION(parser.linearval('X')); @@ -68,8 +68,7 @@ void GcodeSuite::M125() { if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) - park_point.x += hotend_offset[X_AXIS][active_extruder]; - park_point.y += hotend_offset[Y_AXIS][active_extruder]; + park_point += hotend_offset[active_extruder]; #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index f2ade740b4..4056a398e4 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -60,7 +60,6 @@ * Default values are used for omitted arguments. */ void GcodeSuite::M600() { - point_t park_point = NOZZLE_PARK_POINT; #if ENABLED(MIXING_EXTRUDER) const int8_t target_e_stepper = get_target_e_stepper_from_command(); @@ -119,6 +118,8 @@ void GcodeSuite::M600() { #endif ); + xyz_pos_t park_point NOZZLE_PARK_POINT; + // Lift Z axis if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); @@ -127,8 +128,7 @@ void GcodeSuite::M600() { if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) - park_point.x += hotend_offset[X_AXIS][active_extruder]; - park_point.y += hotend_offset[Y_AXIS][active_extruder]; + park_point += hotend_offset[active_extruder]; #endif #if ENABLED(MMU2_MENUS) diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 6add2ebfae..b4bab7e86a 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -28,7 +28,6 @@ #include "../../../Marlin.h" #include "../../../module/motion.h" #include "../../../module/temperature.h" -#include "../../../libs/point_t.h" #if EXTRUDERS > 1 #include "../../../module/tool_change.h" @@ -57,7 +56,7 @@ * Default values are used for omitted arguments. */ void GcodeSuite::M701() { - point_t park_point = NOZZLE_PARK_POINT; + xyz_pos_t park_point = NOZZLE_PARK_POINT; #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed @@ -97,26 +96,31 @@ void GcodeSuite::M701() { // Lift Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); // Load filament #if ENABLED(PRUSA_MMU2) mmu2.load_filament_to_nozzle(target_extruder); #else - constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; - const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) - : fc_settings[active_extruder].load_length); - load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS, - true, thermalManager.still_heating(target_extruder), PAUSE_MODE_LOAD_FILAMENT - #if ENABLED(DUAL_X_CARRIAGE) - , target_extruder - #endif - ); + constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, + slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : fc_settings[active_extruder].load_length); + load_filament( + slow_load_length, fast_load_length, purge_length, + FILAMENT_CHANGE_ALERT_BEEPS, + true, // show_lcd + thermalManager.still_heating(target_extruder), // pause_for_user + PAUSE_MODE_LOAD_FILAMENT // pause_mode + #if ENABLED(DUAL_X_CARRIAGE) + , target_extruder // Dual X target + #endif + ); #endif // Restore Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MAX(current_position[Z_AXIS] - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) // Restore toolhead if it was changed @@ -146,7 +150,7 @@ void GcodeSuite::M701() { * Default values are used for omitted arguments. */ void GcodeSuite::M702() { - point_t park_point = NOZZLE_PARK_POINT; + xyz_pos_t park_point = NOZZLE_PARK_POINT; #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed @@ -196,7 +200,7 @@ void GcodeSuite::M702() { // Lift Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); // Unload filament #if ENABLED(PRUSA_MMU2) @@ -226,7 +230,7 @@ void GcodeSuite::M702() { // Restore Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MAX(current_position[Z_AXIS] - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) // Restore toolhead if it was changed diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp index bbbe86bdb8..a7e6d65172 100644 --- a/Marlin/src/gcode/feature/trinamic/M122.cpp +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -31,8 +31,8 @@ * M122: Debug TMC drivers */ void GcodeSuite::M122() { - bool print_axis[XYZE] = { false, false, false, false }, - print_all = true; + xyze_bool_t print_axis = { false, false, false, false }; + bool print_all = true; LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { print_axis[i] = true; print_all = false; } if (print_all) LOOP_XYZE(i) print_axis[i] = true; @@ -45,12 +45,12 @@ void GcodeSuite::M122() { #endif if (parser.seen('V')) - tmc_get_registers(print_axis[X_AXIS], print_axis[Y_AXIS], print_axis[Z_AXIS], print_axis[E_AXIS]); + tmc_get_registers(print_axis.x, print_axis.y, print_axis.z, print_axis.e); else - tmc_report_all(print_axis[X_AXIS], print_axis[Y_AXIS], print_axis[Z_AXIS], print_axis[E_AXIS]); + tmc_report_all(print_axis.x, print_axis.y, print_axis.z, print_axis.e); #endif - test_tmc_connection(print_axis[X_AXIS], print_axis[Y_AXIS], print_axis[Z_AXIS], print_axis[E_AXIS]); + test_tmc_connection(print_axis.x, print_axis.y, print_axis.z, print_axis.e); } #endif // HAS_TRINAMIC diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index 27a0be9a64..feb891544d 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -104,25 +104,25 @@ */ void GcodeSuite::M912() { #if M91x_SOME_X - const bool hasX = parser.seen(axis_codes[X_AXIS]); + const bool hasX = parser.seen(axis_codes.x); #else constexpr bool hasX = false; #endif #if M91x_SOME_Y - const bool hasY = parser.seen(axis_codes[Y_AXIS]); + const bool hasY = parser.seen(axis_codes.y); #else constexpr bool hasY = false; #endif #if M91x_SOME_Z - const bool hasZ = parser.seen(axis_codes[Z_AXIS]); + const bool hasZ = parser.seen(axis_codes.z); #else constexpr bool hasZ = false; #endif #if M91x_SOME_E - const bool hasE = parser.seen(axis_codes[E_AXIS]); + const bool hasE = parser.seen(axis_codes.e); #else constexpr bool hasE = false; #endif @@ -130,7 +130,7 @@ const bool hasNone = !hasX && !hasY && !hasZ && !hasE; #if M91x_SOME_X - const int8_t xval = int8_t(parser.byteval(axis_codes[X_AXIS], 0xFF)); + const int8_t xval = int8_t(parser.byteval(axis_codes.x, 0xFF)); #if M91x_USE(X) if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX); #endif @@ -140,7 +140,7 @@ #endif #if M91x_SOME_Y - const int8_t yval = int8_t(parser.byteval(axis_codes[Y_AXIS], 0xFF)); + const int8_t yval = int8_t(parser.byteval(axis_codes.y, 0xFF)); #if M91x_USE(Y) if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY); #endif @@ -150,7 +150,7 @@ #endif #if M91x_SOME_Z - const int8_t zval = int8_t(parser.byteval(axis_codes[Z_AXIS], 0xFF)); + const int8_t zval = int8_t(parser.byteval(axis_codes.z, 0xFF)); #if M91x_USE(Z) if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ); #endif @@ -163,7 +163,7 @@ #endif #if M91x_SOME_E - const int8_t eval = int8_t(parser.byteval(axis_codes[E_AXIS], 0xFF)); + const int8_t eval = int8_t(parser.byteval(axis_codes.e, 0xFF)); #if M91x_USE_E(0) if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0); #endif diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f542f842ce..cced238ddc 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -49,12 +49,13 @@ GcodeSuite gcode; millis_t GcodeSuite::previous_move_ms; -static constexpr bool ar_init[XYZE] = AXIS_RELATIVE_MODES; +// Relative motion mode for each logical axis +static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES; uint8_t GcodeSuite::axis_relative = ( - (ar_init[X_AXIS] ? _BV(REL_X) : 0) - | (ar_init[Y_AXIS] ? _BV(REL_Y) : 0) - | (ar_init[Z_AXIS] ? _BV(REL_Z) : 0) - | (ar_init[E_AXIS] ? _BV(REL_E) : 0) + (ar_init.x ? _BV(REL_X) : 0) + | (ar_init.y ? _BV(REL_Y) : 0) + | (ar_init.z ? _BV(REL_Z) : 0) + | (ar_init.e ? _BV(REL_E) : 0) ); #if ENABLED(HOST_KEEPALIVE_FEATURE) @@ -68,7 +69,7 @@ uint8_t GcodeSuite::axis_relative = ( #if ENABLED(CNC_COORDINATE_SYSTEMS) int8_t GcodeSuite::active_coordinate_system = -1; // machine space - float GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; + xyz_pos_t GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS]; #endif /** @@ -112,7 +113,7 @@ int8_t GcodeSuite::get_target_e_stepper_from_command() { * - Set the feedrate, if included */ void GcodeSuite::get_destination_from_command() { - bool seen[XYZE] = { false, false, false, false }; + xyze_bool_t seen = { false, false, false, false }; LOOP_XYZE(i) { if ( (seen[i] = parser.seenval(axis_codes[i])) ) { const float v = parser.value_axis_units((AxisEnum)i); @@ -124,7 +125,7 @@ void GcodeSuite::get_destination_from_command() { #if ENABLED(POWER_LOSS_RECOVERY) && !PIN_EXISTS(POWER_LOSS) // Only update power loss recovery on moves with E - if (recovery.enabled && IS_SD_PRINTING() && seen[E_AXIS] && (seen[X_AXIS] || seen[Y_AXIS])) + if (recovery.enabled && IS_SD_PRINTING() && seen.e && (seen.x || seen.y)) recovery.save(); #endif @@ -133,7 +134,7 @@ void GcodeSuite::get_destination_from_command() { #if ENABLED(PRINTCOUNTER) if (!DEBUGGING(DRYRUN)) - print_job_timer.incFilamentUsed(destination[E_AXIS] - current_position[E_AXIS]); + print_job_timer.incFilamentUsed(destination.e - current_position.e); #endif // Get ABCDHI mixing factors @@ -445,7 +446,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if HAS_HEATED_CHAMBER case 141: M141(); break; // M141: Set chamber temperature - //case 191: M191(); break; // M191: Wait for chamber temperature to reach target + case 191: M191(); break; // M191: Wait for chamber temperature to reach target #endif #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index f871d6d216..9d2b11a07b 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -321,7 +321,7 @@ public: #define MAX_COORDINATE_SYSTEMS 9 #if ENABLED(CNC_COORDINATE_SYSTEMS) static int8_t active_coordinate_system; - static float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; + static xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; static bool select_coordinate_system(const int8_t _new); #endif @@ -620,7 +620,7 @@ private: #if HAS_HEATED_CHAMBER static void M141(); - //static void M191(); + static void M191(); #endif #if HOTENDS && HAS_LCD_MENU diff --git a/Marlin/src/gcode/geometry/G53-G59.cpp b/Marlin/src/gcode/geometry/G53-G59.cpp index 88914ccffd..38f72ae62e 100644 --- a/Marlin/src/gcode/geometry/G53-G59.cpp +++ b/Marlin/src/gcode/geometry/G53-G59.cpp @@ -36,9 +36,9 @@ bool GcodeSuite::select_coordinate_system(const int8_t _new) { if (active_coordinate_system == _new) return false; active_coordinate_system = _new; - float new_offset[XYZ] = { 0 }; + xyz_float_t new_offset{0}; if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1)) - COPY(new_offset, coordinate_system[_new]); + new_offset = coordinate_system[_new]; LOOP_XYZ(i) { if (position_shift[i] != new_offset[i]) { position_shift[i] = new_offset[i]; diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 0ecf43e580..65ad06fe2c 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -86,7 +86,7 @@ void GcodeSuite::G92() { #elif HAS_POSITION_SHIFT if (i == E_AXIS) { didE = true; - current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly + current_position.e = v; // When using coordinate spaces, only E is set directly } else { position_shift[i] += d; // Other axes simply offset the coordinate space @@ -102,7 +102,7 @@ void GcodeSuite::G92() { #if ENABLED(CNC_COORDINATE_SYSTEMS) // Apply workspace offset to the active coordinate system if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) - COPY(coordinate_system[active_coordinate_system], position_shift); + coordinate_system[active_coordinate_system] = position_shift; #endif if (didXYZ) sync_plan_position(); diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index f2d166e0a8..6e2b46081c 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -63,14 +63,14 @@ void GcodeSuite::M206() { void GcodeSuite::M428() { if (axis_unhomed_error()) return; - float diff[XYZ]; + xyz_float_t diff; LOOP_XYZ(i) { diff[i] = base_home_pos((AxisEnum)i) - current_position[i]; if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0) diff[i] = -current_position[i]; if (!WITHIN(diff[i], -20, 20)) { SERIAL_ERROR_MSG(MSG_ERR_M428_TOO_FAR); - LCD_ALERTMESSAGEPGM("Err: Too far!"); + LCD_ALERTMESSAGEPGM_P(PSTR("Err: Too far!")); BUZZ(200, 40); return; } diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index c10b58f705..8b65f2983a 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -36,7 +36,7 @@ #include "../../core/debug_out.h" #endif - void report_xyze(const float pos[], const uint8_t n = 4, const uint8_t precision = 3) { + void report_xyze(const xyze_pos_t &pos, const uint8_t n=4, const uint8_t precision=3) { char str[12]; for (uint8_t a = 0; a < n; a++) { SERIAL_CHAR(' '); @@ -47,22 +47,27 @@ SERIAL_EOL(); } - inline void report_xyz(const float pos[]) { report_xyze(pos, 3); } + void report_xyz(const xyz_pos_t &pos, const uint8_t precision=3) { + char str[12]; + for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[a]); + SERIAL_CHAR(':'); + SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); + } + SERIAL_EOL(); + } + inline void report_xyz(const xyze_pos_t &pos) { report_xyze(pos, 3); } void report_current_position_detail() { SERIAL_ECHOPGM("\nLogical:"); - const float logical[XYZ] = { - LOGICAL_X_POSITION(current_position[X_AXIS]), - LOGICAL_Y_POSITION(current_position[Y_AXIS]), - LOGICAL_Z_POSITION(current_position[Z_AXIS]) - }; - report_xyz(logical); + report_xyz(current_position.asLogical()); SERIAL_ECHOPGM("Raw: "); report_xyz(current_position); - float leveled[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + xyze_pos_t leveled = current_position; #if HAS_LEVELING SERIAL_ECHOPGM("Leveled:"); @@ -70,7 +75,7 @@ report_xyz(leveled); SERIAL_ECHOPGM("UnLevel:"); - float unleveled[XYZ] = { leveled[X_AXIS], leveled[Y_AXIS], leveled[Z_AXIS] }; + xyze_pos_t unleveled = leveled; planner.unapply_leveling(unleveled); report_xyz(unleveled); #endif @@ -153,7 +158,7 @@ SERIAL_EOL(); #if IS_SCARA - const float deg[XYZ] = { + const xy_float_t deg = { planner.get_axis_position_degrees(A_AXIS), planner.get_axis_position_degrees(B_AXIS) }; @@ -162,17 +167,12 @@ #endif SERIAL_ECHOPGM("FromStp:"); - get_cartesian_from_steppers(); // writes cartes[XYZ] (with forward kinematics) - const float from_steppers[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], planner.get_axis_position_mm(E_AXIS) }; + get_cartesian_from_steppers(); // writes 'cartes' (with forward kinematics) + xyze_pos_t from_steppers = { cartes.x, cartes.y, cartes.z, planner.get_axis_position_mm(E_AXIS) }; report_xyze(from_steppers); - const float diff[XYZE] = { - from_steppers[X_AXIS] - leveled[X_AXIS], - from_steppers[Y_AXIS] - leveled[Y_AXIS], - from_steppers[Z_AXIS] - leveled[Z_AXIS], - from_steppers[E_AXIS] - current_position[E_AXIS] - }; - SERIAL_ECHOPGM("Differ: "); + const xyze_float_t diff = from_steppers - leveled; + SERIAL_ECHOPGM("Diff: "); report_xyze(diff); } diff --git a/Marlin/src/gcode/host/M16.cpp b/Marlin/src/gcode/host/M16.cpp index 94ae79b263..9219155011 100644 --- a/Marlin/src/gcode/host/M16.cpp +++ b/Marlin/src/gcode/host/M16.cpp @@ -33,7 +33,7 @@ void GcodeSuite::M16() { if (strcmp_P(parser.string_arg, PSTR(MACHINE_NAME))) - kill(PSTR(MSG_EXPECTED_PRINTER)); + kill(GET_TEXT(MSG_EXPECTED_PRINTER)); } diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index 05fb7576fb..aca149abdc 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -80,7 +80,10 @@ void GcodeSuite::M0_M1() { #elif ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(has_message ? args : MSG_USERWAIT); // SRAM string + if (has_message) + ExtUI::onUserConfirmRequired(args); // Can this take an SRAM string?? + else + ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_USERWAIT)); #else @@ -98,7 +101,7 @@ void GcodeSuite::M0_M1() { host_prompt_do(PROMPT_USER_CONTINUE, PSTR("M0/1 Break Called"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("M0/1 Break Called")); + ExtUI::onUserConfirmRequired_P(PSTR("M0/1 Break Called")); #endif if (ms > 0) { diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 85fb7831ea..1699c6a860 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -38,8 +38,11 @@ * This has no effect during an SD print job */ void GcodeSuite::M73() { - if (parser.seen('P') && !IS_SD_PRINTING()) - ui.set_progress(parser.value_byte()); + if (parser.seen('P')) + ui.set_progress((PROGRESS_SCALE) > 1 + ? parser.value_float() * (PROGRESS_SCALE) + : parser.value_byte() + ); } #endif // LCD_SET_PROGRESS_MANUALLY diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index fed70f553e..36bc29026e 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -35,7 +35,7 @@ #include "../../module/stepper.h" #endif -extern float destination[XYZE]; +extern xyze_pos_t destination; #if ENABLED(VARIABLE_G0_FEEDRATE) feedRate_t fast_move_feedrate = MMM_TO_MMS(G0_FEEDRATE); @@ -87,12 +87,12 @@ void GcodeSuite::G0_G1( if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { // When M209 Autoretract is enabled, convert E-only moves to firmware retract/recover moves if (fwretract.autoretract_enabled && parser.seen('E') && !(parser.seen('X') || parser.seen('Y') || parser.seen('Z'))) { - const float echange = destination[E_AXIS] - current_position[E_AXIS]; + const float echange = destination.e - current_position.e; // Is this a retract or recover move? if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) { - current_position[E_AXIS] = destination[E_AXIS]; // Hide a G1-based retract/recover from calculations - sync_plan_position_e(); // AND from the planner - return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) + current_position.e = destination.e; // Hide a G1-based retract/recover from calculations + sync_plan_position_e(); // AND from the planner + return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) } } } diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 2a713a9f41..6fecbdc0cc 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -50,38 +50,38 @@ * options for G2/G3 arc generation. In future these options may be GCode tunable. */ void plan_arc( - const float (&cart)[XYZE], // Destination position - const float (&offset)[2], // Center of rotation relative to current_position - const uint8_t clockwise // Clockwise? + const xyze_pos_t &cart, // Destination position + const ab_float_t &offset, // Center of rotation relative to current_position + const uint8_t clockwise // Clockwise? ) { #if ENABLED(CNC_WORKSPACE_PLANES) AxisEnum p_axis, q_axis, l_axis; switch (gcode.workspace_plane) { default: case GcodeSuite::PLANE_XY: p_axis = X_AXIS; q_axis = Y_AXIS; l_axis = Z_AXIS; break; - case GcodeSuite::PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; case GcodeSuite::PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; + case GcodeSuite::PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; } #else constexpr AxisEnum p_axis = X_AXIS, q_axis = Y_AXIS, l_axis = Z_AXIS; #endif // Radius vector from center to current location - float r_P = -offset[0], r_Q = -offset[1]; + ab_float_t rvec = -offset; - const float radius = HYPOT(r_P, r_Q), + const float radius = HYPOT(rvec.a, rvec.b), #if ENABLED(AUTO_BED_LEVELING_UBL) start_L = current_position[l_axis], #endif - center_P = current_position[p_axis] - r_P, - center_Q = current_position[q_axis] - r_Q, + center_P = current_position[p_axis] - rvec.a, + center_Q = current_position[q_axis] - rvec.b, rt_X = cart[p_axis] - center_P, rt_Y = cart[q_axis] - center_Q, linear_travel = cart[l_axis] - current_position[l_axis], - extruder_travel = cart[E_AXIS] - current_position[E_AXIS]; + extruder_travel = cart.e - current_position.e; // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. - float angular_travel = ATAN2(r_P * rt_Y - r_Q * rt_X, r_P * rt_X + r_Q * rt_Y); + float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); if (angular_travel < 0) angular_travel += RADIANS(360); #ifdef MIN_ARC_SEGMENTS uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360))); @@ -133,7 +133,7 @@ void plan_arc( * This is important when there are successive arc motions. */ // Vector rotation matrix values - float raw[XYZE]; + xyze_pos_t raw; const float theta_per_segment = angular_travel / segments, linear_per_segment = linear_travel / segments, extruder_per_segment = extruder_travel / segments, @@ -144,7 +144,7 @@ void plan_arc( raw[l_axis] = current_position[l_axis]; // Initialize the extruder axis - raw[E_AXIS] = current_position[E_AXIS]; + raw.e = current_position.e; const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); @@ -168,10 +168,10 @@ void plan_arc( #if N_ARC_CORRECTION > 1 if (--arc_recalc_count) { - // Apply vector rotation matrix to previous r_P / 1 - const float r_new_Y = r_P * sin_T + r_Q * cos_T; - r_P = r_P * cos_T - r_Q * sin_T; - r_Q = r_new_Y; + // Apply vector rotation matrix to previous rvec.a / 1 + const float r_new_Y = rvec.a * sin_T + rvec.b * cos_T; + rvec.a = rvec.a * cos_T - rvec.b * sin_T; + rvec.b = r_new_Y; } else #endif @@ -185,20 +185,20 @@ void plan_arc( // To reduce stuttering, the sin and cos could be computed at different times. // For now, compute both at the same time. const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); - r_P = -offset[0] * cos_Ti + offset[1] * sin_Ti; - r_Q = -offset[0] * sin_Ti - offset[1] * cos_Ti; + rvec.a = -offset[0] * cos_Ti + offset[1] * sin_Ti; + rvec.b = -offset[0] * sin_Ti - offset[1] * cos_Ti; } // Update raw location - raw[p_axis] = center_P + r_P; - raw[q_axis] = center_Q + r_Q; + raw[p_axis] = center_P + rvec.a; + raw[q_axis] = center_Q + rvec.b; #if ENABLED(AUTO_BED_LEVELING_UBL) raw[l_axis] = start_L; UNUSED(linear_per_segment); #else raw[l_axis] += linear_per_segment; #endif - raw[E_AXIS] += extruder_per_segment; + raw.e += extruder_per_segment; apply_motion_limits(raw); @@ -215,7 +215,7 @@ void plan_arc( } // Ensure last segment arrives at target location. - COPY(raw, cart); + raw = cart; #if ENABLED(AUTO_BED_LEVELING_UBL) raw[l_axis] = start_L; #endif @@ -235,26 +235,27 @@ void plan_arc( #if ENABLED(AUTO_BED_LEVELING_UBL) raw[l_axis] = start_L; #endif - COPY(current_position, raw); + current_position = raw; } // plan_arc /** * G2: Clockwise Arc * G3: Counterclockwise Arc * - * This command has two forms: IJ-form and R-form. + * This command has two forms: IJ-form (JK, KI) and R-form. * - * - I specifies an X offset. J specifies a Y offset. - * At least one of the IJ parameters is required. - * X and Y can be omitted to do a complete circle. - * The given XY is not error-checked. The arc ends - * based on the angle of the destination. - * Mixing I or J with R will throw an error. + * - Depending on the current Workspace Plane orientation, + * use parameters IJ/JK/KI to specify the XY/YZ/ZX offsets. + * At least one of the IJ/JK/KI parameters is required. + * XY/YZ/ZX can be omitted to do a complete circle. + * The given XY/YZ/ZX is not error-checked. The arc ends + * based on the angle of the destination. + * Mixing IJ/JK/KI with R will throw an error. * - * - R specifies the radius. X or Y is required. - * Omitting both X and Y will throw an error. - * X or Y must differ from the current XY. - * Mixing R with I or J will throw an error. + * - R specifies the radius. X or Y (Y or Z / Z or X) is required. + * Omitting both XY/YZ/ZX will throw an error. + * XY/YZ/ZX must differ from the current XY/YZ/ZX. + * Mixing R with IJ/JK/KI will throw an error. * * - P specifies the number of full circles to do * before the specified arc move. @@ -278,32 +279,39 @@ void GcodeSuite::G2_G3(const bool clockwise) { relative_mode = relative_mode_backup; #endif - float arc_offset[2] = { 0, 0 }; + ab_float_t arc_offset = { 0, 0 }; if (parser.seenval('R')) { const float r = parser.value_linear_units(); if (r) { - const float p1 = current_position[X_AXIS], q1 = current_position[Y_AXIS], - p2 = destination[X_AXIS], q2 = destination[Y_AXIS]; - if (p2 != p1 || q2 != q1) { - const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 - dx = p2 - p1, dy = q2 - q1, // X and Y differences - d = HYPOT(dx, dy), // Linear distance between the points - dinv = 1/d, // Inverse of d - h = SQRT(sq(r) - sq(d * 0.5f)), // Distance to the arc pivot-point - mx = (p1 + p2) * 0.5f, my = (q1 + q2) * 0.5f,// Point between the two points - sx = -dy * dinv, sy = dx * dinv, // Slope of the perpendicular bisector - cx = mx + e * h * sx, cy = my + e * h * sy; // Pivot-point of the arc - arc_offset[0] = cx - p1; - arc_offset[1] = cy - q1; + const xy_pos_t p1 = current_position, p2 = destination; + if (p1 != p2) { + const xy_pos_t d2 = (p2 - p1) * 0.5f; // XY vector to midpoint of move from current + const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 + len = d2.magnitude(), // Distance to mid-point of move from current + h2 = (r - len) * (r + len), // factored to reduce rounding error + h = (h2 >= 0) ? SQRT(h2) : 0.0f; // Distance to the arc pivot-point from midpoint + const xy_pos_t s = { -d2.y, d2.x }; // Perpendicular bisector. (Divide by len for unit vector.) + arc_offset = d2 + s / len * e * h; // The calculated offset (mid-point if |r| <= len) } } } else { - if (parser.seenval('I')) arc_offset[0] = parser.value_linear_units(); - if (parser.seenval('J')) arc_offset[1] = parser.value_linear_units(); + #if ENABLED(CNC_WORKSPACE_PLANES) + char achar, bchar; + switch (gcode.workspace_plane) { + default: + case GcodeSuite::PLANE_XY: achar = 'I'; bchar = 'J'; break; + case GcodeSuite::PLANE_YZ: achar = 'J'; bchar = 'K'; break; + case GcodeSuite::PLANE_ZX: achar = 'K'; bchar = 'I'; break; + } + #else + constexpr char achar = 'I', bchar = 'J'; + #endif + if (parser.seenval(achar)) arc_offset.a = parser.value_linear_units(); + if (parser.seenval(bchar)) arc_offset.b = parser.value_linear_units(); } - if (arc_offset[0] || arc_offset[1]) { + if (arc_offset) { #if ENABLED(ARC_P_CIRCLES) // P indicates number of circles to do diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index f392668ced..7125532e9b 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -27,11 +27,6 @@ #include "../../module/motion.h" #include "../../module/planner_bezier.h" -void plan_cubic_move(const float (&cart)[XYZE], const float (&offset)[4]) { - cubic_b_spline(current_position, cart, offset, MMS_SCALED(feedrate_mm_s), active_extruder); - COPY(current_position, cart); -} - /** * Parameters interpreted according to: * http://linuxcnc.org/docs/2.6/html/gcode/parser.html#sec:G5-Cubic-Spline @@ -57,14 +52,13 @@ void GcodeSuite::G5() { get_destination_from_command(); - const float offset[4] = { - parser.linearval('I'), - parser.linearval('J'), - parser.linearval('P'), - parser.linearval('Q') + const xy_pos_t offsets[2] = { + { parser.linearval('I'), parser.linearval('J') }, + { parser.linearval('P'), parser.linearval('Q') } }; - plan_cubic_move(destination, offset); + cubic_b_spline(current_position, destination, offsets, MMS_SCALED(feedrate_mm_s), active_extruder); + current_position = destination; } } diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index a2ac85cd0b..7bf274a18d 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -34,23 +34,27 @@ #include "../../core/serial.h" #endif +#if ENABLED(MESH_BED_LEVELING) + #include "../../feature/bedlevel/bedlevel.h" +#endif + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - FORCE_INLINE void mod_zprobe_zoffset(const float &offs) { + FORCE_INLINE void mod_probe_offset(const float &offs) { if (true #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) && active_extruder == 0 #endif ) { - probe_offset[Z_AXIS] += offs; + probe_offset.z += offs; SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET MSG_Z ": ", probe_offset[Z_AXIS]); + SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET MSG_Z ": ", probe_offset.z); } else { #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - hotend_offset[Z_AXIS][active_extruder] -= offs; + hotend_offset[active_extruder].z -= offs; SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET MSG_Z ": ", hotend_offset[Z_AXIS][active_extruder]); + SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET MSG_Z ": ", hotend_offset[active_extruder].z); #endif } } @@ -60,13 +64,15 @@ /** * M290: Babystepping * + * Send 'R' or no parameters for a report. + * * X - Distance to step X * Y - Distance to step Y * Z - Distance to step Z * S - Distance to step Z (alias for Z) * * With BABYSTEP_ZPROBE_OFFSET: - * P0 - Don't adjust the Z probe offset. + * P0 - Don't adjust the Z probe offset */ void GcodeSuite::M290() { #if ENABLED(BABYSTEP_XY) @@ -75,7 +81,7 @@ void GcodeSuite::M290() { const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); babystep.add_mm((AxisEnum)a, offs); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_zprobe_zoffset(offs); + if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_probe_offset(offs); #endif } #else @@ -83,10 +89,46 @@ void GcodeSuite::M290() { const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); babystep.add_mm(Z_AXIS, offs); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (!parser.seen('P') || parser.value_bool()) mod_zprobe_zoffset(offs); + if (!parser.seen('P') || parser.value_bool()) mod_probe_offset(offs); #endif } #endif + + if (!parser.seen("XYZ") || parser.seen('R')) { + SERIAL_ECHO_START(); + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET " " MSG_Z, probe_offset.z); + #endif + + #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) + { + SERIAL_ECHOLNPAIR("Hotend ", int(active_extruder), "Offset" + #if ENABLED(BABYSTEP_XY) + " X", hotend_offset[active_extruder].x, + " Y", hotend_offset[active_extruder].y, + #endif + " Z", hotend_offset[active_extruder].z + ); + } + #endif + + #if ENABLED(MESH_BED_LEVELING) + SERIAL_ECHOLNPAIR("MBL Adjust Z", mbl.z_offset); + #endif + + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + { + SERIAL_ECHOLNPAIR("Babystep" + #if ENABLED(BABYSTEP_XY) + " X", babystep.axis_total[X_AXIS], + " Y", babystep.axis_total[Y_AXIS], + #endif + " Z", babystep.axis_total[Z_AXIS] + ); + } + #endif + } } #endif // BABYSTEPPING diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 76a63a21af..8d70c64cc8 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -222,8 +222,7 @@ void GCodeParser::parse(char *p) { // Only use string_arg for these M codes if (letter == 'M') switch (codenum) { #if ENABLED(GCODE_MACROS) - case 810: case 811: case 812: case 813: case 814: - case 815: case 816: case 817: case 818: case 819: + case 810 ... 819: #endif #if ENABLED(EXPECTED_PRINTER_CHECK) case 16: @@ -245,7 +244,7 @@ void GCodeParser::parse(char *p) { * For 'M118' you must use 'E1' and 'A1' rather than just 'E' or 'A' */ string_arg = nullptr; - while (const char code = *p++) { // Get the next parameter. A NUL ends the loop + while (const char code = *p++) { // Get the next parameter. A NUL ends the loop // Special handling for M32 [P] !/path/to/file.g# // The path must be the last parameter diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index a4fd629b16..2e91216a64 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -290,9 +290,9 @@ public: static inline float mm_to_linear_unit(const float mm) { return mm; } static inline float mm_to_volumetric_unit(const float mm) { return mm; } - static inline float linear_value_to_mm(const float v) { return v; } - static inline float axis_value_to_mm(const AxisEnum axis, const float v) { UNUSED(axis); return v; } - static inline float per_axis_value(const AxisEnum axis, const float v) { UNUSED(axis); return v; } + static inline float linear_value_to_mm(const float v) { return v; } + static inline float axis_value_to_mm(const AxisEnum, const float v) { return v; } + static inline float per_axis_value(const AxisEnum, const float v) { return v; } #endif diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 50d0ea6ae3..e91e3e9d8b 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -39,10 +39,10 @@ * E Engage the probe for each probe (default 1) */ void GcodeSuite::G30() { - const float xpos = parser.linearval('X', current_position[X_AXIS] + probe_offset[X_AXIS]), - ypos = parser.linearval('Y', current_position[Y_AXIS] + probe_offset[Y_AXIS]); + const xy_pos_t pos = { parser.linearval('X', current_position.x + probe_offset.x), + parser.linearval('Y', current_position.y + probe_offset.y) }; - if (!position_is_reachable_by_probe(xpos, ypos)) return; + if (!position_is_reachable_by_probe(pos)) return; // Disable leveling so the planner won't mess with us #if HAS_LEVELING @@ -52,10 +52,9 @@ void GcodeSuite::G30() { remember_feedrate_scaling_off(); const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; - const float measured_z = probe_at_point(xpos, ypos, raise_after, 1); - + const float measured_z = probe_at_point(pos, raise_after, 1); if (!isnan(measured_z)) - SERIAL_ECHOLNPAIR("Bed X: ", FIXFLOAT(xpos), " Y: ", FIXFLOAT(ypos), " Z: ", FIXFLOAT(measured_z)); + SERIAL_ECHOLNPAIR("Bed X: ", FIXFLOAT(pos.x), " Y: ", FIXFLOAT(pos.y), " Z: ", FIXFLOAT(measured_z)); restore_feedrate_and_scaling(); diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp index 33f5611a43..cb298bcccb 100644 --- a/Marlin/src/gcode/probe/G38.cpp +++ b/Marlin/src/gcode/probe/G38.cpp @@ -48,7 +48,7 @@ inline bool G38_run_probe() { #if MULTIPLE_PROBING > 1 // Get direction of move and retract - float retract_mm[XYZ]; + xyz_float_t retract_mm; LOOP_XYZ(i) { const float dist = destination[i] - current_position[i]; retract_mm[i] = ABS(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm((AxisEnum)i) * (dist > 0 ? -1 : 1); @@ -75,8 +75,7 @@ inline bool G38_run_probe() { #if MULTIPLE_PROBING > 1 // Move away by the retract distance - set_destination_from_current(); - LOOP_XYZ(i) destination[i] += retract_mm[i]; + destination = current_position + retract_mm; endstops.enable(false); prepare_move_to_destination(); planner.synchronize(); @@ -84,7 +83,7 @@ inline bool G38_run_probe() { REMEMBER(fr, feedrate_mm_s, feedrate_mm_s * 0.25); // Bump the target more slowly - LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; + destination -= retract_mm * 2; G38_single_probe(move_value); #endif diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp index eec6b2f255..19f96eecd2 100644 --- a/Marlin/src/gcode/probe/M851.cpp +++ b/Marlin/src/gcode/probe/M851.cpp @@ -35,18 +35,18 @@ void GcodeSuite::M851() { // Show usage with no parameters if (!parser.seen("XYZ")) { - SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET " X", probe_offset[X_AXIS], " Y", probe_offset[Y_AXIS], " Z", probe_offset[Z_AXIS]); + SERIAL_ECHOLNPAIR(MSG_PROBE_OFFSET " X", probe_offset.x, " Y", probe_offset.y, " Z", probe_offset.z); return; } - float offs[XYZ] = { probe_offset[X_AXIS], probe_offset[Y_AXIS], probe_offset[Z_AXIS] }; + xyz_pos_t offs = probe_offset; bool ok = true; if (parser.seenval('X')) { const float x = parser.value_float(); if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) - offs[X_AXIS] = x; + offs.x = x; else { SERIAL_ECHOLNPAIR("?X out of range (-", int(X_BED_SIZE), " to ", int(X_BED_SIZE), ")"); ok = false; @@ -56,7 +56,7 @@ void GcodeSuite::M851() { if (parser.seenval('Y')) { const float y = parser.value_float(); if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) - offs[Y_AXIS] = y; + offs.y = y; else { SERIAL_ECHOLNPAIR("?Y out of range (-", int(Y_BED_SIZE), " to ", int(Y_BED_SIZE), ")"); ok = false; @@ -66,7 +66,7 @@ void GcodeSuite::M851() { if (parser.seenval('Z')) { const float z = parser.value_float(); if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - offs[Z_AXIS] = z; + offs.z = z; else { SERIAL_ECHOLNPAIR("?Z out of range (", int(Z_PROBE_OFFSET_RANGE_MIN), " to ", int(Z_PROBE_OFFSET_RANGE_MAX), ")"); ok = false; @@ -74,7 +74,7 @@ void GcodeSuite::M851() { } // Save the new offsets - if (ok) COPY(probe_offset, offs); + if (ok) probe_offset = offs; } #endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp index 585c4d8c86..0e6f51b628 100644 --- a/Marlin/src/gcode/scara/M360-M364.cpp +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -32,7 +32,7 @@ inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { if (IsRunning()) { forward_kinematics_SCARA(delta_a, delta_b); - do_blocking_move_to_xy(cartes[X_AXIS], cartes[Y_AXIS]); + do_blocking_move_to_xy(cartes); return true; } return false; diff --git a/Marlin/src/gcode/temperature/M105.cpp b/Marlin/src/gcode/temperature/M105.cpp index bf11017a57..3dbbb5eb7b 100644 --- a/Marlin/src/gcode/temperature/M105.cpp +++ b/Marlin/src/gcode/temperature/M105.cpp @@ -31,16 +31,21 @@ void GcodeSuite::M105() { const int8_t target_extruder = get_target_extruder_from_command(); if (target_extruder < 0) return; + SERIAL_ECHOPGM(MSG_OK); + #if HAS_TEMP_SENSOR - SERIAL_ECHOPGM(MSG_OK); + thermalManager.print_heater_states(target_extruder #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) , parser.boolval('R') #endif ); - #else // !HAS_TEMP_SENSOR - SERIAL_ERROR_MSG(MSG_ERR_NO_THERMISTORS); - #endif - SERIAL_EOL(); + SERIAL_EOL(); + + #else + + SERIAL_ECHOLNPGM(" T:0"); // Some hosts send M105 to test the serial connection + + #endif } diff --git a/Marlin/src/gcode/temperature/M140_M190.cpp b/Marlin/src/gcode/temperature/M140_M190.cpp index a0d132f6b7..8d7c4fe0d1 100644 --- a/Marlin/src/gcode/temperature/M140_M190.cpp +++ b/Marlin/src/gcode/temperature/M140_M190.cpp @@ -64,7 +64,7 @@ void GcodeSuite::M190() { } else return; - ui.set_status_P(thermalManager.isHeatingBed() ? PSTR(MSG_BED_HEATING) : PSTR(MSG_BED_COOLING)); + ui.set_status_P(thermalManager.isHeatingBed() ? GET_TEXT(MSG_BED_HEATING) : GET_TEXT(MSG_BED_COOLING)); thermalManager.wait_for_bed(no_wait_for_cooling); } diff --git a/Marlin/src/gcode/temperature/M141_M191.cpp b/Marlin/src/gcode/temperature/M141_M191.cpp index 53deb25d2f..eef546649c 100644 --- a/Marlin/src/gcode/temperature/M141_M191.cpp +++ b/Marlin/src/gcode/temperature/M141_M191.cpp @@ -27,7 +27,6 @@ #include "../gcode.h" #include "../../module/temperature.h" -/* #include "../../module/motion.h" #include "../../lcd/ultralcd.h" @@ -40,7 +39,6 @@ #endif #include "../../Marlin.h" // for wait_for_heatup and idle() -*/ /** * M141: Set chamber temperature @@ -54,7 +52,6 @@ void GcodeSuite::M141() { * M191: Sxxx Wait for chamber current temp to reach target temp. Waits only when heating * Rxxx Wait for chamber current temp to reach target temp. Waits when heating and cooling */ -/* void GcodeSuite::M191() { if (DEBUGGING(DRYRUN)) return; @@ -68,10 +65,11 @@ void GcodeSuite::M191() { } else return; - lcd_setstatusPGM(thermalManager.isHeatingChamber() ? PSTR(MSG_CHAMBER_HEATING) : PSTR(MSG_CHAMBER_COOLING)); - - thermalManager.wait_for_chamber(no_wait_for_cooling); + const bool is_heating = thermalManager.isHeatingChamber(); + if (is_heating || !no_wait_for_cooling) { + lcd_setstatusPGM(is_heating ? GET_TEXT(MSG_CHAMBER_HEATING) : GET_TEXT(MSG_CHAMBER_COOLING)); + thermalManager.wait_for_chamber(false); + } } -*/ #endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 0e1e65c87f..42965a14f2 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -128,6 +128,7 @@ #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #define RGB_LED #elif ENABLED(FYSETC_MINI_12864_2_1) + #define LED_CONTROL_MENU #define NEOPIXEL_LED #undef NEOPIXEL_TYPE #define NEOPIXEL_TYPE NEO_RGB @@ -500,8 +501,8 @@ #define PROBE_SELECTED (HAS_BED_PROBE || EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) #if HAS_BED_PROBE - #define USES_Z_MIN_PROBE_ENDSTOP DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #define HOMING_Z_WITH_PROBE (Z_HOME_DIR < 0 && !USES_Z_MIN_PROBE_ENDSTOP) + #define HAS_CUSTOM_PROBE_PIN DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define HOMING_Z_WITH_PROBE (Z_HOME_DIR < 0 && !HAS_CUSTOM_PROBE_PIN) #ifndef Z_PROBE_LOW_POINT #define Z_PROBE_LOW_POINT -5 #endif @@ -524,13 +525,14 @@ #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) #endif -#define HAS_SOFTWARE_ENDSTOPS EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) -#define HAS_RESUME_CONTINUE ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER) -#define HAS_COLOR_LEDS ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) -#define HAS_LEDS_OFF_FLAG (BOTH(PRINTER_EVENT_LEDS, SDSUPPORT) && HAS_RESUME_CONTINUE) -#define HAS_PRINT_PROGRESS EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) -#define HAS_SERVICE_INTERVALS (ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0)) -#define HAS_FILAMENT_SENSOR ENABLED(FILAMENT_RUNOUT_SENSOR) +#define HAS_SOFTWARE_ENDSTOPS EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) +#define HAS_RESUME_CONTINUE ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER) +#define HAS_COLOR_LEDS ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) +#define HAS_LEDS_OFF_FLAG (BOTH(PRINTER_EVENT_LEDS, SDSUPPORT) && HAS_RESUME_CONTINUE) +#define HAS_PRINT_PROGRESS EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) +#define HAS_PRINT_PROGRESS_PERMYRIAD (HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME)) +#define HAS_SERVICE_INTERVALS (ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0)) +#define HAS_FILAMENT_SENSOR ENABLED(FILAMENT_RUNOUT_SENSOR) #define Z_MULTI_STEPPER_DRIVERS EITHER(Z_DUAL_STEPPER_DRIVERS, Z_TRIPLE_STEPPER_DRIVERS) #define Z_MULTI_ENDSTOPS EITHER(Z_DUAL_ENDSTOPS, Z_TRIPLE_ENDSTOPS) @@ -560,6 +562,12 @@ #define BOOT_MARLIN_LOGO_SMALL #endif -#define IS_RE_ARM_BOARD (MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_14_RE_ARM_SF)) +#define IS_RE_ARM_BOARD MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) #define HAS_SDCARD_CONNECTION EITHER(TARGET_LPC1768, ADAFRUIT_GRAND_CENTRAL_M4) + +#define HAS_LINEAR_E_JERK (DISABLED(CLASSIC_JERK) && ENABLED(LIN_ADVANCE)) + +#ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED +#endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index b9b8855428..01b27f2c17 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -131,9 +131,6 @@ // Extensible UI pin mapping for RepRapDiscount #define TOUCH_UI_ULTIPANEL ENABLED(LULZBOT_TOUCH_UI) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) -// TMC SPI Chaining -#define TMC_USE_CHAIN (X_CHAIN_POS||Y_CHAIN_POS||Z_CHAIN_POS||X2_CHAIN_POS||Y2_CHAIN_POS||Z2_CHAIN_POS||Z3_CHAIN_POS||E0_CHAIN_POS||E1_CHAIN_POS||E2_CHAIN_POS||E3_CHAIN_POS||E4_CHAIN_POS||E5_CHAIN_POS) - // Poll-based jogging for joystick and other devices #if ENABLED(JOYSTICK) #define POLL_JOG diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index d5aae1e0f8..a782d45904 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -43,7 +43,8 @@ #define NOT_A_PIN 0 // For PINS_DEBUGGING #endif -#define HAS_CLASSIC_JERK (IS_KINEMATIC || DISABLED(JUNCTION_DEVIATION)) +#define HAS_CLASSIC_JERK (ENABLED(CLASSIC_JERK) || IS_KINEMATIC) +#define HAS_CLASSIC_E_JERK (HAS_CLASSIC_JERK && DISABLED(LIN_ADVANCE)) /** * Axis lengths and center @@ -220,11 +221,6 @@ #ifndef Z_SAFE_HOMING_Y_POINT #define Z_SAFE_HOMING_Y_POINT _SAFE_POINT(Y) #endif - #define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT - #define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT -#else - #define X_TILT_FULCRUM X_HOME_POS - #define Y_TILT_FULCRUM Y_HOME_POS #endif /** @@ -829,12 +825,12 @@ // Is an endstop plug used for the Z2 endstop or the bed probe? #define IS_Z2_OR_PROBE(A,M) ( \ (Z_MULTI_ENDSTOPS && Z2_USE_ENDSTOP == _##A##M##_) \ - || (USES_Z_MIN_PROBE_ENDSTOP && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) + || (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) // Is an endstop plug used for the Z3 endstop or the bed probe? #define IS_Z3_OR_PROBE(A,M) ( \ (ENABLED(Z_TRIPLE_ENDSTOPS) && Z3_USE_ENDSTOP == _##A##M##_) \ - || (USES_Z_MIN_PROBE_ENDSTOP && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) + || (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) /** * Set ENDSTOPPULLUPS for active endstop switches @@ -977,7 +973,10 @@ #define X_SENSORLESS (AXIS_HAS_STALLGUARD(X) && defined(X_STALL_SENSITIVITY)) #define X2_SENSORLESS (AXIS_HAS_STALLGUARD(X2) && defined(X2_STALL_SENSITIVITY)) #define Y_SENSORLESS (AXIS_HAS_STALLGUARD(Y) && defined(Y_STALL_SENSITIVITY)) + #define Y2_SENSORLESS (AXIS_HAS_STALLGUARD(Y2) && defined(Y2_STALL_SENSITIVITY)) #define Z_SENSORLESS (AXIS_HAS_STALLGUARD(Z) && defined(Z_STALL_SENSITIVITY)) + #define Z2_SENSORLESS (AXIS_HAS_STALLGUARD(Z2) && defined(Z2_STALL_SENSITIVITY)) + #define Z3_SENSORLESS (AXIS_HAS_STALLGUARD(Z3) && defined(Z3_STALL_SENSITIVITY)) #if ENABLED(SPI_ENDSTOPS) #define X_SPI_SENSORLESS X_SENSORLESS #define Y_SPI_SENSORLESS Y_SENSORLESS @@ -1006,7 +1005,7 @@ #define HAS_Z2_MAX (PIN_EXISTS(Z2_MAX)) #define HAS_Z3_MIN (PIN_EXISTS(Z3_MIN)) #define HAS_Z3_MAX (PIN_EXISTS(Z3_MAX)) -#define HAS_Z_MIN_PROBE_PIN (USES_Z_MIN_PROBE_ENDSTOP && PIN_EXISTS(Z_MIN_PROBE)) +#define HAS_Z_MIN_PROBE_PIN (HAS_CUSTOM_PROBE_PIN && PIN_EXISTS(Z_MIN_PROBE)) #define HAS_CALIBRATION_PIN (PIN_EXISTS(CALIBRATION)) // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) @@ -1064,7 +1063,7 @@ #define WATCH_CHAMBER (HAS_HEATED_CHAMBER && ENABLED(THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0) // Auto fans -#define HAS_AUTO_FAN_0 (PIN_EXISTS(E0_AUTO_FAN)) +#define HAS_AUTO_FAN_0 (HOTENDS > 0 && PIN_EXISTS(E0_AUTO_FAN)) #define HAS_AUTO_FAN_1 (HOTENDS > 1 && PIN_EXISTS(E1_AUTO_FAN)) #define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN)) #define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN)) @@ -1073,14 +1072,9 @@ #define HAS_AUTO_CHAMBER_FAN (HAS_TEMP_CHAMBER && PIN_EXISTS(CHAMBER_AUTO_FAN)) #define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_FAN_4 || HAS_AUTO_FAN_5 || HAS_AUTO_CHAMBER_FAN) +#define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN) #if HAS_AUTO_FAN - #define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_5 (CHAMBER_AUTO_FAN_PIN == E5_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_E (AUTO_CHAMBER_IS_0 || AUTO_CHAMBER_IS_1 || AUTO_CHAMBER_IS_2 || AUTO_CHAMBER_IS_3 || AUTO_CHAMBER_IS_4 || AUTO_CHAMBER_IS_5) + #define AUTO_CHAMBER_IS_E (_FANOVERLAP(CHAMBER,0) || _FANOVERLAP(CHAMBER,1) || _FANOVERLAP(CHAMBER,2) || _FANOVERLAP(CHAMBER,3) || _FANOVERLAP(CHAMBER,4) || _FANOVERLAP(CHAMBER,5)) #endif #if !HAS_AUTO_CHAMBER_FAN || AUTO_CHAMBER_IS_E @@ -1331,6 +1325,17 @@ #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default #endif +/** + * MIN/MAX case light PWM scaling + */ +#if HAS_CASE_LIGHT + #ifndef CASE_LIGHT_MAX_PWM + #define CASE_LIGHT_MAX_PWM 255 + #elif !WITHIN(CASE_LIGHT_MAX_PWM, 1, 255) + #error "CASE_LIGHT_MAX_PWM must be a value from 1 to 255." + #endif +#endif + /** * Bed Probe dependencies */ @@ -1472,7 +1477,7 @@ #define _PROBE_RADIUS (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) #ifndef DELTA_CALIBRATION_RADIUS #ifdef NOZZLE_TO_PROBE_OFFSET - #define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - _MAX(ABS(nozzle_to_probe_offset[X_AXIS]), ABS(nozzle_to_probe_offset[Y_AXIS]), ABS(MIN_PROBE_EDGE))) + #define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - _MAX(ABS(nozzle_to_probe_offset.x), ABS(nozzle_to_probe_offset.y), ABS(MIN_PROBE_EDGE))) #else #define DELTA_CALIBRATION_RADIUS _PROBE_RADIUS #endif @@ -1506,6 +1511,7 @@ #define PROBE_Y_MIN (Y_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE_FRONT) #define PROBE_X_MAX (X_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE_RIGHT)) #define PROBE_Y_MAX (Y_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE_BACK)) + #endif #if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) @@ -1532,10 +1538,10 @@ #define _MESH_MAX_X (_MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS)) #define _MESH_MAX_Y (_MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) #else - #define _MESH_MIN_X (_MAX(X_MIN_BED + MESH_INSET, X_MIN_POS + nozzle_to_probe_offset[X_AXIS])) - #define _MESH_MIN_Y (_MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS + nozzle_to_probe_offset[Y_AXIS])) - #define _MESH_MAX_X (_MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS + nozzle_to_probe_offset[X_AXIS])) - #define _MESH_MAX_Y (_MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS + nozzle_to_probe_offset[Y_AXIS])) + #define _MESH_MIN_X (_MAX(X_MIN_BED + MESH_INSET, X_MIN_POS + nozzle_to_probe_offset.x)) + #define _MESH_MIN_Y (_MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS + nozzle_to_probe_offset.y)) + #define _MESH_MAX_X (_MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS + nozzle_to_probe_offset.x)) + #define _MESH_MAX_Y (_MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS + nozzle_to_probe_offset.y)) #endif #endif @@ -1762,23 +1768,25 @@ #define Z_STEPPER_COUNT 1 #endif -// Get LCD character width/height, which may be overridden by pins, configs, etc. -#ifndef LCD_WIDTH - #if HAS_GRAPHICAL_LCD - #define LCD_WIDTH 21 - #elif ENABLED(ULTIPANEL) - #define LCD_WIDTH 20 - #elif HAS_SPI_LCD - #define LCD_WIDTH 16 +#if HAS_SPI_LCD + // Get LCD character width/height, which may be overridden by pins, configs, etc. + #ifndef LCD_WIDTH + #if HAS_GRAPHICAL_LCD + #define LCD_WIDTH 21 + #elif ENABLED(ULTIPANEL) + #define LCD_WIDTH 20 + #else + #define LCD_WIDTH 16 + #endif #endif -#endif -#ifndef LCD_HEIGHT - #if HAS_GRAPHICAL_LCD - #define LCD_HEIGHT 5 - #elif ENABLED(ULTIPANEL) - #define LCD_HEIGHT 4 - #elif HAS_SPI_LCD - #define LCD_HEIGHT 2 + #ifndef LCD_HEIGHT + #if HAS_GRAPHICAL_LCD + #define LCD_HEIGHT 5 + #elif ENABLED(ULTIPANEL) + #define LCD_HEIGHT 4 + #else + #define LCD_HEIGHT 2 + #endif #endif #endif @@ -1800,3 +1808,10 @@ #if !NUM_SERIAL #undef BAUD_RATE_GCODE #endif + +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #undef Z_STEPPER_ALIGN_AMP +#endif +#ifndef Z_STEPPER_ALIGN_AMP + #define Z_STEPPER_ALIGN_AMP 1.0 +#endif diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index bb974e64d9..fc26862853 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -39,7 +39,7 @@ #include HAL_PATH(../HAL, inc/SanityCheck.h) // Include all core headers -#include "../core/enum.h" +#include "../core/types.h" #include "../core/language.h" #include "../core/utility.h" #include "../core/serial.h" diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h index 96ee5d347c..19427c4c1b 100644 --- a/Marlin/src/inc/MarlinConfigPre.h +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -34,10 +34,21 @@ #include "../core/boards.h" #include "../core/macros.h" -#include "../core/millis_t.h" -#include "Version.h" #include "../../Configuration.h" + +#ifdef CUSTOM_VERSION_FILE + #if defined(__has_include) + #if __has_include(XSTR(../../CUSTOM_VERSION_FILE)) + #include XSTR(../../CUSTOM_VERSION_FILE) + #endif + #else + #include XSTR(../../CUSTOM_VERSION_FILE) + #endif +#endif + +#include "Version.h" + #include "Conditionals_LCD.h" #include HAL_PATH(../HAL, inc/Conditionals_LCD.h) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1b7922bd74..5379f23e68 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -74,7 +74,9 @@ #elif defined(CUSTOM_MENDEL_NAME) #error "CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME. Please update your configuration." #elif defined(HAS_AUTOMATIC_VERSIONING) - #error "HAS_AUTOMATIC_VERSIONING is now USE_AUTOMATIC_VERSIONING. Please update your configuration." + #error "HAS_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." +#elif defined(USE_AUTOMATIC_VERSIONING) + #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." #elif defined(SDSLOW) #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead." #elif defined(SDEXTRASLOW) @@ -252,13 +254,13 @@ #elif defined(UBL_PROBE_PT_1_X) || defined(UBL_PROBE_PT_1_Y) || defined(UBL_PROBE_PT_2_X) || defined(UBL_PROBE_PT_2_Y) || defined(UBL_PROBE_PT_3_X) || defined(UBL_PROBE_PT_3_Y) #error "UBL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." #elif defined(LEFT_PROBE_BED_POSITION) - #error "LEFT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_LEFT. Please note the differences and update your configuration." + #error "LEFT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_LEFT. Please update your configuration." #elif defined(RIGHT_PROBE_BED_POSITION) - #error "RIGHT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_RIGHT. Please note the differences and update your configuration." + #error "RIGHT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_RIGHT. Please update your configuration." #elif defined(FRONT_PROBE_BED_POSITION) - #error "FRONT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_FRONT. Please note the differences and update your configuration." + #error "FRONT_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_FRONT. Please update your configuration." #elif defined(BACK_PROBE_BED_POSITION) - #error "BACK_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_BACK. Please note the differences and update your configuration." + #error "BACK_PROBE_BED_POSITION has been replaced by MIN_PROBE_EDGE_BACK. Please update your configuration." #elif defined(ENABLE_MESH_EDIT_GFX_OVERLAY) #error "ENABLE_MESH_EDIT_GFX_OVERLAY is now MESH_EDIT_GFX_OVERLAY. Please update your configuration." #elif defined(BABYSTEP_ZPROBE_GFX_REVERSE) @@ -310,7 +312,7 @@ #error "LEVEL_BED_CORNERS requires a LEVEL_CORNERS_INSET value. Please update your Configuration.h." #elif defined(BEZIER_JERK_CONTROL) #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION. Please update your configuration." -#elif defined(JUNCTION_DEVIATION_FACTOR) +#elif DISABLED(CLASSIC_JERK) && defined(JUNCTION_DEVIATION_FACTOR) #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM. Please update your configuration." #elif defined(JUNCTION_ACCELERATION_FACTOR) #error "JUNCTION_ACCELERATION_FACTOR is obsolete. Delete it from Configuration_adv.h." @@ -402,6 +404,10 @@ #error "[XYZ]_PROBE_OFFSET_FROM_EXTRUDER is now NOZZLE_TO_PROBE_OFFSET. Please update your configuration." #elif defined(MIN_PROBE_X) || defined(MIN_PROBE_Y) || defined(MAX_PROBE_X) || defined(MAX_PROBE_Y) #error "(MIN|MAX)_PROBE_[XY] are now calculated at runtime. Please remove them from Configuration.h." +#elif defined(Z_STEPPER_ALIGN_X) || defined(Z_STEPPER_ALIGN_X) + #error "Z_STEPPER_ALIGN_X and Z_STEPPER_ALIGN_Y are now combined as Z_STEPPER_ALIGN_XY. Please update your Configuration_adv.h." +#elif defined(JUNCTION_DEVIATION) + #error "JUNCTION_DEVIATION is no longer required. (See CLASSIC_JERK). Please remove it from Configuration.h." #endif #define BOARD_MKS_13 -1000 @@ -410,6 +416,8 @@ #define BOARD_FORMBOT_TREX2 -1003 #define BOARD_BIQU_SKR_V1_1 -1004 #define BOARD_STM32F1R -1005 +#define BOARD_STM32F103R -1006 +#define BOARD_ESP32 -1007 #if MB(MKS_13) #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." #elif MB(TRIGORILLA) @@ -421,7 +429,11 @@ #elif MB(BIQU_SKR_V1_1) #error "BOARD_BIQU_SKR_V1_1 has been renamed BOARD_BIGTREE_SKR_V1_1. Please update your configuration." #elif MB(STM32F1R) - #error "BOARD_STM32F1R has been renamed BOARD_STM32F103R. Please update your configuration." + #error "BOARD_STM32F1R has been renamed BOARD_STM32F103RE. Please update your configuration." +#elif MB(STM32F103R) + #error "BOARD_STM32F103R has been renamed BOARD_STM32F103RE. Please update your configuration." +#elif MOTHERBOARD == BOARD_ESP32 + #error "BOARD_ESP32 has been renamed BOARD_ESPRESSIF_ESP32. Please update your configuration." #endif #undef BOARD_MKS_13 #undef BOARD_TRIGORILLA @@ -429,6 +441,8 @@ #undef BOARD_FORMBOT_TREX2 #undef BOARD_BIQU_SKR_V1_1 #undef BOARD_STM32F1R +#undef BOARD_STM32F103R +#undef BOARD_ESP32 /** * Marlin release, version and default string @@ -1034,10 +1048,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif /** - * Junction deviation is not compatible with kinematic systems. + * Junction deviation is incompatible with kinematic systems. */ -#if ENABLED(JUNCTION_DEVIATION) && IS_KINEMATIC - #error "Junction deviation is only compatible with Cartesians." +#if DISABLED(CLASSIC_JERK) && IS_KINEMATIC + #error "CLASSIC_JERK is required for DELTA and SCARA." #endif /** @@ -1264,7 +1278,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #if HAS_MESH - #if DISABLED(JUNCTION_DEVIATION) + #if HAS_CLASSIC_JERK static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); #endif #elif ENABLED(G26_MESH_VALIDATION) @@ -2151,69 +2165,58 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers." #endif -#if TMC_USE_CHAIN - #if (X_CHAIN_POS && !PIN_EXISTS(X_CS) ) \ - || (Y_CHAIN_POS && !PIN_EXISTS(Y_CS) ) \ - || (Z_CHAIN_POS && !PIN_EXISTS(Z_CS) ) \ - || (X2_CHAIN_POS && !PIN_EXISTS(X2_CS)) \ - || (Y2_CHAIN_POS && !PIN_EXISTS(Y2_CS)) \ - || (Z2_CHAIN_POS && !PIN_EXISTS(Z2_CS)) \ - || (Z3_CHAIN_POS && !PIN_EXISTS(Z3_CS)) \ - || (E0_CHAIN_POS && !PIN_EXISTS(E0_CS)) \ - || (E1_CHAIN_POS && !PIN_EXISTS(E1_CS)) \ - || (E2_CHAIN_POS && !PIN_EXISTS(E2_CS)) \ - || (E3_CHAIN_POS && !PIN_EXISTS(E3_CS)) \ - || (E4_CHAIN_POS && !PIN_EXISTS(E4_CS)) \ - || (E5_CHAIN_POS && !PIN_EXISTS(E5_CS)) - #error "With TMC_USE_CHAIN all chained TMC drivers need a CS pin." +#define IN_CHAIN(A) (A##_CHAIN_POS > 0) +// TMC SPI Chaining +#if IN_CHAIN(X) || IN_CHAIN(Y) || IN_CHAIN(Z) || IN_CHAIN(X2) || IN_CHAIN(Y2) || IN_CHAIN(Z2) || IN_CHAIN(Z3) || IN_CHAIN(E0) || IN_CHAIN(E1) || IN_CHAIN(E2) || IN_CHAIN(E3) || IN_CHAIN(E4) || IN_CHAIN(E5) + #if (IN_CHAIN(X) && !PIN_EXISTS(X_CS) ) || (IN_CHAIN(Y) && !PIN_EXISTS(Y_CS) ) \ + || (IN_CHAIN(Z) && !PIN_EXISTS(Z_CS) ) || (IN_CHAIN(X2) && !PIN_EXISTS(X2_CS)) \ + || (IN_CHAIN(Y2) && !PIN_EXISTS(Y2_CS)) || (IN_CHAIN(Z2) && !PIN_EXISTS(Z2_CS)) \ + || (IN_CHAIN(Z3) && !PIN_EXISTS(Z3_CS)) || (IN_CHAIN(E0) && !PIN_EXISTS(E0_CS)) \ + || (IN_CHAIN(E1) && !PIN_EXISTS(E1_CS)) || (IN_CHAIN(E2) && !PIN_EXISTS(E2_CS)) \ + || (IN_CHAIN(E3) && !PIN_EXISTS(E3_CS)) || (IN_CHAIN(E4) && !PIN_EXISTS(E4_CS)) \ + || (IN_CHAIN(E5) && !PIN_EXISTS(E5_CS)) + #error "All chained TMC drivers need a CS pin." #else - #if X_CHAIN_POS + #if IN_CHAIN(X) #define CS_COMPARE X_CS_PIN - #elif Y_CHAIN_POS + #elif IN_CHAIN(Y) #define CS_COMPARE Y_CS_PIN - #elif Z_CHAIN_POS + #elif IN_CHAIN(Z) #define CS_COMPARE Z_CS_PIN - #elif X2_CHAIN_POS + #elif IN_CHAIN(X2) #define CS_COMPARE X2_CS_PIN - #elif Y2_CHAIN_POS + #elif IN_CHAIN(Y2) #define CS_COMPARE Y2_CS_PIN - #elif Z2_CHAIN_POS + #elif IN_CHAIN(Z2) #define CS_COMPARE Z2_CS_PIN - #elif Z3_CHAIN_POS + #elif IN_CHAIN(Z3) #define CS_COMPARE Z3_CS_PIN - #elif E0_CHAIN_POS + #elif IN_CHAIN(E0) #define CS_COMPARE E0_CS_PIN - #elif E1_CHAIN_POS + #elif IN_CHAIN(E1) #define CS_COMPARE E1_CS_PIN - #elif E2_CHAIN_POS + #elif IN_CHAIN(E2) #define CS_COMPARE E2_CS_PIN - #elif E3_CHAIN_POS + #elif IN_CHAIN(E3) #define CS_COMPARE E3_CS_PIN - #elif E4_CHAIN_POS + #elif IN_CHAIN(E4) #define CS_COMPARE E4_CS_PIN - #elif E5_CHAIN_POS + #elif IN_CHAIN(E5) #define CS_COMPARE E5_CS_PIN - #else - #error "With TMC_USE_CHAIN some TMC drivers should be chained." #endif - #if (X_CHAIN_POS && X_CS_PIN != CS_COMPARE) \ - || (Y_CHAIN_POS && Y_CS_PIN != CS_COMPARE) \ - || (Z_CHAIN_POS && Z_CS_PIN != CS_COMPARE) \ - || (X2_CHAIN_POS && X2_CS_PIN != CS_COMPARE) \ - || (Y2_CHAIN_POS && Y2_CS_PIN != CS_COMPARE) \ - || (Z2_CHAIN_POS && Z2_CS_PIN != CS_COMPARE) \ - || (Z3_CHAIN_POS && Z3_CS_PIN != CS_COMPARE) \ - || (E0_CHAIN_POS && E0_CS_PIN != CS_COMPARE) \ - || (E1_CHAIN_POS && E1_CS_PIN != CS_COMPARE) \ - || (E2_CHAIN_POS && E2_CS_PIN != CS_COMPARE) \ - || (E3_CHAIN_POS && E3_CS_PIN != CS_COMPARE) \ - || (E4_CHAIN_POS && E4_CS_PIN != CS_COMPARE) \ - || (E5_CHAIN_POS && E5_CS_PIN != CS_COMPARE) - #error "With TMC_USE_CHAIN all TMC drivers must use the same CS pin." + #if (IN_CHAIN(X) && X_CS_PIN != CS_COMPARE) || (IN_CHAIN(Y) && Y_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(Z) && Z_CS_PIN != CS_COMPARE) || (IN_CHAIN(X2) && X2_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(Y2) && Y2_CS_PIN != CS_COMPARE) || (IN_CHAIN(Z2) && Z2_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(Z3) && Z3_CS_PIN != CS_COMPARE) || (IN_CHAIN(E0) && E0_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(E1) && E1_CS_PIN != CS_COMPARE) || (IN_CHAIN(E2) && E2_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(E3) && E3_CS_PIN != CS_COMPARE) || (IN_CHAIN(E4) && E4_CS_PIN != CS_COMPARE) \ + || (IN_CHAIN(E5) && E5_CS_PIN != CS_COMPARE) + #error "All chained TMC drivers must use the same CS pin." #endif #endif #undef CS_COMPARE -#endif // TMC_USE_CHAIN +#endif +#undef IN_CHAIN #if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z)) #error "STEALTHCHOP_XY and STEALTHCHOP_Z must be the same on DELTA." @@ -2238,27 +2241,63 @@ constexpr float sanity_arr_1[] = DEFAULT_AXIS_STEPS_PER_UNIT, #define _ARR_TEST(N,I) (sanity_arr_##N[_MIN(I,int(COUNT(sanity_arr_##N))-1)] > 0) -static_assert(COUNT(sanity_arr_1) >= XYZE, "DEFAULT_AXIS_STEPS_PER_UNIT requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_1) >= XYZE, "DEFAULT_AXIS_STEPS_PER_UNIT requires X, Y, Z and E elements."); static_assert(COUNT(sanity_arr_1) <= XYZE_N, "DEFAULT_AXIS_STEPS_PER_UNIT has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); static_assert( _ARR_TEST(1,0) && _ARR_TEST(1,1) && _ARR_TEST(1,2) && _ARR_TEST(1,3) && _ARR_TEST(1,4) && _ARR_TEST(1,5) && _ARR_TEST(1,6) && _ARR_TEST(1,7) && _ARR_TEST(1,8), "DEFAULT_AXIS_STEPS_PER_UNIT values must be positive."); -static_assert(COUNT(sanity_arr_2) >= XYZE, "DEFAULT_MAX_FEEDRATE requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_2) >= XYZE, "DEFAULT_MAX_FEEDRATE requires X, Y, Z and E elements."); static_assert(COUNT(sanity_arr_2) <= XYZE_N, "DEFAULT_MAX_FEEDRATE has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); static_assert( _ARR_TEST(2,0) && _ARR_TEST(2,1) && _ARR_TEST(2,2) && _ARR_TEST(2,3) && _ARR_TEST(2,4) && _ARR_TEST(2,5) && _ARR_TEST(2,6) && _ARR_TEST(2,7) && _ARR_TEST(2,8), "DEFAULT_MAX_FEEDRATE values must be positive."); -static_assert(COUNT(sanity_arr_3) >= XYZE, "DEFAULT_MAX_ACCELERATION requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_3) >= XYZE, "DEFAULT_MAX_ACCELERATION requires X, Y, Z and E elements."); static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) && _ARR_TEST(3,3) && _ARR_TEST(3,4) && _ARR_TEST(3,5) && _ARR_TEST(3,6) && _ARR_TEST(3,7) && _ARR_TEST(3,8), "DEFAULT_MAX_ACCELERATION values must be positive."); +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #ifdef MAX_ACCEL_EDIT_VALUES + constexpr float sanity_arr_4[] = MAX_ACCEL_EDIT_VALUES; + static_assert(COUNT(sanity_arr_4) >= XYZE, "MAX_ACCEL_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_4) <= XYZE, "MAX_ACCEL_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(4,0) && _ARR_TEST(4,1) && _ARR_TEST(4,2) + && _ARR_TEST(4,3) && _ARR_TEST(4,4) && _ARR_TEST(4,5) + && _ARR_TEST(4,6) && _ARR_TEST(4,7) && _ARR_TEST(4,8), + "MAX_ACCEL_EDIT_VALUES values must be positive."); + #endif +#endif + +#if ENABLED(LIMITED_MAX_FR_EDITING) + #ifdef MAX_FEEDRATE_EDIT_VALUES + constexpr float sanity_arr_5[] = MAX_FEEDRATE_EDIT_VALUES; + static_assert(COUNT(sanity_arr_5) >= XYZE, "MAX_FEEDRATE_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_5) <= XYZE, "MAX_FEEDRATE_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(5,0) && _ARR_TEST(5,1) && _ARR_TEST(5,2) + && _ARR_TEST(5,3) && _ARR_TEST(5,4) && _ARR_TEST(5,5) + && _ARR_TEST(5,6) && _ARR_TEST(5,7) && _ARR_TEST(5,8), + "MAX_FEEDRATE_EDIT_VALUES values must be positive."); + #endif +#endif + +#if ENABLED(LIMITED_JERK_EDITING) + #ifdef MAX_JERK_EDIT_VALUES + constexpr float sanity_arr_6[] = MAX_JERK_EDIT_VALUES; + static_assert(COUNT(sanity_arr_6) >= XYZE, "MAX_JERK_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_6) <= XYZE, "MAX_JERK_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(6,0) && _ARR_TEST(6,1) && _ARR_TEST(6,2) + && _ARR_TEST(6,3) && _ARR_TEST(6,4) && _ARR_TEST(6,5) + && _ARR_TEST(6,6) && _ARR_TEST(6,7) && _ARR_TEST(6,8), + "MAX_JERK_EDIT_VALUES values must be positive."); + #endif +#endif + #undef _ARR_TEST #if BOTH(CNC_COORDINATE_SYSTEMS, NO_WORKSPACE_OFFSETS) @@ -2296,16 +2335,24 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if !Z_MULTI_STEPPER_DRIVERS #error "Z_STEPPER_AUTO_ALIGN requires Z_DUAL_STEPPER_DRIVERS or Z_TRIPLE_STEPPER_DRIVERS." #elif !HAS_BED_PROBE #error "Z_STEPPER_AUTO_ALIGN requires a Z-bed probe." #endif - constexpr float sanity_arr_z_align_x[] = Z_STEPPER_ALIGN_X, sanity_arr_z_align_y[] = Z_STEPPER_ALIGN_Y; - static_assert( - COUNT(sanity_arr_z_align_x) == Z_STEPPER_COUNT && COUNT(sanity_arr_z_align_y) == Z_STEPPER_COUNT, - "Z_STEPPER_ALIGN_[XY] settings require one element per Z stepper." - ); + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #if DISABLED(Z_TRIPLE_STEPPER_DRIVERS) + #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires Z_TRIPLE_STEPPER_DRIVERS." + #endif + constexpr float sanity_arr_screw_xy[][2] = Z_STEPPER_ALIGN_STEPPER_XY; + static_assert( + COUNT(sanity_arr_screw_xy) == Z_STEPPER_COUNT, + "Z_STEPPER_ALIGN_STEPPER_XY requires three {X,Y} entries (one per Z stepper)." + ); + #endif + #endif #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) @@ -2483,3 +2530,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #undef _PIN_CONFLICT #endif + +#if !HAS_GRAPHICAL_LCD + #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) + #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." + #elif ENABLED(SHOW_REMAINING_TIME) + #error "SHOW_REMAINING_TIME currently requires a Graphical LCD." + #endif +#endif diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index e3babe9ad2..725b33b161 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,80 +19,104 @@ * along with this program. If not, see . * */ - #pragma once -#include "../core/macros.h" // for ENABLED +/** + * Release version. Leave the Marlin version or apply a custom scheme. + */ +#ifndef SHORT_BUILD_VERSION + #define SHORT_BUILD_VERSION "bugfix-2.0.x" +#endif /** - * This file is the standard Marlin version identifier file. - * Use -DUSE_AUTOMATIC_VERSIONING=1 and a custom _Version.h - * to override these values. + * Verbose version identifier containing a unique identifier, such as the + * vendor name, download location, GitHub account, etc. + */ +#ifndef DETAILED_BUILD_VERSION + #define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " (GitHub)" +#endif + +/** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ +#ifndef STRING_DISTRIBUTION_DATE + #define STRING_DISTRIBUTION_DATE "2019-10-18" +#endif + +/** + * Minimum Configuration.h and Configuration_adv.h file versions. + * Set based on the release version number. Used to catch an attempt to use + * older configurations. Override these if using a custom versioning scheme + * to alert users to major changes. */ -#if ENABLED(USE_AUTOMATIC_VERSIONING) +#define MARLIN_HEX_VERSION 020000 +#ifndef REQUIRED_CONFIGURATION_H_VERSION + #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION +#endif +#ifndef REQUIRED_CONFIGURATION_ADV_H_VERSION + #define REQUIRED_CONFIGURATION_ADV_H_VERSION MARLIN_HEX_VERSION +#endif - #include "_Version.h" - -#else - - /** - * Marlin release version identifier - */ - #define SHORT_BUILD_VERSION "2.0.x_SX4G" - - /** - * Verbose version identifier which should contain a reference to the location - * from where the binary was downloaded or the source code was compiled. - */ - #define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " TM3D" - - /** - * The STRING_DISTRIBUTION_DATE represents when the binary file was built, - * here we define this default string as the date where the latest release - * version was tagged. - */ - #define STRING_DISTRIBUTION_DATE "2019-09-28" - - /** - * Required minimum Configuration.h and Configuration_adv.h file versions. - * - * You must increment this version number for every significant change such as, - * but not limited to: ADD, DELETE RENAME OR REPURPOSE any directive/option on - * the configuration files. - */ - #define REQUIRED_CONFIGURATION_H_VERSION 020000 - #define REQUIRED_CONFIGURATION_ADV_H_VERSION 020000 - - /** - * The protocol for communication to the host. Protocol indicates communication - * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. - * (Other behaviors are given by the firmware version and capabilities report.) - */ +/** + * The protocol for communication to the host. Protocol indicates communication + * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. + * (Other behaviors are given by the firmware version and capabilities report.) + */ +#ifndef PROTOCOL_VERSION #define PROTOCOL_VERSION "1.0" +#endif - /** - * Defines a generic printer name to be output to the LCD after booting Marlin. - */ - #define MACHINE_NAME "TM3D SX4" +/** + * Define a generic printer name to be output to the LCD after booting Marlin. + */ +#ifndef MACHINE_NAME + #define MACHINE_NAME "3D Printer" +#endif - /** - * The SOURCE_CODE_URL is the location where users will find the Marlin Source - * Code which is installed on the device. In most cases —unless the manufacturer - * has a distinct Github fork— the Source Code URL should just be the main - * Marlin repository. - */ - #define SOURCE_CODE_URL "https://github.com/InsanityAutomation/Marlin/tree/TM_SX4_2.0" +/** + * Website where users can find Marlin source code for the binary installed on the + * device. Override this if you provide public source code download. (GPLv3 requires + * providing the source code to your customers.) + */ +#ifndef SOURCE_CODE_URL + #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" +#endif - /** - * Default generic printer UUID. - */ +/** + * Default generic printer UUID. + */ +#ifndef DEFAULT_MACHINE_UUID #define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" +#endif /** * The WEBSITE_URL is the location where users can get more information such as - * documentation about a specific Marlin release. + * documentation about a specific Marlin release. Displayed in the Info Menu. */ - #define WEBSITE_URL "tinymachines3d.com" +#ifndef WEBSITE_URL + #define WEBSITE_URL "http://marlinfw.org" +#endif -#endif // USE_AUTOMATIC_VERSIONING +/** + * Set the vendor info the serial USB interface, if changable + * Currently only supported by DUE platform + */ +#ifndef USB_DEVICE_VENDOR_ID + #define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ +#endif +#ifndef USB_DEVICE_PRODUCT_ID + #define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ +#endif +//! USB Device string definitions (Optional) +#ifndef USB_DEVICE_MANUFACTURE_NAME + #define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL +#endif +#ifdef CUSTOM_MACHINE_NAME + #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME +#else + #define USB_DEVICE_PRODUCT_NAME MACHINE_NAME +#endif +#define USB_DEVICE_SERIAL_NAME "123985739853" diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 1465637504..83b218aec3 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -484,9 +484,9 @@ void MarlinUI::draw_kill_screen() { lcd_put_u8str(0, 0, status_message); lcd_uint_t y = 2; #if LCD_HEIGHT >= 4 - lcd_put_u8str_P(0, y++, PSTR(MSG_HALTED)); + lcd_put_u8str_P(0, y++, GET_TEXT(MSG_HALTED)); #endif - lcd_put_u8str_P(0, y, PSTR(MSG_PLEASE_RESET)); + lcd_put_u8str_P(0, y, GET_TEXT(MSG_PLEASE_RESET)); } // @@ -566,7 +566,7 @@ FORCE_INLINE void _draw_bed_status(const bool blink) { #if HAS_PRINT_PROGRESS FORCE_INLINE void _draw_print_progress() { - const uint8_t progress = ui.get_progress(); + const uint8_t progress = ui.get_progress_percent(); lcd_put_u8str_P(PSTR( #if ENABLED(SDSUPPORT) "SD" @@ -613,7 +613,7 @@ void MarlinUI::draw_status_message(const bool blink) { // Draw the progress bar if the message has shown long enough // or if there is no message set. if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { - const uint8_t progress = get_progress(); + const uint8_t progress = get_progress_percent(); if (progress > 2) return draw_progress_bar(progress); } @@ -817,11 +817,10 @@ void MarlinUI::draw_status_screen() { #else - _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); - + xy_pos_t lpos = current_position; toLogical(lpos); + _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); lcd_put_wchar(' '); - - _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); + _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); #endif @@ -830,7 +829,7 @@ void MarlinUI::draw_status_screen() { #endif // LCD_WIDTH >= 20 lcd_moveto(LCD_WIDTH - 8, 1); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); #if HAS_LEVELING && !HAS_HEATED_BED lcd_put_wchar(planner.leveling_active || blink ? '_' : ' '); @@ -862,7 +861,7 @@ void MarlinUI::draw_status_screen() { uint16_t per; #if HAS_FAN0 if (true - #if EXTRUDERS + #if EXTRUDERS && ENABLED(ADAPTIVE_FAN_SLOWING) && (blink || thermalManager.fan_speed_scaler[0] < 128) #endif ) { @@ -902,7 +901,7 @@ void MarlinUI::draw_status_screen() { // Z Coordinate // lcd_moveto(LCD_WIDTH - 9, 0); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); #if HAS_LEVELING && (HOTENDS > 1 || !HAS_HEATED_BED) lcd_put_wchar(LCD_WIDTH - 1, 0, planner.leveling_active || blink ? '_' : ' '); @@ -978,7 +977,7 @@ void MarlinUI::draw_status_screen() { #endif // ADVANCED_PAUSE_FEATURE - void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_CENTER*/, const char * const valstr/*=nullptr*/) { + void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { int8_t n = LCD_WIDTH; lcd_moveto(0, row); if ((style & SS_CENTER) && !valstr) { @@ -1189,10 +1188,9 @@ void MarlinUI::draw_status_screen() { * Show X and Y positions */ _XLABEL(_PLOT_X, 0); - lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); - + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); _YLABEL(_LCD_W_POS, 0); - lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); lcd_moveto(_PLOT_X, 0); @@ -1395,9 +1393,9 @@ void MarlinUI::draw_status_screen() { * Show all values at right of screen */ _XLABEL(_LCD_W_POS, 1); - lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); _YLABEL(_LCD_W_POS, 2); - lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); /** * Show the location value diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index a09e778809..d0de7da976 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -1232,7 +1232,7 @@ #define _HEATERS_WIDTH (HOTENDS * (STATUS_HEATERS_XSPACE)) // as many hotends as possible #elif STATUS_HEATERS_WIDTH #define _HEATERS_WIDTH STATUS_HEATERS_WIDTH - #else + #elif HOTENDS #error "Status screen heaters region was not specified." #endif #if STATUS_LOGO_WIDTH > (LCD_PIXEL_WIDTH - (_EXTRA_WIDTH + _HEATERS_WIDTH)) diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el-gr.h b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h similarity index 100% rename from Marlin/src/lcd/dogm/fontdata/langdata_el-gr.h rename to Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_jp-kana.h b/Marlin/src/lcd/dogm/fontdata/langdata_jp-kana.h deleted file mode 100644 index e2ff9129b4..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_jp-kana.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_97_161_164[61] U8G_FONT_SECTION("fontpage_97_161_164") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa4,0x00,0x06,0x00,0x00, - 0x00,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x05,0x06,0x06,0x06,0x00, - 0x00,0xf8,0x08,0x28,0x30,0x20,0x40,0x03,0x04,0x04,0x06,0x01,0x00,0x20,0x40,0xc0, - 0x40,0x04,0x06,0x06,0x06,0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x20}; -const u8g_fntpgm_uint8_t fontpage_97_166_166[29] U8G_FONT_SECTION("fontpage_97_166_166") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x88,0x08,0x10,0x20}; -const u8g_fntpgm_uint8_t fontpage_97_168_168[28] U8G_FONT_SECTION("fontpage_97_168_168") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0xf8}; -const u8g_fntpgm_uint8_t fontpage_97_170_181[167] U8G_FONT_SECTION("fontpage_97_170_181") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xb5,0x00,0x08,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xf8,0x30,0x50,0x90,0x10,0x05,0x06,0x06, - 0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x28, - 0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20, - 0xf8,0x20,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xf8,0x20, - 0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x07,0x07,0x06, - 0x00,0x00,0x28,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0x40, - 0x78,0x90,0x10,0x10,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x40,0x78,0x90, - 0x10,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x07, - 0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xf8,0x50,0x10,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_97_183_187[77] U8G_FONT_SECTION("fontpage_97_183_187") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xbb,0x00,0x07,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x07,0x07,0x06, - 0x00,0x00,0x28,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, - 0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x10,0x20,0x50, - 0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x38}; -const u8g_fntpgm_uint8_t fontpage_97_189_193[77] U8G_FONT_SECTION("fontpage_97_189_193") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xc1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x07,0x07,0x06, - 0x00,0x00,0x28,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x78, - 0x48,0xa8,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x78,0x48,0xa8,0x10, - 0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_97_195_196[38] U8G_FONT_SECTION("fontpage_97_195_196") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc4,0x00,0x05,0x00,0x00, - 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x05,0x05,0x06,0x00, - 0x00,0xa8,0xa8,0x08,0x10,0x20}; -const u8g_fntpgm_uint8_t fontpage_97_198_211[190] U8G_FONT_SECTION("fontpage_97_198_211") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xd3,0x00,0x08,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x05,0x08,0x08, - 0x06,0x00,0x00,0x28,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x03,0x06,0x06,0x06,0x01, - 0x00,0x80,0x80,0xc0,0xa0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x50,0x00,0x80, - 0x80,0xc0,0xa0,0x80,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0x20,0x40, - 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x08,0x50,0x20,0xd0,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x10, - 0x20,0x70,0xa8,0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x20,0x40,0x80,0x05, - 0x05,0x05,0x06,0x00,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, - 0x28,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00, - 0x10,0x88,0x88,0x88,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0xf8,0x80,0x80, - 0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x80,0x80,0xf8,0x80,0x80,0x78}; -const u8g_fntpgm_uint8_t fontpage_97_213_217[77] U8G_FONT_SECTION("fontpage_97_213_217") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd9,0x00,0x08,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x07,0x07,0x06, - 0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x08,0x08,0x06,0x00,0x00,0x18, - 0x18,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x04,0x04,0x06,0x00,0x01,0x40,0xa0,0x10, - 0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x28,0x00,0x40,0xa0,0x10,0x08}; -const u8g_fntpgm_uint8_t fontpage_97_219_220[43] U8G_FONT_SECTION("fontpage_97_219_220") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdc,0x00,0x08,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08, - 0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20}; -const u8g_fntpgm_uint8_t fontpage_97_222_223[39] U8G_FONT_SECTION("fontpage_97_222_223") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x50,0x20,0x10,0x04,0x05,0x05,0x06, - 0x01,0x00,0xe0,0x00,0xe0,0x00,0xf0}; -const u8g_fntpgm_uint8_t fontpage_97_225_226[39] U8G_FONT_SECTION("fontpage_97_225_226") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe2,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x28,0x10,0x28,0xc0,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x40,0xf8,0x40,0x38}; -const u8g_fntpgm_uint8_t fontpage_97_228_229[39] U8G_FONT_SECTION("fontpage_97_228_229") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x40,0x04,0x04,0x04, - 0x06,0x00,0x00,0x60,0x20,0x20,0xf0}; -const u8g_fntpgm_uint8_t fontpage_97_231_237[96] U8G_FONT_SECTION("fontpage_97_231_237") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xed,0x00,0x06,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0xf0,0x10,0xf0,0x05,0x05,0x05,0x06, - 0x00,0x00,0xf8,0x08,0xf8,0x08,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8, - 0x08,0x10,0x20,0x04,0x06,0x06,0x06,0x00,0x00,0x90,0x90,0x90,0x90,0x10,0x20,0x05, - 0x05,0x05,0x06,0x00,0x00,0x20,0xa0,0xa8,0xa8,0xb0,0x04,0x05,0x05,0x06,0x00,0x00, - 0x80,0x80,0x90,0xa0,0xc0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0xf8 - }; -const u8g_fntpgm_uint8_t fontpage_97_242_243[39] U8G_FONT_SECTION("fontpage_97_242_243") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf3,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x30,0x05,0x05,0x05,0x06, - 0x00,0x00,0xc0,0x08,0x08,0x10,0xe0}; -const u8g_fntpgm_uint8_t fontpage_97_252_252[24] U8G_FONT_SECTION("fontpage_97_252_252") = { - 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x03,0x00,0x00, - 0x00,0x05,0x01,0x01,0x06,0x00,0x02,0xf8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ' - FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' - FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' - FONTDATA_ITEM(97, 170, 181, fontpage_97_170_181), // 'オ' -- 'サ' - FONTDATA_ITEM(97, 183, 187, fontpage_97_183_187), // 'シ' -- 'セ' - FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ' - FONTDATA_ITEM(97, 195, 196, fontpage_97_195_196), // 'ッ' -- 'ツ' - FONTDATA_ITEM(97, 198, 211, fontpage_97_198_211), // 'テ' -- 'ビ' - FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' - FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' - FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' - FONTDATA_ITEM(97, 225, 226, fontpage_97_225_226), // 'メ' -- 'モ' - FONTDATA_ITEM(97, 228, 229, fontpage_97_228_229), // 'ヤ' -- 'ュ' - FONTDATA_ITEM(97, 231, 237, fontpage_97_231_237), // 'ョ' -- 'ロ' - FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' - FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h new file mode 100644 index 0000000000..97d82c0293 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h @@ -0,0 +1,111 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_97_161_164[65] U8G_FONT_SECTION("fontpage_97_161_164") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa4,0x00,0x07,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x10, + 0x20,0x60,0xa0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20,0x60,0xa0,0x20, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_97_166_166[30] U8G_FONT_SECTION("fontpage_97_166_166") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x88,0x88,0x08,0x10,0x60}; +const u8g_fntpgm_uint8_t fontpage_97_168_168[29] U8G_FONT_SECTION("fontpage_97_168_168") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0xf8}; +const u8g_fntpgm_uint8_t fontpage_97_170_187[268] U8G_FONT_SECTION("fontpage_97_170_187") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xbb,0x00,0x0d,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xf8,0x10,0x30,0x50,0x90,0x10,0x05,0x07, + 0x07,0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00, + 0x00,0x28,0x08,0x40,0xf8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xf8,0x20,0x20,0xf8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20, + 0xf8,0x20,0x20,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88, + 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x80,0xf8,0x90,0x90,0x10,0x10,0x20,0x05,0x06, + 0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x08,0xf8,0x05,0x09,0x09,0x06,0x00,0x00, + 0x28,0x28,0x00,0xf8,0x08,0x08,0x08,0x08,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x50, + 0xf8,0x50,0x50,0x50,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xf8, + 0x50,0x50,0x50,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xc0,0x08,0xc8,0x08,0x10, + 0xe0,0x07,0x0d,0x0d,0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xc0,0x08, + 0xc8,0x08,0x10,0xe0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88, + 0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf8,0x48,0x50,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_189_193[85] U8G_FONT_SECTION("fontpage_97_189_193") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xc1,0x00,0x09,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x09,0x09, + 0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0x78,0x48,0xa8,0x18,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28, + 0x08,0x40,0x78,0x48,0xa8,0x18,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60, + 0x20,0xf8,0x20,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_195_211[241] U8G_FONT_SECTION("fontpage_97_195_211") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xd3,0x00,0x09,0x00,0x00, + 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x06,0x06,0x06,0x00, + 0x00,0xa8,0xa8,0xa8,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, + 0xa8,0xa8,0xa8,0x08,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xf8,0x20, + 0x20,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xf8,0x20,0x20, + 0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x04, + 0x09,0x09,0x06,0x01,0x00,0x50,0x10,0x80,0x80,0xc0,0xa0,0x90,0x80,0x80,0x05,0x07, + 0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00, + 0x00,0x70,0x00,0x00,0x00,0x00,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28, + 0x10,0x28,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xa8,0x20, + 0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06, + 0x00,0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, + 0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, + 0x10,0x50,0x50,0x48,0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xe0,0x80, + 0x80,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xe0,0x80,0x80, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_97_213_217[84] U8G_FONT_SECTION("fontpage_97_213_217") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd9,0x00,0x09,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09, + 0x06,0x00,0x00,0x28,0x28,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06, + 0x00,0x00,0x18,0x18,0x00,0xf8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00, + 0x01,0x60,0xa0,0x10,0x10,0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60, + 0xa0,0x10,0x10,0x08}; +const u8g_fntpgm_uint8_t fontpage_97_219_220[45] U8G_FONT_SECTION("fontpage_97_219_220") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdc,0x00,0x09,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xf8,0x20,0xa8,0xa8,0xa8,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_222_223[41] U8G_FONT_SECTION("fontpage_97_222_223") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x50,0x20,0x10,0x04,0x06,0x06, + 0x06,0x01,0x00,0xe0,0x00,0xe0,0x00,0xc0,0x30}; +const u8g_fntpgm_uint8_t fontpage_97_225_237[174] U8G_FONT_SECTION("fontpage_97_225_237") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xed,0x00,0x07,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xc0,0x05,0x06,0x06, + 0x06,0x00,0x00,0xf0,0x40,0xf8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40, + 0xf8,0x48,0x50,0x40,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf8,0x48,0x50,0x40, + 0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xf0,0x05,0x06,0x06,0x06, + 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10, + 0xf0,0x10,0xf0,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x08,0xf8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xf8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06, + 0x00,0x00,0x10,0x90,0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x20,0xa0,0xa0,0xa8,0xa8,0xb0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88, + 0xb0,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0xf8}; +const u8g_fntpgm_uint8_t fontpage_97_242_243[41] U8G_FONT_SECTION("fontpage_97_242_243") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf3,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x10,0x60,0x05,0x06,0x06, + 0x06,0x00,0x00,0xc0,0x08,0x08,0x08,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_97_252_252[25] U8G_FONT_SECTION("fontpage_97_252_252") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x05,0x00,0x00, + 0x00,0x05,0x02,0x02,0x06,0x00,0x03,0x80,0x78}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ' + FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' + FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' + FONTDATA_ITEM(97, 170, 187, fontpage_97_170_187), // 'オ' -- 'セ' + FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ' + FONTDATA_ITEM(97, 195, 211, fontpage_97_195_211), // 'ッ' -- 'ビ' + FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' + FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' + FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' + FONTDATA_ITEM(97, 225, 237, fontpage_97_225_237), // 'メ' -- 'ロ' + FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' + FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pt-br.h b/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h similarity index 100% rename from Marlin/src/lcd/dogm/fontdata/langdata_pt-br.h rename to Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index e9023515cf..e5ff034132 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -99,6 +99,9 @@ #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) +#define PROGRESS_BAR_X 54 +#define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) + #if ENABLED(MARLIN_DEV_MODE) #define SHOW_ON_STATE READ(X_MIN_PIN) #else @@ -257,7 +260,7 @@ FORCE_INLINE void _draw_heater_status(const heater_ind_t heater, const bool blin FORCE_INLINE void _draw_chamber_status(const bool blink) { #if ENABLED(MARLIN_DEV_MODE) - const float temp = 10 + (millis() >> 8) % CHAMBER_MAXTEMP, + const float temp = 10 + (millis() >> 8) % CHAMBER_MAXTEMP, target = CHAMBER_MAXTEMP; #else const float temp = thermalManager.degChamber(); @@ -330,6 +333,26 @@ void MarlinUI::draw_status_screen() { static char wstring[5], mstring[4]; #endif + #if HAS_PRINT_PROGRESS + #if DISABLED(DOGM_SD_PERCENT) + #define _SD_DURATION_X(len) (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH) / 2 - (len) * (MENU_FONT_WIDTH) / 2) + #else + #define _SD_DURATION_X(len) (LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH)) + #endif + + static uint8_t progress_bar_solid_width = 0, lastProgress = 0; + #if ENABLED(DOGM_SD_PERCENT) + static char progress_string[5]; + #endif + static uint8_t lastElapsed = 0, elapsed_x_pos = 0; + static char elapsed_string[16]; + #if ENABLED(SHOW_REMAINING_TIME) + #define SHOW_REMAINING_TIME_PREFIX 'E' + static uint8_t estimation_x_pos = 0; + static char estimation_string[10]; + #endif + #endif + // At the first page, generate new display values if (first_page) { #if ANIM_HBC @@ -345,13 +368,58 @@ void MarlinUI::draw_status_screen() { #endif heat_bits = new_bits; #endif - strcpy(xstring, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS]))); - strcpy(ystring, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS]))); - strcpy(zstring, ftostr52sp( LOGICAL_Z_POSITION(current_position[Z_AXIS]))); + const xyz_pos_t lpos = current_position.asLogical(); + strcpy(xstring, ftostr4sign(lpos.x)); + strcpy(ystring, ftostr4sign(lpos.y)); + strcpy(zstring, ftostr52sp( lpos.z)); #if ENABLED(FILAMENT_LCD_DISPLAY) strcpy(wstring, ftostr12ns(filwidth.measured_mm)); strcpy(mstring, i16tostr3(planner.volumetric_percent(parser.volumetric_enabled))); #endif + + // Progress / elapsed / estimation updates and string formatting to avoid float math on each LCD draw + #if HAS_PRINT_PROGRESS + const progress_t progress = + #if HAS_PRINT_PROGRESS_PERMYRIAD + get_progress_permyriad() + #else + get_progress_percent() + #endif + ; + duration_t elapsed = print_job_timer.duration(); + const uint8_t p = progress & 0xFF, ev = elapsed.value & 0xFF; + if (progress > 1 && p != lastProgress) { + lastProgress = p; + + progress_bar_solid_width = uint8_t((PROGRESS_BAR_WIDTH - 2) * progress / (PROGRESS_SCALE) * 0.01f); + + #if ENABLED(DOGM_SD_PERCENT) + strcpy(progress_string, ( + #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) + permyriadtostr4(progress) + #else + ui8tostr3(progress / (PROGRESS_SCALE)) + #endif + )); + #endif + } + + if (ev != lastElapsed) { + lastElapsed = ev; + const bool has_days = (elapsed.value >= 60*60*24L); + const uint8_t len = elapsed.toDigital(elapsed_string, has_days); + elapsed_x_pos = _SD_DURATION_X(len); + + #if ENABLED(SHOW_REMAINING_TIME) + if (!(ev & 0x3)) { + duration_t estimation = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + const bool has_days = (estimation.value >= 60*60*24L); + const uint8_t len = estimation.toDigital(estimation_string, has_days); + estimation_x_pos = _SD_DURATION_X(len + 1); + } + #endif + } + #endif } const bool blink = get_blink(); @@ -484,55 +552,44 @@ void MarlinUI::draw_status_screen() { // // Progress bar frame // - #define PROGRESS_BAR_X 54 - #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) if (PAGE_CONTAINS(49, 52)) u8g.drawFrame(PROGRESS_BAR_X, 49, PROGRESS_BAR_WIDTH, 4); - const uint8_t progress = get_progress(); + // + // Progress bar solid part + // - if (progress > 1) { + if (PAGE_CONTAINS(50, 51)) // 50-51 (or just 50) + u8g.drawBox(PROGRESS_BAR_X + 1, 50, progress_bar_solid_width, 2); - // - // Progress bar solid part - // + // + // SD Percent Complete + // - if (PAGE_CONTAINS(50, 51)) // 50-51 (or just 50) - u8g.drawBox( - PROGRESS_BAR_X + 1, 50, - (uint16_t)((PROGRESS_BAR_WIDTH - 2) * progress * 0.01), 2 - ); - - // - // SD Percent Complete - // - - #if ENABLED(DOGM_SD_PERCENT) + #if ENABLED(DOGM_SD_PERCENT) + if (progress_string[0] != '\0') if (PAGE_CONTAINS(41, 48)) { // Percent complete - lcd_put_u8str(55, 48, ui8tostr3(progress)); + lcd_put_u8str(55, 48, progress_string); lcd_put_wchar('%'); } - #endif - } + #endif // // Elapsed Time // - #if DISABLED(DOGM_SD_PERCENT) - #define SD_DURATION_X (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH / 2) - len * (MENU_FONT_WIDTH / 2)) - #else - #define SD_DURATION_X (LCD_PIXEL_WIDTH - len * MENU_FONT_WIDTH) - #endif - if (PAGE_CONTAINS(EXTRAS_BASELINE - INFO_FONT_ASCENT, EXTRAS_BASELINE - 1)) { - char buffer[13]; - duration_t elapsed = print_job_timer.duration(); - bool has_days = (elapsed.value >= 60*60*24L); - uint8_t len = elapsed.toDigital(buffer, has_days); - lcd_put_u8str(SD_DURATION_X, EXTRAS_BASELINE, buffer); + + #if ENABLED(SHOW_REMAINING_TIME) + if (blink && (estimation_string[0] != '\0')) { + lcd_put_wchar(estimation_x_pos, EXTRAS_BASELINE, SHOW_REMAINING_TIME_PREFIX); + lcd_put_u8str(estimation_string); + } + else + #endif + lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); } #endif // HAS_PRINT_PROGRESS diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 660cf07673..7308201dc5 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -660,7 +660,7 @@ void ST7920_Lite_Status_Screen::draw_status_message() { #endif } -void ST7920_Lite_Status_Screen::draw_position(const float (&pos)[XYZE], const bool position_known) { +void ST7920_Lite_Status_Screen::draw_position(const xyz_pos_t &pos, const bool position_known) { char str[7]; set_ddram_address(DDRAM_LINE_4); begin_data(); @@ -669,13 +669,13 @@ void ST7920_Lite_Status_Screen::draw_position(const float (&pos)[XYZE], const bo const unsigned char alt_label = position_known ? 0 : (ui.get_blink() ? ' ' : 0); write_byte(alt_label ? alt_label : 'X'); - write_str(dtostrf(pos[X_AXIS], -4, 0, str), 4); + write_str(dtostrf(pos.x, -4, 0, str), 4); write_byte(alt_label ? alt_label : 'Y'); - write_str(dtostrf(pos[Y_AXIS], -4, 0, str), 4); + write_str(dtostrf(pos.y, -4, 0, str), 4); write_byte(alt_label ? alt_label : 'Z'); - write_str(dtostrf(pos[Z_AXIS], -5, 1, str), 5); + write_str(dtostrf(pos.z, -5, 1, str), 5); } bool ST7920_Lite_Status_Screen::indicators_changed() { @@ -750,8 +750,8 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { } bool ST7920_Lite_Status_Screen::position_changed() { - const float x_pos = current_position[X_AXIS], y_pos = current_position[Y_AXIS], z_pos = current_position[Z_AXIS]; - const uint8_t checksum = uint8_t(x_pos) ^ uint8_t(y_pos) ^ uint8_t(z_pos); + const xyz_pos_t pos = current_position; + const uint8_t checksum = uint8_t(pos.x) ^ uint8_t(pos.y) ^ uint8_t(pos.z); static uint8_t last_checksum = 0, changed = last_checksum != checksum; if (changed) last_checksum = checksum; return changed; @@ -850,7 +850,7 @@ void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { // when an update is actually necessary. static uint8_t last_progress = 0; - const uint8_t progress = ui.get_progress(); + const uint8_t progress = ui.get_progress_percent(); if (forceUpdate || last_progress != progress) { last_progress = progress; draw_progress_bar(progress); diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index 18a5ed77f2..754c9933e7 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -17,6 +17,7 @@ #include "../../HAL/shared/HAL_ST7920.h" +#include "../../core/types.h" #include "../../core/macros.h" #include "../../libs/duration_t.h" @@ -86,7 +87,7 @@ class ST7920_Lite_Status_Screen { static void draw_print_time(const duration_t &elapsed); static void draw_feedrate_percentage(const uint16_t percentage); static void draw_status_message(); - static void draw_position(const float (&pos)[XYZE], bool position_known = true); + static void draw_position(const xyz_pos_t &pos, bool position_known = true); static bool indicators_changed(); static bool position_changed(); diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index 5a1326daf9..1e12ba84d0 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -130,10 +130,12 @@ static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { UC1701_INDICATOR(0), // indicator disable UC1701_ON(1), // display on UC1701_COLUMN_HI(0), // set upper 4 bit of the col adr to 0 + U8G_ESC_END, // end of sequence + U8G_ESC_DLY(5) // delay 5 ms #else UC1701_COLUMN_ADR(0), // address 0 + U8G_ESC_END // end of sequence #endif - U8G_ESC_END // end of sequence }; uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -170,9 +172,6 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); - #if ENABLED(MKS_MINI_12864) - u8g_Delay(5); - #endif break; case U8G_DEV_MSG_STOP: break; @@ -180,17 +179,11 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - #if ENABLED(MKS_MINI_12864) - u8g_Delay(5); - #endif u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ u8g_SetAddress(u8g, dev, 1); /* data mode */ u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - #if ENABLED(MKS_MINI_12864) - u8g_Delay(5); - #endif u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ u8g_SetAddress(u8g, dev, 1); /* data mode */ u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); @@ -199,16 +192,10 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - #if ENABLED(MKS_MINI_12864) - u8g_Delay(5); - #endif u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); - #if ENABLED(MKS_MINI_12864) - u8g_Delay(5); - #endif return 1; } return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 7eb51eea4d..9f08643e76 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -300,8 +300,8 @@ void MarlinUI::draw_kill_screen() { do { set_font(FONT_MENU); lcd_put_u8str(0, h4 * 1, status_message); - lcd_put_u8str_P(0, h4 * 2, PSTR(MSG_HALTED)); - lcd_put_u8str_P(0, h4 * 3, PSTR(MSG_PLEASE_RESET)); + lcd_put_u8str_P(0, h4 * 2, GET_TEXT(MSG_HALTED)); + lcd_put_u8str_P(0, h4 * 3, GET_TEXT(MSG_PLEASE_RESET)); } while (u8g.nextPage()); } @@ -363,9 +363,9 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a static line of text in the same idiom as a menu item - void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_CENTER*/, const char * const valstr/*=nullptr*/) { + void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { - if (mark_as_selected(row, (style & SS_INVERT))) { + if (mark_as_selected(row, style & SS_INVERT)) { u8g_uint_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed @@ -547,10 +547,12 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Show X and Y positions at top of screen u8g.setColorIndex(1); if (PAGE_UNDER(7)) { + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); lcd_put_u8str(5, 7, "X:"); - lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd_put_u8str(ftostr52(lpos.x)); lcd_put_u8str(74, 7, "Y:"); - lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + lcd_put_u8str(ftostr52(lpos.y)); } // Print plot position diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index e8d1b8a1e3..8ff2dbc85b 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -82,7 +82,7 @@ // MaKrPanel, Mini Viki, Viki 2.0, AZSMZ 12864 ST7565 controller - #define SMART_RAMPS (MB(RAMPS_SMART_EFB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_SMART_EFF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_SMART_SF)) + #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN #define FORCE_SOFT_SPI // SW-SPI diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h index 960375ae43..858cbe8824 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h @@ -49,11 +49,11 @@ #define CPU_ST7920_DELAY_1 DELAY_NS(0) #define CPU_ST7920_DELAY_2 DELAY_NS(0) #define CPU_ST7920_DELAY_3 DELAY_NS(50) -#elif MB(3DRAG) || MB(K8200) || MB(K8400) || MB(SILVER_GATE) +#elif MB(3DRAG, K8200, K8400, SILVER_GATE) #define CPU_ST7920_DELAY_1 DELAY_NS(0) #define CPU_ST7920_DELAY_2 DELAY_NS(188) #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(MINIRAMBO) || MB(EINSY_RAMBO) || MB(EINSY_RETRO) +#elif MB(MINIRAMBO, EINSY_RAMBO, EINSY_RETRO) #define CPU_ST7920_DELAY_1 DELAY_NS(0) #define CPU_ST7920_DELAY_2 DELAY_NS(250) #define CPU_ST7920_DELAY_3 DELAY_NS(0) diff --git a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp index 1fb3783b2d..c669294125 100644 --- a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp @@ -289,11 +289,11 @@ void DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable // Don't let the user in the dark why there is no reaction. if (!ExtUI::isMediaInserted()) { - setstatusmessagePGM(PSTR(MSG_NO_MEDIA)); + setstatusmessagePGM(GET_TEXT(MSG_NO_MEDIA)); return; } if (card.flag.abort_sd_printing) { - setstatusmessagePGM(PSTR(MSG_MEDIA_ABORTING)); + setstatusmessagePGM(GET_TEXT(MSG_MEDIA_ABORTING)); return; } } @@ -472,13 +472,13 @@ void DGUSScreenVariableHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, switch (var.VP) { default: return; #if HOTENDS >= 1 - case VP_T_E1_Set: + case VP_T_E0_Set: thermalManager.setTargetHotend(newvalue, 0); acceptedvalue = thermalManager.temp_hotend[0].target; break; #endif #if HOTENDS >= 2 - case VP_T_E2_Set: + case VP_T_E1_Set: thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.temp_hotend[1].target; break; @@ -503,10 +503,10 @@ void DGUSScreenVariableHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, voi switch (var.VP) { default: return; #if (HOTENDS >= 1) - case VP_Flowrate_E1: target_extruder = 0; break; + case VP_Flowrate_E0: target_extruder = 0; break; #endif #if (HOTENDS >= 2) - case VP_Flowrate_E2: target_extruder = 1; break; + case VP_Flowrate_E1: target_extruder = 1; break; #endif } @@ -526,11 +526,11 @@ void DGUSScreenVariableHandler::HandleManualExtrude(DGUS_VP_Variable &var, void ExtUI::extruder_t target_extruder; switch (var.VP) { - #if HOTENDS >=1 - case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E0; break; + #if HOTENDS >= 1 + case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; #endif - #if HOTENDS >=2 - case VP_MOVE_E2: target_extruder = ExtUI::extruder_t::E1; break + #if HOTENDS >= 2 + case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break #endif default: return; } diff --git a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.cpp b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.cpp index 1ac5270c4b..de15d54597 100644 --- a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.cpp @@ -46,10 +46,10 @@ const uint16_t VPList_Main[] PROGMEM = { const uint16_t VPList_Temp[] PROGMEM = { #if HOTENDS >= 1 - VP_T_E1_Is, VP_T_E1_Set, + VP_T_E0_Is, VP_T_E0_Set, #endif #if HOTENDS >= 2 - VP_T_E2_I, VP_T_E2_S, + VP_T_E1_I, VP_T_E1_S, #endif #if HAS_HEATED_BED VP_T_Bed_Is, VP_T_Bed_Set, @@ -60,10 +60,10 @@ const uint16_t VPList_Temp[] PROGMEM = { const uint16_t VPList_Status[] PROGMEM = { /* VP_M117, for completeness, but it cannot be auto-uploaded */ #if HOTENDS >= 1 - VP_T_E1_Is, VP_T_E1_Set, + VP_T_E0_Is, VP_T_E0_Set, #endif #if HOTENDS >= 2 - VP_T_E2_I, VP_T_E2_S, + VP_T_E1_I, VP_T_E1_S, #endif #if HAS_HEATED_BED VP_T_Bed_Is, VP_T_Bed_Set, @@ -81,10 +81,10 @@ const uint16_t VPList_Status[] PROGMEM = { const uint16_t VPList_Status2[] PROGMEM = { /* VP_M117, for completeness, but it cannot be auto-uploaded */ #if HOTENDS >= 1 - VP_Flowrate_E1, + VP_Flowrate_E0, #endif #if HOTENDS >= 2 - VP_Flowrate_E2, + VP_Flowrate_E1, #endif VP_PrintProgress_Percentage, VP_PrintTime, @@ -107,7 +107,7 @@ const uint16_t VPList_FanAndFeedrate[] PROGMEM = { }; const uint16_t VPList_SD_FlowRates[] PROGMEM = { - VP_Flowrate_E1, VP_Flowrate_E2, + VP_Flowrate_E0, VP_Flowrate_E1, 0x0000 }; @@ -166,17 +166,17 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[0].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[0].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination[3], nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E1, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E2_I, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E2_S, &thermalManager.temp_hotend[1].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E2, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E2, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), + VPHELPER(VP_T_E1_I, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_S, &thermalManager.temp_hotend[1].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), #endif #if HOTENDS >= 3 #error More than 2 Hotends currently not implemented on the Display UI design. @@ -195,12 +195,12 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, DGUSScreenVariableHandler::DGUSLCD_SetValueDirectly, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), // Position Data. - VPHELPER(VP_XPos, ¤t_position[0], nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position[1], nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position[2], nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Print Progress. - VPHELPER(VP_PrintProgress_Percentage, &ui.progress_bar_percent, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), + VPHELPER(VP_PrintProgress_Percentage, &ui.progress_override, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), // Print Time VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintTimeToDisplay ), diff --git a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.h b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.h index f54a2938ec..f90cfa948b 100644 --- a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.h +++ b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplayDefinition.h @@ -109,12 +109,12 @@ constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmati constexpr uint16_t VP_MOVE_X = 0x2100; constexpr uint16_t VP_MOVE_Y = 0x2102; constexpr uint16_t VP_MOVE_Z = 0x2104; -constexpr uint16_t VP_MOVE_E1 = 0x2110; -constexpr uint16_t VP_MOVE_E2 = 0x2112; -//constexpr uint16_t VP_MOVE_E3 = 0x2114; -//constexpr uint16_t VP_MOVE_E4 = 0x2116; -//constexpr uint16_t VP_MOVE_E5 = 0x2118; -//constexpr uint16_t VP_MOVE_E6 = 0x211A; +constexpr uint16_t VP_MOVE_E0 = 0x2110; +constexpr uint16_t VP_MOVE_E1 = 0x2112; +//constexpr uint16_t VP_MOVE_E2 = 0x2114; +//constexpr uint16_t VP_MOVE_E3 = 0x2116; +//constexpr uint16_t VP_MOVE_E4 = 0x2118; +//constexpr uint16_t VP_MOVE_E5 = 0x211A; constexpr uint16_t VP_HOME_ALL = 0x2120; // Firmware version on the boot screen. @@ -126,34 +126,34 @@ constexpr uint16_t VP_M117 = 0x3020; constexpr uint8_t VP_M117_LEN = 0x20; // Temperatures. -constexpr uint16_t VP_T_E1_Is = 0x3060; // 4 Byte Integer -constexpr uint16_t VP_T_E1_Set = 0x3062; // 2 Byte Integer -constexpr uint16_t VP_T_E2_Is = 0x3064; // 4 Byte Integer +constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer // reserved to support up to 6 Extruders: -//constexpr uint16_t VP_T_E2_Set = 0x3066; // 2 Byte Integer -//constexpr uint16_t VP_T_E3_Is = 0x3068; // 4 Byte Integer -//constexpr uint16_t VP_T_E3_Set = 0x306A; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x306C; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x306E; // 2 Byte Integer -//constexpr uint16_t VP_T_E5_Is = 0x3070; // 4 Byte Integer -//constexpr uint16_t VP_T_E5_Set = 0x3072; // 2 Byte Integer -//constexpr uint16_t VP_T_E5_Is = 0x3074; // 4 Byte Integer -//constexpr uint16_t VP_T_E5_Set = 0x3076; // 2 Byte Integer -//constexpr uint16_t VP_T_E6_Is = 0x3078; // 4 Byte Integer -//constexpr uint16_t VP_T_E6_Set = 0x307A; // 2 Byte Integer +//constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer +//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer +//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer -constexpr uint16_t VP_Flowrate_E1 = 0x3090; // 2 Byte Integer -constexpr uint16_t VP_Flowrate_E2 = 0x3092; // 2 Byte Integer +constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer // reserved for up to 6 Extruders: -//constexpr uint16_t VP_Flowrate_E3 = 0x3094; -//constexpr uint16_t VP_Flowrate_E4 = 0x3096; -//constexpr uint16_t VP_Flowrate_E5 = 0x3098; -//constexpr uint16_t VP_Flowrate_E6 = 0x309A; +//constexpr uint16_t VP_Flowrate_E2 = 0x3094; +//constexpr uint16_t VP_Flowrate_E3 = 0x3096; +//constexpr uint16_t VP_Flowrate_E4 = 0x3098; +//constexpr uint16_t VP_Flowrate_E5 = 0x309A; constexpr uint16_t VP_Fan_Percentage = 0x3100; // 2 Byte Integer (0..100) constexpr uint16_t VP_Feedrate_Percentage = 0x3102; // 2 Byte Integer (0..100) @@ -182,9 +182,9 @@ constexpr uint16_t VP_SD_FileName4 = 0x3280; // located at 0x5000 and up // Not used yet! // This can be used e.g to make controls / data display invisible -constexpr uint16_t SP_T_E1_Is = 0x5000; -constexpr uint16_t SP_T_E1_Set = 0x5010; -constexpr uint16_t SP_T_E2_Is = 0x5020; +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; constexpr uint16_t SP_T_Bed_Is = 0x5030; constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/compat.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/compat.h index 7e051be75a..90fd615a5d 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/compat.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/compat.h @@ -38,11 +38,6 @@ // __MARLIN_FIRMWARE__ exists when compiled within Marlin. #include "pin_mappings.h" #else - // Messages that are declared in Marlin - #define WELCOME_MSG "Printer Ready" - #define MSG_MEDIA_INSERTED "Media Inserted" - #define MSG_MEDIA_REMOVED "Media Removed" - namespace UI { static inline uint32_t safe_millis() {return millis();}; static inline void yield() {}; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h index a770ebbd24..a6c1f5c918 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h @@ -310,7 +310,9 @@ class CommandProcessor : public CLCD::CommandFifo { int8_t apply_fit_text(int16_t w, int16_t h, T text) { using namespace FTDI; int8_t font = _font; - const bool is_utf8 = has_utf8_chars(text); + #ifdef TOUCH_UI_USE_UTF8 + const bool is_utf8 = has_utf8_chars(text); + #endif for (;font >= 26;) { int16_t width, height; #ifdef TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/dl_cache.cpp index bf8ca61f3a..5e7377e1a0 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/dl_cache.cpp @@ -115,12 +115,12 @@ bool DLCache::store(uint32_t num_bytes /* = 0*/) { // If we are allocating new space... dl_addr = CLCD::mem_read_32(DL_FREE_ADDR); free_space = MAP::RAM_G_SIZE - dl_addr; - dl_alloc = num_bytes ? num_bytes : new_dl_size; + dl_alloc = num_bytes ?: new_dl_size; dl_size = new_dl_size; } else { // Otherwise, we can only store as much space // as was previously allocated. - free_space = num_bytes ? num_bytes : dl_size; + free_space = num_bytes ?: dl_size; dl_alloc = 0; dl_size = new_dl_size; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/rgb_t.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/rgb_t.h index 07ee957f48..e31c69e605 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/rgb_t.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/rgb_t.h @@ -21,6 +21,46 @@ #pragma once +/** + * Implementation of hsl_to_rgb as constexpr functions based on: + * + * https://www.rapidtables.com/convert/color/hsl-to-rgb.html + */ + +constexpr float _hsl_fmod(float x, float y) { + return x - int(x/y)*y; +} + +constexpr float _hsl_c(int, float S, float L) { + return (1.0f - fabs(2*L-1.0f)) * S; +} + +constexpr float _hsl_x(int H, float S, float L) { + return _hsl_c(H,S,L) * (1.0f - fabs(_hsl_fmod(float(H)/60, 2) - 1)); +} + +constexpr float _hsl_m(int H, float S, float L) { + return L - _hsl_c(H,S,L)/2; +} + +constexpr float _hsl_rgb(int H, float S, float L, float r, float g, float b) { + return ((uint32_t((r + _hsl_m(H,S,L))*255+0.5) << 16) | + (uint32_t((g + _hsl_m(H,S,L))*255+0.5) << 8) | + (uint32_t((b + _hsl_m(H,S,L))*255+0.5) << 0)); +} + +constexpr uint32_t hsl_to_rgb(int H, float S, float L) { + return (H < 60) ? _hsl_rgb(H,S,L,_hsl_c(H,S,L), _hsl_x(H,S,L), 0) : + (H < 120) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), _hsl_c(H,S,L), 0) : + (H < 180) ? _hsl_rgb(H,S,L, 0, _hsl_c(H,S,L), _hsl_x(H,S,L)) : + (H < 240) ? _hsl_rgb(H,S,L, 0, _hsl_x(H,S,L), _hsl_c(H,S,L)) : + (H < 300) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), 0, _hsl_c(H,S,L)) : + _hsl_rgb(H,S,L,_hsl_c(H,S,L), 0, _hsl_x(H,S,L)); +} + +/** + * Structure for RGB colors + */ struct rgb_t { union { struct { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language.h index a8a700864b..fb66e6d77e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language.h @@ -20,70 +20,6 @@ ****************************************************************************/ #pragma once -typedef const char Language_Str[]; - -// Count how many languages are defined. - -#if defined(LCD_LANGUAGE_5) - #define NUM_LANGUAGES 5 -#elif defined(LCD_LANGUAGE_4) - #define NUM_LANGUAGES 4 -#elif defined(LCD_LANGUAGE_3) - #define NUM_LANGUAGES 3 -#elif defined(LCD_LANGUAGE_2) - #define NUM_LANGUAGES 2 -#else - #define NUM_LANGUAGES 1 -#endif - -// Set undefined languages equal to the last and -// let the compiler optimize out the duplicates - -#ifndef LCD_LANGUAGE_1 - #define LCD_LANGUAGE_1 LCD_LANGUAGE -#endif - -#ifndef LCD_LANGUAGE_2 - #define LCD_LANGUAGE_2 LCD_LANGUAGE_1 -#endif - -#ifndef LCD_LANGUAGE_3 - #define LCD_LANGUAGE_3 LCD_LANGUAGE_2 -#endif - -#ifndef LCD_LANGUAGE_4 - #define LCD_LANGUAGE_4 LCD_LANGUAGE_3 -#endif - -#ifndef LCD_LANGUAGE_5 - #define LCD_LANGUAGE_5 LCD_LANGUAGE_4 -#endif - -// Indirection required to paste together the namespace name - -#define _GET_LANG(LANG) Language_##LANG -#define GET_LANG(LANG) _GET_LANG(LANG) - -#if NUM_LANGUAGES > 1 - extern uint8_t lang; - // The compiler does a good job of "flattening" out this - // if statement when there are fewer than five languages. - #define GET_TEXT(MSG) ( \ - lang == 0 ? GET_LANG(LCD_LANGUAGE_1)::MSG : \ - lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ - lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ - lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ - GET_LANG(LCD_LANGUAGE_5)::MSG \ - ) -#else - #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE_1)::MSG -#endif -#define GET_TEXTF(MSG) reinterpret_cast(GET_TEXT(MSG)) - -#define GET_LANGUAGE_NAME(N) GET_LANG(LCD_LANGUAGE_##N)::LANGUAGE - -// All the language tables go here - #include "language_en.h" #include "language_de.h" #include "language_fr.h" diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_de.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_de.h index 3c26bfb3d8..f00c50591e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_de.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_de.h @@ -24,8 +24,6 @@ namespace Language_de { using namespace Language_en; // Inherit undefined strings from English - PROGMEM Language_Str LANGUAGE = u8"Deutsche"; - PROGMEM Language_Str YES = u8"JA"; PROGMEM Language_Str NO = u8"NEIN"; PROGMEM Language_Str BACK = u8"Zurück"; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h index 67904ceaef..1485b0838e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h @@ -24,8 +24,6 @@ #include "language.h" namespace Language_en { - PROGMEM Language_Str LANGUAGE = u8"English"; - PROGMEM Language_Str YES = u8"Yes"; PROGMEM Language_Str NO = u8"No"; PROGMEM Language_Str BACK = u8"Back"; @@ -184,6 +182,7 @@ namespace Language_en { PROGMEM Language_Str ERASING = u8"Erasing..."; PROGMEM Language_Str ERASED = u8"SPI flash erased"; PROGMEM Language_Str CALIBRATION_WARNING = u8"For best results, unload the filament and clean the hotend prior to starting calibration. Continue?"; + PROGMEM Language_Str START_PRINT_CONFIRMATION = u8"Start printing %s?"; PROGMEM Language_Str ABORT_WARNING = u8"Are you sure you want to cancel the print?"; PROGMEM Language_Str EXTRUDER_SELECTION = u8"Extruder Selection"; PROGMEM Language_Str CURRENT_TEMPERATURE = u8"Current Temp"; @@ -222,10 +221,12 @@ namespace Language_en { #ifdef LULZBOT_USE_BIOPRINTER_UI PROGMEM Language_Str MAIN_MENU = u8"Main Menu"; - PROGMEM Language_Str RELEASE_XY_AXIS = u8"Release XY Axis"; - PROGMEM Language_Str LOAD_SYRINGE = u8"Load Syringe"; + PROGMEM Language_Str MOVE_TO_HOME = u8"Move To Home"; + PROGMEM Language_Str RAISE_PLUNGER = u8"Raise Plunger"; + PROGMEM Language_Str RELEASE_XY_AXIS = u8"Release X and Y Axis"; + PROGMEM Language_Str AUTOLEVEL_X_AXIS = u8"Auto-level X Axis"; PROGMEM Language_Str BED_TEMPERATURE = u8"Bed Temperature"; - PROGMEM Language_Str LOADING_WARNING = u8"About to home to loading position. Ensure the top and the bed of the printer are clear.\n\nContinue?"; - PROGMEM Language_Str HOMING_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?"; + PROGMEM Language_Str HOME_XYZ_WARNING = u8"About to move to home position. Ensure the top and the bed of the printer are clear.\n\nContinue?"; + PROGMEM Language_Str HOME_E_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?"; #endif }; // namespace Language_en diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_fr.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_fr.h index a9ad20d320..64582219ce 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_fr.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_fr.h @@ -24,8 +24,6 @@ namespace Language_fr { using namespace Language_en; // Inherit undefined strings from English - PROGMEM Language_Str LANGUAGE = u8"Français"; - PROGMEM Language_Str YES = u8"oui"; PROGMEM Language_Str NO = u8"non"; PROGMEM Language_Str BACK = u8"Retour"; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/languages.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/languages.h deleted file mode 100644 index 03edc55157..0000000000 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/languages.h +++ /dev/null @@ -1,26 +0,0 @@ -/*************** - * languages.h * - ***************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "language_en.h" -#include "language_de.h" -#include "language_fr.h" diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/marlin_events.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/marlin_events.cpp index 4318ae0a04..e61033ee3a 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/marlin_events.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/marlin_events.cpp @@ -38,19 +38,21 @@ namespace ExtUI { EventLoop::loop(); } - void onPrinterKilled(PGM_P lcd_msg) { - KillScreen::show(progmem_str(lcd_msg)); + void onPrinterKilled(PGM_P const error, PGM_P const component) { + char str[strlen_P(error) + strlen_P(component) + 3]; + sprintf_P(str, PSTR(S_FMT ": " S_FMT), error, component); + KillScreen::show(str); } void onMediaInserted() { if (AT_SCREEN(StatusScreen)) - StatusScreen::setStatusMessage(F(MSG_MEDIA_INSERTED)); + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED)); sound.play(media_inserted, PLAY_ASYNCHRONOUS); } void onMediaRemoved() { if (AT_SCREEN(StatusScreen)) - StatusScreen::setStatusMessage(F(MSG_MEDIA_REMOVED)); + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); sound.play(media_removed, PLAY_ASYNCHRONOUS); if (AT_SCREEN(FilesScreen)) { GOTO_SCREEN(StatusScreen) @@ -123,6 +125,11 @@ namespace ExtUI { else ConfirmUserRequestAlertBox::hide(); } + + #if HAS_LEVELING && HAS_MESH + void onMeshUpdate(const uint8_t, const uint8_t, const float) { + } + #endif } #endif // LULZBOT_TOUCH_UI diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/about_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/about_screen.cpp index b062446cab..612f914464 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/about_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/about_screen.cpp @@ -49,7 +49,7 @@ void AboutScreen::onRedraw(draw_mode_t) { #ifdef LULZBOT_LCD_MACHINE_NAME LULZBOT_LCD_MACHINE_NAME #else - GET_TEXTF(COLOR_TOUCH_PANEL) + GET_TEXT_F(COLOR_TOUCH_PANEL) #endif ), OPT_CENTER, font_xlarge); @@ -68,14 +68,14 @@ void AboutScreen::onRedraw(draw_mode_t) { #ifdef LULZBOT_LCD_TOOLHEAD_NAME about_str #else - GET_TEXTF(ABOUT_ALEPH_OBJECTS) + GET_TEXT_F(ABOUT_ALEPH_OBJECTS) #endif , OPT_CENTER, font_medium); cmd.tag(0); draw_text_box(cmd, BTN_POS(1,6), BTN_SIZE(4,2), progmem_str(getFirmwareName_str()), OPT_CENTER, font_medium); - cmd.font(font_medium).colors(action_btn).tag(1).button(BTN_POS(2,8), BTN_SIZE(2,1), GET_TEXTF(OKAY)); + cmd.font(font_medium).colors(action_btn).tag(1).button(BTN_POS(2,8), BTN_SIZE(2,1), GET_TEXT_F(OKAY)); } bool AboutScreen::onTouchEnd(uint8_t tag) { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/advanced_settings_menu.cpp index f4aad3b593..7168b803c5 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/advanced_settings_menu.cpp @@ -49,52 +49,52 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #else .enabled(0) #endif - .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXTF(ZPROBE_ZOFFSET)) + .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(ZPROBE_ZOFFSET)) .enabled(1) - .tag(3) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(STEPS_PER_MM)) + .tag(3) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(STEPS_PER_MM)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(13).button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXTF(MOTOR_CURRENT)) + .tag(13).button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MOTOR_CURRENT)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(14).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(HOME_SENSE)) + .tag(14).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(HOME_SENSE)) #if HOTENDS > 1 .enabled(1) #else .enabled(0) #endif - .tag(4) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXTF(TOOL_OFFSETS)) + .tag(4) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(TOOL_OFFSETS)) #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) .enabled(1) #else .enabled(0) #endif - .tag(11).button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXTF(FILAMENT)) - .tag(12).button( BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXTF(ENDSTOPS)) - .tag(15).button( BTN_POS(2,6), BTN_SIZE(1,1), GET_TEXTF(DISPLAY_MENU)) - .tag(9) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS)) - .tag(10).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(RESTORE_DEFAULTS)) - .tag(5) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(VELOCITY)) - .tag(6) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXTF(ACCELERATION)) - #if ENABLED(JUNCTION_DEVIATION) - .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JUNC_DEVIATION)) + .tag(11).button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(FILAMENT)) + .tag(12).button( BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(ENDSTOPS)) + .tag(15).button( BTN_POS(2,6), BTN_SIZE(1,1), GET_TEXT_F(DISPLAY_MENU)) + .tag(9) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(INTERFACE_SETTINGS)) + .tag(10).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(RESTORE_DEFAULTS)) + .tag(5) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(VELOCITY)) + .tag(6) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(ACCELERATION)) + #if DISABLED(CLASSIC_JERK) + .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JUNC_DEVIATION)) #else - .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JERK)) + .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JERK)) #endif #if ENABLED(BACKLASH_GCODE) .enabled(1) #else .enabled(0) #endif - .tag(8).button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXTF(BACKLASH)) + .tag(8).button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(BACKLASH)) .colors(action_btn) - .tag(1) .button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1) .button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS #else @@ -105,47 +105,47 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #else .enabled(0) #endif - .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,2), GET_TEXTF(ZPROBE_ZOFFSET)) + .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,2), GET_TEXT_F(ZPROBE_ZOFFSET)) .enabled(1) - .tag(3) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(STEPS_PER_MM)) + .tag(3) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(STEPS_PER_MM)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(13).button( BTN_POS(3,1), BTN_SIZE(1,1), GET_TEXTF(MOTOR_CURRENT)) + .tag(13).button( BTN_POS(3,1), BTN_SIZE(1,1), GET_TEXT_F(MOTOR_CURRENT)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(14).button( BTN_POS(3,2), BTN_SIZE(1,1), GET_TEXTF(HOME_SENSE)) + .tag(14).button( BTN_POS(3,2), BTN_SIZE(1,1), GET_TEXT_F(HOME_SENSE)) #if ENABLED(BACKLASH_GCODE) .enabled(1) #else .enabled(0) #endif - .tag(8).button( BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXTF(BACKLASH)) + .tag(8).button( BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXT_F(BACKLASH)) #if HOTENDS > 1 .enabled(1) #else .enabled(0) #endif - .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXTF(TOOL_OFFSETS)) - .tag(12).button( BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXTF(ENDSTOPS)) - .tag(5) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(VELOCITY)) - .tag(6) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXTF(ACCELERATION)) - #if ENABLED(JUNCTION_DEVIATION) - .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JUNC_DEVIATION)) + .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(TOOL_OFFSETS)) + .tag(12).button( BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXT_F(ENDSTOPS)) + .tag(5) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(VELOCITY)) + .tag(6) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(ACCELERATION)) + #if DISABLED(CLASSIC_JERK) + .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JUNC_DEVIATION)) #else - .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JERK)) + .tag(7) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JERK)) #endif - .tag(11).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(FILAMENT)) - .tag(15).button( BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXTF(DISPLAY_MENU)) - .tag(9) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS)) - .tag(10).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(RESTORE_DEFAULTS)) + .tag(11).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(FILAMENT)) + .tag(15).button( BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(DISPLAY_MENU)) + .tag(9) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(INTERFACE_SETTINGS)) + .tag(10).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(RESTORE_DEFAULTS)) .colors(action_btn) - .tag(1) .button( BTN_POS(3,6), BTN_SIZE(1,1), GET_TEXTF(BACK)); + .tag(1) .button( BTN_POS(3,6), BTN_SIZE(1,1), GET_TEXT_F(BACK)); #endif } } @@ -163,7 +163,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 5: GOTO_SCREEN(MaxVelocityScreen); break; case 6: GOTO_SCREEN(DefaultAccelerationScreen); break; case 7: - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) GOTO_SCREEN(JunctionDeviationScreen); #else GOTO_SCREEN(JerkScreen); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/backlash_compensation_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/backlash_compensation_screen.cpp index 925a0f2f5a..111eb19d9f 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/backlash_compensation_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/backlash_compensation_screen.cpp @@ -32,17 +32,17 @@ using namespace Theme; void BacklashCompensationScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(2).units( GET_TEXTF(UNITS_MM)); - w.heading( GET_TEXTF(BACKLASH)); - w.color(x_axis).adjuster(2, GET_TEXTF(AXIS_X), getAxisBacklash_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXTF(AXIS_Y), getAxisBacklash_mm(Y)); - w.color(z_axis).adjuster(6, GET_TEXTF(AXIS_Z), getAxisBacklash_mm(Z)); + w.precision(2).units( GET_TEXT_F(UNITS_MM)); + w.heading( GET_TEXT_F(BACKLASH)); + w.color(x_axis).adjuster(2, GET_TEXT_F(AXIS_X), getAxisBacklash_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(AXIS_Y), getAxisBacklash_mm(Y)); + w.color(z_axis).adjuster(6, GET_TEXT_F(AXIS_Z), getAxisBacklash_mm(Z)); #if ENABLED(CALIBRATION_GCODE) - w.button(12, GET_TEXTF(MEASURE_AUTOMATICALLY)); + w.button(12, GET_TEXT_F(MEASURE_AUTOMATICALLY)); #endif - w.color(other).adjuster(8, GET_TEXTF(SMOOTHING), getBacklashSmoothing_mm()); - w.precision(0).units(GET_TEXTF(UNITS_PERCENT)) - .adjuster(10, GET_TEXTF(CORRECTION), getBacklashCorrection_percent()); + w.color(other).adjuster(8, GET_TEXT_F(SMOOTHING), getBacklashSmoothing_mm()); + w.precision(0).units(GET_TEXT_F(UNITS_PERCENT)) + .adjuster(10, GET_TEXT_F(CORRECTION), getBacklashCorrection_percent()); w.precision(2).increments(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp index 480315620c..c8c500669b 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp @@ -47,7 +47,8 @@ BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what cmd.cmd(CLEAR_COLOR_RGB(bg_color)) .cmd(CLEAR(true,true,true)) .colors(normal_btn) - .cmd(COLOR_RGB(bg_text_enabled)); + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); } cmd.font(font_medium); @@ -57,7 +58,7 @@ BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what #else BTN_POS(15,7), BTN_SIZE(4,1), #endif - GET_TEXTF(BACK), true, true + GET_TEXT_F(BACK), true, true ); _line = 1; @@ -85,12 +86,14 @@ void BaseNumericAdjustmentScreen::widgets_t::_button_style(CommandProcessor &cmd default: break; } - const bool rgb_changed = old_colors->rgb != new_colors->rgb; + const bool rgb_changed = (old_colors->rgb != new_colors->rgb) || + (_style == TEXT_LABEL && style != TEXT_LABEL) || + (_style != TEXT_LABEL && style == TEXT_LABEL); const bool grad_changed = old_colors->grad != new_colors->grad; const bool fg_changed = (old_colors->fg != new_colors->fg) || (_style == TEXT_AREA); const bool bg_changed = old_colors->bg != new_colors->bg; - if (rgb_changed) cmd.cmd(COLOR_RGB(new_colors->rgb)); + if (rgb_changed) cmd.cmd(COLOR_RGB(style == TEXT_LABEL ? bg_text_enabled : new_colors->rgb)); if (grad_changed) cmd.gradcolor(new_colors->grad); if (fg_changed) cmd.fgcolor(new_colors->fg); if (bg_changed) cmd.bgcolor(new_colors->bg); @@ -122,7 +125,9 @@ BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t:: void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { if (_what & BACKGROUND) { CommandProcessor cmd; + _button_style(cmd, TEXT_LABEL); cmd.font(font_medium) + .tag(0) .text( #ifdef TOUCH_UI_PORTRAIT BTN_POS(1, _line), BTN_SIZE(12,1), @@ -185,13 +190,14 @@ void BaseNumericAdjustmentScreen::widgets_t::increments() { cmd.font(LAYOUT_FONT); if (_what & BACKGROUND) { - cmd.text( + _button_style(cmd, TEXT_LABEL); + cmd.tag(0).text( #ifdef TOUCH_UI_PORTRAIT BTN_POS(1, _line), BTN_SIZE(4,1), #else BTN_POS(15, 1), BTN_SIZE(4,1), #endif - GET_TEXTF(INCREMENT) + GET_TEXT_F(INCREMENT) ); } @@ -208,11 +214,12 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, prog CommandProcessor cmd; if (_what & BACKGROUND) { - _button_style(cmd, TEXT_AREA); + _button_style(cmd, TEXT_LABEL); cmd.tag(0) .font(font_small) - .text( BTN_POS(1,_line), BTN_SIZE(4,1), label) - .fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); + .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); + _button_style(cmd, TEXT_AREA); + cmd.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); } cmd.font(font_medium); @@ -267,12 +274,13 @@ void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str CommandProcessor cmd; if (_what & BACKGROUND) { - _button_style(cmd, TEXT_AREA); + _button_style(cmd, TEXT_LABEL); cmd.enabled(1) .tag(0) .font(font_small) - .text( BTN_POS(1,_line), BTN_SIZE(4,1), label) - .fgcolor(_color) + .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); + _button_style(cmd, TEXT_AREA); + cmd.fgcolor(_color) .tag(tag) .button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT); } @@ -297,14 +305,15 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab CommandProcessor cmd; if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); cmd.font(font_small) .text( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS(1, _line), BTN_SIZE( 8,1), - #else - BTN_POS(1, _line), BTN_SIZE(10,1), - #endif - label + #ifdef TOUCH_UI_PORTRAIT + BTN_POS(1, _line), BTN_SIZE( 8,1), + #else + BTN_POS(1, _line), BTN_SIZE(10,1), + #endif + label ); } @@ -314,12 +323,12 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab .enabled(is_enabled) .font(font_small) .toggle2( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS( 9,_line), BTN_SIZE(5,1), - #else - BTN_POS(10,_line), BTN_SIZE(4,1), - #endif - GET_TEXTF(NO), GET_TEXTF(YES), value + #ifdef TOUCH_UI_PORTRAIT + BTN_POS( 9,_line), BTN_SIZE(5,1), + #else + BTN_POS(10,_line), BTN_SIZE(4,1), + #endif + GET_TEXT_F(NO), GET_TEXT_F(YES), value ); } @@ -330,15 +339,16 @@ void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) { CommandProcessor cmd; if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); cmd.font(font_small) - .text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXTF(HOME)); + .text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXT_F(HOME)); } cmd.font(LAYOUT_FONT); - _button(cmd, tag+0, BTN_POS(5,_line), BTN_SIZE(2,1), GET_TEXTF(AXIS_X)); - _button(cmd, tag+1, BTN_POS(7,_line), BTN_SIZE(2,1), GET_TEXTF(AXIS_Y)); - _button(cmd, tag+2, BTN_POS(9,_line), BTN_SIZE(2,1), GET_TEXTF(AXIS_Z)); - _button(cmd, tag+3, BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXTF(AXIS_ALL)); + _button(cmd, tag+0, BTN_POS(5,_line), BTN_SIZE(2,1), GET_TEXT_F(AXIS_X)); + _button(cmd, tag+1, BTN_POS(7,_line), BTN_SIZE(2,1), GET_TEXT_F(AXIS_Y)); + _button(cmd, tag+2, BTN_POS(9,_line), BTN_SIZE(2,1), GET_TEXT_F(AXIS_Z)); + _button(cmd, tag+3, BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXT_F(AXIS_ALL)); _line++; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_advanced_settings.cpp index 1355010c0b..86382b674e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_advanced_settings.cpp @@ -43,52 +43,52 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define GRID_ROWS 9 #define GRID_COLS 2 - .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXTF(DISPLAY_MENU)) + .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(DISPLAY_MENU)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(3) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXTF(MOTOR_CURRENT)) + .tag(3) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MOTOR_CURRENT)) #if HAS_TRINAMIC .enabled(1) #else .enabled(0) #endif - .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXTF(HOME_SENSE)) - .tag(5) .button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(ENDSTOPS)) + .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(HOME_SENSE)) + .tag(5) .button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(ENDSTOPS)) #if HOTENDS > 1 .enabled(1) #else .enabled(0) #endif - .tag(6) .button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXTF(TOOL_OFFSETS)) + .tag(6) .button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(TOOL_OFFSETS)) - .tag(7) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(STEPS_PER_MM)) - .tag(8) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(VELOCITY)) - .tag(9) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXTF(ACCELERATION)) - #if ENABLED(JUNCTION_DEVIATION) - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JUNC_DEVIATION)) + .tag(7) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(STEPS_PER_MM)) + .tag(8) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(VELOCITY)) + .tag(9) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(ACCELERATION)) + #if DISABLED(CLASSIC_JERK) + .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JUNC_DEVIATION)) #else - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(JERK)) + .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(JERK)) #endif #if ENABLED(BACKLASH_GCODE) .enabled(1) #else .enabled(0) #endif - .tag(11) .button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXTF(BACKLASH)) + .tag(11) .button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(BACKLASH)) #if ENABLED(LIN_ADVANCE) .enabled(1) #else .enabled(0) #endif - .tag(12) .button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(LINEAR_ADVANCE)) - .tag(13) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS)) - .tag(14) .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(RESTORE_DEFAULTS)) + .tag(12) .button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(LINEAR_ADVANCE)) + .tag(13) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(INTERFACE_SETTINGS)) + .tag(14) .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(RESTORE_DEFAULTS)) .colors(action_btn) - .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS } @@ -113,7 +113,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 8: GOTO_SCREEN(MaxVelocityScreen); break; case 9: GOTO_SCREEN(DefaultAccelerationScreen); break; case 10: - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) GOTO_SCREEN(JunctionDeviationScreen); #else GOTO_SCREEN(JerkScreen); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_e.cpp index ec6b6045e7..fb36e977c4 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_e.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_e.cpp @@ -29,14 +29,18 @@ using namespace FTDI; void BioConfirmHomeE::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(HOMING_WARNING)); + drawMessage(GET_TEXT_F(HOME_E_WARNING)); drawYesNoButtons(1); } bool BioConfirmHomeE::onTouchEnd(uint8_t tag) { switch (tag) { case 1: - SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_HOME_E_COMMANDS)); + SpinnerDialogBox::enqueueAndWait_P(F( + "G112\n" + LULZBOT_AXIS_LEVELING_COMMANDS "\n" + LULZBOT_PARK_AND_RELEASE_COMMANDS + )); current_screen.forget(); break; case 2: diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_xyz.cpp index 71fc02bd14..43ed1f4baa 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_xyz.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_confirm_home_xyz.cpp @@ -29,14 +29,17 @@ using namespace FTDI; void BioConfirmHomeXYZ::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(LOADING_WARNING)); + drawMessage(GET_TEXT_F(HOME_XYZ_WARNING)); drawYesNoButtons(1); } bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) { switch (tag) { case 1: - SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_HOME_XYZ_COMMANDS)); + SpinnerDialogBox::enqueueAndWait_P(F( + "G28\n" + LULZBOT_PARK_AND_RELEASE_COMMANDS + )); current_screen.forget(); break; case 2: diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp index 403376a180..448cc29207 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp @@ -30,29 +30,32 @@ using namespace FTDI; using namespace Theme; void MainMenu::onRedraw(draw_mode_t what) { - #define GRID_ROWS 8 + #define GRID_ROWS 10 #define GRID_COLS 2 if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); + .cmd(CLEAR(true,true,true)) + .tag(0); } if (what & FOREGROUND) { CommandProcessor cmd; cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(MAIN_MENU)) + .font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MAIN_MENU)) .colors(normal_btn) .font(font_medium) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS)) - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(BED_TEMPERATURE)) - .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS)) - .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(ADVANCED_SETTINGS)) - .tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(ABOUT_PRINTER)) + .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MOVE_TO_HOME)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(RAISE_PLUNGER)) + .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(RELEASE_XY_AXIS)) + .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(AUTOLEVEL_X_AXIS)) + .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(BED_TEMPERATURE)) + .tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(INTERFACE_SETTINGS)) + .tag(8).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(ADVANCED_SETTINGS)) + .tag(9).button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(ABOUT_PRINTER)) .colors(action_btn) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1).button( BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(BACK)); } #undef GRID_COLS @@ -62,14 +65,18 @@ void MainMenu::onRedraw(draw_mode_t what) { bool MainMenu::onTouchEnd(uint8_t tag) { using namespace ExtUI; + const bool e_homed = isAxisPositionKnown(E0); + switch (tag) { case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; case 2: GOTO_SCREEN(BioConfirmHomeXYZ); break; - case 3: StatusScreen::unlockMotors(); break; - case 4: GOTO_SCREEN(TemperatureScreen); break; - case 5: GOTO_SCREEN(InterfaceSettingsScreen); break; - case 6: GOTO_SCREEN(AdvancedSettingsMenu); break; - case 7: GOTO_SCREEN(AboutScreen); break; + case 3: SpinnerDialogBox::enqueueAndWait_P(e_homed ? F("G0 E0 F120") : F("G112")); break; + case 4: StatusScreen::unlockMotors(); break; + case 5: SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_AXIS_LEVELING_COMMANDS)); break; + case 6: GOTO_SCREEN(TemperatureScreen); break; + case 7: GOTO_SCREEN(InterfaceSettingsScreen); break; + case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 9: GOTO_SCREEN(AboutScreen); break; default: return false; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_printing_dialog_box.cpp index bcf9fb8550..04d52498af 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_printing_dialog_box.cpp @@ -38,7 +38,8 @@ using namespace Theme; void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char* message) { if (what & BACKGROUND) { CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)); + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); draw_text_box(cmd, BTN_POS(1,2), BTN_SIZE(2,2), message, OPT_CENTER, font_large); } } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp index 17d9eefbca..cd709a2dc6 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp @@ -29,8 +29,6 @@ #include "../ftdi_eve_lib/extras/poly_ui.h" #include "bio_printer_ui.h" -#define E_TRAVEL_LIMIT 60 - #define GRID_COLS 2 #define GRID_ROWS 9 @@ -94,11 +92,13 @@ void StatusScreen::draw_temperature(draw_mode_t what) { cmd.font(font_xlarge) .cmd(COLOR_RGB(bg_text_enabled)); - if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) { + if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) format_temp(bed_str, getTargetTemp_celsius(BED)); - ui.bounds(POLY(target_temp), x, y, h, v); - cmd.text(x, y, h, v, bed_str); - } + else + strcpy_P(bed_str, PSTR(MSG_BED)); + + ui.bounds(POLY(target_temp), x, y, h, v); + cmd.text(x, y, h, v, bed_str); format_temp(bed_str, getActualTemp_celsius(BED)); ui.bounds(POLY(actual_temp), x, y, h, v); @@ -108,7 +108,11 @@ void StatusScreen::draw_temperature(draw_mode_t what) { void StatusScreen::draw_syringe(draw_mode_t what) { int16_t x, y, h, v; - const float fill_level = 1.0 - min(1.0, max(0.0, getAxisPosition_mm(E0) / E_TRAVEL_LIMIT)); + #ifdef LULZBOT_E_TRAVEL_LIMIT + const float fill_level = 1.0 - min(1.0, max(0.0, getAxisPosition_mm(E0) / LULZBOT_E_TRAVEL_LIMIT)); + #else + const float fill_level = 0.75; + #endif const bool e_homed = isAxisPositionKnown(E0); CommandProcessor cmd; @@ -179,13 +183,13 @@ void StatusScreen::draw_fine_motion(draw_mode_t what) { ui.bounds(POLY(fine_label), x, y, h, v); cmd.cmd(COLOR_RGB(bg_text_enabled)) - .text(x, y, h, v, GET_TEXTF(FINE_MOTION)); + .text(x, y, h, v, GET_TEXT_F(FINE_MOTION)); } if (what & FOREGROUND) { ui.bounds(POLY(fine_toggle), x, y, h, v); cmd.colors(ui_toggle) - .toggle2(x, y, h, v, GET_TEXTF(NO), GET_TEXTF(YES), fine_motion); + .toggle2(x, y, h, v, GET_TEXT_F(NO), GET_TEXT_F(YES), fine_motion); } } @@ -218,11 +222,11 @@ void StatusScreen::draw_buttons(draw_mode_t) { .colors(has_media ? action_btn : normal_btn) .tag(9).button(BTN_POS(1,9), BTN_SIZE(1,1), isPrintingFromMedia() ? - GET_TEXTF(PRINTING) : - GET_TEXTF(MEDIA) + GET_TEXT_F(PRINTING) : + GET_TEXT_F(MEDIA) ); - cmd.colors(!has_media ? action_btn : normal_btn).tag(10).button(BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXTF(MENU)); + cmd.colors(!has_media ? action_btn : normal_btn).tag(10).button(BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXT_F(MENU)); } void StatusScreen::loadBitmaps() { @@ -239,8 +243,9 @@ void StatusScreen::loadBitmaps() { void StatusScreen::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)); - cmd.cmd(CLEAR(true,true,true)); + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); } draw_syringe(what); @@ -258,24 +263,24 @@ bool StatusScreen::onTouchStart(uint8_t) { bool StatusScreen::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: - case 2: - case 3: - case 4: + case 1: + case 2: + case 3: + case 4: case 12: if (!jog_xy) { jog_xy = true; injectCommands_P(PSTR("M17")); } - jog(0, 0, 0); + jog({ 0, 0, 0 }); break; - case 5: - case 6: - jog(0, 0, 0); + case 5: + case 6: + jog({ 0, 0, 0 }); break; - case 9: GOTO_SCREEN(FilesScreen); break; + case 9: GOTO_SCREEN(FilesScreen); break; case 10: GOTO_SCREEN(MainMenu); break; - case 13: SpinnerDialogBox::enqueueAndWait_P(F("G112")); break; + case 13: GOTO_SCREEN(BioConfirmHomeE); break; case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; case 15: GOTO_SCREEN(TemperatureScreen); break; case 16: fine_motion = !fine_motion; break; @@ -291,14 +296,13 @@ bool StatusScreen::onTouchHeld(uint8_t tag) { if (tag >= 1 && tag <= 4 && !jog_xy) return false; const float s = min_speed + (fine_motion ? 0 : (max_speed - min_speed) * sq(increment)); switch (tag) { - case 1: jog(-s, 0, 0); break; - case 2: jog( s, 0, 0); break; - case 4: jog( 0, -s, 0); break; // NOTE: Y directions inverted because bed rather than needle moves - case 3: jog( 0, s, 0); break; - case 5: jog( 0, 0, -s); break; - case 6: jog( 0, 0, s); break; - case 7: - case 8: + case 1: jog({-s, 0, 0}); break; + case 2: jog({ s, 0, 0}); break; + case 4: jog({ 0, -s, 0}); break; // NOTE: Y directions inverted because bed rather than needle moves + case 3: jog({ 0, s, 0}); break; + case 5: jog({ 0, 0, -s}); break; + case 6: jog({ 0, 0, s}); break; + case 7: case 8: { if (ExtUI::isMoving()) return false; const feedRate_t feedrate = emin_speed + (fine_motion ? 0 : (emax_speed - emin_speed) * sq(increment)); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp index 2b22876970..4fa88253c8 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp @@ -31,33 +31,35 @@ using namespace Theme; using namespace ExtUI; void TuneMenu::onRedraw(draw_mode_t what) { + #define GRID_ROWS 8 + #define GRID_COLS 2 + if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(CLEAR_COLOR_RGB(bg_color)) .cmd(CLEAR(true,true,true)) - .font(font_medium); + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + .font(font_large) + .text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(PRINT_MENU)); } - #define GRID_ROWS 7 - #define GRID_COLS 2 - if (what & FOREGROUND) { CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(font_large).text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(PRINT_MENU)) - .colors(normal_btn) + cmd.colors(normal_btn) .font(font_medium) - .enabled( isPrinting()).tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(PRINT_SPEED)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(BED_TEMPERATURE)) + .enabled( isPrinting()).tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(PRINT_SPEED)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(BED_TEMPERATURE)) #if ENABLED(BABYSTEPPING) .enabled(true) #else .enabled(false) #endif - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(NUDGE_NOZZLE)) - .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE)) - .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS)) - .colors(action_btn) .tag(1).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(NUDGE_NOZZLE)) + .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MOVE_TO_HOME)) + .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(RAISE_PLUNGER)) + .enabled(!isPrinting()).tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(RELEASE_XY_AXIS)) + .colors(action_btn) .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(BACK)); } #undef GRID_COLS #undef GRID_ROWS @@ -65,12 +67,13 @@ void TuneMenu::onRedraw(draw_mode_t what) { bool TuneMenu::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: GOTO_SCREEN(FeedratePercentScreen); break; - case 3: GOTO_SCREEN(TemperatureScreen); break; - case 4: GOTO_SCREEN(NudgeNozzleScreen); break; - case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break; - case 6: StatusScreen::unlockMotors(); break; + case 1: GOTO_PREVIOUS(); break; + case 2: GOTO_SCREEN(FeedratePercentScreen); break; + case 3: GOTO_SCREEN(TemperatureScreen); break; + case 4: GOTO_SCREEN(NudgeNozzleScreen); break; + case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break; + case 6: SpinnerDialogBox::enqueueAndWait_P(F("G0 E0 F120")); break; + case 7: StatusScreen::unlockMotors(); break; default: return false; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp index 32c43d654a..47a71f836d 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp @@ -36,6 +36,7 @@ #endif using namespace FTDI; +using namespace Theme; void BootScreen::onRedraw(draw_mode_t) { CommandProcessor cmd; @@ -64,7 +65,7 @@ void BootScreen::onIdle() { } else { if (!UIFlashStorage::is_valid()) { StatusScreen::loadBitmaps(); - SpinnerDialogBox::show(GET_TEXTF(PLEASE_WAIT)); + SpinnerDialogBox::show(GET_TEXT_F(PLEASE_WAIT)); UIFlashStorage::format_flash(); SpinnerDialogBox::hide(); } @@ -84,10 +85,10 @@ void BootScreen::onIdle() { PUSH_SCREEN(StatusScreen); PUSH_SCREEN(BioConfirmHomeE); #elif NUM_LANGUAGES > 1 - StatusScreen::setStatusMessage(F(WELCOME_MSG)); + StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); GOTO_SCREEN(LanguageMenu); #else - StatusScreen::setStatusMessage(F(WELCOME_MSG)); + StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); GOTO_SCREEN(StatusScreen); #endif } @@ -96,16 +97,16 @@ void BootScreen::onIdle() { void BootScreen::showSplashScreen() { CommandProcessor cmd; cmd.cmd(CMD_DLSTART); - cmd.cmd(CLEAR_COLOR_RGB(0xDEEA5C)); + cmd.cmd(CLEAR_COLOR_RGB(logo_bg)); cmd.cmd(CLEAR(true,true,true)); #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) PolyUI ui(cmd); - cmd.cmd(COLOR_RGB(0xC1D82F)); + cmd.cmd(COLOR_RGB(logo_fg)); ui.fill(POLY(logo_green)); - cmd.cmd(COLOR_RGB(0x000000)); + cmd.cmd(COLOR_RGB(logo_stroke)); ui.fill(POLY(logo_black)); ui.fill(POLY(logo_type)); ui.fill(POLY(logo_mark)); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/change_filament_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/change_filament_screen.cpp index de63824f0c..c08be39fff 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/change_filament_screen.cpp @@ -114,14 +114,14 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { #else .font(font_medium) #endif - .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(EXTRUDER_SELECTION)) + .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(EXTRUDER_SELECTION)) #ifdef TOUCH_UI_PORTRAIT .text(BTN_POS(1,7), BTN_SIZE(1,1), F("")) #else - .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXTF(CURRENT_TEMPERATURE)) + .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXT_F(CURRENT_TEMPERATURE)) .font(font_small) #endif - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(REMOVAL_TEMPERATURE)); + .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(REMOVAL_TEMPERATURE)); drawTempGradient(BTN_POS(1,4), BTN_SIZE(1,3)); } @@ -154,12 +154,12 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; if (screen_data.ChangeFilamentScreen.t_tag && !t_ok) { - cmd.text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXTF(HEATING)); + cmd.text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(HEATING)); } else if (getActualTemp_celsius(e) > 100) { cmd.cmd(COLOR_RGB(0xFF0000)) - .text(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(CAUTION)) + .text(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(CAUTION)) .colors(normal_btn) - .text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXTF(HOT)); + .text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(HOT)); } #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) @@ -221,23 +221,23 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { .cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) #ifdef TOUCH_UI_PORTRAIT .font(font_large) - .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXTF(UNLOAD_FILAMENT)) - .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXTF(LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(1,9), BTN_SIZE(1,1), GET_TEXTF(MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXTF(MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(1,10), BTN_SIZE(1,1), GET_TEXTF(CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(2,10), BTN_SIZE(1,1), GET_TEXTF(CONTINUOUS)) - .tag(1).colors(action_btn) .button (BTN_POS(1,11), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(UNLOAD_FILAMENT)) + .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(LOAD_FILAMENT)) + .tag(5) .enabled(t_ok).button (BTN_POS(1,9), BTN_SIZE(1,1), GET_TEXT_F(MOMENTARY)) + .tag(6) .enabled(t_ok).button (BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXT_F(MOMENTARY)) + .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(1,10), BTN_SIZE(1,1), GET_TEXT_F(CONTINUOUS)) + .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(2,10), BTN_SIZE(1,1), GET_TEXT_F(CONTINUOUS)) + .tag(1).colors(action_btn) .button (BTN_POS(1,11), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #else .font(font_small) - .tag(0) .text (BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXTF(UNLOAD_FILAMENT)) - .text (BTN_POS(4,3), BTN_SIZE(1,1), GET_TEXTF(LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXTF(MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(4,4), BTN_SIZE(1,1), GET_TEXTF(MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXTF(CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(4,5), BTN_SIZE(1,1), GET_TEXTF(CONTINUOUS)) + .tag(0) .text (BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXT_F(UNLOAD_FILAMENT)) + .text (BTN_POS(4,3), BTN_SIZE(1,1), GET_TEXT_F(LOAD_FILAMENT)) + .tag(5) .enabled(t_ok).button (BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXT_F(MOMENTARY)) + .tag(6) .enabled(t_ok).button (BTN_POS(4,4), BTN_SIZE(1,1), GET_TEXT_F(MOMENTARY)) + .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(CONTINUOUS)) + .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(4,5), BTN_SIZE(1,1), GET_TEXT_F(CONTINUOUS)) .font(font_medium) - .tag(1).colors(action_btn) .button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1).colors(action_btn) .button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #endif } #undef GRID_COLS @@ -305,8 +305,8 @@ bool ChangeFilamentScreen::onTouchEnd(uint8_t tag) { bool ChangeFilamentScreen::onTouchHeld(uint8_t tag) { if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate constexpr float increment = 1; - #define UI_INCREMENT_AXIS(axis) MoveAxisScreen::setManualFeedrate(axis, increment); UI_INCREMENT(AxisPosition_mm, axis); - #define UI_DECREMENT_AXIS(axis) MoveAxisScreen::setManualFeedrate(axis, increment); UI_DECREMENT(AxisPosition_mm, axis); + #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); switch (tag) { case 5: case 7: UI_DECREMENT_AXIS(getExtruder()); break; case 6: case 8: UI_INCREMENT_AXIS(getExtruder()); break; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_abort_print_dialog_box.cpp index 32dba3df0f..61eae87677 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_abort_print_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_abort_print_dialog_box.cpp @@ -29,7 +29,7 @@ using namespace ExtUI; void ConfirmAbortPrintDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(ABORT_WARNING)); + drawMessage(GET_TEXT_F(ABORT_WARNING)); drawYesNoButtons(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_auto_calibration_dialog_box.cpp index 161828595f..5ca63a5d07 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_auto_calibration_dialog_box.cpp @@ -30,7 +30,7 @@ using namespace ExtUI; using namespace Theme; void ConfirmAutoCalibrationDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(CALIBRATION_WARNING)); + drawMessage(GET_TEXT_F(CALIBRATION_WARNING)); drawYesNoButtons(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_erase_flash_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_erase_flash_dialog_box.cpp index 610d97b118..f7000f1b4f 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_erase_flash_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_erase_flash_dialog_box.cpp @@ -31,17 +31,17 @@ using namespace FTDI; void ConfirmEraseFlashDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(ERASE_FLASH_WARNING)); + drawMessage(GET_TEXT_F(ERASE_FLASH_WARNING)); drawYesNoButtons(); } bool ConfirmEraseFlashDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: - SpinnerDialogBox::show(GET_TEXTF(ERASING)); + SpinnerDialogBox::show(GET_TEXT_F(ERASING)); UIFlashStorage::format_flash(); SpinnerDialogBox::hide(); - AlertDialogBox::show(GET_TEXTF(ERASED)); + AlertDialogBox::show(GET_TEXT_F(ERASED)); // Remove ConfirmEraseFlashDialogBox from the stack // so the alert box doesn't return to me. current_screen.forget(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_start_print_dialog_box.cpp new file mode 100644 index 0000000000..952b029308 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/confirm_start_print_dialog_box.cpp @@ -0,0 +1,70 @@ +/************************************** + * confirm_start_print_dialog_box.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../config.h" + +#if ENABLED(LULZBOT_TOUCH_UI) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void ConfirmStartPrintDialogBox::onEntry() { + BaseScreen::onEntry(); + sound.play(twinkle, PLAY_ASYNCHRONOUS); +} + +void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) { + const char *filename = getLongFilename(); + char buffer[strlen_P(GET_TEXT(START_PRINT_CONFIRMATION)) + strlen(filename) + 1]; + sprintf_P(buffer, GET_TEXT(START_PRINT_CONFIRMATION), filename); + drawMessage((const char *)buffer); + drawYesNoButtons(1); +} + +bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + printFile(getShortFilename()); + StatusScreen::setStatusMessage(GET_TEXT_F(PRINT_STARTING)); + GOTO_SCREEN(StatusScreen); + return true; + case 2: GOTO_PREVIOUS(); return true; + default: return false; + } +} + +const char *ConfirmStartPrintDialogBox::getFilename(bool longName) { + FileList files; + files.seek(screen_data.ConfirmStartPrintDialogBox.file_index, true); + return longName ? files.longFilename() : files.shortFilename(); +} + +void ConfirmStartPrintDialogBox::show(uint8_t file_index) { + screen_data.ConfirmStartPrintDialogBox.file_index = file_index; + GOTO_SCREEN(ConfirmStartPrintDialogBox); +} + +#endif // LULZBOT_TOUCH_UI diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/default_acceleration_screen.cpp index fdfacd58ce..544bf1527e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/default_acceleration_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/default_acceleration_screen.cpp @@ -33,14 +33,14 @@ using namespace Theme; void DefaultAccelerationScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); - w.units(GET_TEXTF(UNITS_MM_S2)); - w.heading( GET_TEXTF(ACCELERATION)); + w.units(GET_TEXT_F(UNITS_MM_S2)); + w.heading( GET_TEXT_F(ACCELERATION)); w.color(other); - w.adjuster( 2, GET_TEXTF(ACCEL_PRINTING), getPrintingAcceleration_mm_s2() ); - w.adjuster( 4, GET_TEXTF(ACCEL_TRAVEL), getTravelAcceleration_mm_s2() ); - w.adjuster( 6, GET_TEXTF(ACCEL_RETRACT), getRetractAcceleration_mm_s2() ); + w.adjuster( 2, GET_TEXT_F(ACCEL_PRINTING), getPrintingAcceleration_mm_s2() ); + w.adjuster( 4, GET_TEXT_F(ACCEL_TRAVEL), getTravelAcceleration_mm_s2() ); + w.adjuster( 6, GET_TEXT_F(ACCEL_RETRACT), getRetractAcceleration_mm_s2() ); w.increments(); - w.button( 8, GET_TEXTF(SET_MAXIMUM)); + w.button( 8, GET_TEXT_F(SET_MAXIMUM)); } bool DefaultAccelerationScreen::onTouchHeld(uint8_t tag) { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/dialog_box_base_class.cpp index 7d2d2e51ea..f31ad5c881 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/dialog_box_base_class.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/dialog_box_base_class.cpp @@ -50,14 +50,14 @@ template void DialogBoxBaseClass::drawMessage(progmem_str, int16_t font); void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) { CommandProcessor cmd; cmd.font(font_medium) - .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button( BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXTF(YES)) - .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button( BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXTF(NO)); + .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button( BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(YES)) + .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button( BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(NO)); } void DialogBoxBaseClass::drawOkayButton() { CommandProcessor cmd; cmd.font(font_medium) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(OKAY)); + .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(OKAY)); } void DialogBoxBaseClass::drawButton(const progmem_str label) { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/display_tuning_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/display_tuning_screen.cpp index eedc3d22c8..4d33dce648 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/display_tuning_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/display_tuning_screen.cpp @@ -33,13 +33,13 @@ void DisplayTuningScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0, BaseNumericAdjustmentScreen::DEFAULT_LOWEST); w.units(F("")); - w.heading(GET_TEXTF(DISPLAY_MENU)); + w.heading(GET_TEXT_F(DISPLAY_MENU)); w.color(other); - w.adjuster( 2, GET_TEXTF(H_OFFSET), CLCD::mem_read_16(CLCD::REG::HOFFSET) ); - w.adjuster( 4, GET_TEXTF(V_OFFSET), CLCD::mem_read_16(CLCD::REG::VOFFSET) ); + w.adjuster( 2, GET_TEXT_F(H_OFFSET), CLCD::mem_read_16(CLCD::REG::HOFFSET) ); + w.adjuster( 4, GET_TEXT_F(V_OFFSET), CLCD::mem_read_16(CLCD::REG::VOFFSET) ); w.increments(); - w.heading( GET_TEXTF(TOUCH_SCREEN)); - w.button(6, GET_TEXTF(CALIBRATE)); + w.heading( GET_TEXT_F(TOUCH_SCREEN)); + w.button(6, GET_TEXT_F(CALIBRATE)); } bool DisplayTuningScreen::onTouchHeld(uint8_t tag) { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/endstop_state_screen.cpp index ce5cd0b4d5..05dccf96f3 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/endstop_state_screen.cpp @@ -32,10 +32,12 @@ using namespace ExtUI; void EndstopStatesScreen::onEntry() { BaseScreen::onEntry(); + enable_emi_pins(true); } void EndstopStatesScreen::onExit() { BaseScreen::onExit(); + enable_emi_pins(false); } void EndstopStatesScreen::onRedraw(draw_mode_t) { @@ -57,52 +59,52 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #else cmd.font(font_medium) #endif - .text(BTN_POS(1,1), BTN_SIZE(6,1), GET_TEXTF(ENDSTOPS)) + .text(BTN_POS(1,1), BTN_SIZE(6,1), GET_TEXT_F(ENDSTOPS)) .font(font_tiny); #if PIN_EXISTS(X_MAX) - PIN_ENABLED (GET_TEXTF(X_MAX), X_MAX,X_MAX_ENDSTOP_INVERTING,1,2) + PIN_ENABLED (GET_TEXT_F(X_MAX), X_MAX,X_MAX_ENDSTOP_INVERTING,1,2) #else - PIN_DISABLED(GET_TEXTF(X_MAX),X_MAX,X_MAX_ENDSTOP_INVERTING,1,2) + PIN_DISABLED(GET_TEXT_F(X_MAX),X_MAX,X_MAX_ENDSTOP_INVERTING,1,2) #endif #if PIN_EXISTS(Y_MAX) - PIN_ENABLED (GET_TEXTF(Y_MAX),Y_MAX,Y_MAX_ENDSTOP_INVERTING,3,2) + PIN_ENABLED (GET_TEXT_F(Y_MAX),Y_MAX,Y_MAX_ENDSTOP_INVERTING,3,2) #else - PIN_DISABLED(GET_TEXTF(Y_MAX),Y_MAX,Y_MAX_ENDSTOP_INVERTING,3,2) + PIN_DISABLED(GET_TEXT_F(Y_MAX),Y_MAX,Y_MAX_ENDSTOP_INVERTING,3,2) #endif #if PIN_EXISTS(Z_MAX) - PIN_ENABLED (GET_TEXTF(Z_MAX),Z_MAX,Z_MAX_ENDSTOP_INVERTING,5,2) + PIN_ENABLED (GET_TEXT_F(Z_MAX),Z_MAX,Z_MAX_ENDSTOP_INVERTING,5,2) #else - PIN_DISABLED(GET_TEXTF(Z_MAX),Z_MAX,Z_MAX_ENDSTOP_INVERTING,5,2) + PIN_DISABLED(GET_TEXT_F(Z_MAX),Z_MAX,Z_MAX_ENDSTOP_INVERTING,5,2) #endif #if PIN_EXISTS(X_MIN) - PIN_ENABLED (GET_TEXTF(X_MIN),X_MIN,X_MIN_ENDSTOP_INVERTING,1,3) + PIN_ENABLED (GET_TEXT_F(X_MIN),X_MIN,X_MIN_ENDSTOP_INVERTING,1,3) #else - PIN_DISABLED(GET_TEXTF(X_MIN),X_MIN,X_MIN_ENDSTOP_INVERTING,1,3) + PIN_DISABLED(GET_TEXT_F(X_MIN),X_MIN,X_MIN_ENDSTOP_INVERTING,1,3) #endif #if PIN_EXISTS(Y_MIN) - PIN_ENABLED (GET_TEXTF(Y_MIN),Y_MIN,Y_MIN_ENDSTOP_INVERTING,3,3) + PIN_ENABLED (GET_TEXT_F(Y_MIN),Y_MIN,Y_MIN_ENDSTOP_INVERTING,3,3) #else - PIN_DISABLED(GET_TEXTF(Y_MIN),Y_MIN,Y_MIN_ENDSTOP_INVERTING,3,3) + PIN_DISABLED(GET_TEXT_F(Y_MIN),Y_MIN,Y_MIN_ENDSTOP_INVERTING,3,3) #endif #if PIN_EXISTS(Z_MIN) - PIN_ENABLED (GET_TEXTF(Z_MIN),Z_MIN,Z_MIN_ENDSTOP_INVERTING,5,3) + PIN_ENABLED (GET_TEXT_F(Z_MIN),Z_MIN,Z_MIN_ENDSTOP_INVERTING,5,3) #else - PIN_DISABLED(GET_TEXTF(Z_MIN),Z_MIN,Z_MIN_ENDSTOP_INVERTING,5,3) + PIN_DISABLED(GET_TEXT_F(Z_MIN),Z_MIN,Z_MIN_ENDSTOP_INVERTING,5,3) #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT) - PIN_ENABLED (GET_TEXTF(RUNOUT_1),FIL_RUNOUT, FIL_RUNOUT_INVERTING,1,4) + PIN_ENABLED (GET_TEXT_F(RUNOUT_1),FIL_RUNOUT, FIL_RUNOUT_INVERTING,1,4) #else - PIN_DISABLED(GET_TEXTF(RUNOUT_1),FIL_RUNOUT, FIL_RUNOUT_INVERTING,1,4) + PIN_DISABLED(GET_TEXT_F(RUNOUT_1),FIL_RUNOUT, FIL_RUNOUT_INVERTING,1,4) #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) - PIN_ENABLED (GET_TEXTF(RUNOUT_2),FIL_RUNOUT2,FIL_RUNOUT_INVERTING,3,4) + PIN_ENABLED (GET_TEXT_F(RUNOUT_2),FIL_RUNOUT2,FIL_RUNOUT_INVERTING,3,4) #else - PIN_DISABLED(GET_TEXTF(RUNOUT_2),FIL_RUNOUT2,FIL_RUNOUT_INVERTING,3,4) + PIN_DISABLED(GET_TEXT_F(RUNOUT_2),FIL_RUNOUT2,FIL_RUNOUT_INVERTING,3,4) #endif #if PIN_EXISTS(Z_MIN_PROBE) - PIN_ENABLED (GET_TEXTF(Z_PROBE),Z_MIN_PROBE,Z_MIN_PROBE_ENDSTOP_INVERTING,5,4) + PIN_ENABLED (GET_TEXT_F(Z_PROBE),Z_MIN_PROBE,Z_MIN_PROBE_ENDSTOP_INVERTING,5,4) #else - PIN_DISABLED(GET_TEXTF(Z_PROBE),Z_MIN_PROBE,Z_MIN_PROBE_ENDSTOP_INVERTING,5,4) + PIN_DISABLED(GET_TEXT_F(Z_PROBE),Z_MIN_PROBE,Z_MIN_PROBE_ENDSTOP_INVERTING,5,4) #endif #if HAS_SOFTWARE_ENDSTOPS @@ -110,16 +112,16 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #define EDGE_R 30 cmd.cmd(COLOR_RGB(bg_text_enabled)) .font(font_small) - .text (BTN_POS(1,5), BTN_SIZE(3,1), GET_TEXTF(SOFT_ENDSTOPS), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,5), BTN_SIZE(3,1), GET_TEXT_F(SOFT_ENDSTOPS), OPT_RIGHTX | OPT_CENTERY) .colors(ui_toggle) - .tag(2).toggle2(BTN_POS(4,5), BTN_SIZE(3,1), GET_TEXTF(NO), GET_TEXTF(YES), getSoftEndstopState()); + .tag(2).toggle2(BTN_POS(4,5), BTN_SIZE(3,1), GET_TEXT_F(NO), GET_TEXT_F(YES), getSoftEndstopState()); #undef EDGE_R #define EDGE_R 0 #endif cmd.font(font_medium) .colors(action_btn) - .tag(1).button( BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXTF(BACK)); + .tag(1).button( BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/feedrate_percent_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/feedrate_percent_screen.cpp index c42296f79c..6ad7ef88aa 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/feedrate_percent_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/feedrate_percent_screen.cpp @@ -31,10 +31,10 @@ using namespace ExtUI; void FeedratePercentScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(0).units(GET_TEXTF(UNITS_PERCENT)); + w.precision(0).units(GET_TEXT_F(UNITS_PERCENT)); - w.heading(GET_TEXTF(PRINT_SPEED)); - w.adjuster(4, GET_TEXTF(SPEED), getFeedrate_percent()); + w.heading(GET_TEXT_F(PRINT_SPEED)); + w.adjuster(4, GET_TEXT_F(SPEED), getFeedrate_percent()); w.increments(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_menu.cpp index a0213d5edc..a7fe2bff55 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_menu.cpp @@ -34,52 +34,53 @@ void FilamentMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); + .cmd(CLEAR(true,true,true)) + .tag(0); } if (what & FOREGROUND) { CommandProcessor cmd; - cmd.font(font_large) + cmd.font(font_large) #ifdef TOUCH_UI_PORTRAIT #define GRID_ROWS 9 #define GRID_COLS 2 - .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(FILAMENT)) + .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(FILAMENT)) .font(font_medium).colors(normal_btn) #if ENABLED(FILAMENT_RUNOUT_SENSOR) .enabled(1) #else .enabled(0) #endif - .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(RUNOUT_SENSOR)) + .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(RUNOUT_SENSOR)) #if ENABLED(LIN_ADVANCE) .enabled(1) #else .enabled(0) #endif - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(LINEAR_ADVANCE)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(LINEAR_ADVANCE)) .colors(action_btn) - .tag(1) .button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1) .button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS #else #define GRID_ROWS 6 #define GRID_COLS 3 - .text ( BTN_POS(1,1), BTN_SIZE(3,1), GET_TEXTF(FILAMENT)) + .text ( BTN_POS(1,1), BTN_SIZE(3,1), GET_TEXT_F(FILAMENT)) .font(font_medium).colors(normal_btn) #if ENABLED(FILAMENT_RUNOUT_SENSOR) .enabled(1) #else .enabled(0) #endif - .tag(2).button( BTN_POS(1,2), BTN_SIZE(3,1), GET_TEXTF(RUNOUT_SENSOR)) + .tag(2).button( BTN_POS(1,2), BTN_SIZE(3,1), GET_TEXT_F(RUNOUT_SENSOR)) #if ENABLED(LIN_ADVANCE) .enabled(1) #else .enabled(0) #endif - .tag(3).button( BTN_POS(1,3), BTN_SIZE(3,1), GET_TEXTF(LINEAR_ADVANCE)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(3,1), GET_TEXT_F(LINEAR_ADVANCE)) .colors(action_btn) - .tag(1) .button( BTN_POS(1,6), BTN_SIZE(3,1), GET_TEXTF(BACK)); + .tag(1) .button( BTN_POS(1,6), BTN_SIZE(3,1), GET_TEXT_F(BACK)); #endif } } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_runout_screen.cpp index 12bf61d68b..fe67a7cdba 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_runout_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/filament_runout_screen.cpp @@ -32,15 +32,15 @@ using namespace Theme; void FilamentRunoutScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.heading( GET_TEXTF(FILAMENT)); - w.toggle( 2, GET_TEXTF(RUNOUT_SENSOR), getFilamentRunoutEnabled()); + w.heading( GET_TEXT_F(FILAMENT)); + w.toggle( 2, GET_TEXT_F(RUNOUT_SENSOR), getFilamentRunoutEnabled()); #ifdef FILAMENT_RUNOUT_DISTANCE_MM - w.heading(GET_TEXTF(DETECTION_THRESHOLD)); - w.units(GET_TEXTF(UNITS_MM)); + w.heading(GET_TEXT_F(DETECTION_THRESHOLD)); + w.units(GET_TEXT_F(UNITS_MM)); w.precision(0); w.color(e_axis); - w.adjuster( 10, GET_TEXTF(DISTANCE), getFilamentRunoutDistance_mm(), getFilamentRunoutEnabled()); + w.adjuster( 10, GET_TEXT_F(DISTANCE), getFilamentRunoutDistance_mm(), getFilamentRunoutEnabled()); w.increments(); #endif } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/files_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/files_screen.cpp index f562573bfd..d0bb97ad62 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/files_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/files_screen.cpp @@ -41,21 +41,15 @@ void FilesScreen::onEntry() { BaseScreen::onEntry(); } -const char *FilesScreen::getSelectedShortFilename() { +const char *FilesScreen::getSelectedFilename(bool longName) { FileList files; - files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true); - return files.shortFilename(); -} - -const char *FilesScreen::getSelectedLongFilename() { - FileList files; - files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true); - return files.longFilename(); + files.seek(getSelectedFileIndex(), true); + return longName ? files.longFilename() : files.shortFilename(); } void FilesScreen::drawSelectedFile() { FileList files; - files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true); + files.seek(getSelectedFileIndex(), true); screen_data.FilesScreen.flags.is_dir = files.isDir(); drawFileButton( files.filename(), @@ -65,6 +59,10 @@ void FilesScreen::drawSelectedFile() { ); } +uint16_t FilesScreen::getSelectedFileIndex() { + return getFileForTag(screen_data.FilesScreen.selected_tag); +} + uint16_t FilesScreen::getFileForTag(uint8_t tag) { return screen_data.FilesScreen.cur_page * files_per_page + tag - 2; } @@ -169,13 +167,13 @@ void FilesScreen::drawFooter() { cmd.colors(normal_btn) .font(font_medium) .colors(has_selection ? normal_btn : action_btn) - .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXTF(BACK)) + .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(BACK)) .enabled(has_selection) .colors(has_selection ? action_btn : normal_btn); if (screen_data.FilesScreen.flags.is_dir) { - cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXTF(OPEN_DIR)); + cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(OPEN_DIR)); } else { - cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXTF(PRINT_FILE)); + cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(PRINT_FILE)); } } @@ -213,9 +211,7 @@ bool FilesScreen::onTouchEnd(uint8_t tag) { } break; case 243: - printFile(getSelectedShortFilename()); - StatusScreen::setStatusMessage(GET_TEXTF(PRINT_STARTING)); - GOTO_SCREEN(StatusScreen); + ConfirmStartPrintDialogBox::show(getSelectedFileIndex()); return true; case 244: { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_settings_screen.cpp index e1b27c79ae..16c355d457 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_settings_screen.cpp @@ -69,15 +69,15 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { .cmd(COLOR_RGB(bg_text_enabled)) .tag(0) .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXTF(INTERFACE_SETTINGS)) + .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(INTERFACE_SETTINGS)) #undef EDGE_R #define EDGE_R 30 .font(font_small) .tag(0) - .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(LCD_BRIGHTNESS), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY); - cmd.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(BOOT_SCREEN), OPT_RIGHTX | OPT_CENTERY); + .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(LCD_BRIGHTNESS), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY); + cmd.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(BOOT_SCREEN), OPT_RIGHTX | OPT_CENTERY); #undef EDGE_R } @@ -94,19 +94,19 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.brightness, 128) .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) .colors(ui_toggle) - .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXTF(NO), GET_TEXTF(YES), LockScreen::is_enabled()) - .tag(5).toggle2(BTN_POS(3,5), BTN_SIZE(w,1), GET_TEXTF(NO), GET_TEXTF(YES), UIData::animations_enabled()) + .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(NO), GET_TEXT_F(YES), LockScreen::is_enabled()) + .tag(5).toggle2(BTN_POS(3,5), BTN_SIZE(w,1), GET_TEXT_F(NO), GET_TEXT_F(YES), UIData::animations_enabled()) #undef EDGE_R #define EDGE_R 0 #ifdef TOUCH_UI_PORTRAIT .colors(normal_btn) - .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXTF(INTERFACE_SOUNDS)) + .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(INTERFACE_SOUNDS)) .colors(action_btn) - .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXTF(BACK)); + .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(BACK)); #else - .tag(6).button (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SOUNDS)) + .tag(6).button (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(INTERFACE_SOUNDS)) .colors(action_btn) - .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #endif } } @@ -263,9 +263,9 @@ void InterfaceSettingsScreen::loadSettings(const char *buff) { success = persistentStore.write_data(0, data, LULZBOT_EEPROM_BACKUP_SIZE) == PERSISTENT_STORE_SUCCESS; if (success) - StatusScreen::setStatusMessage(GET_TEXTF(EEPROM_RESTORED)); + StatusScreen::setStatusMessage(GET_TEXT_F(EEPROM_RESTORED)); else - StatusScreen::setStatusMessage(GET_TEXTF(EEPROM_RESET)); + StatusScreen::setStatusMessage(GET_TEXT_F(EEPROM_RESET)); return success; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_sounds_screen.cpp index a116ae29fe..819a4519a8 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/interface_sounds_screen.cpp @@ -71,15 +71,15 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { #define GRID_ROWS 9 .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXTF(INTERFACE_SOUNDS)) + .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(INTERFACE_SOUNDS)) #undef EDGE_R #define EDGE_R 30 .font(font_small) - .tag(0).text (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(PRINT_ERROR), OPT_RIGHTX | OPT_CENTERY); + .tag(0).text (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(PRINT_ERROR), OPT_RIGHTX | OPT_CENTERY); #undef EDGE_R } @@ -95,7 +95,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { #define EDGE_R 30 .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) .colors(ui_toggle) - .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXTF(NO), GET_TEXTF(YES), UIData::touch_sounds_enabled()) + .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(NO), GET_TEXT_F(YES), UIData::touch_sounds_enabled()) #undef EDGE_R .colors(normal_btn) #define EDGE_R 0 @@ -103,7 +103,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { .tag(5).button (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED)) .tag(6).button (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED)) .colors(action_btn) - .tag(1).button (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXTF(BACK)); + .tag(1).button (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(BACK)); } } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/jerk_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/jerk_screen.cpp index 7053314757..22f5ddbf91 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/jerk_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/jerk_screen.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if ENABLED(LULZBOT_TOUCH_UI) && DISABLED(JUNCTION_DEVIATION) +#if BOTH(LULZBOT_TOUCH_UI, CLASSIC_JERK) #include "screens.h" @@ -34,12 +34,12 @@ void JerkScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(1); - w.units(GET_TEXTF(UNITS_MM_S)); - w.heading(GET_TEXTF(JERK)); - w.color(x_axis) .adjuster( 2, GET_TEXTF(AXIS_X), getAxisMaxJerk_mm_s(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXTF(AXIS_Y), getAxisMaxJerk_mm_s(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXTF(AXIS_Z), getAxisMaxJerk_mm_s(Z) ); - w.color(e_axis) .adjuster( 8, GET_TEXTF(AXIS_E), getAxisMaxJerk_mm_s(E0) ); + w.units(GET_TEXT_F(UNITS_MM_S)); + w.heading(GET_TEXT_F(JERK)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(AXIS_X), getAxisMaxJerk_mm_s(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(AXIS_Y), getAxisMaxJerk_mm_s(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(AXIS_Z), getAxisMaxJerk_mm_s(Z) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(AXIS_E), getAxisMaxJerk_mm_s(E0) ); w.increments(); } @@ -62,4 +62,4 @@ bool JerkScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // LULZBOT_TOUCH_UI +#endif // LULZBOT_TOUCH_UI && CLASSIC_JERK diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/junction_deviation_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/junction_deviation_screen.cpp index 56a3b13365..617cdd2510 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/junction_deviation_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/junction_deviation_screen.cpp @@ -22,7 +22,7 @@ #include "../config.h" -#if BOTH(LULZBOT_TOUCH_UI, JUNCTION_DEVIATION) +#if ENABLED(LULZBOT_TOUCH_UI) && DISABLED(CLASSIC_JERK) #include "screens.h" @@ -33,9 +33,9 @@ using namespace Theme; void JunctionDeviationScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(2); - w.units(GET_TEXTF(UNITS_MM)); - w.heading(GET_TEXTF(JUNC_DEVIATION)); - w.color(other) .adjuster( 2, PSTR(""), getJunctionDeviation_mm() ); + w.units(GET_TEXT_F(UNITS_MM)); + w.heading(GET_TEXT_F(JUNC_DEVIATION)); + w.color(other) .adjuster( 2, F(""), getJunctionDeviation_mm() ); w.increments(); } @@ -51,4 +51,4 @@ bool JunctionDeviationScreen::onTouchHeld(uint8_t tag) { return true; } -#endif // LULZBOT_TOUCH_UI +#endif // LULZBOT_TOUCH_UI && !CLASSIC_JERK diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/kill_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/kill_screen.cpp index 7fa8506734..853491032e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/kill_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/kill_screen.cpp @@ -32,7 +32,7 @@ using namespace FTDI; // loop. So we only have a show() method rather than onRedraw(). The KillScreen // should not be used as a model for other UI screens as it is an exception. -void KillScreen::show(progmem_str message) { +void KillScreen::show(const char *message) { CommandProcessor cmd; cmd.cmd(CMD_DLSTART) @@ -46,8 +46,8 @@ void KillScreen::show(progmem_str message) { cmd.font(Theme::font_large) .cmd(COLOR_RGB(Theme::bg_text_enabled)) .text(BTN_POS(1,2), BTN_SIZE(4,1), message) - .text(BTN_POS(1,3), BTN_SIZE(4,1), GET_TEXTF(PRINTER_HALTED)) - .text(BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXTF(PLEASE_RESET)); + .text(BTN_POS(1,3), BTN_SIZE(4,1), GET_TEXT_F(PRINTER_HALTED)) + .text(BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(PLEASE_RESET)); #undef GRID_COLS #undef GRID_ROWS diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/linear_advance_screen.cpp index 2c08fb24c8..f24ff9fc67 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/linear_advance_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/linear_advance_screen.cpp @@ -33,16 +33,16 @@ using namespace Theme; void LinearAdvanceScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(2, DEFAULT_LOWEST).color(e_axis); - w.heading( GET_TEXTF(LINEAR_ADVANCE)); + w.heading( GET_TEXT_F(LINEAR_ADVANCE)); #if EXTRUDERS == 1 - w.adjuster( 2, GET_TEXTF(LINEAR_ADVANCE_K), getLinearAdvance_mm_mm_s(E0) ); + w.adjuster( 2, GET_TEXT_F(LINEAR_ADVANCE_K), getLinearAdvance_mm_mm_s(E0) ); #else - w.adjuster( 2, GET_TEXTF(LINEAR_ADVANCE_K1), getLinearAdvance_mm_mm_s(E0) ); - w.adjuster( 4, GET_TEXTF(LINEAR_ADVANCE_K2), getLinearAdvance_mm_mm_s(E1) ); + w.adjuster( 2, GET_TEXT_F(LINEAR_ADVANCE_K1), getLinearAdvance_mm_mm_s(E0) ); + w.adjuster( 4, GET_TEXT_F(LINEAR_ADVANCE_K2), getLinearAdvance_mm_mm_s(E1) ); #if EXTRUDERS > 2 - w.adjuster( 6, GET_TEXTF(LINEAR_ADVANCE_K3), getLinearAdvance_mm_mm_s(E2) ); + w.adjuster( 6, GET_TEXT_F(LINEAR_ADVANCE_K3), getLinearAdvance_mm_mm_s(E2) ); #if EXTRUDERS > 3 - w.adjuster( 8, GET_TEXTF(LINEAR_ADVANCE_K4), getLinearAdvance_mm_mm_s(E3) ); + w.adjuster( 8, GET_TEXT_F(LINEAR_ADVANCE_K4), getLinearAdvance_mm_mm_s(E3) ); #endif #endif #endif diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/lock_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/lock_screen.cpp index ae683ced54..13b42b8cee 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/lock_screen.cpp @@ -45,6 +45,7 @@ void LockScreen::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { cmd.cmd(CLEAR_COLOR_RGB(bg_color)) .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) .tag(0); } @@ -65,16 +66,16 @@ void LockScreen::onRedraw(draw_mode_t what) { progmem_str message; switch (message_style()) { case 'w': - message = GET_TEXTF(PASSCODE_REJECTED); + message = GET_TEXT_F(PASSCODE_REJECTED); break; case 'g': - message = GET_TEXTF(PASSCODE_ACCEPTED); + message = GET_TEXT_F(PASSCODE_ACCEPTED); break; default: if (passcode == 0) { - message = GET_TEXTF(PASSCODE_SELECT); + message = GET_TEXT_F(PASSCODE_SELECT); } else { - message = GET_TEXTF(PASSCODE_REQUEST); + message = GET_TEXT_F(PASSCODE_REQUEST); } } message_style() = '\0'; // Terminate the string. @@ -88,29 +89,28 @@ void LockScreen::onRedraw(draw_mode_t what) { const uint8_t pressed = EventLoop::get_pressed_tag(); cmd.font(font_large) - .cmd(COLOR_RGB(bg_text_enabled)) - #ifdef TOUCH_UI_PORTRAIT + #ifdef TOUCH_UI_PORTRAIT .text(BTN_POS(1,2), BTN_SIZE(1,1), message) .font(font_xlarge) .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.LockScreen.passcode) - #else + #else .text(BTN_POS(1,1), BTN_SIZE(1,1), message) .font(font_xlarge) .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.LockScreen.passcode) - #endif + #endif .font(font_large) .colors(normal_btn) - #ifdef TOUCH_UI_PASSCODE + #ifdef TOUCH_UI_PASSCODE .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("123"), pressed) .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("456"), pressed) .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("789"), pressed) .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("0.<"), pressed); - #else + #else .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("1234567890"), pressed) .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("qwertyuiop"), pressed) .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("asdfghjkl "), pressed) .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("zxcvbnm!?<"), pressed); - #endif + #endif #undef MARGIN_T #undef MARGIN_B diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/main_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/main_menu.cpp index ae6dd58c24..23c4415c81 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/main_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/main_menu.cpp @@ -43,53 +43,53 @@ void MainMenu::onRedraw(draw_mode_t what) { #ifdef TOUCH_UI_PORTRAIT #define GRID_ROWS 8 #define GRID_COLS 2 - .tag(2).button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXTF(AUTO_HOME)) + .tag(2).button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(AUTO_HOME)) #ifdef NOZZLE_CLEAN_FEATURE .enabled(1) #else .enabled(0) #endif - .tag(3).button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(CLEAN_NOZZLE)) - .tag(4).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXTF(MOVE_AXIS)) - .tag(5).button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(MOTORS_OFF)) - .tag(6).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(TEMPERATURE)) - .tag(7).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(CHANGE_FILAMENT)) - .tag(8).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(ADVANCED_SETTINGS)) + .tag(3).button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(CLEAN_NOZZLE)) + .tag(4).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MOVE_AXIS)) + .tag(5).button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MOTORS_OFF)) + .tag(6).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(TEMPERATURE)) + .tag(7).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(CHANGE_FILAMENT)) + .tag(8).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(ADVANCED_SETTINGS)) #ifdef PRINTCOUNTER .enabled(1) #else .enabled(0) #endif - .tag(9).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(PRINTER_STATISTICS)) - .tag(10).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(ABOUT_PRINTER)) + .tag(9).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(PRINTER_STATISTICS)) + .tag(10).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(ABOUT_PRINTER)) .colors(action_btn) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS #else #define GRID_ROWS 5 #define GRID_COLS 2 - .tag(2).button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXTF(AUTO_HOME)) + .tag(2).button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(AUTO_HOME)) #if ENABLED(NOZZLE_CLEAN_FEATURE) .enabled(1) #else .enabled(0) #endif - .tag(3).button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(CLEAN_NOZZLE)) - .tag(4).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXTF(MOVE_AXIS)) - .tag(5).button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(MOTORS_OFF)) - .tag(6).button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXTF(TEMPERATURE)) - .tag(7).button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXTF(CHANGE_FILAMENT)) - .tag(8).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(ADVANCED_SETTINGS)) + .tag(3).button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(CLEAN_NOZZLE)) + .tag(4).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MOVE_AXIS)) + .tag(5).button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MOTORS_OFF)) + .tag(6).button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(TEMPERATURE)) + .tag(7).button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(CHANGE_FILAMENT)) + .tag(8).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(ADVANCED_SETTINGS)) #ifdef PRINTCOUNTER .enabled(1) #else .enabled(0) #endif - .tag(9).button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(PRINTER_STATISTICS)) - .tag(10).button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXTF(ABOUT_PRINTER)) + .tag(9).button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(PRINTER_STATISTICS)) + .tag(10).button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(ABOUT_PRINTER)) .colors(action_btn) - .tag(1).button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXTF(BACK)); + .tag(1).button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(BACK)); #undef GRID_COLS #undef GRID_ROWS #endif diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_acceleration_screen.cpp index 80e7f59cde..2a4569244d 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_acceleration_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_acceleration_screen.cpp @@ -33,21 +33,21 @@ using namespace Theme; void MaxAccelerationScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); - w.units(GET_TEXTF(UNITS_MM_S2)); - w.heading(GET_TEXTF(ACCELERATION)); - w.color(x_axis) .adjuster( 2, GET_TEXTF(AMAX_X), getAxisMaxAcceleration_mm_s2(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXTF(AMAX_Y), getAxisMaxAcceleration_mm_s2(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXTF(AMAX_Z), getAxisMaxAcceleration_mm_s2(Z) ); + w.units(GET_TEXT_F(UNITS_MM_S2)); + w.heading(GET_TEXT_F(ACCELERATION)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(AMAX_X), getAxisMaxAcceleration_mm_s2(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(AMAX_Y), getAxisMaxAcceleration_mm_s2(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(AMAX_Z), getAxisMaxAcceleration_mm_s2(Z) ); #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) - w.color(e_axis).adjuster( 8, GET_TEXTF(AMAX_E1), getAxisMaxAcceleration_mm_s2(E0) ); + w.color(e_axis).adjuster( 8, GET_TEXT_F(AMAX_E0), getAxisMaxAcceleration_mm_s2(E0) ); #elif EXTRUDERS > 1 - w.color(e_axis).adjuster( 8, GET_TEXTF(AMAX_E1), getAxisMaxAcceleration_mm_s2(E0) ); - w.color(e_axis).adjuster(10, GET_TEXTF(AMAX_E2), getAxisMaxAcceleration_mm_s2(E1) ); + w.color(e_axis).adjuster( 8, GET_TEXT_F(AMAX_E0), getAxisMaxAcceleration_mm_s2(E0) ); + w.color(e_axis).adjuster(10, GET_TEXT_F(AMAX_E1), getAxisMaxAcceleration_mm_s2(E1) ); #if EXTRUDERS > 2 - w.color(e_axis).adjuster(12, GET_TEXTF(AMAX_E3), getAxisMaxAcceleration_mm_s2(E2) ); + w.color(e_axis).adjuster(12, GET_TEXT_F(AMAX_E2), getAxisMaxAcceleration_mm_s2(E2) ); #endif #if EXTRUDERS > 3 - w.color(e_axis).adjuster(14, GET_TEXTF(AMAX_E4), getAxisMaxAcceleration_mm_s2(E3) ); + w.color(e_axis).adjuster(14, GET_TEXT_F(AMAX_E3), getAxisMaxAcceleration_mm_s2(E3) ); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_velocity_screen.cpp index 719e5a308e..8e5861ae0d 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_velocity_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/max_velocity_screen.cpp @@ -34,21 +34,21 @@ void MaxVelocityScreen::onRedraw(draw_mode_t what) { using namespace ExtUI; widgets_t w(what); w.precision(0); - w.units(GET_TEXTF(UNITS_MM_S)); - w.heading( GET_TEXTF(VELOCITY)); - w.color(x_axis) .adjuster( 2, GET_TEXTF(VMAX_X), getAxisMaxFeedrate_mm_s(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXTF(VMAX_Y), getAxisMaxFeedrate_mm_s(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXTF(VMAX_Z), getAxisMaxFeedrate_mm_s(Z) ); + w.units(GET_TEXT_F(UNITS_MM_S)); + w.heading( GET_TEXT_F(VELOCITY)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(VMAX_X), getAxisMaxFeedrate_mm_s(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(VMAX_Y), getAxisMaxFeedrate_mm_s(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(VMAX_Z), getAxisMaxFeedrate_mm_s(Z) ); #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) - w.color(e_axis) .adjuster( 8, GET_TEXTF(VMAX_E1), getAxisMaxFeedrate_mm_s(E0) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(VMAX_E1), getAxisMaxFeedrate_mm_s(E0) ); #elif EXTRUDERS > 1 - w.color(e_axis) .adjuster( 8, GET_TEXTF(VMAX_E1), getAxisMaxFeedrate_mm_s(E0) ); - w.color(e_axis) .adjuster( 10, GET_TEXTF(VMAX_E2), getAxisMaxFeedrate_mm_s(E1) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(VMAX_E1), getAxisMaxFeedrate_mm_s(E0) ); + w.color(e_axis) .adjuster( 10, GET_TEXT_F(VMAX_E2), getAxisMaxFeedrate_mm_s(E1) ); #if EXTRUDERS > 2 - w.color(e_axis).adjuster( 12, GET_TEXTF(VMAX_E3), getAxisMaxFeedrate_mm_s(E2) ); + w.color(e_axis).adjuster( 12, GET_TEXT_F(VMAX_E3), getAxisMaxFeedrate_mm_s(E2) ); #endif #if EXTRUDERS > 3 - w.color(e_axis).adjuster( 14, GET_TEXTF(VMAX_E4), getAxisMaxFeedrate_mm_s(E3) ); + w.color(e_axis).adjuster( 14, GET_TEXT_F(VMAX_E4), getAxisMaxFeedrate_mm_s(E3) ); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp index 86032e8562..5bc6f31df7 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp @@ -45,24 +45,24 @@ void MoveAxisScreen::onEntry() { void MoveAxisScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(1); - w.units(GET_TEXTF(UNITS_MM)); - w.heading( GET_TEXTF(MOVE_AXIS)); + w.units(GET_TEXT_F(UNITS_MM)); + w.heading( GET_TEXT_F(MOVE_AXIS)); w.home_buttons(20); - w.color(Theme::x_axis).adjuster( 2, GET_TEXTF(AXIS_X), getAxisPosition_mm(X), canMove(X)); - w.color(Theme::y_axis).adjuster( 4, GET_TEXTF(AXIS_Y), getAxisPosition_mm(Y), canMove(Y)); - w.color(Theme::z_axis).adjuster( 6, GET_TEXTF(AXIS_Z), getAxisPosition_mm(Z), canMove(Z)); + w.color(Theme::x_axis).adjuster( 2, GET_TEXT_F(AXIS_X), getAxisPosition_mm(X), canMove(X)); + w.color(Theme::y_axis).adjuster( 4, GET_TEXT_F(AXIS_Y), getAxisPosition_mm(Y), canMove(Y)); + w.color(Theme::z_axis).adjuster( 6, GET_TEXT_F(AXIS_Z), getAxisPosition_mm(Z), canMove(Z)); w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXTF(AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); #elif EXTRUDERS > 1 - w.adjuster( 8, GET_TEXTF(AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXTF(AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXTF(AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXTF(AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); #endif #endif w.increments(); @@ -110,8 +110,8 @@ float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { // Compute feedrate so that the tool lags the adjuster when it is // being held down, this allows enough margin for the planner to // connect segments and even out the motion. - constexpr float manual_feedrate[XYZE] = MANUAL_FEEDRATE; - return min(manual_feedrate[axis] / 60.0f, abs(increment_mm * (TOUCH_REPEATS_PER_SECOND) * 0.80f)); + constexpr xyze_feedrate_t max_manual_feedrate = MANUAL_FEEDRATE; + return min(max_manual_feedrate[axis] / 60.0f, abs(increment_mm * (TOUCH_REPEATS_PER_SECOND) * 0.80f)); } void MoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) { diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nozzle_offsets_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nozzle_offsets_screen.cpp index e8835ba858..eb29588b23 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nozzle_offsets_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nozzle_offsets_screen.cpp @@ -39,14 +39,14 @@ void NozzleOffsetScreen::onEntry() { void NozzleOffsetScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(2).units(GET_TEXTF(UNITS_MM)); + w.precision(2).units(GET_TEXT_F(UNITS_MM)); - w.heading( GET_TEXTF(TOOL_OFFSETS)); - w.color(Theme::x_axis).adjuster(2, GET_TEXTF(AXIS_X), ExtUI::getNozzleOffset_mm(X, E1)); - w.color(Theme::y_axis).adjuster(4, GET_TEXTF(AXIS_Y), ExtUI::getNozzleOffset_mm(Y, E1)); - w.color(Theme::z_axis).adjuster(6, GET_TEXTF(AXIS_Z), ExtUI::getNozzleOffset_mm(Z, E1)); + w.heading( GET_TEXT_F(TOOL_OFFSETS)); + w.color(Theme::x_axis).adjuster(2, GET_TEXT_F(AXIS_X), ExtUI::getNozzleOffset_mm(X, E1)); + w.color(Theme::y_axis).adjuster(4, GET_TEXT_F(AXIS_Y), ExtUI::getNozzleOffset_mm(Y, E1)); + w.color(Theme::z_axis).adjuster(6, GET_TEXT_F(AXIS_Z), ExtUI::getNozzleOffset_mm(Z, E1)); #if ENABLED(CALIBRATION_GCODE) - w.button(8, GET_TEXTF(MEASURE_AUTOMATICALLY), !isPrinting()); + w.button(8, GET_TEXT_F(MEASURE_AUTOMATICALLY), !isPrinting()); #endif w.increments(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nudge_nozzle_screen.cpp index 74e7c45040..e86e66b9c2 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/nudge_nozzle_screen.cpp @@ -36,29 +36,28 @@ void NudgeNozzleScreen::onEntry() { #if EXTRUDERS > 1 screen_data.NudgeNozzleScreen.link_nozzles = true; #endif - LOOP_XYZ(i) { - screen_data.NudgeNozzleScreen.rel[i] = 0; - } + screen_data.NudgeNozzleScreen.rel.reset(); + BaseNumericAdjustmentScreen::onEntry(); } void NudgeNozzleScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXTF(UNITS_MM)); + w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(UNITS_MM)); - w.heading( GET_TEXTF(NUDGE_NOZZLE)); + w.heading( GET_TEXT_F(NUDGE_NOZZLE)); #if ENABLED(BABYSTEP_XY) - w.color(x_axis).adjuster(2, GET_TEXTF(AXIS_X), screen_data.NudgeNozzleScreen.rel[0] / getAxisSteps_per_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXTF(AXIS_Y), screen_data.NudgeNozzleScreen.rel[1] / getAxisSteps_per_mm(Y)); + w.color(x_axis).adjuster(2, GET_TEXT_F(AXIS_X), screen_data.NudgeNozzleScreen.rel.x / getAxisSteps_per_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(AXIS_Y), screen_data.NudgeNozzleScreen.rel.y / getAxisSteps_per_mm(Y)); #endif - w.color(z_axis).adjuster(6, GET_TEXTF(AXIS_Z), screen_data.NudgeNozzleScreen.rel[2] / getAxisSteps_per_mm(Z)); + w.color(z_axis).adjuster(6, GET_TEXT_F(AXIS_Z), screen_data.NudgeNozzleScreen.rel.z / getAxisSteps_per_mm(Z)); w.increments(); #if EXTRUDERS > 1 - w.toggle (8, GET_TEXTF(ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); + w.toggle (8, GET_TEXT_F(ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); #endif #if EXTRUDERS > 1 || HAS_BED_PROBE - w.toggle (9, GET_TEXTF(SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); + w.toggle (9, GET_TEXT_F(SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); if (screen_data.NudgeNozzleScreen.show_offsets) { char str[19]; @@ -70,12 +69,12 @@ void NudgeNozzleScreen::onRedraw(draw_mode_t what) { dtostrf(getZOffset_mm(), 4, 2, str); strcat(str, " "); strcat_P(str, GET_TEXT(UNITS_MM)); - w.text_field (0, GET_TEXTF(ZPROBE_ZOFFSET), str); + w.text_field (0, GET_TEXT_F(ZPROBE_ZOFFSET), str); #endif #if EXTRUDERS > 1 format_position(str, getNozzleOffset_mm(X, E1), getNozzleOffset_mm(Y, E1), getNozzleOffset_mm(Z, E1)); - w.text_field (0, GET_TEXTF(TOOL_OFFSETS), str); + w.text_field (0, GET_TEXT_F(TOOL_OFFSETS), str); #endif } #endif @@ -90,12 +89,12 @@ bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { #endif int16_t steps; switch (tag) { - case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzleScreen.rel[0] -= steps; break; - case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzleScreen.rel[0] += steps; break; - case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzleScreen.rel[1] -= steps; break; - case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel[1] += steps; break; - case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel[2] -= steps; break; - case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel[2] += steps; break; + case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzleScreen.rel.x -= steps; break; + case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzleScreen.rel.x += steps; break; + case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzleScreen.rel.y -= steps; break; + case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel.y += steps; break; + case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel.z -= steps; break; + case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel.z += steps; break; #if EXTRUDERS > 1 case 8: screen_data.NudgeNozzleScreen.link_nozzles = !link; break; #endif diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/restore_failsafe_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/restore_failsafe_dialog_box.cpp index 717fea9cac..4c91e628f7 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/restore_failsafe_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/restore_failsafe_dialog_box.cpp @@ -29,7 +29,7 @@ using namespace ExtUI; void RestoreFailsafeDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(EEPROM_RESET_WARNING)); + drawMessage(GET_TEXT_F(EEPROM_RESET_WARNING)); drawYesNoButtons(); } @@ -37,7 +37,7 @@ bool RestoreFailsafeDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: ExtUI::injectCommands_P(PSTR("M502")); - AlertDialogBox::show(GET_TEXTF(EEPROM_RESET)); + AlertDialogBox::show(GET_TEXT_F(EEPROM_RESET)); // Remove RestoreFailsafeDialogBox from the stack // so the alert box doesn't return to it. current_screen.forget(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/save_settings_dialog_box.cpp index b29c171cf7..e2c8a81e30 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/save_settings_dialog_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/save_settings_dialog_box.cpp @@ -31,7 +31,7 @@ using namespace ExtUI; bool SaveSettingsDialogBox::needs_save = false; void SaveSettingsDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXTF(EEPROM_SAVE_PROMPT)); + drawMessage(GET_TEXT_F(EEPROM_SAVE_PROMPT)); drawYesNoButtons(); } @@ -40,7 +40,7 @@ bool SaveSettingsDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: injectCommands_P(PSTR("M500")); - AlertDialogBox::show(GET_TEXTF(EEPROM_SAVED)); + AlertDialogBox::show(GET_TEXT_F(EEPROM_SAVED)); // Remove SaveSettingsDialogBox from the stack // so the alert box doesn't return to me. current_screen.forget(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screen_data.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screen_data.h index 65cb6e85d7..65d6889a6a 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screen_data.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screen_data.h @@ -35,6 +35,7 @@ union screen_data_t { struct {char passcode[5];} LockScreen; struct {bool isError;} AlertDialogBox; struct {bool auto_hide;} SpinnerDialogBox; + struct {uint8_t file_index;} ConfirmStartPrintDialogBox; struct { uint8_t e_tag, t_tag, repeat_tag; ExtUI::extruder_t saved_extruder; @@ -65,7 +66,7 @@ union screen_data_t { #if ENABLED(BABYSTEPPING) struct { struct base_numeric_adjustment_t placeholder; - int16_t rel[XYZ]; + xyz_int_t rel; #if EXTRUDERS > 1 bool link_nozzles; #endif diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.cpp index 59d4069d6c..42eb8317c9 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.cpp @@ -43,6 +43,7 @@ SCREEN_TABLE { DECL_SCREEN(ConfirmUserRequestAlertBox), DECL_SCREEN(RestoreFailsafeDialogBox), DECL_SCREEN(SaveSettingsDialogBox), + DECL_SCREEN(ConfirmStartPrintDialogBox), DECL_SCREEN(ConfirmAbortPrintDialogBox), #if ENABLED(CALIBRATION_GCODE) DECL_SCREEN(ConfirmAutoCalibrationDialogBox), @@ -74,7 +75,7 @@ SCREEN_TABLE { DECL_SCREEN(MaxVelocityScreen), DECL_SCREEN(MaxAccelerationScreen), DECL_SCREEN(DefaultAccelerationScreen), -#if ENABLED(JUNCTION_DEVIATION) +#if DISABLED(CLASSIC_JERK) DECL_SCREEN(JunctionDeviationScreen), #else DECL_SCREEN(JerkScreen), diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h index 20a1809014..a781564644 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h @@ -55,7 +55,7 @@ enum { MAX_VELOCITY_SCREEN_CACHE, MAX_ACCELERATION_SCREEN_CACHE, DEFAULT_ACCELERATION_SCREEN_CACHE, -#if ENABLED(JUNCTION_DEVIATION) +#if DISABLED(CLASSIC_JERK) JUNC_DEV_SCREEN_CACHE, #else JERK_SCREEN_CACHE, @@ -135,7 +135,7 @@ class KillScreen { // The KillScreen is behaves differently than the // others, so we do not bother extending UIScreen. public: - static void show(progmem_str msg); + static void show(const char*); }; class DialogBoxBaseClass : public BaseScreen { @@ -179,6 +179,20 @@ class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen { static void settingsChanged() {needs_save = true;} }; +class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { + private: + inline static const char *getShortFilename() {return getFilename(false);} + inline static const char *getLongFilename() {return getFilename(true);} + + static const char *getFilename(bool longName); + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t); + + static void show(uint8_t file_index); +}; + class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { public: static void onRedraw(draw_mode_t); @@ -360,7 +374,8 @@ class BaseNumericAdjustmentScreen : public BaseScreen { BTN_ACTION, BTN_TOGGLE, BTN_DISABLED, - TEXT_AREA + TEXT_AREA, + TEXT_LABEL } _style; protected: @@ -488,7 +503,7 @@ class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public Cac static bool onTouchHeld(uint8_t tag); }; -#if ENABLED(JUNCTION_DEVIATION) +#if DISABLED(CLASSIC_JERK) class JunctionDeviationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); @@ -637,9 +652,11 @@ class FilesScreen : public BaseScreen, public CachedScreen 1 - w.color(e_axis).adjuster( 8, GET_TEXTF(AXIS_E1), getAxisCurrent_mA(E0) ); - w.color(e_axis).adjuster(10, GET_TEXTF(AXIS_E2), getAxisCurrent_mA(E1) ); + w.color(e_axis).adjuster( 8, GET_TEXT_F(AXIS_E1), getAxisCurrent_mA(E0) ); + w.color(e_axis).adjuster(10, GET_TEXT_F(AXIS_E2), getAxisCurrent_mA(E1) ); #if EXTRUDERS > 2 - w.color(e_axis).adjuster(12, GET_TEXTF(AXIS_E3), getAxisCurrent_mA(E2) ); + w.color(e_axis).adjuster(12, GET_TEXT_F(AXIS_E3), getAxisCurrent_mA(E2) ); #endif #if EXTRUDERS > 3 - w.color(e_axis).adjuster(14, GET_TEXTF(AXIS_E4), getAxisCurrent_mA(E3) ); + w.color(e_axis).adjuster(14, GET_TEXT_F(AXIS_E4), getAxisCurrent_mA(E3) ); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/steps_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/steps_screen.cpp index 3f69e25559..a265070ff8 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/steps_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/steps_screen.cpp @@ -33,21 +33,21 @@ using namespace Theme; void StepsScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); - w.units(GET_TEXTF(UNITS_STEP_MM)); - w.heading( GET_TEXTF(STEPS_PER_MM)); - w.color(x_axis) .adjuster( 2, GET_TEXTF(AXIS_X), getAxisSteps_per_mm(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXTF(AXIS_Y), getAxisSteps_per_mm(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXTF(AXIS_Z), getAxisSteps_per_mm(Z) ); + w.units(GET_TEXT_F(UNITS_STEP_MM)); + w.heading( GET_TEXT_F(STEPS_PER_MM)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(AXIS_X), getAxisSteps_per_mm(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(AXIS_Y), getAxisSteps_per_mm(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(AXIS_Z), getAxisSteps_per_mm(Z) ); #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) - w.color(e_axis) .adjuster( 8, GET_TEXTF(AXIS_E), getAxisSteps_per_mm(E0) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(AXIS_E), getAxisSteps_per_mm(E0) ); #elif EXTRUDERS > 1 - w.color(e_axis) .adjuster( 8, GET_TEXTF(AXIS_E1), getAxisSteps_per_mm(E0) ); - w.color(e_axis) .adjuster(10, GET_TEXTF(AXIS_E2), getAxisSteps_per_mm(E1) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(AXIS_E1), getAxisSteps_per_mm(E0) ); + w.color(e_axis) .adjuster(10, GET_TEXT_F(AXIS_E2), getAxisSteps_per_mm(E1) ); #if EXTRUDERS > 2 - w.color(e_axis) .adjuster(12, GET_TEXTF(AXIS_E3), getAxisSteps_per_mm(E2) ); + w.color(e_axis) .adjuster(12, GET_TEXT_F(AXIS_E3), getAxisSteps_per_mm(E2) ); #endif #if EXTRUDERS > 3 - w.color(e_axis) .adjuster(14, GET_TEXTF(AXIS_E4), getAxisSteps_per_mm(E3) ); + w.color(e_axis) .adjuster(14, GET_TEXT_F(AXIS_E4), getAxisSteps_per_mm(E3) ); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/string_format.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/string_format.cpp index 17a4a73cf2..56ae3cb776 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/string_format.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/string_format.cpp @@ -30,12 +30,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wno-format" -#ifdef __AVR__ - #define S_FMT "%S" -#else - #define S_FMT "%s" -#endif - /** * Formats a temperature string (e.g. "100°C") */ diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp index aeaecb4096..5796b6585b 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp @@ -32,29 +32,29 @@ using namespace ExtUI; void TemperatureScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(0).color(temp).units(GET_TEXTF(UNITS_C)); - w.heading(GET_TEXTF(TEMPERATURE)); - w.button(30, GET_TEXTF(COOLDOWN)); + w.precision(0).color(temp).units(GET_TEXT_F(UNITS_C)); + w.heading(GET_TEXT_F(TEMPERATURE)); + w.button(30, GET_TEXT_F(COOLDOWN)); #ifndef LULZBOT_DISABLE_TOOLHEAD_HEATER #if HOTENDS == 1 - w.adjuster( 2, GET_TEXTF(HOTEND), getTargetTemp_celsius(E0)); + w.adjuster( 2, GET_TEXT_F(HOTEND), getTargetTemp_celsius(E0)); #else - w.adjuster( 2, GET_TEXTF(HOTEND1), getTargetTemp_celsius(E0)); - w.adjuster( 4, GET_TEXTF(HOTEND2), getTargetTemp_celsius(E1)); + w.adjuster( 2, GET_TEXT_F(HOTEND1), getTargetTemp_celsius(E0)); + w.adjuster( 4, GET_TEXT_F(HOTEND2), getTargetTemp_celsius(E1)); #if HOTENDS > 2 - w.adjuster( 6, GET_TEXTF(HOTEND3), getTargetTemp_celsius(E2)); + w.adjuster( 6, GET_TEXT_F(HOTEND3), getTargetTemp_celsius(E2)); #endif #if HOTENDS > 3 - w.adjuster( 8, GET_TEXTF(HOTEND4), getTargetTemp_celsius(E3)); + w.adjuster( 8, GET_TEXT_F(HOTEND4), getTargetTemp_celsius(E3)); #endif #endif #endif #if HAS_HEATED_BED - w.adjuster( 20, GET_TEXTF(BED), getTargetTemp_celsius(BED)); + w.adjuster( 20, GET_TEXT_F(BED), getTargetTemp_celsius(BED)); #endif #if FAN_COUNT > 0 - w.color(fan_speed).units(GET_TEXTF(UNITS_PERCENT)); - w.adjuster( 10, GET_TEXTF(FAN_SPEED), getTargetFan_percent(FAN0)); + w.color(fan_speed).units(GET_TEXT_F(UNITS_PERCENT)); + w.adjuster( 10, GET_TEXT_F(FAN_SPEED), getTargetFan_percent(FAN0)); #endif w.increments(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/touch_calibration_screen.cpp index 0779bb6fb2..d4e64667b6 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/touch_calibration_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/touch_calibration_screen.cpp @@ -45,7 +45,7 @@ void TouchCalibrationScreen::onEntry() { .cmd(CLEAR_COLOR_RGB(bg_color)) .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)); - draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(4,16), GET_TEXTF(TOUCH_CALIBRATION_START), OPT_CENTER, font_large); + draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(4,16), GET_TEXT_F(TOUCH_CALIBRATION_START), OPT_CENTER, font_large); cmd.cmd(DL::DL_DISPLAY) .cmd(CMD_SWAP) .execute(); @@ -76,7 +76,7 @@ void TouchCalibrationScreen::onRedraw(draw_mode_t) { .cmd(CLEAR(true,true,true)) .cmd(COLOR_RGB(bg_text_enabled)); - draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(4,16), GET_TEXTF(TOUCH_CALIBRATION_PROMPT), OPT_CENTER, font_large); + draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(4,16), GET_TEXT_F(TOUCH_CALIBRATION_PROMPT), OPT_CENTER, font_large); cmd.cmd(CMD_CALIBRATE); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/tune_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/tune_menu.cpp index 416a0146fe..6cb8a27ba0 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/tune_menu.cpp @@ -33,8 +33,7 @@ void TuneMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .font(font_medium); + .cmd(CLEAR(true,true,true)); } #ifdef TOUCH_UI_PORTRAIT @@ -52,79 +51,79 @@ void TuneMenu::onRedraw(draw_mode_t what) { cmd.colors(normal_btn) .font(font_medium) #ifdef TOUCH_UI_PORTRAIT - .tag(2).enabled(1) .button( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(TEMPERATURE)) - .tag(3).enabled(!isPrinting()).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(CHANGE_FILAMENT)) + .tag(2).enabled(1) .button( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(TEMPERATURE)) + .tag(3).enabled(!isPrinting()).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(CHANGE_FILAMENT)) #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) .enabled(1) #else .enabled(0) #endif - .tag(9).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(FILAMENT)) + .tag(9).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(FILAMENT)) #if ENABLED(BABYSTEPPING) - .tag(4).enabled(1) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(NUDGE_NOZZLE)) + .tag(4).enabled(1) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(NUDGE_NOZZLE)) #else #if HAS_BED_PROBE .enabled(1) #else .enabled(0) #endif - .tag(4) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(ZPROBE_ZOFFSET)) + .tag(4) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(ZPROBE_ZOFFSET)) #endif - .tag(5).enabled(1) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(PRINT_SPEED)) + .tag(5).enabled(1) .button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(PRINT_SPEED)) .tag(isPrintingFromMediaPaused() ? 7 : 6) #if ENABLED(SDSUPPORT) .enabled(isPrintingFromMedia()) #else .enabled(0) #endif - .button( BTN_POS(1,6), BTN_SIZE(2,1), isPrintingFromMediaPaused() ? GET_TEXTF(RESUME_PRINT) : GET_TEXTF(PAUSE_PRINT)) + .button( BTN_POS(1,6), BTN_SIZE(2,1), isPrintingFromMediaPaused() ? GET_TEXT_F(RESUME_PRINT) : GET_TEXT_F(PAUSE_PRINT)) #if ENABLED(SDSUPPORT) .enabled(isPrintingFromMedia()) #else .enabled(0) #endif - .tag(8) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(STOP_PRINT)) + .tag(8) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(STOP_PRINT)) .tag(1).colors(action_btn) - .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(BACK)); + .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(BACK)); #else // TOUCH_UI_PORTRAIT - .tag(2).enabled(1) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXTF(TEMPERATURE)) - .tag(3).enabled(!isPrinting()).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXTF(CHANGE_FILAMENT)) + .tag(2).enabled(1) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(TEMPERATURE)) + .tag(3).enabled(!isPrinting()).button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(CHANGE_FILAMENT)) #if ENABLED(BABYSTEPPING) .enabled(1) #else .enabled(0) #endif #if ENABLED(BABYSTEPPING) - .tag(4) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXTF(NUDGE_NOZZLE)) + .tag(4) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(NUDGE_NOZZLE)) #else #if HAS_BED_PROBE .enabled(1) #else .enabled(0) #endif - .tag(4) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(ZPROBE_ZOFFSET)) + .tag(4) .button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(ZPROBE_ZOFFSET)) #endif - .tag(5).enabled(1) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXTF(PRINT_SPEED)) + .tag(5).enabled(1) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(PRINT_SPEED)) .tag(isPrintingFromMediaPaused() ? 7 : 6) #if ENABLED(SDSUPPORT) .enabled(isPrintingFromMedia()) #else .enabled(0) #endif - .button( BTN_POS(1,3), BTN_SIZE(1,1), isPrintingFromMediaPaused() ? GET_TEXTF(RESUME_PRINT) : GET_TEXTF(PAUSE_PRINT)) + .button( BTN_POS(1,3), BTN_SIZE(1,1), isPrintingFromMediaPaused() ? GET_TEXT_F(RESUME_PRINT) : GET_TEXT_F(PAUSE_PRINT)) #if ENABLED(SDSUPPORT) .enabled(isPrintingFromMedia()) #else .enabled(0) #endif - .tag(8). button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXTF(STOP_PRINT)) + .tag(8). button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(STOP_PRINT)) #if ENABLED(LIN_ADVANCE) || ENABLED(FILAMENT_RUNOUT_SENSOR) .enabled(1) #else .enabled(0) #endif - .tag(9).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXTF(FILAMENT)) - .tag(1).colors(action_btn) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXTF(BACK)); + .tag(9).button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(FILAMENT)) + .tag(1).colors(action_btn) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(BACK)); #endif } #undef GRID_COLS diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/z_offset_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/z_offset_screen.cpp index 32a54c09bf..acdee1a656 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/z_offset_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/z_offset_screen.cpp @@ -32,10 +32,10 @@ using namespace Theme; void ZOffsetScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXTF(UNITS_MM)); + w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(UNITS_MM)); - w.heading( GET_TEXTF(ZPROBE_ZOFFSET)); - w.color(z_axis).adjuster(4, GET_TEXTF(ZPROBE_ZOFFSET), getZOffset_mm()); + w.heading( GET_TEXT_F(ZPROBE_ZOFFSET)); + w.color(z_axis).adjuster(4, GET_TEXT_F(ZPROBE_ZOFFSET), getZOffset_mm()); w.increments(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/colors.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/colors.h index 1dae8de4b2..055719d99b 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/colors.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/colors.h @@ -23,25 +23,52 @@ #pragma once namespace Theme { + #ifdef LULZBOT_USE_BIOPRINTER_UI + // The Lulzbot Bio uses the color PANTONE 2175C on the case silkscreen. + // This translates to HSL(208°, 100%, 39%) as an accent color on the GUI. - #define COLOR_CORRECTION(rgb) ( \ - (uint32_t((((rgb) & 0xFF0000) >> 16) * 1.00) << 16) | \ - (uint32_t((((rgb) & 0x00FF00) >> 8) * 1.00) << 8) | \ - (uint32_t((((rgb) & 0x0000FF) >> 0) * .75) << 0)) + constexpr int accent_hue = 208; + constexpr float accent_sat = 0.5; - #define COLOR_BLEND(a,b,f) COLOR_CORRECTION( \ - (uint32_t((((a) & 0xFF0000) >> 16) * f + (((b) & 0xFF0000) >> 16) * (1-f)) << 16) | \ - (uint32_t((((a) & 0x00FF00) >> 8) * f + (((b) & 0x00FF00) >> 8) * (1-f)) << 8) | \ - (uint32_t((((a) & 0x0000FF) >> 0) * f + (((b) & 0x0000FF) >> 0) * (1-f)) << 0)) + constexpr uint32_t logo_bg = 0xffffff; + constexpr uint32_t logo_fg = 0xffffff; + constexpr uint32_t logo_stroke = hsl_to_rgb(accent_hue, 1.0, 0.39); + #else + // The Lulzbot logo uses the color PANTONE 382c. + // This translates to HSL(68°, 68%, 52%) as an accent color on the GUI. - constexpr uint32_t lulzbot_bg = 0xDEEA5C; - constexpr uint32_t lulzbot_fg = 0xC1D82F; + constexpr int accent_hue = 68; + constexpr float accent_sat = 0.68; - constexpr uint32_t lulzbot_green = COLOR_BLEND(0xC1DB2F,0x788814,0.33); + constexpr uint32_t logo_bg = hsl_to_rgb(accent_hue, 0.77, 0.64); + constexpr uint32_t logo_fg = hsl_to_rgb(accent_hue, 0.68, 0.52); // Lulzbot Green + constexpr uint32_t logo_stroke = 0x000000; + #endif + + // Shades of accent color + + constexpr uint32_t accent_color_1 = hsl_to_rgb(accent_hue, accent_sat, 0.26); // Darkest + constexpr uint32_t accent_color_2 = hsl_to_rgb(accent_hue, accent_sat, 0.39); + constexpr uint32_t accent_color_3 = hsl_to_rgb(accent_hue, accent_sat, 0.52); + constexpr uint32_t accent_color_4 = hsl_to_rgb(accent_hue, accent_sat, 0.65); + constexpr uint32_t accent_color_5 = hsl_to_rgb(accent_hue, accent_sat, 0.78); + constexpr uint32_t accent_color_6 = hsl_to_rgb(accent_hue, accent_sat, 0.91); // Lightest + + // Shades of gray + + constexpr float gray_sat = 0.14; + + constexpr uint32_t gray_color_1 = hsl_to_rgb(accent_hue, gray_sat, 0.26); // Darkest + constexpr uint32_t gray_color_2 = hsl_to_rgb(accent_hue, gray_sat, 0.39); + constexpr uint32_t gray_color_3 = hsl_to_rgb(accent_hue, gray_sat, 0.52); + constexpr uint32_t gray_color_4 = hsl_to_rgb(accent_hue, gray_sat, 0.65); + constexpr uint32_t gray_color_5 = hsl_to_rgb(accent_hue, gray_sat, 0.78); + constexpr uint32_t gray_color_6 = hsl_to_rgb(accent_hue, gray_sat, 0.91); // Lightest #ifndef LULZBOT_USE_BIOPRINTER_UI - constexpr uint32_t theme_darkest = COLOR_CORRECTION(0x444444); - constexpr uint32_t theme_dark = COLOR_CORRECTION(0x777777); + // Lulzbot TAZ Pro + constexpr uint32_t theme_darkest = gray_color_1; + constexpr uint32_t theme_dark = gray_color_2; constexpr uint32_t bg_color = theme_darkest; constexpr uint32_t bg_text_disabled = theme_dark; @@ -49,64 +76,59 @@ namespace Theme { constexpr uint32_t bg_normal = theme_darkest; constexpr uint32_t fg_normal = theme_dark; - constexpr uint32_t fg_action = lulzbot_green; - constexpr uint32_t fg_disabled = bg_color; + constexpr uint32_t fg_action = accent_color_2; + constexpr uint32_t fg_disabled = theme_darkest; #else - constexpr uint32_t theme_darkest = 0x545923; - constexpr uint32_t theme_dark = lulzbot_bg; + // Lulzbot Bio + constexpr uint32_t theme_darkest = accent_color_1; + constexpr uint32_t theme_dark = accent_color_4; constexpr uint32_t bg_color = 0xFFFFFF; - constexpr uint32_t bg_text_disabled = 0x333333; - constexpr uint32_t bg_text_enabled = theme_darkest; - constexpr uint32_t bg_normal = theme_dark; + constexpr uint32_t bg_text_disabled = gray_color_1; + constexpr uint32_t bg_text_enabled = accent_color_1; + constexpr uint32_t bg_normal = accent_color_4; - constexpr uint32_t fg_normal = theme_darkest; - constexpr uint32_t fg_action = theme_dark; - constexpr uint32_t fg_disabled = 0xEFEFEF; + constexpr uint32_t fg_normal = accent_color_1; + constexpr uint32_t fg_action = accent_color_4; + constexpr uint32_t fg_disabled = gray_color_6; - constexpr uint32_t shadow_rgb = 0xE0E0E0; - constexpr uint32_t fill_rgb = lulzbot_fg; - constexpr uint32_t stroke_rgb = theme_darkest; - constexpr uint32_t syringe_rgb = 0xF1F6C0; + constexpr uint32_t shadow_rgb = gray_color_6; + constexpr uint32_t stroke_rgb = accent_color_1; + constexpr uint32_t fill_rgb = accent_color_3; + constexpr uint32_t syringe_rgb = accent_color_5; #endif - constexpr uint32_t x_axis = COLOR_CORRECTION(0xFF0000); - constexpr uint32_t y_axis = COLOR_CORRECTION(0x00BB00); - constexpr uint32_t z_axis = COLOR_CORRECTION(0x0000FF); - #ifndef LULZBOT_USE_BIOPRINTER_UI - constexpr uint32_t e_axis = COLOR_CORRECTION(0x777777); - constexpr uint32_t feedrate = COLOR_CORRECTION(0x777777); - constexpr uint32_t other = COLOR_CORRECTION(0x777777); - #else - constexpr uint32_t e_axis = 0x000000; - constexpr uint32_t feedrate = 0x000000; - constexpr uint32_t other = 0x000000; - #endif + constexpr uint32_t x_axis = 0xFF0000; + constexpr uint32_t y_axis = 0x00BB00; + constexpr uint32_t z_axis = 0x0000BF; + constexpr uint32_t e_axis = gray_color_2; + constexpr uint32_t feedrate = gray_color_2; + constexpr uint32_t other = gray_color_2; // Status screen - constexpr uint32_t progress = theme_dark; - constexpr uint32_t status_msg = theme_dark; - constexpr uint32_t fan_speed = COLOR_CORRECTION(0x3771CB); - constexpr uint32_t temp = COLOR_CORRECTION(0x892ca0); - constexpr uint32_t axis_label = theme_dark; + constexpr uint32_t progress = gray_color_2; + constexpr uint32_t status_msg = gray_color_2; + constexpr uint32_t fan_speed = 0x377198; + constexpr uint32_t temp = 0x892c78; + constexpr uint32_t axis_label = gray_color_2; - constexpr uint32_t disabled_icon = 0x101010; + constexpr uint32_t disabled_icon = gray_color_1; // Calibration Registers Screen - constexpr uint32_t transformA = 0x3010D0; - constexpr uint32_t transformB = 0x4010D0; - constexpr uint32_t transformC = 0x5010D0; - constexpr uint32_t transformD = 0x6010D0; - constexpr uint32_t transformE = 0x7010D0; - constexpr uint32_t transformF = 0x8010D0; - constexpr uint32_t transformVal = 0x104010; + constexpr uint32_t transformA = 0x3010D0; + constexpr uint32_t transformB = 0x4010D0; + constexpr uint32_t transformC = 0x5010D0; + constexpr uint32_t transformD = 0x6010D0; + constexpr uint32_t transformE = 0x7010D0; + constexpr uint32_t transformF = 0x8010D0; + constexpr uint32_t transformVal = 0x104010; - constexpr btn_colors disabled_btn = {.bg = bg_color, .grad = fg_disabled, .fg = fg_disabled, .rgb = fg_disabled }; - constexpr btn_colors normal_btn = {.bg = fg_action, .grad = 0xFFFFFF, .fg = fg_normal, .rgb = 0xFFFFFF }; - constexpr btn_colors action_btn = {.bg = bg_color, .grad = 0xFFFFFF, .fg = fg_action, .rgb = 0xFFFFFF }; - constexpr btn_colors red_btn = {.bg = 0xFF5555, .grad = 0xFFFFFF, .fg = 0xFF0000, .rgb = 0xFFFFFF }; - constexpr btn_colors ui_slider = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = lulzbot_green }; - constexpr btn_colors ui_toggle = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = 0xFFFFFF }; + constexpr btn_colors disabled_btn = {.bg = bg_color, .grad = fg_disabled, .fg = fg_disabled, .rgb = fg_disabled }; + constexpr btn_colors normal_btn = {.bg = fg_action, .grad = 0xFFFFFF, .fg = fg_normal, .rgb = 0xFFFFFF }; + constexpr btn_colors action_btn = {.bg = bg_color, .grad = 0xFFFFFF, .fg = fg_action, .rgb = 0xFFFFFF }; + constexpr btn_colors red_btn = {.bg = 0xFF5555, .grad = 0xFFFFFF, .fg = 0xFF0000, .rgb = 0xFFFFFF }; + constexpr btn_colors ui_slider = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = accent_color_3 }; + constexpr btn_colors ui_toggle = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = 0xFFFFFF }; // Temperature color scale diff --git a/Marlin/src/lcd/extensible_ui/ui_api.cpp b/Marlin/src/lcd/extensible_ui/ui_api.cpp index 5035e0cebd..83190438fd 100644 --- a/Marlin/src/lcd/extensible_ui/ui_api.cpp +++ b/Marlin/src/lcd/extensible_ui/ui_api.cpp @@ -204,33 +204,29 @@ namespace ExtUI { * The axis will continue to jog until this function is * called with all zeros. */ - void jog(float dx, float dy, float dz) { + void jog(const xyz_float_t &dir) { // The "destination" variable is used as a scratchpad in // Marlin by GCODE routines, but should remain untouched // during manual jogging, allowing us to reuse the space // for our direction vector. - destination[X] = dx; - destination[Y] = dy; - destination[Z] = dz; - flags.jogging = !NEAR_ZERO(dx) || !NEAR_ZERO(dy) || !NEAR_ZERO(dz); + destination = dir; + flags.jogging = !NEAR_ZERO(dir.x) || !NEAR_ZERO(dir.y) || !NEAR_ZERO(dir.z); } // Called by the polling routine in "joystick.cpp" - void _joystick_update(float (&norm_jog)[XYZ]) { + void _joystick_update(xyz_float_t &norm_jog) { if (flags.jogging) { #define OUT_OF_RANGE(VALUE) (VALUE < -1.0f || VALUE > 1.0f) - if (OUT_OF_RANGE(destination[X_AXIS]) || OUT_OF_RANGE(destination[Y_AXIS]) || OUT_OF_RANGE(destination[Z_AXIS])) { - // If destination[] on any axis is out of range, it + if (OUT_OF_RANGE(destination.x) || OUT_OF_RANGE(destination.y) || OUT_OF_RANGE(destination.z)) { + // If destination on any axis is out of range, it // probably means the UI forgot to stop jogging and - // ran GCODE that wrote a position to destination[]. + // ran GCODE that wrote a position to destination. // To prevent a disaster, stop jogging. flags.jogging = false; return; } - norm_jog[X_AXIS] = destination[X_AXIS]; - norm_jog[Y_AXIS] = destination[Y_AXIS]; - norm_jog[Z_AXIS] = destination[Z_AXIS]; + norm_jog = destination; } } #endif @@ -328,18 +324,16 @@ namespace ExtUI { float getAxisPosition_mm(const extruder_t extruder) { const extruder_t old_tool = getActiveTool(); setActiveTool(extruder, true); - const float pos = ( + const float epos = ( #if ENABLED(JOYSTICK) - flags.jogging ? destination[E_AXIS] : + flags.jogging ? destination.e : #endif - current_position[E_AXIS] + current_position.e ); setActiveTool(old_tool, true); - return pos; + return epos; } - constexpr feedRate_t manual_feedrate_mm_m[XYZE] = MANUAL_FEEDRATE; - void setAxisPosition_mm(const float position, const axis_t axis) { // Start with no limits to movement float min = current_position[axis] - 1000, @@ -350,26 +344,26 @@ namespace ExtUI { if (soft_endstops_enabled) switch (axis) { case X_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) - min = soft_endstop[X_AXIS].min; + min = soft_endstop.min.x; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) - max = soft_endstop[X_AXIS].max; + max = soft_endstop.max.x; #endif break; case Y_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) - min = soft_endstop[Y_AXIS].min; + min = soft_endstop.min.y; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) - max = soft_endstop[Y_AXIS].max; + max = soft_endstop.max.y; #endif break; case Z_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) - min = soft_endstop[Z_AXIS].min; + min = soft_endstop.min.z; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) - max = soft_endstop[Z_AXIS].max; + max = soft_endstop.max.z; #endif default: break; } @@ -391,8 +385,8 @@ namespace ExtUI { void setAxisPosition_mm(const float position, const extruder_t extruder) { setActiveTool(extruder, true); - current_position[E_AXIS] = position; - line_to_current_position(MMM_TO_MMS(manual_feedrate_mm_m[E_AXIS])); + current_position.e = position; + line_to_current_position(MMM_TO_MMS(manual_feedrate_mm_m.e)); } void setActiveTool(const extruder_t extruder, bool no_move) { @@ -522,13 +516,13 @@ namespace ExtUI { int getTMCBumpSensitivity(const axis_t axis) { switch (axis) { - #if X_SENSORLESS && AXIS_HAS_STALLGUARD(X) + #if X_SENSORLESS case X: return stepperX.homing_threshold(); #endif - #if Y_SENSORLESS && AXIS_HAS_STALLGUARD(Y) + #if Y_SENSORLESS case Y: return stepperY.homing_threshold(); #endif - #if Z_SENSORLESS && AXIS_HAS_STALLGUARD(Z) + #if Z_SENSORLESS case Z: return stepperZ.homing_threshold(); #endif default: return 0; @@ -537,18 +531,16 @@ namespace ExtUI { void setTMCBumpSensitivity(const float value, const axis_t axis) { switch (axis) { - #if X_SENSORLESS && AXIS_HAS_STALLGUARD(X) - case X: stepperX.homing_threshold(value); break; - #else - UNUSED(value); - #endif - #if Y_SENSORLESS && AXIS_HAS_STALLGUARD(Y) - case Y: stepperY.homing_threshold(value); break; - #else - UNUSED(value); - #endif - #if Z_SENSORLESS && AXIS_HAS_STALLGUARD(Z) - case Z: stepperZ.homing_threshold(value); break; + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + #if X_SENSORLESS + case X: stepperX.homing_threshold(value); break; + #endif + #if Y_SENSORLESS + case Y: stepperY.homing_threshold(value); break; + #endif + #if Z_SENSORLESS + case Z: stepperZ.homing_threshold(value); break; + #endif #else UNUSED(value); #endif @@ -585,12 +577,11 @@ namespace ExtUI { } void setAxisMaxFeedrate_mm_s(const feedRate_t value, const axis_t axis) { - planner.settings.max_feedrate_mm_s[axis] = value; + planner.set_max_feedrate(axis, value); } void setAxisMaxFeedrate_mm_s(const feedRate_t value, const extruder_t extruder) { - UNUSED_E(extruder); - planner.settings.max_feedrate_mm_s[E_AXIS_N(axis - E0)] = value; + planner.set_max_feedrate(E_AXIS_N(extruder - E0), value); } float getAxisMaxAcceleration_mm_s2(const axis_t axis) { @@ -603,12 +594,11 @@ namespace ExtUI { } void setAxisMaxAcceleration_mm_s2(const float value, const axis_t axis) { - planner.settings.max_acceleration_mm_per_s2[axis] = value; + planner.set_max_acceleration(axis, value); } void setAxisMaxAcceleration_mm_s2(const float value, const extruder_t extruder) { - UNUSED_E(extruder); - planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(extruder - E0)] = value; + planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); } #if HAS_FILAMENT_SENSOR @@ -632,7 +622,7 @@ namespace ExtUI { } #endif - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) float getJunctionDeviation_mm() { return planner.junction_deviation_mm; @@ -652,15 +642,15 @@ namespace ExtUI { } float getAxisMaxJerk_mm_s(const extruder_t) { - return planner.max_jerk[E_AXIS]; + return planner.max_jerk.e; } void setAxisMaxJerk_mm_s(const float value, const axis_t axis) { - planner.max_jerk[axis] = value; + planner.set_max_jerk((AxisEnum)axis, value); } void setAxisMaxJerk_mm_s(const float value, const extruder_t) { - planner.max_jerk[E_AXIS] = value; + planner.set_max_jerk(E_AXIS, value); } #endif @@ -710,7 +700,7 @@ namespace ExtUI { #if EXTRUDERS > 1 && (linked_nozzles || active_extruder == 0) #endif - ) probe_offset[Z_AXIS] += mm; + ) probe_offset.z += mm; #else UNUSED(mm); #endif @@ -724,7 +714,7 @@ namespace ExtUI { if (!linked_nozzles) { HOTEND_LOOP() if (e != active_extruder) - hotend_offset[axis][e] += mm; + hotend_offset[e][axis] += mm; normalizeNozzleOffset(X); normalizeNozzleOffset(Y); @@ -748,7 +738,7 @@ namespace ExtUI { float getZOffset_mm() { #if HAS_BED_PROBE - return probe_offset[Z_AXIS]; + return probe_offset.z; #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) return babystep.axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1]; #else @@ -759,7 +749,7 @@ namespace ExtUI { void setZOffset_mm(const float value) { #if HAS_BED_PROBE if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - probe_offset[Z_AXIS] = value; + probe_offset.z = value; #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) babystep.add_mm(Z_AXIS, (value - babystep.axis_total[BS_TOTAL_AXIS(Z_AXIS) + 1])); #else @@ -771,12 +761,12 @@ namespace ExtUI { float getNozzleOffset_mm(const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return 0; - return hotend_offset[axis][extruder - E0]; + return hotend_offset[extruder - E0][axis]; } void setNozzleOffset_mm(const float value, const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return; - hotend_offset[axis][extruder - E0] = value; + hotend_offset[extruder - E0][axis] = value; } /** @@ -785,8 +775,8 @@ namespace ExtUI { * user to edit the offset the first nozzle). */ void normalizeNozzleOffset(const axis_t axis) { - const float offs = hotend_offset[axis][0]; - HOTEND_LOOP() hotend_offset[axis][e] -= offs; + const float offs = hotend_offset[0][axis]; + HOTEND_LOOP() hotend_offset[e][axis] -= offs; } #endif // HAS_HOTEND_OFFSET @@ -806,7 +796,7 @@ namespace ExtUI { #endif uint8_t getProgress_percent() { - return ui.get_progress(); + return ui.get_progress_percent(); } uint32_t getProgress_seconds_elapsed() { @@ -820,18 +810,15 @@ namespace ExtUI { bool getMeshValid() { return leveling_is_valid(); } #if HAS_MESH bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } - float getMeshPoint(const uint8_t xpos, const uint8_t ypos) { return Z_VALUES(xpos,ypos); } - void setMeshPoint(const uint8_t xpos, const uint8_t ypos, const float zoff) { - if (WITHIN(xpos, 0, GRID_MAX_POINTS_X) && WITHIN(ypos, 0, GRID_MAX_POINTS_Y)) { - Z_VALUES(xpos, ypos) = zoff; + float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } + void setMeshPoint(const xy_uint8_t &pos, const float zoff) { + if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { + Z_VALUES(pos.x, pos.y) = zoff; #if ENABLED(ABL_BILINEAR_SUBDIVISION) bed_level_virt_interpolate(); #endif } } - void onMeshUpdate(const uint8_t xpos, const uint8_t ypos, const float zval) { - UNUSED(xpos); UNUSED(ypos); UNUSED(zval); - } #endif #endif @@ -884,7 +871,7 @@ namespace ExtUI { #endif { #if HOTENDS - static constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); + static constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP); const int16_t e = heater - H0; thermalManager.setTargetHotend(constrain(value, 0, heater_maxtemp[e] - 15), e); #endif @@ -893,7 +880,7 @@ namespace ExtUI { void setTargetTemp_celsius(float value, const extruder_t extruder) { #if HOTENDS - constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); + constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP); const int16_t e = extruder - E0; enableHeater(extruder); thermalManager.setTargetHotend(constrain(value, 0, heater_maxtemp[e] - 15), e); @@ -952,6 +939,12 @@ namespace ExtUI { ui.abort_print(); } + void onUserConfirmRequired_P(PGM_P const pstr) { + char msg[strlen_P(pstr) + 1]; + strcpy_P(msg, pstr); + onUserConfirmRequired(msg); + } + FileList::FileList() { refresh(); } void FileList::refresh() { num_files = 0xFFFF; } @@ -1002,14 +995,14 @@ namespace ExtUI { void FileList::upDir() { #if ENABLED(SDSUPPORT) - card.updir(); + card.cdup(); num_files = 0xFFFF; #endif } void FileList::changeDir(const char * const dirname) { #if ENABLED(SDSUPPORT) - card.chdir(dirname); + card.cd(dirname); num_files = 0xFFFF; #endif } @@ -1049,11 +1042,11 @@ void MarlinUI::update() { ExtUI::onIdle(); } -void MarlinUI::kill_screen(PGM_P const msg) { +void MarlinUI::kill_screen(PGM_P const error, PGM_P const component) { using namespace ExtUI; if (!flags.printer_killed) { flags.printer_killed = true; - onPrinterKilled(msg); + onPrinterKilled(error, component); } } diff --git a/Marlin/src/lcd/extensible_ui/ui_api.h b/Marlin/src/lcd/extensible_ui/ui_api.h index 38cd19b579..d929183949 100644 --- a/Marlin/src/lcd/extensible_ui/ui_api.h +++ b/Marlin/src/lcd/extensible_ui/ui_api.h @@ -81,8 +81,8 @@ namespace ExtUI { void enableHeater(const extruder_t); #if ENABLED(JOYSTICK) - void jog(float dx, float dy, float dz); - void _joystick_update(float (&norm_jog)[XYZ]); + void jog(const xyz_float_t &dir); + void _joystick_update(xyz_float_t &norm_jog); #endif /** @@ -135,9 +135,10 @@ namespace ExtUI { bool getMeshValid(); #if HAS_MESH bed_mesh_t& getMeshArray(); - float getMeshPoint(const uint8_t xpos, const uint8_t ypos); - void setMeshPoint(const uint8_t xpos, const uint8_t ypos, const float zval); + float getMeshPoint(const xy_uint8_t &pos); + void setMeshPoint(const xy_uint8_t &pos, const float zval); void onMeshUpdate(const uint8_t xpos, const uint8_t ypos, const float zval); + inline void onMeshUpdate(const xy_uint8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } #endif #endif @@ -178,7 +179,7 @@ namespace ExtUI { void setLinearAdvance_mm_mm_s(const float, const extruder_t); #endif - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) float getJunctionDeviation_mm(); void setJunctionDeviation_mm(const float); #else @@ -292,12 +293,13 @@ namespace ExtUI { void onMediaError(); void onMediaRemoved(); void onPlayTone(const uint16_t frequency, const uint16_t duration); - void onPrinterKilled(PGM_P const msg); + void onPrinterKilled(PGM_P const error, PGM_P const component); void onPrintTimerStarted(); void onPrintTimerPaused(); void onPrintTimerStopped(); void onFilamentRunout(const extruder_t extruder); void onUserConfirmRequired(const char * const msg); + void onUserConfirmRequired_P(PGM_P const pstr); void onStatusChanged(const char * const msg); void onFactoryReset(); void onStoreSettings(char *); diff --git a/Marlin/src/lcd/extui_dgus_lcd.cpp b/Marlin/src/lcd/extui_dgus_lcd.cpp index 484a333095..e57355bcd0 100644 --- a/Marlin/src/lcd/extui_dgus_lcd.cpp +++ b/Marlin/src/lcd/extui_dgus_lcd.cpp @@ -43,8 +43,8 @@ namespace ExtUI { void onIdle() { ScreenHandler.loop(); } - void onPrinterKilled(const char* msg) { - ScreenHandler.sendinfoscreen(PSTR(MSG_HALTED), msg, PSTR(""), PSTR(MSG_PLEASE_RESET), true, true, true, true); + void onPrinterKilled(PGM_P error, PGM_P component) { + ScreenHandler.sendinfoscreen(GET_TEXT(MSG_HALTED), error, PSTR(""), GET_TEXT(MSG_PLEASE_RESET), true, true, true, true); ScreenHandler.GotoScreen(DGUSLCD_SCREEN_KILL); while (!ScreenHandler.loop()); // Wait while anything is left to be sent } @@ -59,7 +59,7 @@ namespace ExtUI { void onPrintTimerStopped() {} void onFilamentRunout(const extruder_t extruder) {} - void onUserConfirmRequired(const char *msg) { + void onUserConfirmRequired(const char * const msg) { if (msg) { ScreenHandler.sendinfoscreen(PSTR("Please confirm."), nullptr, msg, nullptr, true, true, false, true); ScreenHandler.SetupConfirmAction(ExtUI::setUserConfirmed); diff --git a/Marlin/src/lcd/extui_example.cpp b/Marlin/src/lcd/extui_example.cpp index 4fec2745a9..9bdc0ddfe9 100644 --- a/Marlin/src/lcd/extui_example.cpp +++ b/Marlin/src/lcd/extui_example.cpp @@ -46,7 +46,7 @@ namespace ExtUI { */ } void onIdle() {} - void onPrinterKilled(PGM_P const msg) {} + void onPrinterKilled(PGM_P const error, PGM_P const component) {} void onMediaInserted() {}; void onMediaError() {}; void onMediaRemoved() {}; @@ -88,6 +88,10 @@ namespace ExtUI { // This is called after the entire EEPROM has been read, // whether successful or not. } + + void onMeshUpdate(const uint8_t xpos, const uint8_t ypos, const float zval) { + // This is called when any mesh points are updated + } } #endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui_malyan_lcd.cpp b/Marlin/src/lcd/extui_malyan_lcd.cpp index 3954a1a521..0376ee8333 100644 --- a/Marlin/src/lcd/extui_malyan_lcd.cpp +++ b/Marlin/src/lcd/extui_malyan_lcd.cpp @@ -50,6 +50,7 @@ #include "extensible_ui/ui_api.h" #include "ultralcd.h" +#include "../sd/cardreader.h" #include "../module/temperature.h" #include "../module/stepper.h" #include "../module/motion.h" @@ -57,13 +58,6 @@ #include "../module/printcounter.h" #include "../gcode/queue.h" -#if ENABLED(SDSUPPORT) - #include "../sd/cardreader.h" - #include "../sd/SdFatConfig.h" -#else - #define LONG_FILENAME_LENGTH 0 -#endif - #define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) #include "../core/debug_out.h" @@ -117,17 +111,27 @@ void write_to_lcd(const char * const message) { * the command portion begins after the : */ void process_lcd_c_command(const char* command) { + const int target_val = command[1] ? atoi(command + 1) : -1; + if (target_val < 0) { + DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); + return; + } switch (command[0]) { case 'C': // Cope with both V1 early rev and later LCDs. case 'S': - feedrate_percentage = atoi(command + 1) * 10; + feedrate_percentage = target_val * 10; LIMIT(feedrate_percentage, 10, 999); break; - case 'T': ExtUI::setTargetTemp_celsius(atoi(command + 1), ExtUI::extruder_t::E0); break; + case 'T': + // Sometimes the LCD will send commands to turn off both extruder and bed, though + // this should not happen since the printing screen is up. Better safe than sorry. + if (!print_job_timer.isRunning() || target_val > 0) + ExtUI::setTargetTemp_celsius(target_val, ExtUI::extruder_t::E0); + break; #if HAS_HEATED_BED - case 'P': ExtUI::setTargetTemp_celsius(atoi(command + 1), ExtUI::heater_t::BED); break; + case 'P': ExtUI::setTargetTemp_celsius(target_val, ExtUI::heater_t::BED); break; #endif default: DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); @@ -143,6 +147,7 @@ void process_lcd_c_command(const char* command) { */ void process_lcd_eb_command(const char* command) { char elapsed_buffer[10]; + static uint8_t iteration = 0; duration_t elapsed; switch (command[0]) { case '0': { @@ -150,6 +155,13 @@ void process_lcd_eb_command(const char* command) { sprintf_P(elapsed_buffer, PSTR("%02u%02u%02u"), uint16_t(elapsed.hour()), uint16_t(elapsed.minute()) % 60, uint16_t(elapsed.second()) % 60); char message_buffer[MAX_CURLY_COMMAND]; + uint8_t done_pct = print_job_timer.isRunning() ? (iteration * 10) : 100; + iteration = (iteration + 1) % 10; // Provide progress animation + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia() || ExtUI::isPrintingFromMediaPaused()) + done_pct = card.percentDone(); + #endif + sprintf_P(message_buffer, PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}{TQ:%03i}{TT:%s}"), int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), @@ -159,7 +171,7 @@ void process_lcd_eb_command(const char* command) { 0, 0, #endif #if ENABLED(SDSUPPORT) - card.percentDone(), + done_pct, #else 0, #endif @@ -186,7 +198,7 @@ void process_lcd_j_command(const char* command) { auto move_axis = [command](const auto axis) { const float dist = atof(command + 1) / 10.0; ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(axis) + dist, axis); - } + }; switch (command[0]) { case 'E': break; @@ -246,13 +258,13 @@ void process_lcd_p_command(const char* command) { // Find the name of the file to print. // It's needed to echo the PRINTFILE option. // The {S:L} command should've ensured the SD card was mounted. - card.getfilename(atoi(command)); + card.selectFileByIndex(atoi(command)); // There may be a difference in how V1 and V2 LCDs handle subdirectory // prints. Investigate more. This matches the V1 motion controller actions // but the V2 LCD switches to "print" mode on {SYS:DIR} response. if (card.flag.filenameIsDir) { - card.chdir(card.filename); + card.cd(card.filename); write_to_lcd_P(PSTR("{SYS:DIR}")); } else { @@ -309,7 +321,7 @@ void process_lcd_s_command(const char* command) { char message_buffer[MAX_CURLY_COMMAND]; uint16_t file_count = card.get_num_Files(); for (uint16_t i = 0; i < file_count; i++) { - card.getfilename(i); + card.selectFileByIndex(i); sprintf_P(message_buffer, card.flag.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename()); write_to_lcd(message_buffer); } @@ -330,7 +342,6 @@ void process_lcd_s_command(const char* command) { void process_lcd_command(const char* command) { const char *current = command; - current++; // skip the leading {. The trailing one is already gone. byte command_code = *current++; if (*current == ':') { @@ -350,6 +361,31 @@ void process_lcd_command(const char* command) { DEBUG_ECHOLNPAIR("UNKNOWN COMMAND FORMAT ", command); } +// Parse LCD commands mixed with G-Code +void parse_lcd_byte(byte b) { + static bool parsing_lcd_cmd = false; + static char inbound_buffer[MAX_CURLY_COMMAND]; + + if (!parsing_lcd_cmd) { + if (b == '{' || b == '\n' || b == '\r') { // A line-ending or opening brace + parsing_lcd_cmd = b == '{'; // Brace opens an LCD command + if (inbound_count) { // Looks like a G-code is in the buffer + inbound_buffer[inbound_count] = '\0'; // Reset before processing + inbound_count = 0; + queue.enqueue_one_now(inbound_buffer); // Handle the G-code command + } + } + } + else if (b == '}') { // Closing brace on an LCD command + parsing_lcd_cmd = false; // Unflag and... + inbound_buffer[inbound_count] = '\0'; // reset before processing + inbound_count = 0; + process_lcd_command(inbound_buffer); // Handle the LCD command + } + else if (inbound_count < MAX_CURLY_COMMAND - 2) + inbound_buffer[inbound_count++] = b; // Buffer only if space remains +} + /** * UC means connected. * UD means disconnected @@ -360,8 +396,8 @@ void update_usb_status(const bool forceUpdate) { // This is mildly different than stock, which // appears to use the usb discovery status. // This is more logical. - if (last_usb_connected_status != Serial || forceUpdate) { - last_usb_connected_status = Serial; + if (last_usb_connected_status != SerialUSB || forceUpdate) { + last_usb_connected_status = SerialUSB; write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); } } @@ -391,24 +427,14 @@ namespace ExtUI { /** * - from printer on startup: * {SYS:STARTED}{VER:29}{SYS:STARTED}{R:UD} - * The optimize attribute fixes a register Compile - * error for amtel. */ - static char inbound_buffer[MAX_CURLY_COMMAND]; // First report USB status. update_usb_status(false); // now drain commands... while (LCD_SERIAL.available()) { - const byte b = (byte)LCD_SERIAL.read() & 0x7F; - inbound_buffer[inbound_count++] = b; - if (b == '}' || inbound_count == sizeof(inbound_buffer) - 1) { - inbound_buffer[inbound_count - 1] = '\0'; - process_lcd_command(inbound_buffer); - inbound_count = 0; - inbound_buffer[0] = 0; - } + parse_lcd_byte((byte)LCD_SERIAL.read() & 0x7F); } #if ENABLED(SDSUPPORT) @@ -432,28 +458,31 @@ namespace ExtUI { } // {E:} is for error states. - void onPrinterKilled(PGM_P msg) { + void onPrinterKilled(PGM_P error, PGM_P component) { write_to_lcd_P(PSTR("{E:")); - write_to_lcd_P(msg); + write_to_lcd_P(error); + write_to_lcd_P(PSTR(" ")); + write_to_lcd_P(component); write_to_lcd_P("}"); } + void onPrintTimerStarted() { write_to_lcd_P(PSTR("{SYS:BUILD}")); } + void onPrintTimerPaused() {} + void onPrintTimerStopped() { write_to_lcd_P(PSTR("{TQ:100}")); } + // Not needed for Malyan LCD - void onStatusChanged(const char * const msg) { UNUSED(msg); } + void onStatusChanged(const char * const) {} void onMediaInserted() {}; void onMediaError() {}; void onMediaRemoved() {}; - void onPlayTone(const uint16_t frequency, const uint16_t duration) { UNUSED(frequency); UNUSED(duration); } - void onPrintTimerStarted() {} - void onPrintTimerPaused() {} - void onPrintTimerStopped() {} + void onPlayTone(const uint16_t, const uint16_t) {} void onFilamentRunout(const extruder_t extruder) {} - void onUserConfirmRequired(const char * const msg) { UNUSED(msg); } + void onUserConfirmRequired(const char * const) {} void onFactoryReset() {} - void onStoreSettings(char *buff) { UNUSED(buff); } - void onLoadSettings(const char *buff) { UNUSED(buff); } - void onConfigurationStoreWritten(bool success) { UNUSED(success); } - void onConfigurationStoreRead(bool success) { UNUSED(success); } + void onStoreSettings(char*) {} + void onLoadSettings(const char*) {} + void onConfigurationStoreWritten(bool) {} + void onConfigurationStoreRead(bool) {} } #endif // MALYAN_LCD diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index f3c4372ba7..45d19e85c1 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -32,225 +32,263 @@ #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -#define WELCOME_MSG MACHINE_NAME _UxGT(" parada.") -#define MSG_MEDIA_INSERTED _UxGT("Tarcheta mesa") -#define MSG_MEDIA_REMOVED _UxGT("Tarcheta sacada") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu prencipal") -#define MSG_AUTOSTART _UxGT("Inicio automatico") -#define MSG_DISABLE_STEPPERS _UxGT("Amortar motors") -#define MSG_AUTO_HOME _UxGT("Levar a l'orichen") -#define MSG_AUTO_HOME_X _UxGT("Orichen X") -#define MSG_AUTO_HOME_Y _UxGT("Orichen Y") -#define MSG_AUTO_HOME_Z _UxGT("Orichen Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Orichen XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Encetar (pretar)") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Vinient punto") -#define MSG_LEVEL_BED_DONE _UxGT("Nivelacion feita!") -#define MSG_SET_HOME_OFFSETS _UxGT("Achustar desfases") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicau") -#define MSG_SET_ORIGIN _UxGT("Establir orichen") -#define MSG_PREHEAT_1 _UxGT("Precalentar " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tot") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Base") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Conf") -#define MSG_PREHEAT_2 _UxGT("Precalentar " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tot") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Base") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Conf") -#define MSG_COOLDOWN _UxGT("Enfriar") -#define MSG_SWITCH_PS_ON _UxGT("Enchegar Fuent") -#define MSG_SWITCH_PS_OFF _UxGT("Amortar Fuent") -#define MSG_EXTRUDE _UxGT("Extruir") -#define MSG_RETRACT _UxGT("Retraer") -#define MSG_MOVE_AXIS _UxGT("Mover Eixes") -#define MSG_BED_LEVELING _UxGT("Nivelar base") -#define MSG_LEVEL_BED _UxGT("Nivelar base") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_MOVE_Z_DIST _UxGT("Mover %smm") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidat") -#define MSG_BED_Z _UxGT("Base Z") -#define MSG_NOZZLE _UxGT("Boquilla") -#define MSG_BED _UxGT("Base") -#define MSG_FAN_SPEED _UxGT("Ixoriador") -#define MSG_FLOW _UxGT("Fluxo") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Trigar") -#define MSG_ACC _UxGT("Aceleracion") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vel. viache min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Acel. max") -#define MSG_A_RETRACT _UxGT("Acel. retrac.") -#define MSG_A_TRAVEL _UxGT("Acel. Viaje") -#define MSG_STEPS_PER_MM _UxGT("Trangos/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A trangos/mm") - #define MSG_BSTEPS _UxGT("B trangos/mm") - #define MSG_CSTEPS _UxGT("C trangos/mm") -#else - #define MSG_ASTEPS _UxGT("X trangos/mm") - #define MSG_BSTEPS _UxGT("Y trangos/mm") - #define MSG_CSTEPS _UxGT("Z trangos/mm") -#endif -#define MSG_ESTEPS _UxGT("E trangos/mm") -#define MSG_E1STEPS _UxGT("E1 trangos/mm") -#define MSG_E2STEPS _UxGT("E2 trangos/mm") -#define MSG_E3STEPS _UxGT("E3 trangos/mm") -#define MSG_E4STEPS _UxGT("E4 trangos/mm") -#define MSG_E5STEPS _UxGT("E5 trangos/mm") -#define MSG_E6STEPS _UxGT("E6 trangos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimiento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Alzar memoria") -#define MSG_LOAD_EEPROM _UxGT("Cargar memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") -#define MSG_REFRESH _UxGT("Tornar a cargar") -#define MSG_WATCH _UxGT("Informacion") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Achustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impresion") -#define MSG_RESUME_PRINT _UxGT("Contin. impresion") -#define MSG_STOP_PRINT _UxGT("Detener Impresion") -#define MSG_MEDIA_MENU _UxGT("Menu de SD") -#define MSG_NO_MEDIA _UxGT("No i hai tarcheta") -#define MSG_DWELL _UxGT("Reposo...") -#define MSG_USERWAIT _UxGT("Aguardand ordines") -#define MSG_PRINT_ABORTED _UxGT("Impres. cancelada") -#define MSG_NO_MOVE _UxGT("Sin movimiento") -#define MSG_KILLED _UxGT("Aturada d'emerch.") -#define MSG_STOPPED _UxGT("Aturada.") -#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Retraer mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraer F") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Devantar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet F") -#define MSG_AUTORETRACT _UxGT("Retraccion auto.") -#define MSG_FILAMENTCHANGE _UxGT("Cambear filamento") -#define MSG_INIT_MEDIA _UxGT("Encetan. tarcheta") -#define MSG_CHANGE_MEDIA _UxGT("Cambiar tarcheta") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Test") -#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") -#define MSG_BABYSTEP_X _UxGT("Micropaso X") -#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") -#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") -#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Error: en calentar") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") -#define MSG_THERMAL_RUNAWAY _UxGT("Error de temperatura") -#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Maxima") -#define MSG_ERR_MINTEMP _UxGT("Error: Temp Menima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max base") -#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min base") -#define MSG_ERR_Z_HOMING _UxGT("Home XY first") -#define MSG_HALTED _UxGT("IMPRESORA ATURADA") -#define MSG_PLEASE_RESET _UxGT("Per favor reinic.") -#define MSG_SHORT_DAY _UxGT("d") -#define MSG_SHORT_HOUR _UxGT("h") -#define MSG_SHORT_MINUTE _UxGT("m") -#define MSG_HEATING _UxGT("Calentando...") -#define MSG_BED_HEATING _UxGT("Calentando base...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibracion Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") +namespace Language_an { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_INFO_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_STATS_MENU _UxGT("Estadisticas Imp.") -#define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusors") -#define MSG_INFO_BAUDRATE _UxGT("Baudios") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz") + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Aragonese"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresion") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total d'imp.") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impresion mas larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total d'extrusion") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impresions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Mas larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusion") -#endif + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" parada."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarcheta mesa"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu prencipal"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automatico"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Amortar motors"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Levar a l'orichen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Orichen X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Orichen Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Orichen Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Orichen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Encetar (pretar)"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Vinient punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelacion feita!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Achustar desfases"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicau"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establir orichen"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Base"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Precalentar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Precal. ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Base"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Enchegar Fuent"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Amortar Fuent"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover Eixes"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelar base"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar base"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidat"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Boquilla ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Boquilla ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Boquilla ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Boquilla ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Boquilla ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Boquilla ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Base"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ixoriador"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Ixoriador 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Ixoriador 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Ixoriador 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Fluxo ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Fluxo ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Fluxo ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Fluxo ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Fluxo ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Fluxo ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temperatura Auto."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Trigar"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Trigar ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Trigar ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Trigar ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Trigar ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Trigar ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Trigar ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Aceleracion"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vel. viache min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Acel. max ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Acel. max ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Acel. max ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Acel. max ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Acel. max ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Acel. max ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Trangos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E trangos/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Alzar memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar memoria"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Restaurar memoria"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Tornar a cargar"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Informacion"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Achustar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresion"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Contin. impresion"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener Impresion"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Menu de SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No i hai tarcheta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aguardand ordines"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impres. cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("Aturada d'emerch."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Aturada."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer F"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Devantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet F"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retraccion auto."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambear filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Cambear filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Cambear filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Cambear filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Cambear filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Cambear filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Cambear filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Encetan. tarcheta"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar tarcheta"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error: en calentar"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Error: temperatura"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Error de temperatura"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Error: Temp Max"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Error: Temp Min"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY first"); + PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA ATURADA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Per favor reinic."); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Calentando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando base..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); -#define MSG_INFO_MIN_TEMP _UxGT("Temperatura menima") -#define MSG_INFO_MAX_TEMP _UxGT("Temperatura maxima") -#define MSG_INFO_PSU _UxGT("Fuente de aliment") + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Inf. Impresora"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inf. Impresora"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadisticas Imp."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Inf. Controlador"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz"); -#define MSG_DRIVE_STRENGTH _UxGT("Fuerza d'o driver") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escri. DAC EEPROM") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Conteo de impresion"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total d'imp."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresion mas larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total d'extrusion"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mas larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrusion"); + #endif -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguardand iniciar") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temperatura menima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temperatura maxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fuente de aliment"); -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Meta o filamento") -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y prete lo boton") + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza d'o driver"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escri. DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Resumir imp."); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("d'o filamento") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambear") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pa continar...") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("d'o fil. cambear") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Meta o filamento") -#endif // LCD_HEIGHT < 4 + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Aguardando a") -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("expulsar filament") -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Aguardando a") -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("cargar filamento") -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Aguardando impre.") -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("pa continar") + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Aguardand iniciar", "d'o filamento", "cambear")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Meta o filamento", "y prete lo boton", "pa continar...")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Aguardand iniciar", "d'o fil. cambear")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Meta o filamento", "y prete lo boton")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Aguardando a", "expulsar filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Aguardando a", "cargar filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Aguardando impre.", "pa continar")); +} diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index 3e95058ba9..7d1bc74751 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -28,120 +28,178 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ -#define DISPLAY_CHARSET_ISO10646_5 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" Готов.") -#define MSG_MEDIA_INSERTED _UxGT("Картата е поставена") -#define MSG_MEDIA_REMOVED _UxGT("Картата е извадена") -#define MSG_MAIN _UxGT("Меню") -#define MSG_AUTOSTART _UxGT("Автостарт") -#define MSG_DISABLE_STEPPERS _UxGT("Изкл. двигатели") -#define MSG_AUTO_HOME _UxGT("Паркиране") -#define MSG_SET_HOME_OFFSETS _UxGT("Задай Начало") -#define MSG_SET_ORIGIN _UxGT("Изходна точка") -#define MSG_PREHEAT_1 _UxGT("Подгряване " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Подгряване " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_ALL _UxGT("Подгр. " PREHEAT_1_LABEL " Всички") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Подгр. " PREHEAT_1_LABEL " Легло") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Настройки " PREHEAT_1_LABEL) -#define MSG_PREHEAT_2 _UxGT("Подгряване " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Подгряване " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_ALL _UxGT("Подгр. " PREHEAT_2_LABEL " Всички") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Подгр. " PREHEAT_2_LABEL " Легло") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Настройки " PREHEAT_2_LABEL) -#define MSG_COOLDOWN _UxGT("Охлаждане") -#define MSG_SWITCH_PS_ON _UxGT("Вкл. захранване") -#define MSG_SWITCH_PS_OFF _UxGT("Изкл. захранване") -#define MSG_EXTRUDE _UxGT("Екструзия") -#define MSG_RETRACT _UxGT("Откат") -#define MSG_MOVE_AXIS _UxGT("Движение по ос") -#define MSG_BED_LEVELING _UxGT("Нивелиране") -#define MSG_LEVEL_BED _UxGT("Нивелиране") -#define MSG_MOVE_X _UxGT("Движение по X") -#define MSG_MOVE_Y _UxGT("Движение по Y") -#define MSG_MOVE_Z _UxGT("Движение по Z") -#define MSG_MOVE_E _UxGT("Екструдер") -#define MSG_MOVE_Z_DIST _UxGT("Премести с %smm") -#define MSG_MOVE_01MM _UxGT("Премести с 0.1mm") -#define MSG_MOVE_1MM _UxGT("Премести с 1mm") -#define MSG_MOVE_10MM _UxGT("Премести с 10mm") -#define MSG_SPEED _UxGT("Скорост") -#define MSG_BED_Z _UxGT("Bed Z") -#define MSG_NOZZLE LCD_STR_THERMOMETER _UxGT(" Дюза") -#define MSG_BED LCD_STR_THERMOMETER _UxGT(" Легло") -#define MSG_FAN_SPEED _UxGT("Вентилатор") -#define MSG_FLOW _UxGT("Поток") -#define MSG_CONTROL _UxGT("Управление") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Минимум") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Максимум") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Фактор") -#define MSG_AUTOTEMP _UxGT("Авто-темп.") -#define MSG_LCD_ON _UxGT("Вкл.") -#define MSG_LCD_OFF _UxGT("Изкл.") -#define MSG_A_RETRACT _UxGT("A-откат") -#define MSG_A_TRAVEL _UxGT("A-travel") -#define MSG_STEPS_PER_MM _UxGT("Стъпки/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Aстъпки/mm") - #define MSG_BSTEPS _UxGT("Bстъпки/mm") - #define MSG_CSTEPS _UxGT("Cстъпки/mm") -#else - #define MSG_ASTEPS _UxGT("Xстъпки/mm") - #define MSG_BSTEPS _UxGT("Yстъпки/mm") - #define MSG_CSTEPS _UxGT("Zстъпки/mm") -#endif -#define MSG_ESTEPS _UxGT("E стъпки/mm") -#define MSG_E1STEPS _UxGT("E1 стъпки/mm") -#define MSG_E2STEPS _UxGT("E2 стъпки/mm") -#define MSG_E3STEPS _UxGT("E3 стъпки/mm") -#define MSG_E4STEPS _UxGT("E4 стъпки/mm") -#define MSG_E5STEPS _UxGT("E5 стъпки/mm") -#define MSG_E6STEPS _UxGT("E6 стъпки/mm") -#define MSG_TEMPERATURE _UxGT("Температура") -#define MSG_MOTION _UxGT("Движение") -#define MSG_FILAMENT _UxGT("Нишка") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Диам. нишка") -#define MSG_CONTRAST _UxGT("LCD контраст") -#define MSG_STORE_EEPROM _UxGT("Запази в EPROM") -#define MSG_LOAD_EEPROM _UxGT("Зареди от EPROM") -#define MSG_RESTORE_FAILSAFE _UxGT("Фабрични настройки") -#define MSG_REFRESH LCD_STR_REFRESH _UxGT("Обнови") -#define MSG_WATCH _UxGT("Преглед") -#define MSG_PREPARE _UxGT("Действия") -#define MSG_TUNE _UxGT("Настройка") -#define MSG_PAUSE_PRINT _UxGT("Пауза") -#define MSG_RESUME_PRINT _UxGT("Възобнови печата") -#define MSG_STOP_PRINT _UxGT("Спри печата") -#define MSG_MEDIA_MENU _UxGT("Меню карта") -#define MSG_NO_MEDIA _UxGT("Няма карта") -#define MSG_DWELL _UxGT("Почивка...") -#define MSG_USERWAIT _UxGT("Изчакване") -#define MSG_PRINT_ABORTED _UxGT("Печатът е прекъснат") -#define MSG_NO_MOVE _UxGT("Няма движение") -#define MSG_KILLED _UxGT("УБИТО.") -#define MSG_STOPPED _UxGT("СПРЯНО.") -#define MSG_CONTROL_RETRACT _UxGT("Откат mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Смяна Откат mm") -#define MSG_CONTROL_RETRACTF _UxGT("Откат V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Скок mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Възврат mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Смяна Възврат mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Възврат V") -#define MSG_AUTORETRACT _UxGT("Автоoткат") -#define MSG_FILAMENTCHANGE _UxGT("Смяна нишка") -#define MSG_INIT_MEDIA _UxGT("Иниц. SD-Карта") -#define MSG_CHANGE_MEDIA _UxGT("Смяна SD-Карта") -#define MSG_ZPROBE_OUT _UxGT("Z-сондата е извадена") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Отстояние") -#define MSG_BABYSTEP_X _UxGT("Министъпка X") -#define MSG_BABYSTEP_Y _UxGT("Министъпка Y") -#define MSG_BABYSTEP_Z _UxGT("Министъпка Z") -#define MSG_ENDSTOP_ABORT _UxGT("Стоп Кр.Изключватели") -#define MSG_DELTA_CALIBRATE _UxGT("Делта Калибровка") -#define MSG_DELTA_CALIBRATE_X _UxGT("Калибровка X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Калибровка Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Калибровка Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калибровка Център") -#define MSG_EXPECTED_PRINTER _UxGT("Неправилен принтер") +#define DISPLAY_CHARSET_ISO10646_5 + +namespace Language_bg { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Bulgarian"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Картата е поставена"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Картата е извадена"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Изкл. двигатели"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Паркиране"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Задай Начало"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Изходна точка"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Подгряване ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Подгряване ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Всички"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Легло"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Настройки ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Подгряване ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Подгряване ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Подгряване ") PREHEAT_2_LABEL _UxGT(" Дюза ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Подгр. ") PREHEAT_2_LABEL _UxGT(" Всички"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Подгр. ") PREHEAT_2_LABEL _UxGT(" Легло"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Настройки ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждане"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Вкл. захранване"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Изкл. захранване"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Екструзия"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Откат"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Движение по ос"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Нивелиране"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Нивелиране"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Екструдер"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Екструдер ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Екструдер ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Екструдер ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Екструдер ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Екструдер ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Екструдер ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Премести с %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Премести с 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Премести с 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Премести с 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Скорост"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Дюза"); + PROGMEM Language_Str MSG_NOZZLE_0 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = " " LCD_STR_THERMOMETER _UxGT(" Дюза ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Легло"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Вентилатор"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Вентилатор 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Вентилатор 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Вентилатор 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Поток"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Поток ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Поток ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Поток ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Поток ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Поток ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Поток ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Управление"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Минимум"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Максимум"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Авто-темп."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Изкл."); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-откат"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-travel"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Стъпки/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E стъпки/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" стъпки/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Нишка"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. нишка"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Диам. нишка ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Диам. нишка ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Диам. нишка ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Диам. нишка ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Диам. нишка ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Диам. нишка ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD контраст"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Запази в EPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зареди от EPROM"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Фабрични настройки"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Обнови"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Преглед"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Действия"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Настройка"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Възобнови печата"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Спри печата"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Меню карта"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Няма карта"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Почивка..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Изчакване"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Печатът е прекъснат"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Няма движение"); + PROGMEM Language_Str MSG_KILLED = _UxGT("УБИТО."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("СПРЯНО."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Откат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смяна Откат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Откат V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Скок mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Възврат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Смяна Възврат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Възврат V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автоoткат"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Смяна нишка"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Смяна нишка ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Смяна нишка ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Смяна нишка ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Смяна нишка ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Смяна нишка ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Смяна нишка ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Иниц. SD-Карта"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Смяна SD-Карта"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-сондата е извадена"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Отстояние"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Министъпка X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Министъпка Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Министъпка Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Стоп Кр.Изключватели"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Делта Калибровка"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровка X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровка Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровка Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровка Център"); + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Неправилен принтер"); +} diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index cf7278851e..21d5329db3 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -28,236 +28,263 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ +namespace Language_ca { + using namespace Language_en; // Inherit undefined strings from English -#define CHARSIZE 2 + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Catalan"); -#define WELCOME_MSG MACHINE_NAME _UxGT(" preparada.") -#define MSG_MEDIA_INSERTED _UxGT("Targeta detectada.") -#define MSG_MEDIA_REMOVED _UxGT("Targeta extreta.") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") -#define MSG_MAIN _UxGT("Menú principal") -#define MSG_AUTOSTART _UxGT("Inici automatic") -#define MSG_DISABLE_STEPPERS _UxGT("Desactiva motors") -#define MSG_DEBUG_MENU _UxGT("Menu de depuracio") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra progres") -#define MSG_AUTO_HOME _UxGT("Ves a l'origen") -#define MSG_AUTO_HOME_X _UxGT("X a origen") -#define MSG_AUTO_HOME_Y _UxGT("Y a origen") -#define MSG_AUTO_HOME_Z _UxGT("Z a origen") -#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Premeu per iniciar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Següent punt") -#define MSG_LEVEL_BED_DONE _UxGT("Anivellament fet!") -#define MSG_SET_HOME_OFFSETS _UxGT("Ajusta decalatge") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Decalatge aplicat") -#define MSG_SET_ORIGIN _UxGT("Estableix origen") -#define MSG_PREHEAT_1 _UxGT("Preescalfa " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tot") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Llit") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Conf.") -#define MSG_PREHEAT_2 _UxGT("Preescalfa " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tot") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Llit") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Conf.") -#define MSG_COOLDOWN _UxGT("Refreda") -#define MSG_SWITCH_PS_ON _UxGT("Switch power on") -#define MSG_SWITCH_PS_OFF _UxGT("Switch power off") -#define MSG_EXTRUDE _UxGT("Extrudeix") -#define MSG_RETRACT _UxGT("Retreu") -#define MSG_MOVE_AXIS _UxGT("Mou eixos") -#define MSG_BED_LEVELING _UxGT("Anivella llit") -#define MSG_LEVEL_BED _UxGT("Anivella llit") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" preparada."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Targeta detectada."); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Targeta extreta."); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inici automatic"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactiva motors"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu de depuracio"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progres"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ves a l'origen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X a origen"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y a origen"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z a origen"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premeu per iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Següent punt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Anivellament fet!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajusta decalatge"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Decalatge aplicat"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Estableix origen"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Preescalfa ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Llit"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preescalfa ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Preescalfa ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Llit"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Conf."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refreda"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch power on"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch power off"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudeix"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retreu"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mou eixos"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Anivella llit"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Anivella llit"); -#define MSG_MOVING _UxGT("Movent..") -#define MSG_FREE_XY _UxGT("XY lliures") -#define MSG_MOVE_X _UxGT("Mou X") -#define MSG_MOVE_Y _UxGT("Mou Y") -#define MSG_MOVE_Z _UxGT("Mou Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_MOVE_Z_DIST _UxGT("Mou %smm") -#define MSG_MOVE_01MM _UxGT("Mou 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mou 1mm") -#define MSG_MOVE_10MM _UxGT("Mou 10mm") -#define MSG_SPEED _UxGT("Velocitat") -#define MSG_BED_Z _UxGT("Llit Z") -#define MSG_NOZZLE _UxGT("Nozzle") -#define MSG_BED _UxGT("Llit") -#define MSG_FAN_SPEED _UxGT("Vel. Ventilador") -#define MSG_FLOW _UxGT("Flux") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Autotemp") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Select") -#define MSG_ACC _UxGT("Accel") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VViatge min") -#define MSG_AMAX _UxGT("Accel. max ") -#define MSG_A_RETRACT _UxGT("Accel. retracc") -#define MSG_A_TRAVEL _UxGT("Accel. Viatge") -#define MSG_STEPS_PER_MM _UxGT("Passos/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Apassos/mm") - #define MSG_BSTEPS _UxGT("Bpassos/mm") - #define MSG_CSTEPS _UxGT("Cpassos/mm") -#else - #define MSG_ASTEPS _UxGT("Xpassos/mm") - #define MSG_BSTEPS _UxGT("Ypassos/mm") - #define MSG_CSTEPS _UxGT("Zpassos/mm") -#endif -#define MSG_ESTEPS _UxGT("Epassos/mm") -#define MSG_E1STEPS _UxGT("E1passos/mm") -#define MSG_E2STEPS _UxGT("E2passos/mm") -#define MSG_E3STEPS _UxGT("E3passos/mm") -#define MSG_E4STEPS _UxGT("E4passos/mm") -#define MSG_E5STEPS _UxGT("E5passos/mm") -#define MSG_E6STEPS _UxGT("E6passos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Moviment") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diam. Fil.") -#define MSG_CONTRAST _UxGT("Contrast de LCD") -#define MSG_STORE_EEPROM _UxGT("Desa memoria") -#define MSG_LOAD_EEPROM _UxGT("Carrega memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaura valors") -#define MSG_REFRESH _UxGT("Actualitza") -#define MSG_WATCH _UxGT("Pantalla Info.") -#define MSG_PREPARE _UxGT("Prepara") -#define MSG_TUNE _UxGT("Ajusta") -#define MSG_PAUSE_PRINT _UxGT("Pausa impressio") -#define MSG_RESUME_PRINT _UxGT("Repren impressio") -#define MSG_STOP_PRINT _UxGT("Atura impressio.") -#define MSG_MEDIA_MENU _UxGT("Imprimeix de SD") -#define MSG_NO_MEDIA _UxGT("No hi ha targeta") -#define MSG_DWELL _UxGT("En repos...") -#define MSG_USERWAIT _UxGT("Esperant usuari..") -#define MSG_PRINT_ABORTED _UxGT("Imp. cancelada") -#define MSG_NO_MOVE _UxGT("Sense moviment.") -#define MSG_KILLED _UxGT("MATAT.") -#define MSG_STOPPED _UxGT("ATURADA.") -#define MSG_CONTROL_RETRACT _UxGT("Retreu mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Retreure mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retreu V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Aixeca mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet +mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap DesRet +mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") -#define MSG_AUTORETRACT _UxGT("Auto retraccio") -#define MSG_FILAMENTCHANGE _UxGT("Canvia filament") -#define MSG_INIT_MEDIA _UxGT("Inicialitza SD") -#define MSG_CHANGE_MEDIA _UxGT("Canvia SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z fora") -#define MSG_BLTOUCH_RESET _UxGT("Reinicia BLTouch") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s primer") -#define MSG_ZPROBE_ZOFFSET _UxGT("Decalatge Z") -#define MSG_BABYSTEP_X _UxGT("Micropas X") -#define MSG_BABYSTEP_Y _UxGT("Micropas Y") -#define MSG_BABYSTEP_Z _UxGT("Micropas Z") -#define MSG_ENDSTOP_ABORT _UxGT("Cancel. Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Error al escalfar") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP REDUNDANT") -#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") -#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MAXIMA") -#define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMPMAX LLIT") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMPMIN LLIT") -#define MSG_ERR_Z_HOMING _UxGT("Home XY primer") -#define MSG_HALTED _UxGT("IMPRESSORA PARADA") -#define MSG_PLEASE_RESET _UxGT("Reinicieu") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Escalfant...") -#define MSG_BED_HEATING _UxGT("Escalfant llit...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibratge Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibra X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibra Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibra Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra el centre") + PROGMEM Language_Str MSG_MOVING = _UxGT("Movent.."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY lliures"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mou X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mou Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mou Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mou %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mou 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mou 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mou 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocitat"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Llit Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Nozzle ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Nozzle ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Nozzle ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Nozzle ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Nozzle ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Nozzle ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Llit"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventilador"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Vel. Ventilador 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Vel. Ventilador 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Vel. Ventilador 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flux ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flux ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flux ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flux ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flux ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flux ") LCD_STR_N5; + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VViatge min"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Accel. max ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Accel. max ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Accel. max ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Accel. max ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Accel. max ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Accel. max ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Accel. max ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Accel. max ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Accel. max ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Accel. max ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Accel. retracc"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Accel. Viatge"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassos/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("passos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Moviment"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. Fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Diam. Fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Diam. Fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Diam. Fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Diam. Fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Diam. Fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Diam. Fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrast de LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Desa memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carrega memoria"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Restaura valors"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Pantalla Info."); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ajusta"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa impressio"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Repren impressio"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Atura impressio."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimeix de SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No hi ha targeta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("En repos..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Esperant usuari.."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Imp. cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sense moviment."); + PROGMEM Language_Str MSG_KILLED = _UxGT("MATAT."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ATURADA."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retreu mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retreure mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retreu V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Aixeca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet +mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet +mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto retraccio"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Canvia filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Canvia filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Canvia filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Canvia filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Canvia filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Canvia filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Canvia filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Inicialitza SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Canvia SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fora"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reinicia BLTouch"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s primer"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Decalatge Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropas X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropas Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropas Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancel. Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error al escalfar"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP REDUNDANT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MAXIMA"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY primer"); + PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PARADA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reinicieu"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Escalfant..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Escalfant llit..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibratge Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra el centre"); -#define MSG_INFO_MENU _UxGT("Quant a la impr.") -#define MSG_INFO_PRINTER_MENU _UxGT("Info Impressora") -#define MSG_INFO_STATS_MENU _UxGT("Estadistiques") -#define MSG_INFO_BOARD_MENU _UxGT("Info placa") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusors") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protocol") -#define MSG_CASE_LIGHT _UxGT("Llum") + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Quant a la impr."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info Impressora"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadistiques"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info placa"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Llum"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Total impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Acabades") - #define MSG_INFO_PRINT_TIME _UxGT("Temps imprimint") - #define MSG_INFO_PRINT_LONGEST _UxGT("Treball mes llarg") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total extrudit") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Acabades") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Mes llarg") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudit") -#endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Temps imprimint"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Treball mes llarg"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total extrudit"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mes llarg"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudit"); + #endif -#define MSG_INFO_MIN_TEMP _UxGT("Temp. mínima") -#define MSG_INFO_MAX_TEMP _UxGT("Temp. màxima") -#define MSG_INFO_PSU _UxGT("Font alimentacio") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. mínima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. màxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Font alimentacio"); -#define MSG_DRIVE_STRENGTH _UxGT("Força motor") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Repren impressió") + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força motor"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Repren impressió"); -#define MSG_EXPECTED_PRINTER _UxGT("Impressora incorrecta") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Impressora incorrecta"); -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperant per") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar el canvi") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filament") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperant per") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("treure filament") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Poseu filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i premeu el boto") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("per continuar...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Premeu boto per") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("escalfar nozzle.") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Escalfant nozzle") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espereu...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperant carrega") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("de filament") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperant per") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("reprendre") -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Espereu...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Expulsant...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insereix i prem") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Escalfant...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregant...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprenent...") -#endif // LCD_HEIGHT < 4 + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperant per", "iniciar el canvi", "de filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperant per", "treure filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Poseu filament", "i premeu el boto", "per continuar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premeu boto per", "escalfar nozzle.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Escalfant nozzle", "Espereu...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperant carrega", "de filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperant per", "reprendre")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Espereu...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Expulsant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insereix i prem")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Escalfant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprenent...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 92a9e0ca83..ebb8186e76 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -35,521 +35,578 @@ */ #define DISPLAY_CHARSET_ISO10646_CZ -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("áÁčČďĎéÉěĚíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽ³") -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" připraven.") -#define MSG_YES _UxGT("ANO") -#define MSG_NO _UxGT("NE") -#define MSG_BACK _UxGT("Zpět") -#define MSG_MEDIA_INSERTED _UxGT("Karta vložena") -#define MSG_MEDIA_REMOVED _UxGT("Karta vyjmuta") -#define MSG_LCD_ENDSTOPS _UxGT("Endstopy") // max 8 znaku -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Endstopy") -#define MSG_MAIN _UxGT("Hlavní nabídka") -#define MSG_ADVANCED_SETTINGS _UxGT("Další nastavení") -#define MSG_CONFIGURATION _UxGT("Konfigurace") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Uvolnit motory") -#define MSG_DEBUG_MENU _UxGT("Nabídka ladění") -#if LCD_WIDTH >= 20 - #define MSG_PROGRESS_BAR_TEST _UxGT("Test ukaz. průběhu") -#else - #define MSG_PROGRESS_BAR_TEST _UxGT("Test uk. průběhu") -#endif -#define MSG_AUTO_HOME _UxGT("Domovská pozice") -#define MSG_AUTO_HOME_X _UxGT("Domů osa X") -#define MSG_AUTO_HOME_Y _UxGT("Domů osa Y") -#define MSG_AUTO_HOME_Z _UxGT("Domů osa Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Auto srovnání Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Měření podložky") -#define MSG_LEVEL_BED_WAITING _UxGT("Kliknutím spusťte") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Další bod") -#define MSG_LEVEL_BED_DONE _UxGT("Měření hotovo!") -#define MSG_Z_FADE_HEIGHT _UxGT("Výška srovnávání") -#define MSG_SET_HOME_OFFSETS _UxGT("Nastavit ofsety") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Ofsety nastaveny") -#define MSG_SET_ORIGIN _UxGT("Nastavit počátek") -#define MSG_PREHEAT_1 _UxGT("Zahřát " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" vše") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podlož") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast") -#define MSG_PREHEAT_2 _UxGT("Zahřát " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" vše") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podlož") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast") -#define MSG_PREHEAT_CUSTOM _UxGT("Zahřát vlastní") -#define MSG_COOLDOWN _UxGT("Zchladit") -#define MSG_LASER_MENU _UxGT("Ovládání laseru") -#define MSG_LASER_OFF _UxGT("Vypnout laser") -#define MSG_LASER_ON _UxGT("Zapnout laser") -#define MSG_LASER_POWER _UxGT("Výkon laseru") -#define MSG_SPINDLE_REVERSE _UxGT("Vřeteno opačně") -#define MSG_SWITCH_PS_ON _UxGT("Zapnout napájení") -#define MSG_SWITCH_PS_OFF _UxGT("Vypnout napájení") -#define MSG_EXTRUDE _UxGT("Vytlačit (extr.)") -#define MSG_RETRACT _UxGT("Zatlačit (retr.)") -#define MSG_MOVE_AXIS _UxGT("Posunout osy") -#define MSG_BED_LEVELING _UxGT("Vyrovnat podložku") -#define MSG_LEVEL_BED _UxGT("Vyrovnat podložku") -#define MSG_LEVEL_CORNERS _UxGT("Vyrovnat rohy") -#define MSG_NEXT_CORNER _UxGT("Další roh") -#define MSG_EDIT_MESH _UxGT("Upravit síť bodů") -#define MSG_EDITING_STOPPED _UxGT("Konec úprav sítě") -#define MSG_MESH_X _UxGT("Index X") -#define MSG_MESH_Y _UxGT("Index Y") -#define MSG_MESH_EDIT_Z _UxGT("Hodnota Z") +namespace Language_cz { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_USER_MENU _UxGT("Vlastní příkazy") -#define MSG_IDEX_MENU _UxGT("Režim IDEX") -#define MSG_OFFSETS_MENU _UxGT("Ofsety nástrojů") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplikace") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Zrcadlení") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Plná kontrola") -#define MSG_X_OFFSET _UxGT("2. tryska X") -#define MSG_Y_OFFSET _UxGT("2. tryska Y") -#define MSG_Z_OFFSET _UxGT("2. tryska Z") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Czech"); -#define MSG_UBL_DOING_G29 _UxGT("Provádím G29") -#define MSG_UBL_TOOLS _UxGT("UBL nástroje") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Manuální síť bodů") -#define MSG_UBL_BC_INSERT _UxGT("Vložte kartu, změřte") -#define MSG_UBL_BC_INSERT2 _UxGT("Změřte") -#define MSG_UBL_BC_REMOVE _UxGT("Odstraňte a změřte") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Přesun na další") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Aktivovat UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deaktivovat UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Teplota podložky") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Teplota hotendu") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Úprava sítě bodů") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Upravit vlastní síť") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Doladit síť bodů") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Konec úprav sítě") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Vlastní síť") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Vytvořit síť") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Síť bodů " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Síť bodů " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Studená síť bodů") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Upravit výšku sítě") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Výška") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Zkontrolovat síť") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Kontrola sítě " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Kontrola sítě " PREHEAT_2_LABEL) -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Kontrola vlast. sítě") -#define MSG_UBL_CONTINUE_MESH _UxGT("Pokračovat v síťi") -#define MSG_UBL_MESH_LEVELING _UxGT("Síťové rovnání") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-bodové rovnání") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Mřížkové rovnání") -#define MSG_UBL_MESH_LEVEL _UxGT("Srovnat podložku") -#define MSG_UBL_SIDE_POINTS _UxGT("Postranní body") -#define MSG_UBL_MAP_TYPE _UxGT("Typ sítě bodu") -#define MSG_UBL_OUTPUT_MAP _UxGT("Exportovat síť") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovat do PC") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovat do CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Záloha do PC") -#define MSG_UBL_INFO_UBL _UxGT("Info o UBL do PC") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mřížky") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Ruční hustota") -#define MSG_UBL_SMART_FILLIN _UxGT("Chytrá hustota") -#define MSG_UBL_FILLIN_MESH _UxGT("Zaplnit mřížku") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Zrušit všechno") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrušit poslední") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Upravit všechny") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Upravit poslední") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Uložiště sítí") -#define MSG_UBL_STORAGE_SLOT _UxGT("Paměťový slot") -#define MSG_UBL_LOAD_MESH _UxGT("Načíst síť bodů") -#define MSG_UBL_SAVE_MESH _UxGT("Uložit síť bodů") -#define MSG_MESH_LOADED _UxGT("Síť %i načtena") -#define MSG_MESH_SAVED _UxGT("Síť %i uložena") -#define MSG_UBL_NO_STORAGE _UxGT("Nedostatek místa") -#define MSG_UBL_SAVE_ERROR _UxGT("Ch.: Uložit UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Ch.: Obnovit UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Konec Z-Offsetu") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Postupně") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" připraven."); + PROGMEM Language_Str MSG_YES = _UxGT("ANO"); + PROGMEM Language_Str MSG_NO = _UxGT("NE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Zpět"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložena"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vyjmuta"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavní nabídka"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Další nastavení"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurace"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolnit motory"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Nabídka ladění"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test ukaz. průběhu"); + #else + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. průběhu"); + #endif + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozice"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domů osa X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domů osa Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domů osa Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto srovnání Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Měření podložky"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím spusťte"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Další bod"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Měření hotovo!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška srovnávání"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Nastavit ofsety"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastaveny"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastavit počátek"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Zahřát ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" vše"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" nast"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Zahřát ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Zahřát ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" vše"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" nast"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Zahřát vlastní"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Zchladit"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Ovládání laseru"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnout laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnout laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon laseru"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Vřeteno opačně"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnout napájení"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnout napájení"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačit (extr.)"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Zatlačit (retr.)"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunout osy"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnat podložku"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnat podložku"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnat rohy"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Další roh"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upravit síť bodů"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Konec úprav sítě"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); -#define MSG_LED_CONTROL _UxGT("Nastavení LED") -#define MSG_LEDS _UxGT("Světla") -#define MSG_LED_PRESETS _UxGT("Světla Předvolby") -#define MSG_SET_LEDS_RED _UxGT("Červená") -#define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") -#define MSG_SET_LEDS_YELLOW _UxGT("Žlutá") -#define MSG_SET_LEDS_GREEN _UxGT("Zelená") -#define MSG_SET_LEDS_BLUE _UxGT("Modrá") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Fialová") -#define MSG_SET_LEDS_WHITE _UxGT("Bílá") -#define MSG_SET_LEDS_DEFAULT _UxGT("Výchozí") -#define MSG_CUSTOM_LEDS _UxGT("Vlastní světla") -#define MSG_INTENSITY_R _UxGT("Červená intenzita") -#define MSG_INTENSITY_G _UxGT("Zelená intezita") -#define MSG_INTENSITY_B _UxGT("Modrá intenzita") -#define MSG_INTENSITY_W _UxGT("Bílá intenzita") -#define MSG_LED_BRIGHTNESS _UxGT("Jas") + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastní příkazy"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Režim IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofsety nástrojů"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikace"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrcadlení"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2. tryska X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2. tryska Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2. tryska Z"); -#define MSG_MOVING _UxGT("Posouvání...") -#define MSG_FREE_XY _UxGT("Uvolnit XY") -#define MSG_MOVE_X _UxGT("Posunout X") -#define MSG_MOVE_Y _UxGT("Posunout Y") -#define MSG_MOVE_Z _UxGT("Posunout Z") -#define MSG_MOVE_E _UxGT("Extrudér") -#define MSG_HOTEND_TOO_COLD _UxGT("Hotend je studený") -#define MSG_MOVE_Z_DIST _UxGT("Posunout o %smm") -#define MSG_MOVE_01MM _UxGT("Posunout o 0,1mm") -#define MSG_MOVE_1MM _UxGT("Posunout o 1mm") -#define MSG_MOVE_10MM _UxGT("Posunout o 10mm") -#define MSG_SPEED _UxGT("Rychlost") -#define MSG_BED_Z _UxGT("Výška podl.") -#define MSG_NOZZLE _UxGT("Tryska") -#define MSG_BED _UxGT("Podložka") -#define MSG_CHAMBER _UxGT("Komora") -#define MSG_FAN_SPEED _UxGT("Rychlost vent.") -#define MSG_EXTRA_FAN_SPEED _UxGT("Rychlost ex. vent.") -#define MSG_FLOW _UxGT("Průtok") -#define MSG_CONTROL _UxGT("Ovládaní") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") -#define MSG_AUTOTEMP _UxGT("Autoteplota") -#define MSG_LCD_ON _UxGT("Zap") -#define MSG_LCD_OFF _UxGT("Vyp") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Vybrat") -#define MSG_ACC _UxGT("Zrychl") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_JUNCTION_DEVIATION _UxGT("Odchylka spoje") -#define MSG_VELOCITY _UxGT("Rychlost") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_ACCELERATION _UxGT("Akcelerace") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retrakt") -#define MSG_A_TRAVEL _UxGT("A-přejezd") -#define MSG_STEPS_PER_MM _UxGT("Kroků/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Akroků/mm") - #define MSG_BSTEPS _UxGT("Bkroků/mm") - #define MSG_CSTEPS _UxGT("Ckroků/mm") -#else - #define MSG_ASTEPS _UxGT("Xkroků/mm") - #define MSG_BSTEPS _UxGT("Ykroků/mm") - #define MSG_CSTEPS _UxGT("Zkroků/mm") -#endif -#define MSG_ESTEPS _UxGT("Ekroků/mm") -#define MSG_E1STEPS _UxGT("E1kroků/mm") -#define MSG_E2STEPS _UxGT("E2kroků/mm") -#define MSG_E3STEPS _UxGT("E3kroků/mm") -#define MSG_E4STEPS _UxGT("E4kroků/mm") -#define MSG_E5STEPS _UxGT("E5kroků/mm") -#define MSG_E6STEPS _UxGT("E6kroků/mm") -#define MSG_TEMPERATURE _UxGT("Teplota") -#define MSG_MOTION _UxGT("Pohyb") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E na mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Prum.") -#define MSG_FILAMENT_UNLOAD _UxGT("Vysunout mm") -#define MSG_FILAMENT_LOAD _UxGT("Zavést mm") -#define MSG_ADVANCE_K _UxGT("K pro posun") -#define MSG_CONTRAST _UxGT("Kontrast LCD") -#define MSG_STORE_EEPROM _UxGT("Uložit nastavení") -#define MSG_LOAD_EEPROM _UxGT("Načíst nastavení") -#define MSG_RESTORE_FAILSAFE _UxGT("Obnovit výchozí") -#define MSG_INIT_EEPROM _UxGT("Inic. EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Aktualizace z SD") -#define MSG_RESET_PRINTER _UxGT("Reset tiskárny") -#define MSG_REFRESH _UxGT("Obnovit") -#define MSG_WATCH _UxGT("Info obrazovka") -#define MSG_PREPARE _UxGT("Připrava tisku") -#define MSG_TUNE _UxGT("Doladění tisku") -#define MSG_START_PRINT _UxGT("Spustit tisk") -#define MSG_BUTTON_PRINT _UxGT("Tisk") -#define MSG_BUTTON_CANCEL _UxGT("Zrušit") -#define MSG_PAUSE_PRINT _UxGT("Pozastavit tisk") -#define MSG_RESUME_PRINT _UxGT("Obnovit tisk") -#define MSG_STOP_PRINT _UxGT("Zastavit tisk") -#define MSG_OUTAGE_RECOVERY _UxGT("Obnova výpadku") -#define MSG_MEDIA_MENU _UxGT("Tisknout z SD") -#define MSG_NO_MEDIA _UxGT("Žádná SD karta") -#define MSG_DWELL _UxGT("Uspáno...") -#define MSG_USERWAIT _UxGT("Čekání na uživ...") -#define MSG_PRINT_PAUSED _UxGT("Tisk pozastaven") -#define MSG_PRINTING _UxGT("Tisknu...") -#define MSG_PRINT_ABORTED _UxGT("Tisk zrušen") -#define MSG_NO_MOVE _UxGT("Žádný pohyb.") -#define MSG_KILLED _UxGT("PŘERUSENO. ") -#define MSG_STOPPED _UxGT("ZASTAVENO. ") -#define MSG_CONTROL_RETRACT _UxGT("Retrakt mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Výměna Re.mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraktovat V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Zvednuti Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Délka retrakce") -#define MSG_TOOL_CHANGE _UxGT("Výměna nástroje") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Zdvih Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Rychlost primár.") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Rychlost retrak.") -#define MSG_NOZZLE_STANDBY _UxGT("Tryska standby") -#define MSG_FILAMENTCHANGE _UxGT("Vyměnit filament") -#define MSG_FILAMENTLOAD _UxGT("Zavést filament") -#define MSG_FILAMENTUNLOAD _UxGT("Vysunout filament") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Vysunout vše") + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Provádím G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL nástroje"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuální síť bodů"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Vložte kartu, změřte"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Změřte"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstraňte a změřte"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Přesun na další"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovat UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovat UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava sítě bodů"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upravit vlastní síť"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladit síť bodů"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Konec úprav sítě"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastní síť"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvořit síť"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Síť bodů ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Síť bodů ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená síť bodů"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upravit výšku sítě"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Zkontrolovat síť"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Kontrola sítě ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Kontrola sítě ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast. sítě"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovat v síťi"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Síťové rovnání"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnání"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mřížkové rovnání"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Srovnat podložku"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranní body"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ sítě bodu"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovat síť"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Exportovat do PC"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Exportovat do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Záloha do PC"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info o UBL do PC"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mřížky"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ruční hustota"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytrá hustota"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Zaplnit mřížku"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušit všechno"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušit poslední"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upravit všechny"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upravit poslední"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Uložiště sítí"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Paměťový slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načíst síť bodů"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložit síť bodů"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Síť %i načtena"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Síť %i uložena"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatek místa"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ch.: Uložit UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ch.: Obnovit UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Konec Z-Offsetu"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Postupně"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Studená síť bodů"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Chytrá hustota"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Zkontrolovat síť"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Upravit všechny"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Zkontrolovat síť"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Upravit všechny"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Uložit síť bodů"); -#define MSG_INIT_MEDIA _UxGT("Načíst SD kartu") -#define MSG_CHANGE_MEDIA _UxGT("Vyměnit SD kartu") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z mimo podl") -#define MSG_SKEW_FACTOR _UxGT("Faktor zkosení") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch self-test") -#define MSG_BLTOUCH_RESET _UxGT("BLTouch reset") -#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch vysunout") -#define MSG_BLTOUCH_SW_MODE _UxGT("SW výsun BLTouch") -#define MSG_BLTOUCH_5V_MODE _UxGT("BLTouch 5V režim") -#define MSG_BLTOUCH_OD_MODE _UxGT("BLTouch OD režim") -#define MSG_BLTOUCH_STOW _UxGT("BLTouch zasunout") -#define MSG_MANUAL_DEPLOY _UxGT("Vysunout Z-sondu") -#define MSG_MANUAL_STOW _UxGT("Zasunout Z-sondu") -#define MSG_HOME_FIRST _UxGT("Domů %s%s%s první") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z ofset") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Celkem") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -#define MSG_HEATING_FAILED_LCD _UxGT("Chyba zahřívání") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Chyba zahř.podl.") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEPLOTA") -#define MSG_THERMAL_RUNAWAY _UxGT("TEPLOTNÍ ÚNIK") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEPL. ÚNIK PODL.") -#define MSG_ERR_MAXTEMP _UxGT("VYSOKÁ TEPLOTA") -#define MSG_ERR_MINTEMP _UxGT("NÍZKA TEPLOTA") -#define MSG_ERR_MAXTEMP_BED _UxGT("VYS. TEPL. PODL.") -#define MSG_ERR_MINTEMP_BED _UxGT("NÍZ. TEPL. PODL.") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err: MAXTEMP KOMORA") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err: MINTEMP KOMORA") -#define MSG_ERR_Z_HOMING _UxGT("Domů XY první") -#define MSG_HALTED _UxGT("TISK. ZASTAVENA") -#define MSG_PLEASE_RESET _UxGT("Proveďte reset") -#define MSG_SHORT_DAY _UxGT("d") -#define MSG_SHORT_HOUR _UxGT("h") -#define MSG_SHORT_MINUTE _UxGT("m") -#define MSG_HEATING _UxGT("Zahřívání...") -#define MSG_COOLING _UxGT("Chlazení...") -#if LCD_WIDTH >= 20 - #define MSG_BED_HEATING _UxGT("Zahřívání podložky") -#else - #define MSG_BED_HEATING _UxGT("Zahřívání podl.") -#endif -#if LCD_WIDTH >= 20 - #define MSG_BED_COOLING _UxGT("Chlazení podložky") -#else - #define MSG_BED_COOLING _UxGT("Chlazení podl.") -#endif -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrace") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrovat X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrovat Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrovat Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrovat Střed") -#define MSG_DELTA_SETTINGS _UxGT("Delta nastavení") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autokalibrace") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Nast.výšku delty") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Nast. Z-ofset") -#define MSG_DELTA_DIAG_ROD _UxGT("Diag rameno") -#define MSG_DELTA_HEIGHT _UxGT("Výška") -#define MSG_DELTA_RADIUS _UxGT("Poloměr") -#define MSG_INFO_MENU _UxGT("O tiskárně") -#define MSG_INFO_PRINTER_MENU _UxGT("Info o tiskárně") -#define MSG_3POINT_LEVELING _UxGT("3-bodové rovnání") -#define MSG_LINEAR_LEVELING _UxGT("Lineárni rovnání") -#define MSG_BILINEAR_LEVELING _UxGT("Bilineární rovnání") -#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -#define MSG_MESH_LEVELING _UxGT("Mřížkové rovnání") -#define MSG_INFO_STATS_MENU _UxGT("Statistika") -#define MSG_INFO_BOARD_MENU _UxGT("Info o desce") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistory") -#define MSG_INFO_EXTRUDERS _UxGT("Extrudéry") -#define MSG_INFO_BAUDRATE _UxGT("Rychlost") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Osvětlení") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Jas světla") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavení LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Světla"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Světla Předvolby"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žlutá"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bílá"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Výchozí"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastní světla"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Červená intenzita"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zelená intezita"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Modrá intenzita"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Bílá intenzita"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Počet tisků") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Dokončeno") - #define MSG_INFO_PRINT_TIME _UxGT("Celkový čas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelší tisk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Celkem vytlačeno") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Tisky") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Hotovo") - #define MSG_INFO_PRINT_TIME _UxGT("Čas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelší") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Vytlačeno") -#endif + PROGMEM Language_Str MSG_MOVING = _UxGT("Posouvání..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolnit XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunout X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunout Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunout Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrudér ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrudér ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrudér ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrudér ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrudér ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrudér ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunout o %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunout o 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunout o 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Rychlost"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Tryska ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Tryska ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Tryska ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Tryska ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Tryska ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Tryska ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rychlost vent."); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Rychlost vent. 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Rychlost vent. 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Rychlost vent. 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rychlost ex. vent."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Rychlost ex. vent. 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Rychlost ex. vent. 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Rychlost ex. vent. 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Průtok"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Průtok ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Průtok ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Průtok ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Průtok ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Průtok ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Průtok ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládaní"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autoteplota"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrat"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Vybrat ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Vybrat ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Vybrat ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Vybrat ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Vybrat ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Vybrat ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Zrychl"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Odchylka spoje"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rychlost"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Akcelerace"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-přejezd"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroků/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekroků/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Prum."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Prum. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Prum. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Prum. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Prum. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Prum. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Prum. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunout mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zavést mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pro posun"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K pro posun ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K pro posun ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K pro posun ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K pro posun ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K pro posun ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K pro posun ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložit nastavení"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načíst nastavení"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Obnovit výchozí"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inic. EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizace z SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset tiskárny"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnovit"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info obrazovka"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Připrava tisku"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Doladění tisku"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Spustit tisk"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tisk"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušit"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastavit tisk"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastavit tisk"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova výpadku"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tisknout z SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žádná SD karta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uspáno..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekání na uživ..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tisk pozastaven"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Tisknu..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tisk zrušen"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žádný pohyb."); + PROGMEM Language_Str MSG_KILLED = _UxGT("PŘERUSENO. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výměna Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovat V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zvednuti Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Délka retrakce"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výměna nástroje"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvih Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Rychlost primár."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Rychlost retrak."); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Tryska standby"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vyměnit filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Vyměnit filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Vyměnit filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Vyměnit filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Vyměnit filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Vyměnit filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Vyměnit filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zavést filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Zavést filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Zavést filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Zavést filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Zavést filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Zavést filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Zavést filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Vysunout filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Vysunout filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Vysunout filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Vysunout filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Vysunout filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Vysunout filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunout vše"); -#define MSG_INFO_MIN_TEMP _UxGT("Teplota min") -#define MSG_INFO_MAX_TEMP _UxGT("Teplota max") -#define MSG_INFO_PSU _UxGT("Nap. zdroj") -#define MSG_DRIVE_STRENGTH _UxGT("Buzení motorů") -#define MSG_DAC_PERCENT _UxGT("Motor %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Uložit do EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("TISK POZASTAVEN") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ZAVEDENÍ FILAMENTU") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("VYSUNUTÍ FILAMENTU") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("MOŽNOSTI OBNOVENÍ:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Vytlačit víc") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Obnovit tisk") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Tryska: ") -#define MSG_RUNOUT_SENSOR _UxGT("Senzor filamentu") -#define MSG_ERR_HOMING_FAILED _UxGT("Parkování selhalo") -#define MSG_ERR_PROBING_FAILED _UxGT("Kalibrace selhala") -#define MSG_M600_TOO_COLD _UxGT("M600: Moc studený") + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Načíst SD kartu"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vyměnit SD kartu"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor zkosení"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch self-test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch reset"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch vysunout"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW výsun BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch 5V režim"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch OD režim"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch zasunout"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Vysunout Z-sondu"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Zasunout Z-sondu"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Domů %s%s%s první"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkem"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop abort"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba zahřívání"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba zahř.podl."); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEPLOTA"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÍ ÚNIK"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPL. ÚNIK PODL."); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("VYSOKÁ TEPLOTA"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("NÍZKA TEPLOTA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("VYS. TEPL. PODL."); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("NÍZ. TEPL. PODL."); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP KOMORA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP KOMORA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Domů XY první"); + PROGMEM Language_Str MSG_HALTED = _UxGT("TISK. ZASTAVENA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Proveďte reset"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Zahřívání..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Chlazení..."); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podložky"); + #else + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podl."); + #endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podložky"); + #else + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podl."); + #endif + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrace"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovat X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovat Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovat Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovat Střed"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavení"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autokalibrace"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast.výšku delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Nast. Z-ofset"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rameno"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Poloměr"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tiskárně"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info o tiskárně"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnání"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárni rovnání"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineární rovnání"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mřížkové rovnání"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info o desce"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rychlost"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvětlení"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas světla"); -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("VÝMĚNA FILAMENTU") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("VYBERTE FILAMENT") -#define MSG_MMU2_MENU _UxGT("MMU") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Aktual. MMU firmware!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU potř. pozornost.") -#define MSG_MMU2_RESUME _UxGT("Obnovit tisk") -#define MSG_MMU2_RESUMING _UxGT("Obnovování...") -#define MSG_MMU2_LOAD_FILAMENT _UxGT("Zavést filament") -#define MSG_MMU2_LOAD_ALL _UxGT("Zavést všechny") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Zavést do trysky") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Vysunout filament") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Vysun. filament 1") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Vysun. filament 2") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Vysun. filament 3") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Vysun. filament 4") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Vysun. filament 5") -#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Vytáhnout filament") -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Zavádění fil. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Vytahování fil. ...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Vysouvání fil....") -#define MSG_MMU2_ALL _UxGT("Všechny") -#define MSG_MMU2_FILAMENT0 _UxGT("Filament 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filament 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filament 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filament 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filament 5") -#define MSG_MMU2_RESET _UxGT("Resetovat MMU") -#define MSG_MMU2_RESETTING _UxGT("Resetování MMU...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Vytáhněte, klikněte") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tisků"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončeno"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší tisk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkem vytlačeno"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tisky"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačeno"); + #endif -#define MSG_MIX _UxGT("Mix") -#define MSG_MIX_COMPONENT _UxGT("Komponenta") -#define MSG_MIXER _UxGT("Mixér") -#define MSG_GRADIENT _UxGT("Přechod") -#define MSG_FULL_GRADIENT _UxGT("Celý přechod") -#define MSG_TOGGLE_MIX _UxGT("Přepnout mix") -#define MSG_CYCLE_MIX _UxGT("Střídat mix") -#define MSG_GRADIENT_MIX _UxGT("Přechod mix") -#define MSG_REVERSE_GRADIENT _UxGT("Opačný přechod") -#if LCD_WIDTH >= 20 - #define MSG_ACTIVE_VTOOL _UxGT("Aktivní V-nástroj") - #define MSG_START_VTOOL _UxGT("Spustit V-nástroj") - #define MSG_END_VTOOL _UxGT("Ukončit V-nástroj") - #define MSG_GRADIENT_ALIAS _UxGT("Alias V-nástroje") - #define MSG_RESET_VTOOLS _UxGT("Resetovat V-nástroj") - #define MSG_COMMIT_VTOOL _UxGT("Uložit V-nástroj mix") - #define MSG_VTOOLS_RESET _UxGT("V-nástroj resetovat") -#else - #define MSG_ACTIVE_VTOOL _UxGT("Aktivní V-nástr.") - #define MSG_START_VTOOL _UxGT("Spustit V-nástr.") - #define MSG_END_VTOOL _UxGT("Ukončit V-nástr.") - #define MSG_GRADIENT_ALIAS _UxGT("Alias V-nástr.") - #define MSG_RESET_VTOOLS _UxGT("Reset. V-nástr.") - #define MSG_COMMIT_VTOOL _UxGT("Uložit V-nás. mix") - #define MSG_VTOOLS_RESET _UxGT("V-nástr. reset.") -#endif -#define MSG_START_Z _UxGT("Počáteční Z") -#define MSG_END_Z _UxGT(" Koncové Z") -#define MSG_BRICKOUT _UxGT("Brickout") -#define MSG_INVADERS _UxGT("Invaders") -#define MSG_SNAKE _UxGT("Sn4k3") -#define MSG_MAZE _UxGT("Bludiště") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Buzení motorů"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Motor %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Uložit do EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMĚNA FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("TISK POZASTAVEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENÍ FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTÍ FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI OBNOVENÍ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačit víc"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Parkování selhalo"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrace selhala"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Moc studený"); -#define MSG_EXPECTED_PRINTER _UxGT("Nesprávná tiskárna") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Aktual. MMU firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potř. pozornost."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovování..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zavést filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zavést všechny"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zavést do trysky"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunout filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Vysun. filament 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Vysun. filament 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Vysun. filament 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Vysun. filament 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Vysun. filament 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vytáhnout filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádění fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vytahování fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysouvání fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všechny"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetovat MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetování MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Vytáhněte, klikněte"); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Stikněte tlačítko") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("pro obnovení tisku") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parkování...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekejte prosím") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("na zahájení") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("výměny filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("a stiskněte") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tlačítko...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klikněte pro") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("nahřátí trysky") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Čekejte prosím") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("na nahřátí tr.") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čekejte prosím") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("na vysunuti") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Čekejte prosím") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("na zavedení") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vyčkejte na") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("vytlačení") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Klikněte pro") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("ukončení") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_3 _UxGT("vytlačování") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Čekejte prosím") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("na pokračování") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("tisku") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Stikněte tlač.") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("pro obnovení") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parkování...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekejte...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte, klikněte") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klikněte pro") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("nahřátí") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nahřívání...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysouvání...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavádění...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlačování...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Klikněte pro") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("ukončení") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Pokračování...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Komponenta 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Komponenta 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Komponenta 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Komponenta 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Komponenta 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Komponenta 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Přechod"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Celý přechod"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Přepnout mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Střídat mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Přechod mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Opačný přechod"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástroj"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástroj"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástroj"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástroje"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Resetovat V-nástroj"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nástroj mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástroj resetovat"); + #else + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástr."); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástr."); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástr."); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástr."); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset. V-nástr."); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nás. mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástr. reset."); + #endif + PROGMEM Language_Str MSG_START_Z = _UxGT("Počáteční Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Koncové Z:"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Bludiště"); -#define MSG_TMC_DRIVERS _UxGT("TMC budiče") -#define MSG_TMC_CURRENT _UxGT("Proud budičů") -#define MSG_TMC_HYBRID_THRS _UxGT("Hybridní práh") -#define MSG_TMC_HOMING_THRS _UxGT("Domů bez senzorů") -#define MSG_TMC_STEPPING_MODE _UxGT("Režim kroků") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop povolen") -#define MSG_SERVICE_RESET _UxGT("Reset") -#define MSG_SERVICE_IN _UxGT(" za:") -#define MSG_BACKLASH _UxGT("Vůle") -#define MSG_BACKLASH_CORRECTION _UxGT("Korekce") -#define MSG_BACKLASH_SMOOTHING _UxGT("Vyhlazení") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Nesprávná tiskárna"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlačítko", "pro obnovení tisku")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekejte prosím", "na zahájení", "výměny filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stiskněte", "tlačítko...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí trysky")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Čekejte prosím", "na nahřátí tr.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na vysunuti", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na zavedení", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Vyčkejte na", "vytlačení")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klikněte pro", "ukončení", "vytlačování")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Čekejte prosím", "na pokračování", "tisku")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlač.", "pro obnovení")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čekejte...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte, klikněte")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nahřívání...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysouvání...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádění...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klikněte pro", "ukončení")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračování...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC budiče"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Proud budičů"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" za:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Vůle"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korekce"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhlazení"); +} diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index 6a8d48175d..98b47d7511 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -30,223 +30,212 @@ */ #define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" er klar") -#define MSG_MEDIA_INSERTED _UxGT("Kort isat") -#define MSG_MEDIA_REMOVED _UxGT("Kort fjernet") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Slå alle steppere fra") -#define MSG_AUTO_HOME _UxGT("Auto Home") // G28 -#define MSG_AUTO_HOME_X _UxGT("Home X") -#define MSG_AUTO_HOME_Y _UxGT("Home Y") -#define MSG_AUTO_HOME_Z _UxGT("Home Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Klik når du er klar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Næste punkt") -#define MSG_LEVEL_BED_DONE _UxGT("Bed level er færdig!") -#define MSG_SET_HOME_OFFSETS _UxGT("Sæt forsk. af home") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Forsk. er nu aktiv") -#define MSG_SET_ORIGIN _UxGT("Sæt origin") -#define MSG_PREHEAT_1 _UxGT("Forvarm " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Forvarm " PREHEAT_1_LABEL " ") -#define MSG_PREHEAT_1_ALL _UxGT("Forvarm " PREHEAT_1_LABEL " Alle") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Forvarm " PREHEAT_1_LABEL " Bed") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Forvarm " PREHEAT_1_LABEL " conf") -#define MSG_PREHEAT_2 _UxGT("Forvarm " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Forvarm " PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL _UxGT("Forvarm " PREHEAT_2_LABEL " Alle") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Forvarm " PREHEAT_2_LABEL " Bed") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Forvarm " PREHEAT_2_LABEL " conf") -#define MSG_COOLDOWN _UxGT("Afkøl") -#define MSG_SWITCH_PS_ON _UxGT("Slå strøm til") -#define MSG_SWITCH_PS_OFF _UxGT("Slå strøm fra") -#define MSG_EXTRUDE _UxGT("Extruder") -#define MSG_RETRACT _UxGT("Retract") -#define MSG_MOVE_AXIS _UxGT("Flyt akser") -#define MSG_BED_LEVELING _UxGT("Juster bed") -#define MSG_LEVEL_BED _UxGT("Juster bed") -#define MSG_MOVE_X _UxGT("Flyt X") -#define MSG_MOVE_Y _UxGT("Flyt Y") -#define MSG_MOVE_Z _UxGT("Flyt Z") -#define MSG_MOVE_E _UxGT("Extruder") -#define MSG_MOVE_Z_DIST _UxGT("Flyt %smm") -#define MSG_MOVE_01MM _UxGT("Flyt 0.1mm") -#define MSG_MOVE_1MM _UxGT("Flyt 1mm") -#define MSG_MOVE_10MM _UxGT("Flyt 10mm") -#define MSG_SPEED _UxGT("Hastighed") -#define MSG_BED_Z _UxGT("Plade Z") -#define MSG_NOZZLE _UxGT("Dyse") +namespace Language_da { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_BED _UxGT("Plade") -#define MSG_FAN_SPEED _UxGT("Blæser hastighed") -#define MSG_FLOW _UxGT("Flow") -#define MSG_CONTROL _UxGT("Kontrol") -#define MSG_MIN _UxGT(" \002 Min") -#define MSG_MAX _UxGT(" \002 Max") -#define MSG_FACTOR _UxGT(" \002 Fact") -#define MSG_AUTOTEMP _UxGT("Autotemp") -#define MSG_LCD_ON _UxGT("Til") -#define MSG_LCD_OFF _UxGT("Fra") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Vælg") -#define MSG_ACC _UxGT("Accel") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retract") -#define MSG_A_TRAVEL _UxGT("A-rejse") -#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Asteps/mm") - #define MSG_BSTEPS _UxGT("Bsteps/mm") - #define MSG_CSTEPS _UxGT("Csteps/mm") -#else - #define MSG_ASTEPS _UxGT("Xsteps/mm") - #define MSG_BSTEPS _UxGT("Ysteps/mm") - #define MSG_CSTEPS _UxGT("Zsteps/mm") -#endif -#define MSG_ESTEPS _UxGT("Esteps/mm") -#define MSG_E1STEPS _UxGT("E1steps/mm") -#define MSG_E2STEPS _UxGT("E2steps/mm") -#define MSG_E3STEPS _UxGT("E3steps/mm") -#define MSG_E4STEPS _UxGT("E4steps/mm") -#define MSG_E5STEPS _UxGT("E5steps/mm") -#define MSG_E6STEPS _UxGT("E6steps/mm") -#define MSG_TEMPERATURE _UxGT("Temperatur") -#define MSG_MOTION _UxGT("Bevægelse") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E i mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_CONTRAST _UxGT("LCD kontrast") -#define MSG_STORE_EEPROM _UxGT("Gem i EEPROM") -#define MSG_LOAD_EEPROM _UxGT("Hent fra EEPROM") -#define MSG_RESTORE_FAILSAFE _UxGT("Gendan failsafe") -#define MSG_REFRESH _UxGT("Genopfrisk") -#define MSG_WATCH _UxGT("Info skærm") -#define MSG_PREPARE _UxGT("Forbered") -#define MSG_TUNE _UxGT("Tune") -#define MSG_PAUSE_PRINT _UxGT("Pause printet") -#define MSG_RESUME_PRINT _UxGT("Forsæt printet") -#define MSG_STOP_PRINT _UxGT("Stop printet") -#define MSG_MEDIA_MENU _UxGT("Print fra SD") -#define MSG_NO_MEDIA _UxGT("Intet SD kort") -#define MSG_DWELL _UxGT("Dvale...") -#define MSG_USERWAIT _UxGT("Venter på bruger...") -#define MSG_PRINT_ABORTED _UxGT("Print annulleret") -#define MSG_NO_MOVE _UxGT("Ingen bevægelse.") -#define MSG_KILLED _UxGT("DRÆBT. ") -#define MSG_STOPPED _UxGT("STOPPET. ") -#define MSG_CONTROL_RETRACT _UxGT("Tilbagetræk mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Skift Re.mm") -#define MSG_CONTROL_RETRACTF _UxGT("Tilbagetræk V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Skift UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENTCHANGE _UxGT("Skift filament") -#define MSG_INIT_MEDIA _UxGT("Init. SD card") -#define MSG_CHANGE_MEDIA _UxGT("Skift SD kort") -#define MSG_ZPROBE_OUT _UxGT("Probe udenfor plade") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Selv-Test") -#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s først") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -#define MSG_HEATING_FAILED_LCD _UxGT("Opvarmning fejlet") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Fejl: reserve temp") -#define MSG_THERMAL_RUNAWAY _UxGT("Temp løber løbsk") -#define MSG_ERR_MAXTEMP _UxGT("Fejl: Maks temp") -#define MSG_ERR_MINTEMP _UxGT("Fejl: Min temp") -#define MSG_ERR_MAXTEMP_BED _UxGT("Fejl: Maks Plade temp") -#define MSG_ERR_MINTEMP_BED _UxGT("Fejl: Min Plade temp") -#define MSG_ERR_Z_HOMING _UxGT("Home XY først") -#define MSG_HALTED _UxGT("PRINTER STOPPET") -#define MSG_PLEASE_RESET _UxGT("Reset Venligst") -#define MSG_SHORT_DAY _UxGT("d") // Kun et bogstav -#define MSG_SHORT_HOUR _UxGT("h") // Kun et bogstav -#define MSG_SHORT_MINUTE _UxGT("m") // Kun et bogstav -#define MSG_HEATING _UxGT("Opvarmer...") -#define MSG_BED_HEATING _UxGT("Opvarmer plade...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrering") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrer X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrer Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrer Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrerings Center") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Danish"); -#define MSG_INFO_MENU _UxGT("Om Printer") -#define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") -#define MSG_INFO_STATS_MENU _UxGT("Printer Stats") -#define MSG_INFO_BOARD_MENU _UxGT("Kort Info") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extruders") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protocol") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" er klar"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kort isat"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kort fjernet"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Slå alle steppere fra"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); // G28 + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik når du er klar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Næste punkt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level er færdig!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Sæt forsk. af home"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Forsk. er nu aktiv"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sæt origin"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Forvarm ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end") + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Forvarm ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Forvarm ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end") + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" Alle"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkøl"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Slå strøm til"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Slå strøm fra"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Flyt akser"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Juster bed"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Juster bed"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Flyt X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Flyt Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Flyt Z"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Flyt %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flyt 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flyt 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flyt 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Hastighed"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Plade Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dyse"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Dyse ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Dyse ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Dyse ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Dyse ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Dyse ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Dyse ") LCD_STR_N5; -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Ant. Prints") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Færdige") - #define MSG_INFO_PRINT_TIME _UxGT("Total print tid") - #define MSG_INFO_PRINT_LONGEST _UxGT("Længste print") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total Extruderet") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Prints") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Færdige") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Længste") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruderet") -#endif + PROGMEM Language_Str MSG_BED = _UxGT("Plade"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Blæser hastighed"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Blæser hastighed 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Blæser hastighed 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Blæser hastighed 3"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); + PROGMEM Language_Str MSG_MIN = _UxGT(" \002 Min"); + PROGMEM Language_Str MSG_MAX = _UxGT(" \002 Max"); + PROGMEM Language_Str MSG_FACTOR = _UxGT(" \002 Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Til"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Fra"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Vælg"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Vælg ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Vælg ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Vælg ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Vælg ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Vælg ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Vælg ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retract"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-rejse"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Bevægelse"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gem i EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hent fra EEPROM"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Gendan failsafe"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info skærm"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Forbered"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause printet"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Forsæt printet"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop printet"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print fra SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Intet SD kort"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Dvale..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Venter på bruger..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print annulleret"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ingen bevægelse."); + PROGMEM Language_Str MSG_KILLED = _UxGT("DRÆBT. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPET. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Tilbagetræk mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Skift Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Tilbagetræk V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Skift filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Skift filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Skift filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Skift filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Skift filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Skift filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Skift filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Skift SD kort"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Probe udenfor plade"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Selv-Test"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s først"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Opvarmning fejlet"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Fejl: reserve temp"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Temp løber løbsk"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Fejl: Maks temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Fejl: Maks Plade temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Fejl: Min Plade temp"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY først"); + PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER STOPPET"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset Venligst"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // Kun et bogstav + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Kun et bogstav + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Kun et bogstav + PROGMEM Language_Str MSG_HEATING = _UxGT("Opvarmer..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Opvarmer plade..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrerings Center"); -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Strømfors.") + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Om Printer"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kort Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); -#define MSG_DRIVE_STRENGTH _UxGT("Driv Styrke") -#define MSG_DAC_PERCENT _UxGT("Driv %") -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Skriv") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Ant. Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total print tid"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste print"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruderet"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderet"); + #endif -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Forsæt print") + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Strømfors."); -#define MSG_EXPECTED_PRINTER _UxGT("Forkert printer") + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driv Styrke"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driv %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv"); -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Vent på start") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("af filament") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("skift") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vent på") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament udskyd.") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Indsæt filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("og tryk på knap") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("for at fortsætte...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Vent på") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament indtag") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Vent på at print") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("fortsætter") -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Vent venligst...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Udskyder...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Indsæt og klik") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Indtager...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsætter...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Forsæt print"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Forkert printer"); + + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vent på start", "af filament", "skift")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Vent på", "filament udskyd.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Indsæt filament", "og tryk på knap", "for at fortsætte...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Vent på", "filament indtag")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Vent på at print", "fortsætter")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vent venligst...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Udskyder...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Indsæt og klik")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Indtager...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsætter...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 76acb55e80..9fa894bb96 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -29,545 +29,652 @@ * */ -#define CHARSIZE 2 +namespace Language_de { + using namespace Language_en; // Inherit undefined strings from English -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("ÄäÖöÜüß²³") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Deutsche"); -#define WELCOME_MSG MACHINE_NAME _UxGT(" bereit") -#define MSG_YES _UxGT("JA") -#define MSG_NO _UxGT("NEIN") -#define MSG_BACK _UxGT("Zurück") -#define MSG_MEDIA_ABORTING _UxGT("Abbruch...") -#define MSG_MEDIA_INSERTED _UxGT("Medium erkannt") -#define MSG_MEDIA_REMOVED _UxGT("Medium entfernt") -#define MSG_MEDIA_RELEASED _UxGT("Medium freigegeben") -#define MSG_MEDIA_WAITING _UxGT("Warten auf Medium") -#define MSG_MEDIA_READ_ERROR _UxGT("Medium Lesefehler") -#define MSG_MEDIA_USB_REMOVED _UxGT("USB Gerät entfernt") -#define MSG_MEDIA_USB_FAILED _UxGT("USB Start fehlge.") -#define MSG_LCD_ENDSTOPS _UxGT("Endstopp") // Max length 8 characters -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Software-Endstopp") -#define MSG_MAIN _UxGT("Hauptmenü") -#define MSG_ADVANCED_SETTINGS _UxGT("Erw. Einstellungen") -#define MSG_CONFIGURATION _UxGT("Konfiguration") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Motoren deaktivieren") // M84 :: Max length 19 characters -#define MSG_DEBUG_MENU _UxGT("Debug-Menü") -#define MSG_PROGRESS_BAR_TEST _UxGT("Statusbalken-Test") -#define MSG_AUTO_HOME _UxGT("Home XYZ") // G28 -#define MSG_AUTO_HOME_X _UxGT("Home X") -#define MSG_AUTO_HOME_Y _UxGT("Home Y") -#define MSG_AUTO_HOME_Z _UxGT("Home Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Z-Achsen ausgleichen") -#define MSG_LEVEL_BED_HOMING _UxGT("Home XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Klick zum Starten") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Nächste Koordinate") -#define MSG_LEVEL_BED_DONE _UxGT("Nivellieren fertig!") -#define MSG_Z_FADE_HEIGHT _UxGT("Ausblendhöhe") -#define MSG_SET_HOME_OFFSETS _UxGT("Setze Homeversatz") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Homeversatz aktiv") -#define MSG_SET_ORIGIN _UxGT("Setze Nullpunkte") //"G92 X0 Y0 Z0" commented out in ultralcd.cpp -#define MSG_PREHEAT_1 _UxGT(PREHEAT_1_LABEL " Vorwärmen") -#define MSG_PREHEAT_1_N _UxGT(PREHEAT_1_LABEL " Vorwärmen ") -#define MSG_PREHEAT_1_ALL _UxGT(PREHEAT_1_LABEL " Alles Vorwärmen") -#define MSG_PREHEAT_1_END _UxGT(PREHEAT_1_LABEL " Extr. Vorwärmen") -#define MSG_PREHEAT_1_BEDONLY _UxGT(PREHEAT_1_LABEL " Bett Vorwärmen") -#define MSG_PREHEAT_1_SETTINGS _UxGT(PREHEAT_1_LABEL " Einstellungen") -#define MSG_PREHEAT_2 _UxGT(PREHEAT_2_LABEL " Vorwärmen") -#define MSG_PREHEAT_2_N _UxGT(PREHEAT_2_LABEL " Vorwärmen ") -#define MSG_PREHEAT_2_ALL _UxGT(PREHEAT_2_LABEL " Alles Vorwärmen") -#define MSG_PREHEAT_2_END _UxGT(PREHEAT_2_LABEL " Extr. Vorwärmen") -#define MSG_PREHEAT_2_BEDONLY _UxGT(PREHEAT_2_LABEL " Bett Vorwärmen") -#define MSG_PREHEAT_2_SETTINGS _UxGT(PREHEAT_2_LABEL " Einstellungen") -#define MSG_PREHEAT_CUSTOM _UxGT("benutzerdef. Heizen") -#define MSG_COOLDOWN _UxGT("Abkühlen") -#define MSG_LASER_MENU _UxGT("Laser") -#define MSG_LASER_OFF _UxGT("Laser aus") -#define MSG_LASER_ON _UxGT("Laser an") -#define MSG_LASER_POWER _UxGT("Laserleistung") -#define MSG_SPINDLE_MENU _UxGT("Spindel-Steuerung") -#define MSG_SPINDLE_OFF _UxGT("Spindel aus") -#define MSG_SPINDLE_ON _UxGT("Spindel an") -#define MSG_SPINDLE_POWER _UxGT("Spindelleistung") -#define MSG_SPINDLE_REVERSE _UxGT("Spindelrichtung") -#define MSG_SWITCH_PS_ON _UxGT("Netzteil ein") -#define MSG_SWITCH_PS_OFF _UxGT("Netzteil aus") -#define MSG_EXTRUDE _UxGT("Extrudieren") -#define MSG_RETRACT _UxGT("Einzug") -#define MSG_MOVE_AXIS _UxGT("Achsen bewegen") -#define MSG_BED_LEVELING _UxGT("Bett-Nivellierung") -#define MSG_LEVEL_BED _UxGT("Bett nivellieren") -#define MSG_LEVEL_CORNERS _UxGT("Ecken nivellieren") -#define MSG_NEXT_CORNER _UxGT("Nächste Ecke") -#define MSG_MESH_EDITOR _UxGT("Netz Editor") -#define MSG_EDIT_MESH _UxGT("Netz bearbeiten") -#define MSG_EDITING_STOPPED _UxGT("Netzbearb. angeh.") -#define MSG_PROBING_MESH _UxGT("Messpunkt") -#define MSG_MESH_X _UxGT("Index X") -#define MSG_MESH_Y _UxGT("Index Y") -#define MSG_MESH_EDIT_Z _UxGT("Z-Wert") -#define MSG_USER_MENU _UxGT("Benutzer-Menü") -#define MSG_LCD_TILTING_MESH _UxGT("Berührungspunkt") -#define MSG_M48_TEST _UxGT("M48 Sondentest") -#define MSG_M48_POINT _UxGT("M48 Punkt") -#define MSG_M48_DEVIATION _UxGT("Abweichung") -#define MSG_IDEX_MENU _UxGT("IDEX-Modus") -#define MSG_OFFSETS_MENU _UxGT("Werkzeugversätze") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Autom. parken") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplizieren") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Spiegelkopie") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("vollstä. Kontrolle") -#define MSG_X_OFFSET _UxGT("2. Düse X") -#define MSG_Y_OFFSET _UxGT("2. Düse Y") -#define MSG_Z_OFFSET _UxGT("2. Düse Z") -#define MSG_UBL_DOING_G29 _UxGT("G29 ausführen") -#define MSG_UBL_TOOLS _UxGT("UBL-Werkzeuge") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Netz manuell erst.") -#define MSG_UBL_BC_INSERT _UxGT("Unterlegen & messen") -#define MSG_UBL_BC_INSERT2 _UxGT("Messen") -#define MSG_UBL_BC_REMOVE _UxGT("Entfernen & messen") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Nächster Punkt...") -#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktivieren") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL deaktivieren") -#define MSG_UBL_SET_TEMP_BED _UxGT("Betttemperatur") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Hotend-Temp.") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Netz bearbeiten") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Eigenes Netz bearb.") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Feineinstellung...") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Bearbeitung beendet") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Eigenes Netz erst.") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Netz erstellen") -#define MSG_UBL_BUILD_MESH_M1 _UxGT(PREHEAT_1_LABEL " Netz erstellen") -#define MSG_UBL_BUILD_MESH_M2 _UxGT(PREHEAT_2_LABEL " Netz erstellen") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Netz erstellen kalt") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Netzhöhe einst.") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Höhe") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Netz validieren") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT(PREHEAT_1_LABEL " Netz validieren") -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT(PREHEAT_2_LABEL " Netz validieren") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Eig. Netz validieren") -#define MSG_G26_HEATING_NOZZLE _UxGT("G26 Heating Nozzle") -#define MSG_G26_HEATING_BED _UxGT("G26 heizt Bett") -#define MSG_G26_FIXED_LENGTH _UxGT("Feste Länge Prime") -#define MSG_G26_PRIME_DONE _UxGT("Priming fertig") -#define MSG_G26_CANCELED _UxGT("G26 abgebrochen") -#define MSG_G26_LEAVING _UxGT("G26 verlassen") -#define MSG_UBL_CONTINUE_MESH _UxGT("Netzerst. forts.") -#define MSG_UBL_MESH_LEVELING _UxGT("Netz-Nivellierung") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Punkt-Nivell.") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Gitternetz-Nivell.") -#define MSG_UBL_MESH_LEVEL _UxGT("Netz nivellieren") -#define MSG_UBL_SIDE_POINTS _UxGT("Eckpunkte") -#define MSG_UBL_MAP_TYPE _UxGT("Kartentyp") -#define MSG_UBL_OUTPUT_MAP _UxGT("Karte ausgeben") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Ausgabe für Host") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Ausgabe für CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Externe Sicherung") -#define MSG_UBL_INFO_UBL _UxGT("UBL-Info ausgeben") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Menge an Füllung") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Manuelles Füllen") -#define MSG_UBL_SMART_FILLIN _UxGT("Cleveres Füllen") -#define MSG_UBL_FILLIN_MESH _UxGT("Netz Füllen") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Alles annullieren") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Nächstlieg. ann.") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Feineinst. Alles") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Feineinst. Nächstl.") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Netz-Speicherplatz") -#define MSG_UBL_STORAGE_SLOT _UxGT("Speicherort") -#define MSG_UBL_LOAD_MESH _UxGT("Bettnetz laden") -#define MSG_UBL_SAVE_MESH _UxGT("Bettnetz speichern") -#define MSG_MESH_LOADED _UxGT("Netz %i geladen") -#define MSG_MESH_SAVED _UxGT("Netz %i gespeichert") -#define MSG_UBL_NO_STORAGE _UxGT("Kein Speicher") -#define MSG_UBL_SAVE_ERROR _UxGT("Err:UBL speichern") -#define MSG_UBL_RESTORE_ERROR _UxGT("Err:UBL wiederherst.") -#define MSG_UBL_Z_OFFSET _UxGT("Z-Versatz: ") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Versatz angehalten") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Schrittweises UBL") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" bereit"); -#define MSG_LED_CONTROL _UxGT("Licht-Steuerung") -#define MSG_LEDS _UxGT("Licht") -#define MSG_LED_PRESETS _UxGT("Licht-Einstellung") -#define MSG_SET_LEDS_RED _UxGT("Rot") -#define MSG_SET_LEDS_ORANGE _UxGT("Orange") -#define MSG_SET_LEDS_YELLOW _UxGT("Gelb") -#define MSG_SET_LEDS_GREEN _UxGT("Grün") -#define MSG_SET_LEDS_BLUE _UxGT("Blau") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Violett") -#define MSG_SET_LEDS_WHITE _UxGT("Weiß") -#define MSG_SET_LEDS_DEFAULT _UxGT("Standard") -#define MSG_CUSTOM_LEDS _UxGT("Benutzerdefiniert") -#define MSG_INTENSITY_R _UxGT("Intensität Rot") -#define MSG_INTENSITY_G _UxGT("Intensität Grün") -#define MSG_INTENSITY_B _UxGT("Intensität Blau") -#define MSG_INTENSITY_W _UxGT("Intensität Weiß") -#define MSG_LED_BRIGHTNESS _UxGT("Helligkeit") + PROGMEM Language_Str MSG_YES = _UxGT("JA"); + PROGMEM Language_Str MSG_NO = _UxGT("NEIN"); + PROGMEM Language_Str MSG_BACK = _UxGT("Zurück"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abbruch..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Medium erkannt"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Medium entfernt"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Medium freigegeben"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Warten auf Medium"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge."); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Hauptmenü"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug-Menü"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klick zum Starten"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nächste Koordinate"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivellieren fertig!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Ausblendhöhe"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in ultralcd.cpp + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_H0 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" Alles Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" Bett Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" Einstellungen"); + PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_2_H0 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" Alles Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" Bett Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" Einstellungen"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("benutzerdef. Heizen"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Abkühlen"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser aus"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser an"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laserleistung"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindel-Steuerung"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindel aus"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindel an"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindelleistung"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindelrichtung"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Netzteil ein"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Netzteil aus"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudieren"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Einzug"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Achsen bewegen"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bett-Nivellierung"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Bett nivellieren"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ecken nivellieren"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nächste Ecke"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Netz Editor"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Netz bearbeiten"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Netzbearb. angeh."); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Messpunkt"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Abweichung"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX-Modus"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Werkzeugversätze"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Autom. parken"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplizieren"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Spiegelkopie"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("vollstä. Kontrolle"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2. Düse X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2. Düse Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2. Düse Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 ausführen"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL-Werkzeuge"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Netz manuell erst."); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Unterlegen & messen"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Messen"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Entfernen & messen"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Nächster Punkt..."); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktivieren"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktivieren"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Betttemperatur"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Betttemperatur"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend-Temp."); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend-Temp."); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Netz bearbeiten"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Eigenes Netz bearb."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Feineinstellung..."); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Bearbeitung beendet"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Eigenes Netz erst."); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Netz erstellen"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = PREHEAT_1_LABEL _UxGT(" Netz erstellen"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = PREHEAT_2_LABEL _UxGT(" Netz erstellen"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Netz erstellen kalt"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Netzhöhe einst."); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höhe"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Netz validieren"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = PREHEAT_1_LABEL _UxGT(" Netz validieren"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = PREHEAT_2_LABEL _UxGT(" Netz validieren"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett"); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Feste Länge Prime"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming fertig"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 abgebrochen"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("G26 verlassen"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Netzerst. forts."); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Netz-Nivellierung"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkt-Nivell."); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Gitternetz-Nivell."); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Netz nivellieren"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Eckpunkte"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Kartentyp"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Karte ausgeben"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Ausgabe für Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Ausgabe für CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externe Sicherung"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL-Info ausgeben"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Menge an Füllung"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuelles Füllen"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Cleveres Füllen"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Netz Füllen"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Alles annullieren"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Nächstlieg. ann."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Feineinst. Nächstl."); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Netz-Speicherplatz"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Speicherort"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Bettnetz laden"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Bettnetz speichern"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Netz %i geladen"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Netz %i gespeichert"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Kein Speicher"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err:UBL speichern"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err:UBL wiederherst."); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Versatz: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Versatz angehalten"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Schrittweises UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Netz erstellen kalt"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Cleveres Füllen"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Netz validieren"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Netz validieren"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Bettnetz speichern"); -#define MSG_MOVING _UxGT("In Bewegung...") -#define MSG_FREE_XY _UxGT("Abstand XY") -#define MSG_MOVE_X _UxGT("Bewege X") -#define MSG_MOVE_Y _UxGT("Bewege Y") -#define MSG_MOVE_Z _UxGT("Bewege Z") -#define MSG_MOVE_E _UxGT("Bewege Extruder") -#define MSG_HOTEND_TOO_COLD _UxGT("Hotend zu kalt") -#define MSG_MOVE_Z_DIST _UxGT(" %s mm") -#define MSG_MOVE_01MM _UxGT(" 0,1 mm") -#define MSG_MOVE_1MM _UxGT(" 1,0 mm") -#define MSG_MOVE_10MM _UxGT("10,0 mm") -#define MSG_SPEED _UxGT("Geschw.") -#define MSG_BED_Z _UxGT("Bett Z") -#define MSG_NOZZLE _UxGT("Düse") -#define MSG_BED _UxGT("Bett") -#define MSG_CHAMBER _UxGT("Gehäuse") -#define MSG_FAN_SPEED _UxGT("Lüfter") -#define MSG_EXTRA_FAN_SPEED _UxGT("Geschw. Extralüfter") -#define MSG_FLOW _UxGT("Flussrate") -#define MSG_CONTROL _UxGT("Einstellungen") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Faktor") -#define MSG_AUTOTEMP _UxGT("Auto Temperatur") -#define MSG_LCD_ON _UxGT("an") -#define MSG_LCD_OFF _UxGT("aus") -#define MSG_PID_P _UxGT("PID P") -#define MSG_PID_I _UxGT("PID I") -#define MSG_PID_D _UxGT("PID D") -#define MSG_PID_C _UxGT("PID C") -#define MSG_SELECT _UxGT("Auswählen") -#define MSG_ACC _UxGT("Beschleunigung") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("V A Jerk") - #define MSG_VB_JERK _UxGT("V B Jerk") - #define MSG_VC_JERK _UxGT("V C Jerk") -#else - #define MSG_VA_JERK _UxGT("V X Jerk") - #define MSG_VB_JERK _UxGT("V Y Jerk") - #define MSG_VC_JERK _UxGT("V Z Jerk") -#endif -#define MSG_VE_JERK _UxGT("V E Jerk") -#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") -#define MSG_VELOCITY _UxGT("Geschwindigkeit") -#define MSG_VMAX _UxGT("V max ") // space intentional -#define MSG_VMIN _UxGT("V min ") -#define MSG_VTRAV_MIN _UxGT("V min Leerfahrt") -#define MSG_ACCELERATION _UxGT("Beschleunigung") -#define MSG_AMAX _UxGT("A max ") // space intentional -#define MSG_A_RETRACT _UxGT("A Einzug") -#define MSG_A_TRAVEL _UxGT("A Leerfahrt") -#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A Steps/mm") - #define MSG_BSTEPS _UxGT("B Steps/mm") - #define MSG_CSTEPS _UxGT("C Steps/mm") -#else - #define MSG_ASTEPS _UxGT("X Steps/mm") - #define MSG_BSTEPS _UxGT("Y Steps/mm") - #define MSG_CSTEPS _UxGT("Z Steps/mm") -#endif -#define MSG_ESTEPS _UxGT("E Steps/mm") -#define MSG_E1STEPS _UxGT("E1 Steps/mm") -#define MSG_E2STEPS _UxGT("E2 Steps/mm") -#define MSG_E3STEPS _UxGT("E3 Steps/mm") -#define MSG_E4STEPS _UxGT("E4 Steps/mm") -#define MSG_E5STEPS _UxGT("E5 Steps/mm") -#define MSG_E6STEPS _UxGT("E6 Steps/mm") -#define MSG_TEMPERATURE _UxGT("Temperatur") -#define MSG_MOTION _UxGT("Bewegung") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") -#define MSG_FILAMENT_DIAM _UxGT("Filamentdurchmesser") -#define MSG_FILAMENT_UNLOAD _UxGT("Entladen mm") -#define MSG_FILAMENT_LOAD _UxGT("Laden mm") -#define MSG_ADVANCE_K _UxGT("Vorschubfaktor") -#define MSG_CONTRAST _UxGT("LCD-Kontrast") -#define MSG_STORE_EEPROM _UxGT("Konfig. speichern") -#define MSG_LOAD_EEPROM _UxGT("Konfig. laden") -#define MSG_RESTORE_FAILSAFE _UxGT("Standardwerte laden") -#define MSG_INIT_EEPROM _UxGT("Werkseinstellungen") -#define MSG_MEDIA_UPDATE _UxGT("FW Update vom Medium") -#define MSG_RESET_PRINTER _UxGT("Drucker neustarten") -#define MSG_REFRESH _UxGT("Aktualisieren") -#define MSG_WATCH _UxGT("Info") -#define MSG_PREPARE _UxGT("Vorbereitung") -#define MSG_TUNE _UxGT("Justierung") -#define MSG_START_PRINT _UxGT("Starte Druck") -#define MSG_BUTTON_NEXT _UxGT("Weiter") -#define MSG_BUTTON_INIT _UxGT("Bestätigen") -#define MSG_BUTTON_STOP _UxGT("Stop") -#define MSG_BUTTON_PRINT _UxGT("Drucken") -#define MSG_BUTTON_RESET _UxGT("Reseten") -#define MSG_BUTTON_CANCEL _UxGT("Abbrechen") -#define MSG_BUTTON_DONE _UxGT("Fertig") -#define MSG_PAUSE_PRINT _UxGT("SD-Druck pausieren") -#define MSG_RESUME_PRINT _UxGT("SD-Druck fortsetzen") -#define MSG_STOP_PRINT _UxGT("SD-Druck abbrechen") -#define MSG_OUTAGE_RECOVERY _UxGT("Wiederh. n. Stroma.") -#define MSG_MEDIA_MENU _UxGT("Druck vom Medium") -#define MSG_NO_MEDIA _UxGT("Kein Medium") -#define MSG_DWELL _UxGT("Warten...") -#define MSG_USERWAIT _UxGT("Klick zum Fortsetzen") -#define MSG_PRINT_PAUSED _UxGT("Druck pausiert...") -#define MSG_PRINTING _UxGT("Druckt...") -#define MSG_PRINT_ABORTED _UxGT("Druck abgebrochen") -#define MSG_NO_MOVE _UxGT("Motoren angeschaltet") -#define MSG_KILLED _UxGT("ABGEBROCHEN") -#define MSG_STOPPED _UxGT("ANGEHALTEN") -#define MSG_CONTROL_RETRACT _UxGT("Einzug mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Wechs. Einzug mm") -#define MSG_CONTROL_RETRACTF _UxGT("V Einzug") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Z-Sprung mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Wechs. UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("Autom. Einzug") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Einzugslänge") -#define MSG_FILAMENT_PURGE_LENGTH _UxGT("Entladelänge") -#define MSG_TOOL_CHANGE _UxGT("Werkzeugwechsel") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Z anheben") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Prime-Geschwin.") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Einzug-Geschwin.") -#define MSG_NOZZLE_STANDBY _UxGT("Düsen-Standby") -#define MSG_FILAMENTCHANGE _UxGT("Filament wechseln") -#define MSG_FILAMENTLOAD _UxGT("Filament laden") -#define MSG_FILAMENTUNLOAD _UxGT("Filament entladen") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Alles entladen") -#define MSG_INIT_MEDIA _UxGT("Medium initial.") // Manually initialize the SD-card via user interface -#define MSG_CHANGE_MEDIA _UxGT("Medium getauscht") // SD-card changed by user. For machines with no autocarddetect. Both send "M21" -#define MSG_RELEASE_MEDIA _UxGT("Medium freigeben") // if Marlin gets confused - M22 -#define MSG_ZPROBE_OUT _UxGT("Z-Sonde außerhalb") -#define MSG_SKEW_FACTOR _UxGT("Korrekturfaktor") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Selbsttest") -#define MSG_BLTOUCH_RESET _UxGT("BLTouch zurücks.") -#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch ausfahren") -#define MSG_BLTOUCH_SW_MODE _UxGT("BLTouch SW-Modus") -#define MSG_BLTOUCH_5V_MODE _UxGT("BLTouch 5V-Modus") -#define MSG_BLTOUCH_OD_MODE _UxGT("BLTouch OD-Modus") -#define MSG_BLTOUCH_MODE_STORE _UxGT("BLTouch Mode Store") -#define MSG_BLTOUCH_MODE_STORE_5V _UxGT("BLTouch auf 5V") -#define MSG_BLTOUCH_MODE_STORE_OD _UxGT("BLTouch auf OD") -#define MSG_BLTOUCH_STOW _UxGT("BLTouch einfahren") -#define MSG_BLTOUCH_MODE_ECHO _UxGT("BLTouch Modus: ") -#define MSG_BLTOUCH_MODE_CHANGE _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?") -#define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#define MSG_TOUCHMI_INIT _UxGT("TouchMI initial.") -#define MSG_TOUCHMI_ZTEST _UxGT("Test Z-Versatz") -#define MSG_TOUCHMI_SAVE _UxGT("Speichern") -#define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("TouchMI ausfahren") -#define MSG_MANUAL_DEPLOY _UxGT("Z-Sonde ausfahren") -#define MSG_MANUAL_STOW _UxGT("Z-Sonde einfahren") -#define MSG_HOME_FIRST _UxGT("Vorher %s%s%s homen") -#define MSG_ZPROBE_ZOFFSET _UxGT("Sondenversatz Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Total") -#define MSG_ENDSTOP_ABORT _UxGT("Abbr. mit Endstopp") -#define MSG_HEATING_FAILED_LCD _UxGT("HEIZEN ERFOLGLOS") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Bett heizen fehlge.") -#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Geh. heizen fehlge.") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEMP-ABWEI.") -#define MSG_THERMAL_RUNAWAY LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("BETT") MSG_THERMAL_RUNAWAY -#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("GEH.") MSG_THERMAL_RUNAWAY -#define MSG_ERR_MAXTEMP LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN") -#define MSG_ERR_MINTEMP LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN") -#define MSG_ERR_MAXTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN") -#define MSG_ERR_MINTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err:Gehäuse max Temp") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err:Gehäuse min Temp") -#define MSG_ERR_Z_HOMING _UxGT("Vorher XY vorher") -#define MSG_HALTED _UxGT("DRUCKER GESTOPPT") -#define MSG_PLEASE_RESET _UxGT("Bitte neustarten") -#define MSG_SHORT_DAY _UxGT("t") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("heizt...") -#define MSG_COOLING _UxGT("kühlt...") -#define MSG_BED_HEATING _UxGT("Bett heizt...") -#define MSG_BED_COOLING _UxGT("Bett kühlt...") -#define MSG_CHAMBER_HEATING _UxGT("Gehäuse heizt...") -#define MSG_CHAMBER_COOLING _UxGT("Gehäuse kühlt...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrieren") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriere X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriere Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibriere Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibriere Mitte") -#define MSG_DELTA_SETTINGS _UxGT("Delta Einst. anzeig.") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autom. Kalibrierung") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Höhe setzen") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Sondenversatz Z") -#define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") -#define MSG_DELTA_HEIGHT _UxGT("Höhe") -#define MSG_DELTA_RADIUS _UxGT("Radius") -#define MSG_INFO_MENU _UxGT("Über den Drucker") -#define MSG_INFO_PRINTER_MENU _UxGT("Drucker-Info") -#define MSG_3POINT_LEVELING _UxGT("3-Punkt-Nivellierung") -#define MSG_LINEAR_LEVELING _UxGT("Lineare Nivellierung") -#define MSG_BILINEAR_LEVELING _UxGT("Bilineare Nivell.") -#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -#define MSG_MESH_LEVELING _UxGT("Netz-Nivellierung") -#define MSG_INFO_STATS_MENU _UxGT("Drucker-Statistik") -#define MSG_INFO_BOARD_MENU _UxGT("Board-Info") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistoren") -#define MSG_INFO_EXTRUDERS _UxGT("Extruder") -#define MSG_INFO_BAUDRATE _UxGT("Baudrate") -#define MSG_INFO_PROTOCOL _UxGT("Protokoll") -#define MSG_CASE_LIGHT _UxGT("Beleuchtung") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Helligkeit") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Licht-Steuerung"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Licht"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Licht-Einstellung"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rot"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Gelb"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Grün"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blau"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violett"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Weiß"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Standard"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Benutzerdefiniert"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensität Rot"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensität Grün"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensität Blau"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensität Weiß"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Helligkeit"); -#define MSG_EXPECTED_PRINTER _UxGT("Falscher Drucker") + PROGMEM Language_Str MSG_MOVING = _UxGT("In Bewegung..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Abstand XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Bewege X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Bewege Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Bewege Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Bewege Extruder"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Bewege Extruder ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Bewege Extruder ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Bewege Extruder ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Bewege Extruder ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Bewege Extruder ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Bewege Extruder ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT(" %s mm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10,0 mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Geschw."); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bett Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Düse"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Düse ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Düse ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Düse ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Düse ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Düse ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Düse ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Bett"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Gehäuse"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Lüfter"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Lüfter 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Lüfter 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Lüfter 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Geschw. Extralüfter"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Geschw. Extralüfter 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Geschw. Extralüfter 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Geschw. Extralüfter 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flussrate"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flussrate ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flussrate ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flussrate ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flussrate ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flussrate ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flussrate ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Einstellungen"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Faktor"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto Temperatur"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("an"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("aus"); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Auswählen"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Auswählen ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Auswählen ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Auswählen ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Auswählen ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Auswählen ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Auswählen ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Beschleunigung"); + PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V ") LCD_STR_A _UxGT(" Jerk"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V ") LCD_STR_B _UxGT(" Jerk"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V ") LCD_STR_C _UxGT(" Jerk"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("V E Jerk"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Geschwindigkeit"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("V max ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("V max ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("V max ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("V max ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("V max ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("V max ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("V max ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("V max ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("V max ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("V max ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("V min "); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("V min Leerfahrt"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Beschleunigung"); + PROGMEM Language_Str MSG_AMAX = _UxGT("A max "); // space intentional + PROGMEM Language_Str MSG_AMAX_A = _UxGT("A max ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("A max ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("A max ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("A max ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("A max ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("A max ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("A max ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("A max ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("A max ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("A max ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A Einzug"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A Leerfahrt"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E_STEPS = LCD_STR_E _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Bewegung"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Filamentdurchmesser ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Filamentdurchmesser ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Filamentdurchmesser ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Filamentdurchmesser ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Filamentdurchmesser ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Filamentdurchmesser ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Entladen mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Laden mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Vorschubfaktor"); + PROGMEM Language_Str MSG_ADVANCE_E0 = _UxGT("Vorschubfaktor ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_E1 = _UxGT("Vorschubfaktor ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_E2 = _UxGT("Vorschubfaktor ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_E3 = _UxGT("Vorschubfaktor ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_E4 = _UxGT("Vorschubfaktor ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_E5 = _UxGT("Vorschubfaktor ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD-Kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Konfig. speichern"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Konfig. laden"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Standardwerte laden"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Werkseinstellungen"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Drucker neustarten"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Vorbereitung"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Justierung"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Starte Druck"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Weiter"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Bestätigen"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drucken"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseten"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Abbrechen"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fertig"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("SD-Druck fortsetzen"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("SD-Druck abbrechen"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Wiederh. n. Stroma."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Druck vom Medium"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Kein Medium"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Warten..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Klick zum Fortsetzen"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druck pausiert..."); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Druckt..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druck abgebrochen"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Motoren angeschaltet"); + PROGMEM Language_Str MSG_KILLED = _UxGT("ABGEBROCHEN"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ANGEHALTEN"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Einzug mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Wechs. Einzug mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("V Einzug"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z-Sprung mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Autom. Einzug"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Entladelänge"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Werkzeugwechsel"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z anheben"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Prime-Geschwin."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Einzug-Geschwin."); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düsen-Standby"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filament wechseln"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Filament wechseln ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Filament wechseln ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Filament wechseln ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Filament wechseln ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Filament wechseln ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Filament wechseln ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filament laden"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Filament laden ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Filament laden ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Filament laden ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Filament laden ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Filament laden ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Filament laden ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Filament entladen ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Filament entladen ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Filament entladen ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Filament entladen ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Filament entladen ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Filament entladen ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Alles entladen"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Medium getauscht"); // SD-card changed by user. For machines with no autocarddetect. Both send "M21" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Medium freigeben"); // if Marlin gets confused - M22 + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Sonde außerhalb"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Korrekturfaktor"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Selbsttest"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch zurücks."); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch ausfahren"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("BLTouch SW-Modus"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch 5V-Modus"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch OD-Modus"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("BLTouch Mode Store"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch auf 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch auf OD"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch einfahren"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("BLTouch Modus: "); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("TouchMI initial."); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z-Versatz"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Speichern"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI ausfahren"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Sonde ausfahren"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Sonde einfahren"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Vorher %s%s%s homen"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Sondenversatz Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abbr. mit Endstopp"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bett heizen fehlge."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Geh. heizen fehlge."); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEMP-ABWEI."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BETT") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("GEH.") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = " " LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN"); + PROGMEM Language_Str MSG_ERR_MINTEMP = " " LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:Gehäuse max Temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:Gehäuse min Temp"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Vorher XY homen"); + PROGMEM Language_Str MSG_HALTED = _UxGT("DRUCKER GESTOPPT"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Bitte neustarten"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("t"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("heizt..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("kühlt..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bett heizt..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bett kühlt..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Gehäuse heizt..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Gehäuse kühlt..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrieren"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriere X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriere Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriere Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriere Mitte"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Einst. anzeig."); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autom. Kalibrierung"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Höhe setzen"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Sondenversatz Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Höhe"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Über den Drucker"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Drucker-Info"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Punkt-Nivellierung"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineare Nivellierung"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineare Nivell."); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Netz-Nivellierung"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Drucker-Statistik"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board-Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistoren"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruder"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudrate"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Beleuchtung"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Helligkeit"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Gesamte Drucke") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplette Drucke") - #define MSG_INFO_PRINT_TIME _UxGT("Gesamte Druckzeit") - #define MSG_INFO_PRINT_LONGEST _UxGT("Längste Druckzeit") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Gesamt Extrudiert") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Drucke") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplette") - #define MSG_INFO_PRINT_TIME _UxGT("Gesamte") - #define MSG_INFO_PRINT_LONGEST _UxGT("Längste") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.") -#endif + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Falscher Drucker"); -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Netzteil") -#define MSG_DRIVE_STRENGTH _UxGT("Motorleistung") -#define MSG_DAC_PERCENT _UxGT("Treiber %") -#define MSG_ERROR_TMC _UxGT("TMC Verbindungsfehler") -#define MSG_DAC_EEPROM_WRITE _UxGT("Werte speichern") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("DRUCK PAUSIERT") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("FILAMENT LADEN") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("FILAMENT ENTLADEN") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("FORTS. OPTIONEN:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Mehr entladen") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Druck weiter") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Düse: ") -#define MSG_RUNOUT_SENSOR _UxGT("Runout-Sensor") -#define MSG_RUNOUT_DISTANCE_MM _UxGT("Runout-Weg mm") -#define MSG_ERR_HOMING_FAILED _UxGT("Homing gescheitert") -#define MSG_ERR_PROBING_FAILED _UxGT("Probing gescheitert") -#define MSG_M600_TOO_COLD _UxGT("M600: zu kalt") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Gesamte Drucke"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette Drucke"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte Druckzeit"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste Druckzeit"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Gesamt Extrudiert"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Drucke"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); + #endif -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("FILAMENT WECHSEL") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("FILAMENT WÄHLEN") -#define MSG_MMU2_MENU _UxGT("MMU") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Update MMU Firmware!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU handeln erfor.") -#define MSG_MMU2_RESUME _UxGT("Druck fortsetzen") -#define MSG_MMU2_RESUMING _UxGT("Fortfahren...") -#define MSG_MMU2_LOAD_FILAMENT MSG_FILAMENTLOAD -#define MSG_MMU2_LOAD_ALL _UxGT("Lade alle") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Düse laden") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Filament auswerfen") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Filament 1 auswerfen") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Filament 2 auswerfen") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Filament 3 auswerfen") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Filament 4 auswerfen") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Filament 5 auswerfen") -#define MSG_MMU2_UNLOAD_FILAMENT MSG_FILAMENTUNLOAD -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Lade Fila. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Fila. auswerfen...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Fila. entladen...") -#define MSG_MMU2_ALL _UxGT("Alle") -#define MSG_MMU2_FILAMENT0 _UxGT("Filament 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filament 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filament 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filament 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filament 5") -#define MSG_MMU2_RESET _UxGT("setze MMU zurück") -#define MSG_MMU2_RESETTING _UxGT("MMU zurücksetzen...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Entfernen, klicken") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Netzteil"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorleistung"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Treiber %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC Verbindungsfehler"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Werte speichern"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT WECHSEL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("DRUCK PAUSIERT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMENT LADEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMENT ENTLADEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FORTS. OPTIONEN:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Mehr entladen"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Druck weiter"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Düse: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout-Sensor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout-Weg mm"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Homing gescheitert"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing gescheitert"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: zu kalt"); -#define MSG_MIX _UxGT("Mix") -#define MSG_MIX_COMPONENT _UxGT("Komponente") -#define MSG_MIXER _UxGT("Mixer") -#define MSG_GRADIENT _UxGT("Gradient") // equal Farbverlauf -#define MSG_FULL_GRADIENT _UxGT("Volle Gradient") -#define MSG_TOGGLE_MIX _UxGT("Mix umschalten") -#define MSG_CYCLE_MIX _UxGT("Zyklus Mix") -#define MSG_GRADIENT_MIX _UxGT("Gradient Mix") -#define MSG_REVERSE_GRADIENT _UxGT("Umgekehrte Gradient") -#define MSG_ACTIVE_VTOOL _UxGT("Aktives V-Tool") -#define MSG_START_VTOOL _UxGT("V-Tool Start") -#define MSG_END_VTOOL _UxGT("V-Tool Ende") -#define MSG_GRADIENT_ALIAS _UxGT("V-Tool Alias") -#define MSG_RESET_VTOOLS _UxGT("V-Tools Reseten") -#define MSG_COMMIT_VTOOL _UxGT("V-Tool Mix sichern") -#define MSG_VTOOLS_RESET _UxGT("V-Tools ist resetet") -#define MSG_START_Z _UxGT("Z Start") -#define MSG_END_Z _UxGT("Z Ende") -#define MSG_GAMES _UxGT("Spiele") -#define MSG_BRICKOUT _UxGT("Brickout") -#define MSG_INVADERS _UxGT("Invaders") -#define MSG_SNAKE _UxGT("Sn4k3") -#define MSG_MAZE _UxGT("Maze") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMENT WÄHLEN"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Update MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU handeln erfor."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Druck fortsetzen"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Fortfahren..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Filament laden"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Lade alle"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Düse laden"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Filament auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Filament 1 auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Filament 2 auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Filament 3 auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Filament 4 auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Filament 5 auswerfen"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filament entladen "); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Lade Fila. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fila. auswerfen..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fila. entladen..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Alle"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("setze MMU zurück"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU zurücksetzen..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Entfernen, klicken"); -// -// Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen -// ...oder 2 Zeilen auf einem 3-Zeilen-Display. -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Knopf drücken um") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("Druck fortzusetzen") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Druck ist") - #define MSG_PAUSE_PRINT_INIT_2 _UxGT("pausiert...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Warte auf den") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("Start des") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("Filamentwechsels...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filament einlegen") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("und Knopf drücken") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("um fortzusetzen") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Knopf drücken um") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Düse aufzuheizen") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Düse heizt auf") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("bitte warten...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Warte auf") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("Herausnahme") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("des Filaments...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Warte auf") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Laden des") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("Filaments...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Warte auf") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Entladen des") - #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("Filaments...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Klicke um") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("die Fila-Entladung") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_3 _UxGT("zu beenden") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Warte auf") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("Fortsetzen des") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("Drucks...") -#else // LCD_HEIGHT < 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 MSG_USERWAIT - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Pausiert...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Bitte warten...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laden und Klick") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klick zum Heizen") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heizen...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Entladen...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Laden...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Entladen...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Klick zum beenden") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("der Fila-Entladung") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsetzen...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Komponente 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Komponente 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Komponente 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Komponente 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Komponente 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Komponente 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Volle Gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mix umschalten"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Zyklus Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Umgekehrte Gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktives V-Tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-Tool Start"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-Tool Ende"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-Tool Alias"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("V-Tools Reseten"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("V-Tool Mix sichern"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-Tools ist resetet"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Z Start:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Z Ende:"); + PROGMEM Language_Str MSG_GAMES = _UxGT("Spiele"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); -#define MSG_TMC_DRIVERS _UxGT("TMC Treiber") // Max length 18 characters -#define MSG_TMC_CURRENT _UxGT("Treiber Strom") -#define MSG_TMC_HYBRID_THRS _UxGT("Hybrid threshold") -#define MSG_TMC_HOMING_THRS _UxGT("Sensorloses Homing") -#define MSG_TMC_STEPPING_MODE _UxGT("Schrittmodus") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop einsch.") -#define MSG_SERVICE_RESET _UxGT("Reset") -#define MSG_SERVICE_IN _UxGT(" im:") -#define MSG_BACKLASH _UxGT("Spiel") -#define MSG_BACKLASH_CORRECTION _UxGT("Korrektur") -#define MSG_BACKLASH_SMOOTHING _UxGT("Glätten") + // + // Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen + // ...oder 2 Zeilen auf einem 3-Zeilen-Display. + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Knopf drücken um", "Druck fortzusetzen")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_2_LINE("Druck ist", "pausiert...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Warte auf den", "Start des", "Filamentwechsels...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filament einlegen", "und Knopf drücken", "um fortzusetzen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Knopf drücken um", "Düse aufzuheizen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Düse heizt auf", "bitte warten...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Herausnahme", "des Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Warte auf", "Laden des", "Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Entladen des", "Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Fila-Entladung", "zu beenden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Warte auf", "Fortsetzen des", "Drucks...")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick zum Fortsetzen")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Pausiert...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Bitte warten...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Laden und Klick")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klick zum Heizen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heizen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laden...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Entladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Fila-Entladung")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsetzen...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Treiber"); // Max length 18 characters + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Treiber Strom"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" im:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Spiel"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrektur"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Glätten"); +} diff --git a/Marlin/src/lcd/language/language_el-gr.h b/Marlin/src/lcd/language/language_el-gr.h deleted file mode 100644 index 5f7a1d2d36..0000000000 --- a/Marlin/src/lcd/language/language_el-gr.h +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Greek (Greece) - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ - -#define DISPLAY_CHARSET_ISO10646_GREEK -#define CHARSIZE 2 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" έτοιμο.") -#define MSG_MEDIA_INSERTED _UxGT("Εισαγωγή κάρτας") -#define MSG_MEDIA_REMOVED _UxGT("Αφαίρεση κάρτας") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Βασική Οθόνη") -#define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση") -#define MSG_DISABLE_STEPPERS _UxGT("Απενεργοποίηση βηματιστή") -#define MSG_AUTO_HOME _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο") -#define MSG_AUTO_HOME_X _UxGT("Αρχικό σημείο X") -#define MSG_AUTO_HOME_Y _UxGT("Αρχικό σημείο Y") -#define MSG_AUTO_HOME_Z _UxGT("Αρχικό σημείο Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ") -#define MSG_LEVEL_BED_WAITING _UxGT("Κάντε κλικ για να ξεκινήσετε") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Επόμενο σημείο") -#define MSG_LEVEL_BED_DONE _UxGT("Ολοκλήρωση επιπεδοποίησης!") -#define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις") -#define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης") -#define MSG_PREHEAT_1 _UxGT("Προθέρμανση " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" κλίνη") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" επιβεβαίωση") -#define MSG_PREHEAT_2 _UxGT("Προθέρμανση " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" όλα") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" επιβεβαίωση") -#define MSG_COOLDOWN _UxGT("Μειωση θερμοκρασιας") -#define MSG_SWITCH_PS_ON _UxGT("Ενεργοποίηση") -#define MSG_SWITCH_PS_OFF _UxGT("Απενεργοποίηση") -#define MSG_EXTRUDE _UxGT("Εξώθηση") -#define MSG_RETRACT _UxGT("Ανάσυρση") -#define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα") -#define MSG_BED_LEVELING _UxGT("Επιπεδοποίηση κλίνης") -#define MSG_LEVEL_BED _UxGT("Επιπεδοποίηση κλίνης") -#define MSG_MOVE_X _UxGT("Μετακίνηση X") -#define MSG_MOVE_Y _UxGT("Μετακίνηση Y") -#define MSG_MOVE_Z _UxGT("Μετακίνηση Z") -#define MSG_MOVE_E _UxGT("Εξωθητήρας") -#define MSG_MOVE_Z_DIST _UxGT("Μετακίνηση %s μμ") -#define MSG_MOVE_01MM _UxGT("Μετακίνηση 0,1 μμ") -#define MSG_MOVE_1MM _UxGT("Μετακίνηση 1 μμ") -#define MSG_MOVE_10MM _UxGT("Μετακίνηση 10 μμ") -#define MSG_SPEED _UxGT("Ταχύτητα") -#define MSG_BED_Z _UxGT("Κλίνη Z") -#define MSG_NOZZLE _UxGT("Ακροφύσιο") -#define MSG_BED _UxGT("Κλίνη") -#define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα") -#define MSG_FLOW _UxGT("Ροή") -#define MSG_CONTROL _UxGT("Έλεγχος") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Αυτομ. ρύθμιση θερμοκρασίας") -#define MSG_LCD_ON _UxGT("Ενεργοποιημένο") -#define MSG_LCD_OFF _UxGT("Απενεργοποιημένο") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_ACC _UxGT("Επιτάχυνση") -#define MSG_JERK _UxGT("Vαντίδραση") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Vαντίδραση A") - #define MSG_VB_JERK _UxGT("Vαντίδραση B") - #define MSG_VC_JERK _UxGT("Vαντίδραση C") -#else - #define MSG_VA_JERK _UxGT("Vαντίδραση X") - #define MSG_VB_JERK _UxGT("Vαντίδραση Y") - #define MSG_VC_JERK _UxGT("Vαντίδραση Z") -#endif -#define MSG_VE_JERK _UxGT("Vαντίδραση E") -#define MSG_VMAX _UxGT("Vμεγ ") -#define MSG_VMIN _UxGT("Vελαχ") -#define MSG_VTRAV_MIN _UxGT("Vελάχ. μετατόπιση") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Aμεγ ") -#define MSG_A_RETRACT _UxGT("Α-ανάσυρση") -#define MSG_A_TRAVEL _UxGT("Α-μετατόπιση") -#define MSG_STEPS_PER_MM _UxGT("Bήματα ανά μμ") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Bήματα A ανά μμ") - #define MSG_BSTEPS _UxGT("Bήματα B ανά μμ") - #define MSG_CSTEPS _UxGT("Bήματα C ανά μμ") -#else - #define MSG_ASTEPS _UxGT("Bήματα X ανά μμ") - #define MSG_BSTEPS _UxGT("Bήματα Y ανά μμ") - #define MSG_CSTEPS _UxGT("Bήματα Z ανά μμ") -#endif -#define MSG_ESTEPS _UxGT("Bήματα Ε ανά μμ") -#define MSG_E1STEPS _UxGT("Bήματα Ε1 ανά μμ") -#define MSG_E2STEPS _UxGT("Bήματα Ε2 ανά μμ") -#define MSG_E3STEPS _UxGT("Bήματα Ε3 ανά μμ") -#define MSG_E4STEPS _UxGT("Bήματα Ε4 ανά μμ") -#define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ") -#define MSG_TEMPERATURE _UxGT("Θερμοκρασία") -#define MSG_MOTION _UxGT("Κίνηση") -#define MSG_FILAMENT _UxGT("Νήμα") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3") -#define MSG_FILAMENT_DIAM _UxGT("Διάμετρος νήματος") -#define MSG_CONTRAST _UxGT("Κοντράστ LCD") -#define MSG_STORE_EEPROM _UxGT("Αποθήκευση") -#define MSG_LOAD_EEPROM _UxGT("Φόρτωση") -#define MSG_RESTORE_FAILSAFE _UxGT("Επαναφορά ασφαλούς αντιγράφου") -#define MSG_REFRESH _UxGT("Ανανέωση") -#define MSG_WATCH _UxGT("Οθόνη πληροφόρησης") -#define MSG_PREPARE _UxGT("Προετοιμασία") -#define MSG_TUNE _UxGT("Συντονισμός") -#define MSG_PAUSE_PRINT _UxGT("Παύση εκτύπωσης") -#define MSG_RESUME_PRINT _UxGT("Συνέχιση εκτύπωσης") -#define MSG_STOP_PRINT _UxGT("Διακοπή εκτύπωσης") -#define MSG_MEDIA_MENU _UxGT("Εκτύπωση από SD") -#define MSG_NO_MEDIA _UxGT("Δεν βρέθηκε SD") -#define MSG_DWELL _UxGT("Αναστολή λειτουργίας…") -#define MSG_USERWAIT _UxGT("Αναμονή για χρήστη…") -#define MSG_PRINT_ABORTED _UxGT("Διακόπτεται η εκτύπωση") -#define MSG_NO_MOVE _UxGT("Καμία κίνηση.") -#define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ") -#define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ") -#define MSG_CONTROL_RETRACT _UxGT("Ανάσυρση μμ") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Εναλλαγή ανάσυρσης μμ") -#define MSG_CONTROL_RETRACTF _UxGT("Ανάσυρση V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Μεταπήδηση μμ") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_AUTORETRACT _UxGT("Αυτόματη ανάσυρση") -#define MSG_FILAMENTCHANGE _UxGT("Αλλαγή νήματος") -#define MSG_INIT_MEDIA _UxGT("Προετοιμασία κάρτας SD") -#define MSG_CHANGE_MEDIA _UxGT("Αλλαγή κάρτας SD") -#define MSG_ZPROBE_OUT _UxGT("Διερεύνηση Z εκτός κλίνης") -#define MSG_YX_UNHOMED _UxGT("Επαναφορά Χ/Υ πριν από Ζ") -#define MSG_XYZ_UNHOMED _UxGT("Επαναφορά ΧΥΖ πρώτα") -#define MSG_ZPROBE_ZOFFSET _UxGT("Μετατόπιση Ζ") -#define MSG_BABYSTEP_X _UxGT("Μικρό βήμα Χ") -#define MSG_BABYSTEP_Y _UxGT("Μικρό βήμα Υ") -#define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ") -#define MSG_ENDSTOP_ABORT _UxGT("Ματαίωση endstop ") -#define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ") -#define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ") -#define MSG_ERR_MAXTEMP _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") -#define MSG_ERR_MINTEMP _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") -#define MSG_ERR_MAXTEMP_BED _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") -#define MSG_ERR_MINTEMP_BED _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") -#define MSG_HEATING _UxGT("Θερμαίνεται…") -#define MSG_BED_HEATING _UxGT("Θέρμανση κλίνης…") -#define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Βαθμονόμηση Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Βαθμονόμηση κέντρου") - -#define MSG_EXPECTED_PRINTER _UxGT("Εσφαλμένος εκτυπωτής") diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 37eb4fbe74..a74c8da12f 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -30,161 +30,225 @@ */ #define DISPLAY_CHARSET_ISO10646_GREEK -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" έτοιμο.") -#define MSG_MEDIA_INSERTED _UxGT("Εισαγωγή κάρτας") -#define MSG_MEDIA_REMOVED _UxGT("Αφαίρεση κάρτας") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Βασική Οθόνη") -#define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση") -#define MSG_DISABLE_STEPPERS _UxGT("Απενεργοποίηση Μοτέρ") -#define MSG_AUTO_HOME _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο") //SHORTEN -#define MSG_AUTO_HOME_X _UxGT("Αρχικό σημείο X") -#define MSG_AUTO_HOME_Y _UxGT("Αρχικό σημείο Y") -#define MSG_AUTO_HOME_Z _UxGT("Αρχικό σημείο Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά Επ. Εκτύπωσης") //SHORTEN -#define MSG_LEVEL_BED_WAITING _UxGT("Επιπεδοποίηση επ. Εκτύπωσης περιμενει") //SHORTEN -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Επόμενο σημείο") -#define MSG_LEVEL_BED_DONE _UxGT("Ολοκλήρωση επιπεδοποίησης!") //SHORTEN -#define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων") //SHORTEN -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις") //SHORTEN -#define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης") -#define MSG_PREHEAT_1 _UxGT("Προθέρμανση " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" bed") //SHORTEN -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" επιβεβαίωση") //SHORTEN -#define MSG_PREHEAT_2 _UxGT("Προθέρμανση " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" όλα") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" bed") //SHORTEN -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" επιβεβαίωση") //SHORTEN -#define MSG_COOLDOWN _UxGT("Μειωση θερμοκρασιας") -#define MSG_SWITCH_PS_ON _UxGT("Ενεργοποίηση") -#define MSG_SWITCH_PS_OFF _UxGT("Απενεργοποίηση") -#define MSG_EXTRUDE _UxGT("Εξώθηση") -#define MSG_RETRACT _UxGT("Ανάσυρση") -#define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα") -#define MSG_BED_LEVELING _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης") //SHORTEN -#define MSG_LEVEL_BED _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης") //SHORTEN -#define MSG_MOVE_X _UxGT("Μετακίνηση X") -#define MSG_MOVE_Y _UxGT("Μετακίνηση Y") -#define MSG_MOVE_Z _UxGT("Μετακίνηση Z") -#define MSG_MOVE_E _UxGT("Εξωθητήρας") -#define MSG_MOVE_Z_DIST _UxGT("Μετακίνηση %s μμ") -#define MSG_MOVE_01MM _UxGT("Μετακίνηση 0,1 μμ") -#define MSG_MOVE_1MM _UxGT("Μετακίνηση 1 μμ") -#define MSG_MOVE_10MM _UxGT("Μετακίνηση 10 μμ") -#define MSG_SPEED _UxGT("Ταχύτητα") -#define MSG_BED_Z _UxGT("Επ. Εκτύπωσης Z") -#define MSG_NOZZLE _UxGT("Ακροφύσιο") -#define MSG_BED _UxGT("Κλίνη") -#define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα") -#define MSG_FLOW _UxGT("Ροή") -#define MSG_CONTROL _UxGT("Έλεγχος") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Αυτομ ρύθμιση θερ/σίας") //SHORTEN -#define MSG_LCD_ON _UxGT("Ενεργοποιημένο") -#define MSG_LCD_OFF _UxGT("Απενεργοποιημένο") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_ACC _UxGT("Επιτάχυνση") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Vαντίδραση A") - #define MSG_VB_JERK _UxGT("Vαντίδραση B") - #define MSG_VC_JERK _UxGT("Vαντίδραση C") -#else - #define MSG_VA_JERK _UxGT("Vαντίδραση X") - #define MSG_VB_JERK _UxGT("Vαντίδραση Y") - #define MSG_VC_JERK _UxGT("Vαντίδραση Z") -#endif -#define MSG_VE_JERK _UxGT("Vαντίδραση E") -#define MSG_VMAX _UxGT("V Μέγιστο") -#define MSG_VMIN _UxGT("V Ελάχιστο") -#define MSG_VTRAV_MIN _UxGT("Vελάχ. μετατόπιση") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Aμεγ ") -#define MSG_A_RETRACT _UxGT("Α-ανάσυρση") -#define MSG_A_TRAVEL _UxGT("Α-μετατόπιση") -#define MSG_STEPS_PER_MM _UxGT("Bήματα ανά μμ") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Bήματα A ανά μμ") - #define MSG_BSTEPS _UxGT("Bήματα B ανά μμ") - #define MSG_CSTEPS _UxGT("Bήματα C ανά μμ") -#else - #define MSG_ASTEPS _UxGT("Bήματα X ανά μμ") - #define MSG_BSTEPS _UxGT("Bήματα Y ανά μμ") - #define MSG_CSTEPS _UxGT("Bήματα Z ανά μμ") -#endif -#define MSG_ESTEPS _UxGT("Bήματα Ε ανά μμ") -#define MSG_E1STEPS _UxGT("Bήματα Ε1 ανά μμ") -#define MSG_E2STEPS _UxGT("Bήματα Ε2 ανά μμ") -#define MSG_E3STEPS _UxGT("Bήματα Ε3 ανά μμ") -#define MSG_E4STEPS _UxGT("Bήματα Ε4 ανά μμ") -#define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ") -#define MSG_TEMPERATURE _UxGT("Θερμοκρασία") -#define MSG_MOTION _UxGT("Κίνηση") -#define MSG_FILAMENT _UxGT("Νήμα") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3") -#define MSG_FILAMENT_DIAM _UxGT("Διάμετρος νήματος") -#define MSG_CONTRAST _UxGT("Κοντράστ LCD") -#define MSG_STORE_EEPROM _UxGT("Αποθήκευση") -#define MSG_LOAD_EEPROM _UxGT("Φόρτωση") -#define MSG_RESTORE_FAILSAFE _UxGT("Επαναφορά ασφαλούς αντιγράφου") //SHORTEN -#define MSG_REFRESH _UxGT("Ανανέωση") -#define MSG_WATCH _UxGT("Οθόνη πληροφόρησης") -#define MSG_PREPARE _UxGT("Προετοιμασία") -#define MSG_TUNE _UxGT("Συντονισμός") -#define MSG_PAUSE_PRINT _UxGT("Παύση εκτύπωσης") -#define MSG_RESUME_PRINT _UxGT("Συνέχιση εκτύπωσης") -#define MSG_STOP_PRINT _UxGT("Διακοπή εκτύπωσης") -#define MSG_MEDIA_MENU _UxGT("Εκτύπωση από SD") -#define MSG_NO_MEDIA _UxGT("Δεν βρέθηκε SD") -#define MSG_DWELL _UxGT("Αναστολή λειτουργίας") -#define MSG_USERWAIT _UxGT("Αναμονή για χρήστη") -#define MSG_PRINT_ABORTED _UxGT("Διακόπτεται η εκτύπωση") //SHORTEN -#define MSG_NO_MOVE _UxGT("Καμία κίνηση.") -#define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ") -#define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ") -#define MSG_CONTROL_RETRACT _UxGT("Ανάσυρση μμ") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Εναλλαγή ανάσυρσης μμ") //SHORTEN -#define MSG_CONTROL_RETRACTF _UxGT("Ανάσυρση V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Μεταπήδηση μμ") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_AUTORETRACT _UxGT("Αυτόματη ανάσυρση") -#define MSG_FILAMENTCHANGE _UxGT("Αλλαγή νήματος") -#define MSG_INIT_MEDIA _UxGT("Προετοιμασία κάρτας SD") //SHORTEN -#define MSG_CHANGE_MEDIA _UxGT("Αλλαγή κάρτας SD") -#define MSG_ZPROBE_OUT _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης") //SHORTEN -#define MSG_YX_UNHOMED _UxGT("Επαναφορά Χ/Υ πριν από Ζ") //SHORTEN -#define MSG_XYZ_UNHOMED _UxGT("Επαναφορά ΧΥΖ πρώτα") -#define MSG_ZPROBE_ZOFFSET _UxGT("Μετατόπιση Ζ") -#define MSG_BABYSTEP_X _UxGT("Μικρό βήμα Χ") -#define MSG_BABYSTEP_Y _UxGT("Μικρό βήμα Υ") -#define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ") -#define MSG_ENDSTOP_ABORT _UxGT("Ακύρωση endstop ") -#define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ") -#define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ") -#define MSG_ERR_MAXTEMP _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ") -#define MSG_ERR_MINTEMP _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ") //SHORTEN -#define MSG_ERR_MAXTEMP_BED _UxGT("ΜΕΓΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ") //SHORTEN -#define MSG_ERR_MINTEMP_BED _UxGT("ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ") //SHORTEN -#define MSG_HALTED _UxGT("H εκτύπωση διακόπηκε") -#define MSG_HEATING _UxGT("Θερμαίνεται…") -#define MSG_BED_HEATING _UxGT("Θέρμανση ΕΠ. Εκτύπωσης") //SHORTEN -#define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Βαθμονόμηση Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Βαθμονόμηση κέντρου") +namespace Language_el { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_EXPECTED_PRINTER _UxGT("Εσφαλμένος εκτυπωτής") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Greek"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση Μοτέρ"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο"); //SHORTEN + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Αρχικό σημείο X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Αρχικό σημείο Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Αρχικό σημείο Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Επαναφορά Επ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Επιπεδοποίηση επ. Εκτύπωσης περιμενει"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!"); //SHORTEN + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); //SHORTEN + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); //SHORTEN + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" bed"); //SHORTEN + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θερμοκρασιας"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Εξώθηση"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Ανάσυρση"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Μετακίνηση X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Μετακίνηση Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Εξωθητήρας"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Εξωθητήρας ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Εξωθητήρας ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Εξωθητήρας ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Εξωθητήρας ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Εξωθητήρας ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Εξωθητήρας ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Επ. Εκτύπωσης Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Ακροφύσιο ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Ακροφύσιο ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Ακροφύσιο ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Ακροφύσιο ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Ακροφύσιο ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Ακροφύσιο ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Κλίνη"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Ταχύτητα ανεμιστήρα 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Ταχύτητα ανεμιστήρα 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Ταχύτητα ανεμιστήρα 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Ροή"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Ροή ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Ροή ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Ροή ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Ροή ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Ροή ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Ροή ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Αυτομ ρύθμιση θερ/σίας"); //SHORTEN + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); + PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("V Μέγιστο") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("V Μέγιστο") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("V Μέγιστο") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("V Μέγιστο") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("V Μέγιστο ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("V Μέγιστο ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("V Μέγιστο ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("V Μέγιστο ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("V Μέγιστο ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("V Μέγιστο ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("V Ελάχιστο"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aμεγ ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aμεγ ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aμεγ ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aμεγ ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Aμεγ ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Aμεγ ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Aμεγ ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Aμεγ ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Aμεγ ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Aμεγ ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Α-ανάσυρση"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("Bήματα ") LCD_STR_E0 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("Bήματα ") LCD_STR_E1 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("Bήματα ") LCD_STR_E2 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("Bήματα ") LCD_STR_E3 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("Bήματα ") LCD_STR_E4 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("Bήματα ") LCD_STR_E5 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Θερμοκρασία"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Νήμα"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Διάμετρος νήματος ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Διάμετρος νήματος ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Διάμετρος νήματος ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Διάμετρος νήματος ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Διάμετρος νήματος ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Διάμετρος νήματος ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Κοντράστ LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Αποθήκευση"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Φόρτωση"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Επαναφορά ασφαλούς αντιγράφου"); //SHORTEN + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Οθόνη πληροφόρησης"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Προετοιμασία"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Συντονισμός"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Αναστολή λειτουργίας"); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Αναμονή για χρήστη"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Διακόπτεται η εκτύπωση"); //SHORTEN + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Καμία κίνηση."); + PROGMEM Language_Str MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης μμ"); //SHORTEN + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Αλλαγή νήματος ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Αλλαγή νήματος ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Αλλαγή νήματος ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Αλλαγή νήματος ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Αλλαγή νήματος ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Αλλαγή νήματος ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Προετοιμασία κάρτας SD"); //SHORTEN + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); //SHORTEN + PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ακύρωση endstop "); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ"); //SHORTEN + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("ΜΕΓΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ"); //SHORTEN + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ"); //SHORTEN + PROGMEM Language_Str MSG_HALTED = _UxGT("H εκτύπωση διακόπηκε"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Θερμαίνεται…"); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Θέρμανση ΕΠ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); +} diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h new file mode 100644 index 0000000000..e78a229008 --- /dev/null +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -0,0 +1,283 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Greek (Greece) + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ + +#define DISPLAY_CHARSET_ISO10646_GREEK + +namespace Language_el_gr { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Greek (Greece)"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση βηματιστή"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Αρχικό σημείο X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Αρχικό σημείο Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Αρχικό σημείο Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Κάντε κλικ για να ξεκινήσετε"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" κλίνη"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" κλίνη"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_2_LABEL _UxGT(" επιβεβαίωση"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θερμοκρασιας"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Εξώθηση"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Ανάσυρση"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση κλίνης"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση κλίνης"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Μετακίνηση X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Μετακίνηση Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Εξωθητήρας"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Εξωθητήρας ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Εξωθητήρας ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Εξωθητήρας ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Εξωθητήρας ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Εξωθητήρας ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Εξωθητήρας ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Κλίνη Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Ακροφύσιο ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Ακροφύσιο ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Ακροφύσιο ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Ακροφύσιο ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Ακροφύσιο ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Ακροφύσιο ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Κλίνη"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Ταχύτητα ανεμιστήρα 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Ταχύτητα ανεμιστήρα 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Ταχύτητα ανεμιστήρα 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Ροή"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Ροή ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Ροή ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Ροή ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Ροή ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Ροή ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Ροή ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Αυτομ. ρύθμιση θερμοκρασίας"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); + PROGMEM Language_Str MSG_JERK = _UxGT("Vαντίδραση"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vμεγ ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vμεγ ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vμεγ ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vμεγ ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vμεγ ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vμεγ ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vμεγ ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vμεγ ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vμεγ ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vμεγ ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vελαχ"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aμεγ ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aμεγ ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aμεγ ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aμεγ ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Aμεγ ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Aμεγ ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Aμεγ ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Aμεγ ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Aμεγ ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Aμεγ ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Α-ανάσυρση"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("Bήματα ") LCD_STR_E0 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("Bήματα ") LCD_STR_E1 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("Bήματα ") LCD_STR_E2 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("Bήματα ") LCD_STR_E3 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("Bήματα ") LCD_STR_E4 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("Bήματα ") LCD_STR_E5 _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Θερμοκρασία"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Νήμα"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Διάμετρος νήματος ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Διάμετρος νήματος ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Διάμετρος νήματος ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Διάμετρος νήματος ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Διάμετρος νήματος ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Διάμετρος νήματος ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Κοντράστ LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Αποθήκευση"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Φόρτωση"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Επαναφορά ασφαλούς αντιγράφου"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Οθόνη πληροφόρησης"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Προετοιμασία"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Συντονισμός"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Αναστολή λειτουργίας…"); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Αναμονή για χρήστη…"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Διακόπτεται η εκτύπωση"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Καμία κίνηση."); + PROGMEM Language_Str MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Αλλαγή νήματος ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Αλλαγή νήματος ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Αλλαγή νήματος ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Αλλαγή νήματος ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Αλλαγή νήματος ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Αλλαγή νήματος ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Προετοιμασία κάρτας SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός κλίνης"); + PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); + PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ματαίωση endstop "); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Θερμαίνεται…"); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Θέρμανση κλίνης…"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); +} diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 225a83e8d4..2b813cea2a 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -35,1544 +35,675 @@ #endif #undef en -#ifndef THIS_LANGUAGES_SPECIAL_SYMBOLS - #define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("³") -#endif +namespace Language_en { + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("English"); -#ifdef NOT_EXTENDED_ISO10646_1_5X7 - #define MSG_CUBED _UxGT("^3") -#else - #define MSG_CUBED _UxGT("³") -#endif + #ifdef NOT_EXTENDED_ISO10646_1_5X7 + PROGMEM Language_Str MSG_CUBED = _UxGT("^3"); + #else + PROGMEM Language_Str MSG_CUBED = _UxGT("³"); + #endif -#ifndef CHARSIZE - #define CHARSIZE 1 -#endif + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Ready."); + PROGMEM Language_Str MSG_YES = _UxGT("YES"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Back"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Aborting..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Inserted"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Removed"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Media Released"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Waiting for media"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Media read error"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB start failed"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Progress Bar Test"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Leveling Done!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Set Origin"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Preheat ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" All"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preheat ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Preheat ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" All"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preheat Custom"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Cooldown"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser Control"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Control"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Off"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle On"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Power"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Move Axis"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level Bed"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Level Corners"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Next Corner"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editor"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edit Mesh"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Probing Point"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Value"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2nd Nozzle X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2nd Nozzle Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2nd Nozzle Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Doing G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tools"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Tilting Point"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Measure"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Build Mesh (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Build Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validate Mesh (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validate Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manual priming..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Done Priming"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Canceled"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Leaving G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Side Points"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Map Type"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Printer Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Output UBL Info"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Mesh %i Loaded"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Mesh %i Saved"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("No Storage"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh"); -#ifndef WELCOME_MSG - #define WELCOME_MSG MACHINE_NAME _UxGT(" Ready.") -#endif -#ifndef MSG_YES - #define MSG_YES _UxGT("YES") -#endif -#ifndef MSG_NO - #define MSG_NO _UxGT("NO") -#endif -#ifndef MSG_BACK - #define MSG_BACK _UxGT("Back") -#endif -#ifndef MSG_MEDIA_ABORTING - #define MSG_MEDIA_ABORTING _UxGT("Aborting...") -#endif -#ifndef MSG_MEDIA_INSERTED - #define MSG_MEDIA_INSERTED _UxGT("Media Inserted") -#endif -#ifndef MSG_MEDIA_REMOVED - #define MSG_MEDIA_REMOVED _UxGT("Media Removed") -#endif -#ifndef MSG_MEDIA_RELEASED - #define MSG_MEDIA_RELEASED _UxGT("Media Released") -#endif -#ifndef MSG_MEDIA_WAITING - #define MSG_MEDIA_WAITING _UxGT("Waiting for media") -#endif -#ifndef MSG_MEDIA_READ_ERROR - #define MSG_MEDIA_READ_ERROR _UxGT("Media read error") -#endif -#ifndef MSG_MEDIA_USB_REMOVED - #define MSG_MEDIA_USB_REMOVED _UxGT("USB device removed") -#endif -#ifndef MSG_MEDIA_USB_FAILED - #define MSG_MEDIA_USB_FAILED _UxGT("USB start failed") -#endif -#ifndef MSG_LCD_ENDSTOPS - #define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#endif -#ifndef MSG_LCD_SOFT_ENDSTOPS - #define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Endstops") -#endif -#ifndef MSG_MAIN - #define MSG_MAIN _UxGT("Main") -#endif -#ifndef MSG_ADVANCED_SETTINGS - #define MSG_ADVANCED_SETTINGS _UxGT("Advanced Settings") -#endif -#ifndef MSG_CONFIGURATION - #define MSG_CONFIGURATION _UxGT("Configuration") -#endif -#ifndef MSG_AUTOSTART - #define MSG_AUTOSTART _UxGT("Autostart") -#endif -#ifndef MSG_DISABLE_STEPPERS - #define MSG_DISABLE_STEPPERS _UxGT("Disable Steppers") -#endif -#ifndef MSG_DEBUG_MENU - #define MSG_DEBUG_MENU _UxGT("Debug Menu") -#endif -#ifndef MSG_PROGRESS_BAR_TEST - #define MSG_PROGRESS_BAR_TEST _UxGT("Progress Bar Test") -#endif -#ifndef MSG_AUTO_HOME - #define MSG_AUTO_HOME _UxGT("Auto Home") -#endif -#ifndef MSG_AUTO_HOME_X - #define MSG_AUTO_HOME_X _UxGT("Home X") -#endif -#ifndef MSG_AUTO_HOME_Y - #define MSG_AUTO_HOME_Y _UxGT("Home Y") -#endif -#ifndef MSG_AUTO_HOME_Z - #define MSG_AUTO_HOME_Z _UxGT("Home Z") -#endif -#ifndef MSG_AUTO_Z_ALIGN - #define MSG_AUTO_Z_ALIGN _UxGT("Auto Z-Align") -#endif -#ifndef MSG_LEVEL_BED_HOMING - #define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") -#endif -#ifndef MSG_LEVEL_BED_WAITING - #define MSG_LEVEL_BED_WAITING _UxGT("Click to Begin") -#endif -#ifndef MSG_LEVEL_BED_NEXT_POINT - #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Next Point") -#endif -#ifndef MSG_LEVEL_BED_DONE - #define MSG_LEVEL_BED_DONE _UxGT("Leveling Done!") -#endif -#ifndef MSG_Z_FADE_HEIGHT - #define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") -#endif -#ifndef MSG_SET_HOME_OFFSETS - #define MSG_SET_HOME_OFFSETS _UxGT("Set Home Offsets") -#endif -#ifndef MSG_HOME_OFFSETS_APPLIED - #define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets Applied") -#endif -#ifndef MSG_SET_ORIGIN - #define MSG_SET_ORIGIN _UxGT("Set Origin") -#endif -#ifndef MSG_PREHEAT_1 - #define MSG_PREHEAT_1 _UxGT("Preheat " PREHEAT_1_LABEL) -#endif -#ifndef MSG_PREHEAT_1_N - #define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#endif -#ifndef MSG_PREHEAT_1_ALL - #define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" All") -#endif -#ifndef MSG_PREHEAT_1_END - #define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") -#endif -#ifndef MSG_PREHEAT_1_BEDONLY - #define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Bed") -#endif -#ifndef MSG_PREHEAT_1_SETTINGS - #define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Conf") -#endif -#ifndef MSG_PREHEAT_2 - #define MSG_PREHEAT_2 _UxGT("Preheat " PREHEAT_2_LABEL) -#endif -#ifndef MSG_PREHEAT_2_N - #define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#endif -#ifndef MSG_PREHEAT_2_ALL - #define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" All") -#endif -#ifndef MSG_PREHEAT_2_END - #define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") -#endif -#ifndef MSG_PREHEAT_2_BEDONLY - #define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") -#endif -#ifndef MSG_PREHEAT_2_SETTINGS - #define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Conf") -#endif -#ifndef MSG_PREHEAT_CUSTOM - #define MSG_PREHEAT_CUSTOM _UxGT("Preheat Custom") -#endif -#ifndef MSG_COOLDOWN - #define MSG_COOLDOWN _UxGT("Cooldown") -#endif -#ifndef MSG_LASER_MENU - #define MSG_LASER_MENU _UxGT("Laser Control") -#endif -#ifndef MSG_LASER_OFF - #define MSG_LASER_OFF _UxGT("Laser Off") -#endif -#ifndef MSG_LASER_ON - #define MSG_LASER_ON _UxGT("Laser On") -#endif -#ifndef MSG_LASER_POWER - #define MSG_LASER_POWER _UxGT("Laser Power") -#endif -#ifndef MSG_SPINDLE_MENU - #define MSG_SPINDLE_MENU _UxGT("Spindle Control") -#endif -#ifndef MSG_SPINDLE_OFF - #define MSG_SPINDLE_OFF _UxGT("Spindle Off") -#endif -#ifndef MSG_SPINDLE_ON - #define MSG_SPINDLE_ON _UxGT("Spindle On") -#endif -#ifndef MSG_SPINDLE_POWER - #define MSG_SPINDLE_POWER _UxGT("Spindle Power") -#endif -#ifndef MSG_SPINDLE_REVERSE - #define MSG_SPINDLE_REVERSE _UxGT("Spindle Reverse") -#endif -#ifndef MSG_SWITCH_PS_ON - #define MSG_SWITCH_PS_ON _UxGT("Switch Power On") -#endif -#ifndef MSG_SWITCH_PS_OFF - #define MSG_SWITCH_PS_OFF _UxGT("Switch Power Off") -#endif -#ifndef MSG_EXTRUDE - #define MSG_EXTRUDE _UxGT("Extrude") -#endif -#ifndef MSG_RETRACT - #define MSG_RETRACT _UxGT("Retract") -#endif -#ifndef MSG_MOVE_AXIS - #define MSG_MOVE_AXIS _UxGT("Move Axis") -#endif -#ifndef MSG_BED_LEVELING - #define MSG_BED_LEVELING _UxGT("Bed Leveling") -#endif -#ifndef MSG_LEVEL_BED - #define MSG_LEVEL_BED _UxGT("Level Bed") -#endif -#ifndef MSG_LEVEL_CORNERS - #define MSG_LEVEL_CORNERS _UxGT("Level Corners") -#endif -#ifndef MSG_NEXT_CORNER - #define MSG_NEXT_CORNER _UxGT("Next Corner") -#endif -#ifndef MSG_MESH_EDITOR - #define MSG_MESH_EDITOR _UxGT("Mesh Editor") -#endif -#ifndef MSG_EDIT_MESH - #define MSG_EDIT_MESH _UxGT("Edit Mesh") -#endif -#ifndef MSG_EDITING_STOPPED - #define MSG_EDITING_STOPPED _UxGT("Mesh Editing Stopped") -#endif -#ifndef MSG_PROBING_MESH - #define MSG_PROBING_MESH _UxGT("Probing Point") -#endif -#ifndef MSG_MESH_X - #define MSG_MESH_X _UxGT("Index X") -#endif -#ifndef MSG_MESH_Y - #define MSG_MESH_Y _UxGT("Index Y") -#endif -#ifndef MSG_MESH_EDIT_Z - #define MSG_MESH_EDIT_Z _UxGT("Z Value") -#endif -#ifndef MSG_USER_MENU - #define MSG_USER_MENU _UxGT("Custom Commands") -#endif -#ifndef MSG_M48_TEST - #define MSG_M48_TEST _UxGT("M48 Probe Test") -#endif -#ifndef MSG_M48_POINT - #define MSG_M48_POINT _UxGT("M48 Point") -#endif -#ifndef MSG_M48_DEVIATION - #define MSG_M48_DEVIATION _UxGT("Deviation") -#endif -#ifndef MSG_IDEX_MENU - #define MSG_IDEX_MENU _UxGT("IDEX Mode") -#endif -#ifndef MSG_OFFSETS_MENU - #define MSG_OFFSETS_MENU _UxGT("Tool Offsets") -#endif -#ifndef MSG_IDEX_MODE_AUTOPARK - #define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") -#endif -#ifndef MSG_IDEX_MODE_DUPLICATE - #define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication") -#endif -#ifndef MSG_IDEX_MODE_MIRRORED_COPY - #define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Mirrored Copy") -#endif -#ifndef MSG_IDEX_MODE_FULL_CTRL - #define MSG_IDEX_MODE_FULL_CTRL _UxGT("Full Control") -#endif -#ifndef MSG_X_OFFSET - #define MSG_X_OFFSET _UxGT("2nd Nozzle X") -#endif -#ifndef MSG_Y_OFFSET - #define MSG_Y_OFFSET _UxGT("2nd Nozzle Y") -#endif -#ifndef MSG_Z_OFFSET - #define MSG_Z_OFFSET _UxGT("2nd nNozzle Z") -#endif -#ifndef MSG_UBL_DOING_G29 - #define MSG_UBL_DOING_G29 _UxGT("Doing G29") -#endif -#ifndef MSG_UBL_TOOLS - #define MSG_UBL_TOOLS _UxGT("UBL Tools") -#endif -#ifndef MSG_UBL_LEVEL_BED - #define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#endif -#ifndef MSG_LCD_TILTING_MESH - #define MSG_LCD_TILTING_MESH _UxGT("Tilting Point") -#endif -#ifndef MSG_UBL_MANUAL_MESH - #define MSG_UBL_MANUAL_MESH _UxGT("Manually Build Mesh") -#endif -#ifndef MSG_UBL_BC_INSERT - #define MSG_UBL_BC_INSERT _UxGT("Place Shim & Measure") -#endif -#ifndef MSG_UBL_BC_INSERT2 - #define MSG_UBL_BC_INSERT2 _UxGT("Measure") -#endif -#ifndef MSG_UBL_BC_REMOVE - #define MSG_UBL_BC_REMOVE _UxGT("Remove & Measure Bed") -#endif -#ifndef MSG_UBL_MOVING_TO_NEXT - #define MSG_UBL_MOVING_TO_NEXT _UxGT("Moving to next") -#endif -#ifndef MSG_UBL_ACTIVATE_MESH - #define MSG_UBL_ACTIVATE_MESH _UxGT("Activate UBL") -#endif -#ifndef MSG_UBL_DEACTIVATE_MESH - #define MSG_UBL_DEACTIVATE_MESH _UxGT("Deactivate UBL") -#endif -#ifndef MSG_UBL_SET_TEMP_BED - #define MSG_UBL_SET_TEMP_BED _UxGT("Bed Temp") -#endif -#ifndef MSG_UBL_BED_TEMP_CUSTOM - #define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#endif -#ifndef MSG_UBL_SET_TEMP_HOTEND - #define MSG_UBL_SET_TEMP_HOTEND _UxGT("Hotend Temp") -#endif -#ifndef MSG_UBL_HOTEND_TEMP_CUSTOM - #define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#endif -#ifndef MSG_UBL_MESH_EDIT - #define MSG_UBL_MESH_EDIT _UxGT("Mesh Edit") -#endif -#ifndef MSG_UBL_EDIT_CUSTOM_MESH - #define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit Custom Mesh") -#endif -#ifndef MSG_UBL_FINE_TUNE_MESH - #define MSG_UBL_FINE_TUNE_MESH _UxGT("Fine Tuning Mesh") -#endif -#ifndef MSG_UBL_DONE_EDITING_MESH - #define MSG_UBL_DONE_EDITING_MESH _UxGT("Done Editing Mesh") -#endif -#ifndef MSG_UBL_BUILD_CUSTOM_MESH - #define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Build Custom Mesh") -#endif -#ifndef MSG_UBL_BUILD_MESH_MENU - #define MSG_UBL_BUILD_MESH_MENU _UxGT("Build Mesh") -#endif -#ifndef MSG_UBL_BUILD_MESH_M1 - #define MSG_UBL_BUILD_MESH_M1 _UxGT("Build Mesh (" PREHEAT_1_LABEL ")") -#endif -#ifndef MSG_UBL_BUILD_MESH_M2 - #define MSG_UBL_BUILD_MESH_M2 _UxGT("Build Mesh (" PREHEAT_2_LABEL ")") -#endif -#ifndef MSG_UBL_BUILD_COLD_MESH - #define MSG_UBL_BUILD_COLD_MESH _UxGT("Build Cold Mesh") -#endif -#ifndef MSG_UBL_MESH_HEIGHT_ADJUST - #define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Adjust Mesh Height") -#endif -#ifndef MSG_UBL_MESH_HEIGHT_AMOUNT - #define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Height Amount") -#endif -#ifndef MSG_UBL_VALIDATE_MESH_MENU - #define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validate Mesh") -#endif -#ifndef MSG_UBL_VALIDATE_MESH_M1 - #define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Validate Mesh (" PREHEAT_1_LABEL ")") -#endif -#ifndef MSG_UBL_VALIDATE_MESH_M2 - #define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Validate Mesh (" PREHEAT_2_LABEL ")") -#endif -#ifndef MSG_UBL_VALIDATE_CUSTOM_MESH - #define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validate Custom Mesh") -#endif -#ifndef MSG_G26_HEATING_BED - #define MSG_G26_HEATING_BED _UxGT("G26 Heating Bed") -#endif -#ifndef MSG_G26_HEATING_NOZZLE - #define MSG_G26_HEATING_NOZZLE _UxGT("G26 Heating Nozzle") -#endif -#ifndef MSG_G26_MANUAL_PRIME - #define MSG_G26_MANUAL_PRIME _UxGT("Manual priming...") -#endif -#ifndef MSG_G26_FIXED_LENGTH - #define MSG_G26_FIXED_LENGTH _UxGT("Fixed Length Prime") -#endif -#ifndef MSG_G26_PRIME_DONE - #define MSG_G26_PRIME_DONE _UxGT("Done Priming") -#endif -#ifndef MSG_G26_CANCELED - #define MSG_G26_CANCELED _UxGT("G26 Canceled") -#endif -#ifndef MSG_G26_LEAVING - #define MSG_G26_LEAVING _UxGT("Leaving G26") -#endif -#ifndef MSG_UBL_CONTINUE_MESH - #define MSG_UBL_CONTINUE_MESH _UxGT("Continue Bed Mesh") -#endif -#ifndef MSG_UBL_MESH_LEVELING - #define MSG_UBL_MESH_LEVELING _UxGT("Mesh Leveling") -#endif -#ifndef MSG_UBL_3POINT_MESH_LEVELING - #define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Point Leveling") -#endif -#ifndef MSG_UBL_GRID_MESH_LEVELING - #define MSG_UBL_GRID_MESH_LEVELING _UxGT("Grid Mesh Leveling") -#endif -#ifndef MSG_UBL_MESH_LEVEL - #define MSG_UBL_MESH_LEVEL _UxGT("Level Mesh") -#endif -#ifndef MSG_UBL_SIDE_POINTS - #define MSG_UBL_SIDE_POINTS _UxGT("Side Points") -#endif -#ifndef MSG_UBL_MAP_TYPE - #define MSG_UBL_MAP_TYPE _UxGT("Map Type") -#endif -#ifndef MSG_UBL_OUTPUT_MAP - #define MSG_UBL_OUTPUT_MAP _UxGT("Output Mesh Map") -#endif -#ifndef MSG_UBL_OUTPUT_MAP_HOST - #define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Output for Host") -#endif -#ifndef MSG_UBL_OUTPUT_MAP_CSV - #define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Output for CSV") -#endif -#ifndef MSG_UBL_OUTPUT_MAP_BACKUP - #define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") -#endif -#ifndef MSG_UBL_INFO_UBL - #define MSG_UBL_INFO_UBL _UxGT("Output UBL Info") -#endif -#ifndef MSG_UBL_FILLIN_AMOUNT - #define MSG_UBL_FILLIN_AMOUNT _UxGT("Fill-in Amount") -#endif -#ifndef MSG_UBL_MANUAL_FILLIN - #define MSG_UBL_MANUAL_FILLIN _UxGT("Manual Fill-in") -#endif -#ifndef MSG_UBL_SMART_FILLIN - #define MSG_UBL_SMART_FILLIN _UxGT("Smart Fill-in") -#endif -#ifndef MSG_UBL_FILLIN_MESH - #define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Mesh") -#endif -#ifndef MSG_UBL_INVALIDATE_ALL - #define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidate All") -#endif -#ifndef MSG_UBL_INVALIDATE_CLOSEST - #define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidate Closest") -#endif -#ifndef MSG_UBL_FINE_TUNE_ALL - #define MSG_UBL_FINE_TUNE_ALL _UxGT("Fine Tune All") -#endif -#ifndef MSG_UBL_FINE_TUNE_CLOSEST - #define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Fine Tune Closest") -#endif -#ifndef MSG_UBL_STORAGE_MESH_MENU - #define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Storage") -#endif -#ifndef MSG_UBL_STORAGE_SLOT - #define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") -#endif -#ifndef MSG_UBL_LOAD_MESH - #define MSG_UBL_LOAD_MESH _UxGT("Load Bed Mesh") -#endif -#ifndef MSG_UBL_SAVE_MESH - #define MSG_UBL_SAVE_MESH _UxGT("Save Bed Mesh") -#endif -#ifndef MSG_MESH_LOADED - #define MSG_MESH_LOADED _UxGT("Mesh %i Loaded") -#endif -#ifndef MSG_MESH_SAVED - #define MSG_MESH_SAVED _UxGT("Mesh %i Saved") -#endif -#ifndef MSG_UBL_NO_STORAGE - #define MSG_UBL_NO_STORAGE _UxGT("No Storage") -#endif -#ifndef MSG_UBL_SAVE_ERROR - #define MSG_UBL_SAVE_ERROR _UxGT("Err: UBL Save") -#endif -#ifndef MSG_UBL_RESTORE_ERROR - #define MSG_UBL_RESTORE_ERROR _UxGT("Err: UBL Restore") -#endif -#ifndef MSG_UBL_Z_OFFSET - #define MSG_UBL_Z_OFFSET _UxGT("Z-Offset: ") -#endif -#ifndef MSG_UBL_Z_OFFSET_STOPPED - #define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") -#endif -#ifndef MSG_UBL_STEP_BY_STEP_MENU - #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") -#endif + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Control"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Lights"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Light Presets"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Red"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Yellow"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Green"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blue"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Blue Intensity"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("White Intensity"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brightness"); -#ifndef MSG_LED_CONTROL - #define MSG_LED_CONTROL _UxGT("LED Control") -#endif -#ifndef MSG_LEDS - #define MSG_LEDS _UxGT("Lights") -#endif -#ifndef MSG_LED_PRESETS - #define MSG_LED_PRESETS _UxGT("Light Presets") -#endif -#ifndef MSG_SET_LEDS_RED - #define MSG_SET_LEDS_RED _UxGT("Red") -#endif -#ifndef MSG_SET_LEDS_ORANGE - #define MSG_SET_LEDS_ORANGE _UxGT("Orange") -#endif -#ifndef MSG_SET_LEDS_YELLOW - #define MSG_SET_LEDS_YELLOW _UxGT("Yellow") -#endif -#ifndef MSG_SET_LEDS_GREEN - #define MSG_SET_LEDS_GREEN _UxGT("Green") -#endif -#ifndef MSG_SET_LEDS_BLUE - #define MSG_SET_LEDS_BLUE _UxGT("Blue") -#endif -#ifndef MSG_SET_LEDS_INDIGO - #define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#endif -#ifndef MSG_SET_LEDS_VIOLET - #define MSG_SET_LEDS_VIOLET _UxGT("Violet") -#endif -#ifndef MSG_SET_LEDS_WHITE - #define MSG_SET_LEDS_WHITE _UxGT("White") -#endif -#ifndef MSG_SET_LEDS_DEFAULT - #define MSG_SET_LEDS_DEFAULT _UxGT("Default") -#endif -#ifndef MSG_CUSTOM_LEDS - #define MSG_CUSTOM_LEDS _UxGT("Custom Lights") -#endif -#ifndef MSG_INTENSITY_R - #define MSG_INTENSITY_R _UxGT("Red Intensity") -#endif -#ifndef MSG_INTENSITY_G - #define MSG_INTENSITY_G _UxGT("Green Intensity") -#endif -#ifndef MSG_INTENSITY_B - #define MSG_INTENSITY_B _UxGT("Blue Intensity") -#endif -#ifndef MSG_INTENSITY_W - #define MSG_INTENSITY_W _UxGT("White Intensity") -#endif -#ifndef MSG_LED_BRIGHTNESS - #define MSG_LED_BRIGHTNESS _UxGT("Brightness") -#endif + PROGMEM Language_Str MSG_MOVING = _UxGT("Moving..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Free XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Move X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Move Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Move Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extruder ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extruder ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extruder ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extruder ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extruder ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extruder ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend too cold"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Speed"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Nozzle ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Nozzle ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Nozzle ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Nozzle ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Nozzle ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Nozzle ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Fan Speed 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Fan Speed 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Fan Speed 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Extra Fan Speed 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Extra Fan Speed 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Extra Fan Speed 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flow ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flow ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flow ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flow ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flow ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flow ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); + PROGMEM Language_Str MSG_AUTOTUNE_PID = _UxGT("PID Autotune"); + PROGMEM Language_Str MSG_AUTOTUNE_PID_E0 = _UxGT("PID Autotune ") LCD_STR_E0; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E1 = _UxGT("PID Autotune ") LCD_STR_E1; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E2 = _UxGT("PID Autotune ") LCD_STR_E2; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E3 = _UxGT("PID Autotune ") LCD_STR_E3; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E4 = _UxGT("PID Autotune ") LCD_STR_E4; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E5 = _UxGT("PID Autotune ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Select"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Select ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Select ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Select ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Select ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Select ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Select ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); + PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocity"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vmax ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vmax ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vmax ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vmax ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vmax ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vmax ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleration"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Amax ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Amax ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Amax ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Amax ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Amax ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Amax ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Retract"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Travel"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("steps/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("steps/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Esteps/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("steps/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Unload mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Load mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Advance K ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Advance K ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Advance K ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Advance K ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Advance K ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Advance K ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Contrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Store Settings"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Load Settings"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Restore failsafe"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Update"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset Printer"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info Screen"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepare"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Tune"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Print"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Next"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Print"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancel"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Done"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Outage Recovery"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print from Media"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No Media"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Sleep..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Click to Resume..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Print Paused"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Printing..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print Aborted"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("No Move."); + PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Tool Change"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Prime Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Retract Speed"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Change Filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Change Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Change Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Change Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Change Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Change Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Change Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Load Filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Load Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Load Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Load Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Load Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Load Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Load Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Unload Filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Unload Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Unload Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Unload Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Unload Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Unload Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Unload Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Unload All"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Init. Media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Change Media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Release Media"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s First"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: MAXTEMP BED"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY First"); + PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Heating..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Cooling..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed Heating..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bed Cooling..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Settings"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Set Delta Height"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Probe Z-offset"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Height"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("About Printer"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Printer Info"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Point Leveling"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Linear Leveling"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruders"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON"); -#ifndef MSG_MOVING - #define MSG_MOVING _UxGT("Moving...") -#endif -#ifndef MSG_FREE_XY - #define MSG_FREE_XY _UxGT("Free XY") -#endif -#ifndef MSG_MOVE_X - #define MSG_MOVE_X _UxGT("Move X") -#endif -#ifndef MSG_MOVE_Y - #define MSG_MOVE_Y _UxGT("Move Y") -#endif -#ifndef MSG_MOVE_Z - #define MSG_MOVE_Z _UxGT("Move Z") -#endif -#ifndef MSG_MOVE_E - #define MSG_MOVE_E _UxGT("Extruder") -#endif -#ifndef MSG_HOTEND_TOO_COLD - #define MSG_HOTEND_TOO_COLD _UxGT("Hotend too cold") -#endif -#ifndef MSG_MOVE_Z_DIST - #define MSG_MOVE_Z_DIST _UxGT("Move %smm") -#endif -#ifndef MSG_MOVE_01MM - #define MSG_MOVE_01MM _UxGT("Move 0.1mm") -#endif -#ifndef MSG_MOVE_1MM - #define MSG_MOVE_1MM _UxGT("Move 1mm") -#endif -#ifndef MSG_MOVE_10MM - #define MSG_MOVE_10MM _UxGT("Move 10mm") -#endif -#ifndef MSG_SPEED - #define MSG_SPEED _UxGT("Speed") -#endif -#ifndef MSG_BED_Z - #define MSG_BED_Z _UxGT("Bed Z") -#endif -#ifndef MSG_NOZZLE - #define MSG_NOZZLE _UxGT("Nozzle") -#endif -#ifndef MSG_BED - #define MSG_BED _UxGT("Bed") -#endif -#ifndef MSG_CHAMBER - #define MSG_CHAMBER _UxGT("Enclosure") -#endif -#ifndef MSG_FAN_SPEED - #define MSG_FAN_SPEED _UxGT("Fan Speed") -#endif -#ifndef MSG_EXTRA_FAN_SPEED - #define MSG_EXTRA_FAN_SPEED _UxGT("Extra Fan Speed") -#endif -#ifndef MSG_FLOW - #define MSG_FLOW _UxGT("Flow") -#endif -#ifndef MSG_CONTROL - #define MSG_CONTROL _UxGT("Control") -#endif -#ifndef MSG_MIN - #define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#endif -#ifndef MSG_MAX - #define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#endif -#ifndef MSG_FACTOR - #define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#endif -#ifndef MSG_AUTOTEMP - #define MSG_AUTOTEMP _UxGT("Autotemp") -#endif -#ifndef MSG_LCD_ON - #define MSG_LCD_ON _UxGT("On") -#endif -#ifndef MSG_LCD_OFF - #define MSG_LCD_OFF _UxGT("Off") -#endif -#ifndef MSG_PID_P - #define MSG_PID_P _UxGT("PID-P") -#endif -#ifndef MSG_PID_I - #define MSG_PID_I _UxGT("PID-I") -#endif -#ifndef MSG_PID_D - #define MSG_PID_D _UxGT("PID-D") -#endif -#ifndef MSG_PID_C - #define MSG_PID_C _UxGT("PID-C") -#endif -#ifndef MSG_SELECT - #define MSG_SELECT _UxGT("Select") -#endif -#ifndef MSG_ACC - #define MSG_ACC _UxGT("Accel") -#endif -#ifndef MSG_JERK - #define MSG_JERK _UxGT("Jerk") -#endif -#if IS_KINEMATIC - #ifndef MSG_VA_JERK - #define MSG_VA_JERK _UxGT("Va-Jerk") - #endif - #ifndef MSG_VB_JERK - #define MSG_VB_JERK _UxGT("Vb-Jerk") - #endif - #ifndef MSG_VC_JERK - #define MSG_VC_JERK _UxGT("Vc-Jerk") - #endif -#else - #ifndef MSG_VA_JERK - #define MSG_VA_JERK _UxGT("Vx-Jerk") - #endif - #ifndef MSG_VB_JERK - #define MSG_VB_JERK _UxGT("Vy-Jerk") - #endif - #ifndef MSG_VC_JERK - #define MSG_VC_JERK _UxGT("Vz-Jerk") - #endif -#endif -#ifndef MSG_VE_JERK - #define MSG_VE_JERK _UxGT("Ve-Jerk") -#endif -#ifndef MSG_JUNCTION_DEVIATION - #define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") -#endif -#ifndef MSG_VELOCITY - #define MSG_VELOCITY _UxGT("Velocity") -#endif -#ifndef MSG_VMAX - #define MSG_VMAX _UxGT("Vmax ") -#endif -#ifndef MSG_VMIN - #define MSG_VMIN _UxGT("Vmin") -#endif -#ifndef MSG_VTRAV_MIN - #define MSG_VTRAV_MIN _UxGT("VTrav Min") -#endif -#ifndef MSG_ACCELERATION - #define MSG_ACCELERATION _UxGT("Acceleration") -#endif -#ifndef MSG_AMAX - #define MSG_AMAX _UxGT("Amax ") -#endif -#ifndef MSG_A_RETRACT - #define MSG_A_RETRACT _UxGT("A-Retract") -#endif -#ifndef MSG_A_TRAVEL - #define MSG_A_TRAVEL _UxGT("A-Travel") -#endif -#ifndef MSG_STEPS_PER_MM - #define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#endif -#if IS_KINEMATIC - #ifndef MSG_ASTEPS - #define MSG_ASTEPS _UxGT("Asteps/mm") - #endif - #ifndef MSG_BSTEPS - #define MSG_BSTEPS _UxGT("Bsteps/mm") - #endif - #ifndef MSG_CSTEPS - #define MSG_CSTEPS _UxGT("Csteps/mm") - #endif -#else - #ifndef MSG_ASTEPS - #define MSG_ASTEPS _UxGT("Xsteps/mm") - #endif - #ifndef MSG_BSTEPS - #define MSG_BSTEPS _UxGT("Ysteps/mm") - #endif - #ifndef MSG_CSTEPS - #define MSG_CSTEPS _UxGT("Zsteps/mm") - #endif -#endif -#ifndef MSG_ESTEPS - #define MSG_ESTEPS _UxGT("Esteps/mm") -#endif -#ifndef MSG_E1STEPS - #define MSG_E1STEPS _UxGT("E1steps/mm") -#endif -#ifndef MSG_E2STEPS - #define MSG_E2STEPS _UxGT("E2steps/mm") -#endif -#ifndef MSG_E3STEPS - #define MSG_E3STEPS _UxGT("E3steps/mm") -#endif -#ifndef MSG_E4STEPS - #define MSG_E4STEPS _UxGT("E4steps/mm") -#endif -#ifndef MSG_E5STEPS - #define MSG_E5STEPS _UxGT("E5steps/mm") -#endif -#ifndef MSG_E6STEPS - #define MSG_E6STEPS _UxGT("E6steps/mm") -#endif -#ifndef MSG_TEMPERATURE - #define MSG_TEMPERATURE _UxGT("Temperature") -#endif -#ifndef MSG_MOTION - #define MSG_MOTION _UxGT("Motion") -#endif -#ifndef MSG_FILAMENT - #define MSG_FILAMENT _UxGT("Filament") -#endif -#ifndef MSG_VOLUMETRIC_ENABLED - #define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm") MSG_CUBED -#endif -#ifndef MSG_FILAMENT_DIAM - #define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#endif -#ifndef MSG_FILAMENT_UNLOAD - #define MSG_FILAMENT_UNLOAD _UxGT("Unload mm") -#endif -#ifndef MSG_FILAMENT_LOAD - #define MSG_FILAMENT_LOAD _UxGT("Load mm") -#endif -#ifndef MSG_ADVANCE_K - #define MSG_ADVANCE_K _UxGT("Advance K") -#endif -#ifndef MSG_CONTRAST - #define MSG_CONTRAST _UxGT("LCD Contrast") -#endif -#ifndef MSG_STORE_EEPROM - #define MSG_STORE_EEPROM _UxGT("Store Settings") -#endif -#ifndef MSG_LOAD_EEPROM - #define MSG_LOAD_EEPROM _UxGT("Load Settings") -#endif -#ifndef MSG_RESTORE_FAILSAFE - #define MSG_RESTORE_FAILSAFE _UxGT("Restore failsafe") -#endif -#ifndef MSG_INIT_EEPROM - #define MSG_INIT_EEPROM _UxGT("Initialize EEPROM") -#endif -#ifndef MSG_MEDIA_UPDATE - #define MSG_MEDIA_UPDATE _UxGT("Media Update") -#endif -#ifndef MSG_RESET_PRINTER - #define MSG_RESET_PRINTER _UxGT("Reset Printer") -#endif -#ifndef MSG_REFRESH - #define MSG_REFRESH _UxGT("Refresh") -#endif -#ifndef MSG_WATCH - #define MSG_WATCH _UxGT("Info Screen") -#endif -#ifndef MSG_PREPARE - #define MSG_PREPARE _UxGT("Prepare") -#endif -#ifndef MSG_TUNE - #define MSG_TUNE _UxGT("Tune") -#endif -#ifndef MSG_START_PRINT - #define MSG_START_PRINT _UxGT("Start Print") -#endif -#ifndef MSG_BUTTON_NEXT - #define MSG_BUTTON_NEXT _UxGT("Next") -#endif -#ifndef MSG_BUTTON_INIT - #define MSG_BUTTON_INIT _UxGT("Init") -#endif -#ifndef MSG_BUTTON_STOP - #define MSG_BUTTON_STOP _UxGT("Stop") -#endif -#ifndef MSG_BUTTON_PRINT - #define MSG_BUTTON_PRINT _UxGT("Print") -#endif -#ifndef MSG_BUTTON_RESET - #define MSG_BUTTON_RESET _UxGT("Reset") -#endif -#ifndef MSG_BUTTON_CANCEL - #define MSG_BUTTON_CANCEL _UxGT("Cancel") -#endif -#ifndef MSG_BUTTON_DONE - #define MSG_BUTTON_DONE _UxGT("Done") -#endif -#ifndef MSG_PAUSE_PRINT - #define MSG_PAUSE_PRINT _UxGT("Pause Print") -#endif -#ifndef MSG_RESUME_PRINT - #define MSG_RESUME_PRINT _UxGT("Resume Print") -#endif -#ifndef MSG_STOP_PRINT - #define MSG_STOP_PRINT _UxGT("Stop Print") -#endif -#ifndef MSG_OUTAGE_RECOVERY - #define MSG_OUTAGE_RECOVERY _UxGT("Outage Recovery") -#endif -#ifndef MSG_MEDIA_MENU - #define MSG_MEDIA_MENU _UxGT("Print from Media") -#endif -#ifndef MSG_NO_MEDIA - #define MSG_NO_MEDIA _UxGT("No Media") -#endif -#ifndef MSG_DWELL - #define MSG_DWELL _UxGT("Sleep...") -#endif -#ifndef MSG_USERWAIT - #define MSG_USERWAIT _UxGT("Click to Resume...") -#endif -#ifndef MSG_PRINT_PAUSED - #define MSG_PRINT_PAUSED _UxGT("Print Paused") -#endif -#ifndef MSG_PRINTING - #define MSG_PRINTING _UxGT("Printing...") -#endif -#ifndef MSG_PRINT_ABORTED - #define MSG_PRINT_ABORTED _UxGT("Print Aborted") -#endif -#ifndef MSG_NO_MOVE - #define MSG_NO_MOVE _UxGT("No Move.") -#endif -#ifndef MSG_KILLED - #define MSG_KILLED _UxGT("KILLED. ") -#endif -#ifndef MSG_STOPPED - #define MSG_STOPPED _UxGT("STOPPED. ") -#endif -#ifndef MSG_CONTROL_RETRACT - #define MSG_CONTROL_RETRACT _UxGT("Retract mm") -#endif -#ifndef MSG_CONTROL_RETRACT_SWAP - #define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") -#endif -#ifndef MSG_CONTROL_RETRACTF - #define MSG_CONTROL_RETRACTF _UxGT("Retract V") -#endif -#ifndef MSG_CONTROL_RETRACT_ZHOP - #define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") -#endif -#ifndef MSG_CONTROL_RETRACT_RECOVER - #define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#endif -#ifndef MSG_CONTROL_RETRACT_RECOVER_SWAP - #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#endif -#ifndef MSG_CONTROL_RETRACT_RECOVERF - #define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#endif -#ifndef MSG_CONTROL_RETRACT_RECOVER_SWAPF - #define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#endif -#ifndef MSG_AUTORETRACT - #define MSG_AUTORETRACT _UxGT("AutoRetr.") -#endif -#ifndef MSG_FILAMENT_SWAP_LENGTH - #define MSG_FILAMENT_SWAP_LENGTH _UxGT("Swap Length") -#endif -#ifndef MSG_FILAMENT_PURGE_LENGTH - #define MSG_FILAMENT_PURGE_LENGTH _UxGT("Purge Length") -#endif -#ifndef MSG_TOOL_CHANGE - #define MSG_TOOL_CHANGE _UxGT("Tool Change") -#endif -#ifndef MSG_TOOL_CHANGE_ZLIFT - #define MSG_TOOL_CHANGE_ZLIFT _UxGT("Z Raise") -#endif -#ifndef MSG_SINGLENOZZLE_PRIME_SPD - #define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Prime Speed") -#endif -#ifndef MSG_SINGLENOZZLE_RETRACT_SPD - #define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Retract Speed") -#endif -#ifndef MSG_NOZZLE_STANDBY - #define MSG_NOZZLE_STANDBY _UxGT("Nozzle Standby") -#endif -#ifndef MSG_FILAMENTCHANGE - #define MSG_FILAMENTCHANGE _UxGT("Change Filament") -#endif -#ifndef MSG_FILAMENTLOAD - #define MSG_FILAMENTLOAD _UxGT("Load Filament") -#endif -#ifndef MSG_FILAMENTUNLOAD - #define MSG_FILAMENTUNLOAD _UxGT("Unload Filament") -#endif -#ifndef MSG_FILAMENTUNLOAD_ALL - #define MSG_FILAMENTUNLOAD_ALL _UxGT("Unload All") -#endif -#ifndef MSG_INIT_MEDIA - #define MSG_INIT_MEDIA _UxGT("Init. Media") -#endif -#ifndef MSG_CHANGE_MEDIA - #define MSG_CHANGE_MEDIA _UxGT("Change Media") -#endif -#ifndef MSG_RELEASE_MEDIA - #define MSG_RELEASE_MEDIA _UxGT("Release Media") -#endif -#ifndef MSG_ZPROBE_OUT - #define MSG_ZPROBE_OUT _UxGT("Z Probe Past Bed") -#endif -#ifndef MSG_SKEW_FACTOR - #define MSG_SKEW_FACTOR _UxGT("Skew Factor") -#endif -#ifndef MSG_BLTOUCH - #define MSG_BLTOUCH _UxGT("BLTouch") -#endif -#ifndef MSG_BLTOUCH_SELFTEST - #define MSG_BLTOUCH_SELFTEST _UxGT("Cmd: Self-Test") -#endif -#ifndef MSG_BLTOUCH_RESET - #define MSG_BLTOUCH_RESET _UxGT("Cmd: Reset") -#endif -#ifndef MSG_BLTOUCH_STOW - #define MSG_BLTOUCH_STOW _UxGT("Cmd: Stow") -#endif -#ifndef MSG_BLTOUCH_DEPLOY - #define MSG_BLTOUCH_DEPLOY _UxGT("Cmd: Deploy") -#endif -#ifndef MSG_BLTOUCH_SW_MODE - #define MSG_BLTOUCH_SW_MODE _UxGT("Cmd: SW-Mode") -#endif -#ifndef MSG_BLTOUCH_5V_MODE - #define MSG_BLTOUCH_5V_MODE _UxGT("Cmd: 5V-Mode") -#endif -#ifndef MSG_BLTOUCH_OD_MODE - #define MSG_BLTOUCH_OD_MODE _UxGT("Cmd: OD-Mode") -#endif -#ifndef MSG_BLTOUCH_MODE_STORE - #define MSG_BLTOUCH_MODE_STORE _UxGT("Cmd: Mode-Store") -#endif -#ifndef MSG_BLTOUCH_MODE_STORE_5V - #define MSG_BLTOUCH_MODE_STORE_5V _UxGT("Set BLTouch to 5V") -#endif -#ifndef MSG_BLTOUCH_MODE_STORE_OD - #define MSG_BLTOUCH_MODE_STORE_OD _UxGT("Set BLTouch to OD") -#endif -#ifndef MSG_BLTOUCH_MODE_ECHO - #define MSG_BLTOUCH_MODE_ECHO _UxGT("Report Drain") -#endif -#ifndef MSG_BLTOUCH_MODE_CHANGE - #define MSG_BLTOUCH_MODE_CHANGE _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?") -#endif -#ifndef MSG_TOUCHMI_PROBE - #define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#endif -#ifndef MSG_TOUCHMI_INIT - #define MSG_TOUCHMI_INIT _UxGT("Init TouchMI") -#endif -#ifndef MSG_TOUCHMI_ZTEST - #define MSG_TOUCHMI_ZTEST _UxGT("Z Offset Test") -#endif -#ifndef MSG_TOUCHMI_SAVE - #define MSG_TOUCHMI_SAVE _UxGT("Save") -#endif -#ifndef MSG_MANUAL_DEPLOY_TOUCHMI - #define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("Deploy TouchMI") -#endif -#ifndef MSG_MANUAL_DEPLOY - #define MSG_MANUAL_DEPLOY _UxGT("Deploy Z-Probe") -#endif -#ifndef MSG_MANUAL_STOW - #define MSG_MANUAL_STOW _UxGT("Stow Z-Probe") -#endif -#ifndef MSG_HOME_FIRST - #define MSG_HOME_FIRST _UxGT("Home %s%s%s First") -#endif -#ifndef MSG_ZPROBE_ZOFFSET - #define MSG_ZPROBE_ZOFFSET _UxGT("Probe Z Offset") -#endif -#ifndef MSG_BABYSTEP_X - #define MSG_BABYSTEP_X _UxGT("Babystep X") -#endif -#ifndef MSG_BABYSTEP_Y - #define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#endif -#ifndef MSG_BABYSTEP_Z - #define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#endif -#ifndef MSG_BABYSTEP_TOTAL - #define MSG_BABYSTEP_TOTAL _UxGT("Total") -#endif -#ifndef MSG_ENDSTOP_ABORT - #define MSG_ENDSTOP_ABORT _UxGT("Endstop Abort") -#endif -#ifndef MSG_HEATING_FAILED_LCD - #define MSG_HEATING_FAILED_LCD _UxGT("Heating Failed") -#endif -#ifndef MSG_HEATING_FAILED_LCD_BED - #define MSG_HEATING_FAILED_LCD_BED _UxGT("Bed Heating Failed") -#endif -#ifndef MSG_HEATING_FAILED_LCD_CHAMBER - #define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Chamber Heating Fail") -#endif -#ifndef MSG_ERR_REDUNDANT_TEMP - #define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") -#endif -#ifndef MSG_THERMAL_RUNAWAY - #define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") -#endif -#ifndef MSG_THERMAL_RUNAWAY_BED - #define MSG_THERMAL_RUNAWAY_BED _UxGT("BED THERMAL RUNAWAY") -#endif -#ifndef MSG_THERMAL_RUNAWAY_CHAMBER - #define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("CHAMBER T. RUNAWAY") -#endif -#ifndef MSG_ERR_MAXTEMP - #define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP") -#endif -#ifndef MSG_ERR_MINTEMP - #define MSG_ERR_MINTEMP _UxGT("Err: MINTEMP") -#endif -#ifndef MSG_ERR_MAXTEMP_BED - #define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") -#endif -#ifndef MSG_ERR_MINTEMP_BED - #define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") -#endif -#ifndef MSG_ERR_MAXTEMP_CHAMBER - #define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err: MAXTEMP CHAMBER") -#endif -#ifndef MSG_ERR_MINTEMP_CHAMBER - #define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err: MINTEMP CHAMBER") -#endif -#ifndef MSG_ERR_Z_HOMING - #define MSG_ERR_Z_HOMING _UxGT("Home XY First") -#endif -#ifndef MSG_HALTED - #define MSG_HALTED _UxGT("PRINTER HALTED") -#endif -#ifndef MSG_PLEASE_RESET - #define MSG_PLEASE_RESET _UxGT("Please Reset") -#endif -#ifndef MSG_SHORT_DAY - #define MSG_SHORT_DAY _UxGT("d") // One character only -#endif -#ifndef MSG_SHORT_HOUR - #define MSG_SHORT_HOUR _UxGT("h") // One character only -#endif -#ifndef MSG_SHORT_MINUTE - #define MSG_SHORT_MINUTE _UxGT("m") // One character only -#endif -#ifndef MSG_HEATING - #define MSG_HEATING _UxGT("Heating...") -#endif -#ifndef MSG_COOLING - #define MSG_COOLING _UxGT("Cooling...") -#endif -#ifndef MSG_BED_HEATING - #define MSG_BED_HEATING _UxGT("Bed Heating...") -#endif -#ifndef MSG_BED_COOLING - #define MSG_BED_COOLING _UxGT("Bed Cooling...") -#endif -#ifndef MSG_CHAMBER_HEATING - #define MSG_CHAMBER_HEATING _UxGT("Chamber Heating...") -#endif -#ifndef MSG_CHAMBER_COOLING - #define MSG_CHAMBER_COOLING _UxGT("Chamber Cooling...") -#endif -#ifndef MSG_DELTA_CALIBRATE - #define MSG_DELTA_CALIBRATE _UxGT("Delta Calibration") -#endif -#ifndef MSG_DELTA_CALIBRATE_X - #define MSG_DELTA_CALIBRATE_X _UxGT("Calibrate X") -#endif -#ifndef MSG_DELTA_CALIBRATE_Y - #define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrate Y") -#endif -#ifndef MSG_DELTA_CALIBRATE_Z - #define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrate Z") -#endif -#ifndef MSG_DELTA_CALIBRATE_CENTER - #define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrate Center") -#endif -#ifndef MSG_DELTA_SETTINGS - #define MSG_DELTA_SETTINGS _UxGT("Delta Settings") -#endif -#ifndef MSG_DELTA_AUTO_CALIBRATE - #define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibration") -#endif -#ifndef MSG_DELTA_HEIGHT_CALIBRATE - #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Set Delta Height") -#endif -#ifndef MSG_DELTA_Z_OFFSET_CALIBRATE - #define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Probe Z-offset") -#endif -#ifndef MSG_DELTA_DIAG_ROD - #define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") -#endif -#ifndef MSG_DELTA_HEIGHT - #define MSG_DELTA_HEIGHT _UxGT("Height") -#endif -#ifndef MSG_DELTA_RADIUS - #define MSG_DELTA_RADIUS _UxGT("Radius") -#endif -#ifndef MSG_INFO_MENU - #define MSG_INFO_MENU _UxGT("About Printer") -#endif -#ifndef MSG_INFO_PRINTER_MENU - #define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") -#endif -#ifndef MSG_3POINT_LEVELING - #define MSG_3POINT_LEVELING _UxGT("3-Point Leveling") -#endif -#ifndef MSG_LINEAR_LEVELING - #define MSG_LINEAR_LEVELING _UxGT("Linear Leveling") -#endif -#ifndef MSG_BILINEAR_LEVELING - #define MSG_BILINEAR_LEVELING _UxGT("Bilinear Leveling") -#endif -#ifndef MSG_UBL_LEVELING - #define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -#endif -#ifndef MSG_MESH_LEVELING - #define MSG_MESH_LEVELING _UxGT("Mesh Leveling") -#endif -#ifndef MSG_INFO_STATS_MENU - #define MSG_INFO_STATS_MENU _UxGT("Printer Stats") -#endif -#ifndef MSG_INFO_BOARD_MENU - #define MSG_INFO_BOARD_MENU _UxGT("Board Info") -#endif -#ifndef MSG_INFO_THERMISTOR_MENU - #define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -#endif -#ifndef MSG_INFO_EXTRUDERS - #define MSG_INFO_EXTRUDERS _UxGT("Extruders") -#endif -#ifndef MSG_INFO_BAUDRATE - #define MSG_INFO_BAUDRATE _UxGT("Baud") -#endif -#ifndef MSG_INFO_PROTOCOL - #define MSG_INFO_PROTOCOL _UxGT("Protocol") -#endif -#ifndef MSG_CASE_LIGHT - #define MSG_CASE_LIGHT _UxGT("Case Light") -#endif -#ifndef MSG_CASE_LIGHT_BRIGHTNESS - #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Light Brightness") -#endif + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case Light"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness"); + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER"); -#ifndef MSG_EXPECTED_PRINTER - #define MSG_EXPECTED_PRINTER _UxGT("INCORRECT PRINTER") -#endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Print Count"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print time"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded"); + #endif -#if LCD_WIDTH >= 20 - #ifndef MSG_INFO_PRINT_COUNT - #define MSG_INFO_PRINT_COUNT _UxGT("Print Count") - #endif - #ifndef MSG_INFO_COMPLETED_PRINTS - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") - #endif - #ifndef MSG_INFO_PRINT_TIME - #define MSG_INFO_PRINT_TIME _UxGT("Total Print time") - #endif - #ifndef MSG_INFO_PRINT_LONGEST - #define MSG_INFO_PRINT_LONGEST _UxGT("Longest Job Time") - #endif - #ifndef MSG_INFO_PRINT_FILAMENT - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded Total") - #endif -#else - #ifndef MSG_INFO_PRINT_COUNT - #define MSG_INFO_PRINT_COUNT _UxGT("Prints") - #endif - #ifndef MSG_INFO_COMPLETED_PRINTS - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") - #endif - #ifndef MSG_INFO_PRINT_TIME - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #endif - #ifndef MSG_INFO_PRINT_LONGEST - #define MSG_INFO_PRINT_LONGEST _UxGT("Longest") - #endif - #ifndef MSG_INFO_PRINT_FILAMENT - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded") - #endif -#endif -#ifndef MSG_INFO_MIN_TEMP - #define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#endif -#ifndef MSG_INFO_MAX_TEMP - #define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#endif -#ifndef MSG_INFO_PSU - #define MSG_INFO_PSU _UxGT("PSU") -#endif -#ifndef MSG_DRIVE_STRENGTH - #define MSG_DRIVE_STRENGTH _UxGT("Drive Strength") -#endif -#ifndef MSG_DAC_PERCENT - #define MSG_DAC_PERCENT _UxGT("Driver %") -#endif -#ifndef MSG_ERROR_TMC - #define MSG_ERROR_TMC _UxGT("TMC CONNECTION ERROR") -#endif -#ifndef MSG_DAC_EEPROM_WRITE - #define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") -#endif -#ifndef MSG_FILAMENT_CHANGE_HEADER_PAUSE - #define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("PRINT PAUSED") -#endif -#ifndef MSG_FILAMENT_CHANGE_HEADER_LOAD - #define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("LOAD FILAMENT") -#endif -#ifndef MSG_FILAMENT_CHANGE_HEADER_UNLOAD - #define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("UNLOAD FILAMENT") -#endif -#ifndef MSG_FILAMENT_CHANGE_OPTION_HEADER - #define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("RESUME OPTIONS:") -#endif -#ifndef MSG_FILAMENT_CHANGE_OPTION_PURGE - #define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purge more") -#endif -#ifndef MSG_FILAMENT_CHANGE_OPTION_RESUME - #define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continue") -#endif -#ifndef MSG_FILAMENT_CHANGE_NOZZLE - #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozzle: ") -#endif -#ifndef MSG_RUNOUT_SENSOR - #define MSG_RUNOUT_SENSOR _UxGT("Runout Sensor") -#endif -#ifndef MSG_RUNOUT_DISTANCE_MM - #define MSG_RUNOUT_DISTANCE_MM _UxGT("Runout Dist mm") -#endif -#ifndef MSG_ERR_HOMING_FAILED - #define MSG_ERR_HOMING_FAILED _UxGT("Homing Failed") -#endif -#ifndef MSG_ERR_PROBING_FAILED - #define MSG_ERR_PROBING_FAILED _UxGT("Probing Failed") -#endif -#ifndef MSG_M600_TOO_COLD - #define MSG_M600_TOO_COLD _UxGT("M600: Too Cold") -#endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Drive Strength"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Homing Failed"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Too Cold"); -#ifndef MSG_MMU2_FILAMENT_CHANGE_HEADER - #define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("FILAMENT CHANGE") -#endif -#ifndef MSG_MMU2_CHOOSE_FILAMENT_HEADER - #define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("CHOOSE FILAMENT") -#endif -#ifndef MSG_MMU2_MENU - #define MSG_MMU2_MENU _UxGT("MMU") -#endif -#ifndef MSG_MMU2_WRONG_FIRMWARE - #define MSG_MMU2_WRONG_FIRMWARE _UxGT("Update MMU Firmware!") -#endif -#ifndef MSG_MMU2_NOT_RESPONDING - #define MSG_MMU2_NOT_RESPONDING _UxGT("MMU Needs Attention.") -#endif -#ifndef MSG_MMU2_RESUME - #define MSG_MMU2_RESUME _UxGT("Resume Print") -#endif -#ifndef MSG_MMU2_RESUMING - #define MSG_MMU2_RESUMING _UxGT("Resuming...") -#endif -#ifndef MSG_MMU2_LOAD_FILAMENT - #define MSG_MMU2_LOAD_FILAMENT _UxGT("Load Filament") -#endif -#ifndef MSG_MMU2_LOAD_ALL - #define MSG_MMU2_LOAD_ALL _UxGT("Load All") -#endif -#ifndef MSG_MMU2_LOAD_TO_NOZZLE - #define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Load to Nozzle") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT - #define MSG_MMU2_EJECT_FILAMENT _UxGT("Eject Filament") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT0 - #define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Eject Filament 1") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT1 - #define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Eject Filament 2") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT2 - #define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Eject Filament 3") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT3 - #define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Eject Filament 4") -#endif -#ifndef MSG_MMU2_EJECT_FILAMENT4 - #define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Eject Filament 5") -#endif -#ifndef MSG_MMU2_UNLOAD_FILAMENT - #define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Unload Filament") -#endif -#ifndef MSG_MMU2_LOADING_FILAMENT - #define MSG_MMU2_LOADING_FILAMENT _UxGT("Loading Fil. %i...") -#endif -#ifndef MSG_MMU2_EJECTING_FILAMENT - #define MSG_MMU2_EJECTING_FILAMENT _UxGT("Ejecting Fil. ...") -#endif -#ifndef MSG_MMU2_UNLOADING_FILAMENT - #define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Unloading Fil....") -#endif -#ifndef MSG_MMU2_ALL - #define MSG_MMU2_ALL _UxGT("All") -#endif -#ifndef MSG_MMU2_FILAMENT0 - #define MSG_MMU2_FILAMENT0 _UxGT("Filament 1") -#endif -#ifndef MSG_MMU2_FILAMENT1 - #define MSG_MMU2_FILAMENT1 _UxGT("Filament 2") -#endif -#ifndef MSG_MMU2_FILAMENT2 - #define MSG_MMU2_FILAMENT2 _UxGT("Filament 3") -#endif -#ifndef MSG_MMU2_FILAMENT3 - #define MSG_MMU2_FILAMENT3 _UxGT("Filament 4") -#endif -#ifndef MSG_MMU2_FILAMENT4 - #define MSG_MMU2_FILAMENT4 _UxGT("Filament 5") -#endif -#ifndef MSG_MMU2_RESET - #define MSG_MMU2_RESET _UxGT("Reset MMU") -#endif -#ifndef MSG_MMU2_RESETTING - #define MSG_MMU2_RESETTING _UxGT("Resetting MMU...") -#endif -#ifndef MSG_MMU2_EJECT_RECOVER - #define MSG_MMU2_EJECT_RECOVER _UxGT("Remove, click") -#endif + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Update MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Resume Print"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Resuming..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Load Filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Load All"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Load to Nozzle"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Eject Filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Eject Filament 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Eject Filament 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Eject Filament 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Eject Filament 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Eject Filament 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Unload Filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("All"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reset MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetting MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click"); -#ifndef MSG_MIX - #define MSG_MIX _UxGT("Mix") -#endif -#ifndef MSG_MIX_COMPONENT - #define MSG_MIX_COMPONENT _UxGT("Component") -#endif -#ifndef MSG_MIXER - #define MSG_MIXER _UxGT("Mixer") -#endif -#ifndef MSG_GRADIENT - #define MSG_GRADIENT _UxGT("Gradient") -#endif -#ifndef MSG_FULL_GRADIENT - #define MSG_FULL_GRADIENT _UxGT("Full Gradient") -#endif -#ifndef MSG_TOGGLE_MIX - #define MSG_TOGGLE_MIX _UxGT("Toggle Mix") -#endif -#ifndef MSG_CYCLE_MIX - #define MSG_CYCLE_MIX _UxGT("Cycle Mix") -#endif -#ifndef MSG_GRADIENT_MIX - #define MSG_GRADIENT_MIX _UxGT("Gradient Mix") -#endif -#ifndef MSG_REVERSE_GRADIENT - #define MSG_REVERSE_GRADIENT _UxGT("Reverse Gradient") -#endif -#ifndef MSG_ACTIVE_VTOOL - #define MSG_ACTIVE_VTOOL _UxGT("Active V-tool") -#endif -#ifndef MSG_START_VTOOL - #define MSG_START_VTOOL _UxGT("Start V-tool") -#endif -#ifndef MSG_END_VTOOL - #define MSG_END_VTOOL _UxGT(" End V-tool") -#endif -#ifndef MSG_GRADIENT_ALIAS - #define MSG_GRADIENT_ALIAS _UxGT("Alias V-tool") -#endif -#ifndef MSG_RESET_VTOOLS - #define MSG_RESET_VTOOLS _UxGT("Reset V-tools") -#endif -#ifndef MSG_COMMIT_VTOOL - #define MSG_COMMIT_VTOOL _UxGT("Commit V-tool Mix") -#endif -#ifndef MSG_VTOOLS_RESET - #define MSG_VTOOLS_RESET _UxGT("V-tools Were Reset") -#endif -#ifndef MSG_START_Z - #define MSG_START_Z _UxGT("Start Z") -#endif -#ifndef MSG_END_Z - #define MSG_END_Z _UxGT(" End Z") -#endif + PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Component 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Component 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Component 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Component 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Component 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Component 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Full Gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle Mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" End V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" End Z:"); -#ifndef MSG_GAMES - #define MSG_GAMES _UxGT("Games") -#endif -#ifndef MSG_BRICKOUT - #define MSG_BRICKOUT _UxGT("Brickout") -#endif -#ifndef MSG_INVADERS - #define MSG_INVADERS _UxGT("Invaders") -#endif -#ifndef MSG_SNAKE - #define MSG_SNAKE _UxGT("Sn4k3") -#endif -#ifndef MSG_MAZE - #define MSG_MAZE _UxGT("Maze") -#endif + PROGMEM Language_Str MSG_GAMES = _UxGT("Games"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - #ifndef MSG_ADVANCED_PAUSE_WAITING_1 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Press Button") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("to resume print") - #endif - #ifndef MSG_PAUSE_PRINT_INIT_1 - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parking...") - #endif - #ifndef MSG_FILAMENT_CHANGE_INIT_1 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wait for") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filament change") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("to start") - #endif - #ifndef MSG_FILAMENT_CHANGE_INSERT_1 - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("and press button") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("to continue") - #endif - #ifndef MSG_FILAMENT_CHANGE_HEAT_1 - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Press button") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("to heat nozzle") - #endif - #ifndef MSG_FILAMENT_CHANGE_HEATING_1 - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nozzle heating") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Please wait...") - #endif - #ifndef MSG_FILAMENT_CHANGE_UNLOAD_1 - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wait for") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") - #endif - #ifndef MSG_FILAMENT_CHANGE_LOAD_1 - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wait for") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") - #endif - #ifndef MSG_FILAMENT_CHANGE_PURGE_1 - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Wait for") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("filament purge") - #endif - #ifndef MSG_FILAMENT_CHANGE_CONT_PURGE_1 - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Click to finish") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("filament purge") - #endif - #ifndef MSG_FILAMENT_CHANGE_RESUME_1 - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume...") - #endif -#else // LCD_HEIGHT < 4 - #ifndef MSG_ADVANCED_PAUSE_WAITING_1 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Click to continue") - #endif - #ifndef MSG_PAUSE_PRINT_INIT_1 - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parking...") - #endif - #ifndef MSG_FILAMENT_CHANGE_INIT_1 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Please wait...") - #endif - #ifndef MSG_FILAMENT_CHANGE_INSERT_1 - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") - #endif - #ifndef MSG_FILAMENT_CHANGE_HEAT_1 - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Click to heat") - #endif - #ifndef MSG_FILAMENT_CHANGE_HEATING_1 - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating...") - #endif - #ifndef MSG_FILAMENT_CHANGE_UNLOAD_1 - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...") - #endif - #ifndef MSG_FILAMENT_CHANGE_LOAD_1 - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Loading...") - #endif - #ifndef MSG_FILAMENT_CHANGE_PURGE_1 - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purging...") - #endif - #ifndef MSG_FILAMENT_CHANGE_CONT_PURGE_1 - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Click to finish") - #endif - #ifndef MSG_FILAMENT_CHANGE_RESUME_1 - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Resuming...") - #endif -#endif // LCD_HEIGHT < 4 + #define MSG_1_LINE(A) A "\0" "\0" + #define MSG_2_LINE(A,B) A "\0" B "\0" + #define MSG_3_LINE(A,B,C) A "\0" B "\0" C -#ifndef MSG_TMC_DRIVERS - #define MSG_TMC_DRIVERS _UxGT("TMC Drivers") -#endif -#ifndef MSG_TMC_CURRENT - #define MSG_TMC_CURRENT _UxGT("Driver Current") -#endif -#ifndef MSG_TMC_HYBRID_THRS - #define MSG_TMC_HYBRID_THRS _UxGT("Hybrid Threshold") -#endif -#ifndef MSG_TMC_HOMING_THRS - #define MSG_TMC_HOMING_THRS _UxGT("Sensorless Homing") -#endif -#ifndef MSG_TMC_STEPPING_MODE - #define MSG_TMC_STEPPING_MODE _UxGT("Stepping Mode") -#endif -#ifndef MSG_TMC_STEALTH_ENABLED - #define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop Enabled") -#endif - -#ifndef MSG_SERVICE_RESET - #define MSG_SERVICE_RESET _UxGT("Reset") -#endif -#ifndef MSG_SERVICE_IN - #define MSG_SERVICE_IN _UxGT(" in:") -#endif - -#ifndef MSG_BACKLASH - #define MSG_BACKLASH _UxGT("Backlash") -#endif -#ifndef MSG_BACKLASH_CORRECTION - #define MSG_BACKLASH_CORRECTION _UxGT("Correction") -#endif -#ifndef MSG_BACKLASH_SMOOTHING - #define MSG_BACKLASH_SMOOTHING _UxGT("Smoothing") -#endif + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Press Button", "to resume print")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wait for", "filament change", "to start")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Please wait...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click to heat")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heating...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejecting...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Loading...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Current"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); +} diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index e38390b3f9..9c33add941 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -29,536 +29,606 @@ * */ -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT ("¡¿ªáéíóúÁÉÍÓÚ") #define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" lista") -#define MSG_YES _UxGT("SI") -#define MSG_NO _UxGT("NO") -#define MSG_BACK _UxGT("Atrás") -#define MSG_MEDIA_ABORTING _UxGT("Cancelando...") -#define MSG_MEDIA_INSERTED _UxGT("SD/USB insertado") -#define MSG_MEDIA_REMOVED _UxGT("SD/USB retirado") -#define MSG_MEDIA_RELEASED _UxGT("SD/USB lanzado") -#define MSG_MEDIA_WAITING _UxGT("Esperando al SD/USB") -#define MSG_MEDIA_READ_ERROR _UxGT("Error lectura SD/USB") -#define MSG_MEDIA_USB_REMOVED _UxGT("Disp. USB retirado") -#define MSG_MEDIA_USB_FAILED _UxGT("Inicio USB fallido") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Endstops") -#define MSG_MAIN _UxGT("Menú principal") -#define MSG_ADVANCED_SETTINGS _UxGT("Ajustes avanzados") -#define MSG_CONFIGURATION _UxGT("Configuración") -#define MSG_AUTOSTART _UxGT("Inicio automático") -#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") -#define MSG_DEBUG_MENU _UxGT("Menú depuración") -#define MSG_PROGRESS_BAR_TEST _UxGT("Prob. barra progreso") -#define MSG_AUTO_HOME _UxGT("Llevar al origen") -#define MSG_AUTO_HOME_X _UxGT("Origen X") -#define MSG_AUTO_HOME_Y _UxGT("Origen Y") -#define MSG_AUTO_HOME_Z _UxGT("Origen Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Auto alineado Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Pulsar para comenzar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Siguiente punto") -#define MSG_LEVEL_BED_DONE _UxGT("¡Nivelación lista!") -#define MSG_Z_FADE_HEIGHT _UxGT("Compensación Altura") -#define MSG_SET_HOME_OFFSETS _UxGT("Ajustar desfases") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicada") -#define MSG_SET_ORIGIN _UxGT("Establecer origen") -#define MSG_PREHEAT_1 _UxGT("Precalentar " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Todo") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Fin") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Cama") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Ajuste") -#define MSG_PREHEAT_2 _UxGT("Precalentar" PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Todo") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Fin") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Cama") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Ajuste") -#define MSG_PREHEAT_CUSTOM _UxGT("Precalen. Personali.") -#define MSG_COOLDOWN _UxGT("Enfriar") -#define MSG_LASER_MENU _UxGT("Control Láser") -#define MSG_LASER_OFF _UxGT("Láser Apagado") -#define MSG_LASER_ON _UxGT("Láser Encendido") -#define MSG_LASER_POWER _UxGT("Potencia Láser") -#define MSG_SPINDLE_MENU _UxGT("Control Mandrino") -#define MSG_SPINDLE_OFF _UxGT("Mandrino Apagado") -#define MSG_SPINDLE_ON _UxGT("Mandrino Encendido") -#define MSG_SPINDLE_POWER _UxGT("Potencia Mandrino") -#define MSG_SPINDLE_REVERSE _UxGT("Invertir giro") -#define MSG_SWITCH_PS_ON _UxGT("Encender Fuente") -#define MSG_SWITCH_PS_OFF _UxGT("Apagar Fuente") -#define MSG_EXTRUDE _UxGT("Extruir") -#define MSG_RETRACT _UxGT("Retraer") -#define MSG_MOVE_AXIS _UxGT("Mover ejes") -#define MSG_BED_LEVELING _UxGT("Nivelando Cama") -#define MSG_LEVEL_BED _UxGT("Nivelar Cama") -#define MSG_LEVEL_CORNERS _UxGT("Nivelar Esquinas") -#define MSG_NEXT_CORNER _UxGT("Siguente Esquina") -#define MSG_MESH_EDITOR _UxGT("Editor Mallado") -#define MSG_EDIT_MESH _UxGT("Editar Mallado") -#define MSG_EDITING_STOPPED _UxGT("Ed. Mallado parada") -#define MSG_PROBING_MESH _UxGT("Sondear Punto") -#define MSG_MESH_X _UxGT("Índice X") -#define MSG_MESH_Y _UxGT("Índice Y") -#define MSG_MESH_EDIT_Z _UxGT("Valor Z") -#define MSG_USER_MENU _UxGT("Comandos Personaliz.") -#define MSG_M48_TEST _UxGT("M48 Probar Sonda") -#define MSG_M48_POINT _UxGT("M48 Punto") -#define MSG_M48_DEVIATION _UxGT("Desviación") -#define MSG_IDEX_MENU _UxGT("Modo IDEX") -#define MSG_OFFSETS_MENU _UxGT("Desfase Boquillas") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Aparcado") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplicar") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Copia Reflejada") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Control Total") -#define MSG_X_OFFSET _UxGT("2ª Boquilla X") -#define MSG_Y_OFFSET _UxGT("2ª Boquilla Y") -#define MSG_Z_OFFSET _UxGT("2ª Boquilla Z") -#define MSG_UBL_DOING_G29 _UxGT("Hacer G29") -#define MSG_UBL_TOOLS _UxGT("Herramientas UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Nivel.Cama.Uni.(UBL)") -#define MSG_LCD_TILTING_MESH _UxGT("Punto de inclinación") -#define MSG_UBL_MANUAL_MESH _UxGT("Crear Mallado man.") -#define MSG_UBL_BC_INSERT _UxGT("Colocar cuña y Medir") -#define MSG_UBL_BC_INSERT2 _UxGT("Medir") -#define MSG_UBL_BC_REMOVE _UxGT("Retirar y Medir Cama") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Mover al Siguente") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Activar UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Desactivar UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Temp. Cama") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT ("Hotend Temp") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Editar Mallado") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit. Mallado perso.") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ajuste fino Mallado") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Term. edici. Mallado") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Crear Mallado Perso.") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Crear Mallado") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Crear Mallado (" PREHEAT_1_LABEL ")") -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Crear Mallado (" PREHEAT_2_LABEL ")") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Crear Mallado Frío") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajustar alt. Mallado") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Cantidad de altura") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validar Mallado") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Validar Mallado (" PREHEAT_1_LABEL ")") -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Validar Mallado (" PREHEAT_2_LABEL ")") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Vali. Mallado perso.") -#define MSG_G26_HEATING_BED _UxGT("G26 Calentando Cama") -#define MSG_G26_HEATING_NOZZLE _UxGT("G26 Calent. Boquilla") -#define MSG_G26_MANUAL_PRIME _UxGT("Imprimado manual...") -#define MSG_G26_FIXED_LENGTH _UxGT("Impri. longit. fija") -#define MSG_G26_PRIME_DONE _UxGT("Imprimación Lista") -#define MSG_G26_CANCELED _UxGT("G26 Cancelado") -#define MSG_G26_LEAVING _UxGT("Dejando G26") -#define MSG_UBL_CONTINUE_MESH _UxGT("Contin. Mallado cama") -#define MSG_UBL_MESH_LEVELING _UxGT("Nivelando Mallado") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelando 3Puntos") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivel. Mallado cuad.") -#define MSG_UBL_MESH_LEVEL _UxGT("Nivel de Mallado") -#define MSG_UBL_SIDE_POINTS _UxGT("Puntos Laterales") -#define MSG_UBL_MAP_TYPE _UxGT("Tipo de mapa ") -#define MSG_UBL_OUTPUT_MAP _UxGT("Salida Mapa mallado") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Salida para el host") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Salida para CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") -#define MSG_UBL_INFO_UBL _UxGT("Salida Info. UBL") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Cantidad de relleno") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Relleno manual") -#define MSG_UBL_SMART_FILLIN _UxGT("Relleno inteligente") -#define MSG_UBL_FILLIN_MESH _UxGT("Mallado de relleno") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidar todo") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar proximos") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ajustar Fino Todo") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajustar Fino proxi.") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Almacen de Mallado") -#define MSG_UBL_STORAGE_SLOT _UxGT("Huecos de memoria") -#define MSG_UBL_LOAD_MESH _UxGT("Cargar Mallado cama") -#define MSG_UBL_SAVE_MESH _UxGT("Guardar Mallado cama") -#define MSG_MESH_LOADED _UxGT("Mallado %i Cargado") -#define MSG_MESH_SAVED _UxGT("Mallado %i Guardado") -#define MSG_UBL_NO_STORAGE _UxGT("Sin guardar") -#define MSG_UBL_SAVE_ERROR _UxGT("Error: Guardar UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Error: Restaurar UBL") -#define MSG_UBL_Z_OFFSET _UxGT("Desfase de Z: ") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Desfase de Z Parado") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Paso a Paso") +namespace Language_es { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_LED_CONTROL _UxGT("Control LED") -#define MSG_LEDS _UxGT("Luzes") -#define MSG_LED_PRESETS _UxGT("Luz predefinida") -#define MSG_SET_LEDS_RED _UxGT("Rojo") -#define MSG_SET_LEDS_ORANGE _UxGT("Naranja") -#define MSG_SET_LEDS_YELLOW _UxGT("Amarillo") -#define MSG_SET_LEDS_GREEN _UxGT("Verde") -#define MSG_SET_LEDS_BLUE _UxGT("Azul") -#define MSG_SET_LEDS_INDIGO _UxGT("Índigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Violeta") -#define MSG_SET_LEDS_WHITE _UxGT("Blanco") -#define MSG_SET_LEDS_DEFAULT _UxGT("Por defecto") -#define MSG_CUSTOM_LEDS _UxGT("Luces personalizadas") -#define MSG_INTENSITY_R _UxGT("Intensidad Rojo") -#define MSG_INTENSITY_G _UxGT("Intensidad Verde") -#define MSG_INTENSITY_B _UxGT("Intensidad Azul") -#define MSG_INTENSITY_W _UxGT("Intensidad Blanco") -#define MSG_LED_BRIGHTNESS _UxGT("Brillo") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Spanish"); -#define MSG_MOVING _UxGT("Moviendo...") -#define MSG_FREE_XY _UxGT("Libre XY") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_HOTEND_TOO_COLD _UxGT("Hotend muy frio") -#define MSG_MOVE_Z_DIST _UxGT("Mover %smm") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidad") -#define MSG_BED_Z _UxGT("Cama Z") -#define MSG_NOZZLE _UxGT("Boquilla") -#define MSG_BED _UxGT("Cama") -#define MSG_CHAMBER _UxGT("Recinto") -#define MSG_FAN_SPEED _UxGT("Ventilador") -#define MSG_EXTRA_FAN_SPEED _UxGT("Vel. Ext. ventilador") -#define MSG_FLOW _UxGT("Flujo") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") -#define MSG_LCD_ON _UxGT("Encender") -#define MSG_LCD_OFF _UxGT("Apagar") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Seleccionar") -#define MSG_ACC _UxGT("Aceleración") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-Jerk") - #define MSG_VB_JERK _UxGT("Vb-Jerk") - #define MSG_VC_JERK _UxGT("Vc-Jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-Jerk") - #define MSG_VB_JERK _UxGT("Vy-Jerk") - #define MSG_VC_JERK _UxGT("Vz-Jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-Jerk") -#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") -#define MSG_VELOCITY _UxGT("Velocidad") -#define MSG_VMAX _UxGT("Vmax") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vel. viaje min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Acel. max") -#define MSG_A_RETRACT _UxGT("Acel. retrac.") -#define MSG_A_TRAVEL _UxGT("Acel. Viaje") -#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#else - #define MSG_ASTEPS _UxGT("X pasos/mm") - #define MSG_BSTEPS _UxGT("Y pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#endif -#define MSG_ESTEPS _UxGT("E pasos/mm") -#define MSG_E1STEPS _UxGT("E1 pasos/mm") -#define MSG_E2STEPS _UxGT("E2 pasos/mm") -#define MSG_E3STEPS _UxGT("E3 pasos/mm") -#define MSG_E4STEPS _UxGT("E4 pasos/mm") -#define MSG_E5STEPS _UxGT("E5 pasos/mm") -#define MSG_E6STEPS _UxGT("E6 pasos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimiento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm") MSG_CUBED -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_FILAMENT_UNLOAD _UxGT("Descarga mm") -#define MSG_FILAMENT_LOAD _UxGT("Carga mm") -#define MSG_ADVANCE_K _UxGT("Avance K") -#define MSG_CONTRAST _UxGT("Contraste LCD") -#define MSG_STORE_EEPROM _UxGT("Guardar EEPROM") -#define MSG_LOAD_EEPROM _UxGT("Cargar EEPROM") -#define MSG_RESTORE_FAILSAFE _UxGT("Rest. fábrica") -#define MSG_INIT_EEPROM _UxGT("Inicializar EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Actualizar SD/USB") -#define MSG_RESET_PRINTER _UxGT("Resetear Impresora") -#define MSG_REFRESH _UxGT("Recargar") -#define MSG_WATCH _UxGT("Pantalla de Inf.") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Ajustar") -#define MSG_START_PRINT _UxGT("Iniciar impresión") -#define MSG_BUTTON_NEXT _UxGT("Siguinte") -#define MSG_BUTTON_INIT _UxGT("Iniciar") -#define MSG_BUTTON_STOP _UxGT("Parar") -#define MSG_BUTTON_PRINT _UxGT("Imprimir") -#define MSG_BUTTON_RESET _UxGT("Reiniciar") -#define MSG_BUTTON_CANCEL _UxGT("Cancelar") -#define MSG_BUTTON_DONE _UxGT("Listo") -#define MSG_PAUSE_PRINT _UxGT("Pausar impresión") -#define MSG_RESUME_PRINT _UxGT("Reanudar impresión") -#define MSG_STOP_PRINT _UxGT("Detener impresión") -#define MSG_OUTAGE_RECOVERY _UxGT("Recuper. por interr.") -#define MSG_MEDIA_MENU _UxGT("Imprim. desde SD/USB") -#define MSG_NO_MEDIA _UxGT("SD/USB no presente") -#define MSG_DWELL _UxGT("Reposo...") -#define MSG_USERWAIT _UxGT("Pulsar para Reanudar") -#define MSG_PRINT_PAUSED _UxGT("Impresión Pausada") -#define MSG_PRINTING _UxGT("Imprimiendo...") -#define MSG_PRINT_ABORTED _UxGT("Impresión cancelada") -#define MSG_NO_MOVE _UxGT("Sin movimiento") -#define MSG_KILLED _UxGT("MUERTA") -#define MSG_STOPPED _UxGT("DETENIDA") -#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Interc. Retraer mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraer V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Levantar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Interc. DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("Retracción Auto.") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Inter. longitud") -#define MSG_FILAMENT_PURGE_LENGTH _UxGT("Purgar longitud") -#define MSG_TOOL_CHANGE _UxGT("Cambiar Herramienta") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Aumentar Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Prime Speed") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Vel. de retracción") -#define MSG_NOZZLE_STANDBY _UxGT("Colocar boquilla") -#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamento") -#define MSG_FILAMENTLOAD _UxGT("Cargar filamento") -#define MSG_FILAMENTUNLOAD _UxGT("Descargar filamento") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Descargar todo") -#define MSG_INIT_MEDIA _UxGT("Iniciar SD/USB") -#define MSG_CHANGE_MEDIA _UxGT("Cambiar SD/USB") -#define MSG_RELEASE_MEDIA _UxGT("Lanzar SD/USB") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera cama") -#define MSG_SKEW_FACTOR _UxGT("Factor de desviación") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Cmd: Auto-Prueba") -#define MSG_BLTOUCH_RESET _UxGT("Cmd: Reiniciar") -#define MSG_BLTOUCH_STOW _UxGT("Cmd: Bajar pistón") -#define MSG_BLTOUCH_DEPLOY _UxGT("Cmd: Subir pistón") -#define MSG_BLTOUCH_SW_MODE _UxGT("Cmd: Modo Software") -#define MSG_BLTOUCH_5V_MODE _UxGT("Cmd: Modo 5V") -#define MSG_BLTOUCH_OD_MODE _UxGT("Cmd: Modo OD") -#define MSG_BLTOUCH_MODE_STORE _UxGT("Cmd: Modo almacenar") -#define MSG_BLTOUCH_MODE_STORE_5V _UxGT("Poner BLTouch a 5V") -#define MSG_BLTOUCH_MODE_STORE_OD _UxGT("Poner BLTouch a OD") -#define MSG_BLTOUCH_MODE_ECHO _UxGT("Informe de drenaje") -#define MSG_BLTOUCH_MODE_CHANGE _UxGT("PELIGRO: ¡Una mala configuración puede producir daños! ¿Proceder igualmente?") -#define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#define MSG_TOUCHMI_INIT _UxGT("Iniciar TouchMI") -#define MSG_TOUCHMI_ZTEST _UxGT("Test de desfase Z") -#define MSG_TOUCHMI_SAVE _UxGT("Guardar") -#define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("Subir TouchMI") -#define MSG_MANUAL_DEPLOY _UxGT("Subir Sonda Z") -#define MSG_MANUAL_STOW _UxGT("Bajar Sonda Z") -#define MSG_HOME_FIRST _UxGT("Origen %s%s%s Primero") -#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") -#define MSG_BABYSTEP_X _UxGT("Micropaso X") -#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") -#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Total") -#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Calent. fallido") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Calent. cama fallido") -#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Calent. Cám. fallido") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP. REDUN.") -#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TERMICO") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("ESC. TERMICO CAMA") -#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("ESC. TERMICO CAMARA") -#define MSG_ERR_MAXTEMP _UxGT("Err:TEMP. MÁX") -#define MSG_ERR_MINTEMP _UxGT("Err:TEMP. MIN") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err:TEMP. MÁX CAMA") -#define MSG_ERR_MINTEMP_BED _UxGT("Err:TEMP. MIN CAMA") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err:TEMP. MÁX CÁMARA") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err:TEMP. MIN CÁMARA") -#define MSG_ERR_Z_HOMING _UxGT("Origen XY Primero") -#define MSG_HALTED _UxGT("IMPRESORA DETENIDA") -#define MSG_PLEASE_RESET _UxGT("Por favor, reinicie") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Calentando...") -#define MSG_COOLING _UxGT("Enfriando...") -#define MSG_BED_HEATING _UxGT("Calentando Cama...") -#define MSG_BED_COOLING _UxGT("Enfriando Cama...") -#define MSG_CHAMBER_HEATING _UxGT("Calentando Cámara...") -#define MSG_CHAMBER_COOLING _UxGT("Enfriando Cámara...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibración Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_DELTA_SETTINGS _UxGT("Configuración Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibración") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Est. Altura Delta") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Ajustar Sonda Z") -#define MSG_DELTA_DIAG_ROD _UxGT("Barra Diagonal") -#define MSG_DELTA_HEIGHT _UxGT("Altura") -#define MSG_DELTA_RADIUS _UxGT("Radio") -#define MSG_INFO_MENU _UxGT("Acerca de Impresora") -#define MSG_INFO_PRINTER_MENU _UxGT("Info. Impresora") -#define MSG_3POINT_LEVELING _UxGT("Nivelando 3puntos") -#define MSG_LINEAR_LEVELING _UxGT("Nivelando Lineal") -#define MSG_BILINEAR_LEVELING _UxGT("Nivelando Bilineal") -#define MSG_UBL_LEVELING _UxGT("Nivelando UBL") -#define MSG_MESH_LEVELING _UxGT("Nivelando en Mallado") -#define MSG_INFO_STATS_MENU _UxGT("Estadísticas Imp.") -#define MSG_INFO_BOARD_MENU _UxGT("Info. Controlador") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") -#define MSG_INFO_BAUDRATE _UxGT("Baudios") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz cabina") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Brillo cabina") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" lista"); + PROGMEM Language_Str MSG_YES = _UxGT("SI"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Atrás"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Cancelando..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD/USB insertado"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD/USB retirado"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("SD/USB lanzado"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Esperando al SD/USB"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Error lectura SD/USB"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ajustes avanzados"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automático"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prob. barra progreso"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Llevar al origen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origen X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origen Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origen Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alineado Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Pulsar para comenzar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Siguiente punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("¡Nivelación lista!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Compensación Altura"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajustar desfases"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establecer origen"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Precalentar ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Fin ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Ajuste"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Precalentar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Precalentar ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Fin ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Ajuste"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Precalen. Personali."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Láser Apagado"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Láser Encendido"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Mandrino Apagado"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Mandrino Encendido"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Invertir giro"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Encender Fuente"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar Fuente"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover ejes"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelando Cama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Cama"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Esquinas"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Siguente Esquina"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mallado"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Mallado"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ed. Mallado parada"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sondear Punto"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandos Personaliz."); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Desfase Boquillas"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Aparcado"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicar"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Reflejada"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2ª Boquilla X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2ª Boquilla Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2ª Boquilla Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Hacer G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Herramientas UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivel.Cama.Uni.(UBL)"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Crear Mallado man."); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Colocar cuña y Medir"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Retirar y Medir Cama"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover al Siguente"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Cama"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT ("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Mallado"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Mallado perso."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste fino Mallado"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Term. edici. Mallado"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Mallado Perso."); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Mallado"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Crear Mallado (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Crear Mallado (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Mallado Frío"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar alt. Mallado"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Cantidad de altura"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Mallado"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validar Mallado (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validar Mallado (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Vali. Mallado perso."); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Calentando Cama"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Calent. Boquilla"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Imprimado manual..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Impri. longit. fija"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Imprimación Lista"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Dejando G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Contin. Mallado cama"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelando Mallado"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelando 3Puntos"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivel. Mallado cuad."); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivel de Mallado"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterales"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de mapa "); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salida Mapa mallado"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Salida para el host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salida para CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Printer Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Salida Info. UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidad de relleno"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Relleno manual"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Relleno inteligente"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mallado de relleno"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar proximos"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Fino proxi."); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacen de Mallado"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Huecos de memoria"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Cargar Mallado cama"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Guardar Mallado cama"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Mallado %i Cargado"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Mallado %i Guardado"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sin guardar"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Error: Guardar UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Error: Restaurar UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Parado"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crear Mallado Frío"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Relleno inteligente"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Validar Mallado"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Validar Mallado"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Guardar Mallado cama"); -#define MSG_EXPECTED_PRINTER _UxGT("Impresora incorrecta") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Control LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luzes"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Luz predefinida"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rojo"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Naranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Amarillo"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Azul"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Índigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violeta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Blanco"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luces personalizadas"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidad Rojo"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidad Verde"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidad Azul"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidad Blanco"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brillo"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Cont. de impresión") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total de imp.") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impresión más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total Extruido") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impresiones") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruido") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Temp. Mínima") -#define MSG_INFO_MAX_TEMP _UxGT("Temp. Máxima") -#define MSG_INFO_PSU _UxGT("Fuente alimentación") -#define MSG_DRIVE_STRENGTH _UxGT("Fuerza de empuje") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_ERROR_TMC _UxGT("ERROR CONEX. TMC") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escribe DAC EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPRESIÓN PAUSADA") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CARGAR FILAMENTO") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("DESCARGAR FILAMENTO") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPC. REINICIO:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purgar más") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar imp.") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") -#define MSG_RUNOUT_SENSOR _UxGT("Sensor de sección") -#define MSG_RUNOUT_DISTANCE_MM _UxGT("Dist de secc. mm") -#define MSG_ERR_HOMING_FAILED _UxGT("Ir a origen Fallado") -#define MSG_ERR_PROBING_FAILED _UxGT("Sondeo Fallado") -#define MSG_M600_TOO_COLD _UxGT("M600: Muy Frio") + PROGMEM Language_Str MSG_MOVING = _UxGT("Moviendo..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Libre XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend muy frio"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidad"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Boquilla ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Boquilla ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Boquilla ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Boquilla ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Boquilla ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Boquilla ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Cama"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Recinto"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ventilador"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Ventilador 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Ventilador 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Ventilador 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Ext. ventilador"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Vel. Ext. ventilador ") LCD_STR_N1; + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Vel. Ext. ventilador ") LCD_STR_N2; + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Vel. Ext. ventilador ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW = _UxGT("Flujo"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flujo ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flujo ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flujo ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flujo ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flujo ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flujo ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temperatura Auto."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Encender"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apagar"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Seleccionar"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Seleccionar ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Seleccionar ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Seleccionar ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Seleccionar ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Seleccionar ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Seleccionar ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Aceleración"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidad"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vel. viaje min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Acel. max ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Acel. max ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Acel. max ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Acel. max ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Acel. max ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Acel. max ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carga mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Avance K ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Avance K ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Avance K ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Avance K ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Avance K ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Avance K ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar EEPROM"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Rest. fábrica"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/USB"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetear Impresora"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Pantalla de Inf."); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Iniciar impresión"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Siguinte"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Iniciar"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Parar"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Listo"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresión"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reanudar impresión"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener impresión"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuper. por interr."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprim. desde SD/USB"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD/USB no presente"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pulsar para Reanudar"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impresión Pausada"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimiendo..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impresión cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("MUERTA"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("DETENIDA"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Interc. Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Levantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Interc. DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retracción Auto."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Inter. longitud"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purgar longitud"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambiar Herramienta"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Aumentar Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Prime Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Vel. de retracción"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Colocar boquilla"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Cambiar filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Cambiar filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Cambiar filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Cambiar filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Cambiar filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Cambiar filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Cargar filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Cargar filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Cargar filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Cargar filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Cargar filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Cargar filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Descargar filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Descargar filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Descargar filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Descargar filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Descargar filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Descargar filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar todo"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Iniciar SD/USB"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/USB"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/USB"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera cama"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Factor de desviación"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Auto-Prueba"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reiniciar"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Bajar pistón"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Subir pistón"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Modo Software"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Modo 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Modo OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Modo almacenar"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Poner BLTouch a 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Poner BLTouch a OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Informe de drenaje"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PELIGRO: ¡Una mala configuración puede producir daños! ¿Proceder igualmente?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test de desfase Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Guardar"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Subir TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Subir Sonda Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Bajar Sonda Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origen %s%s%s Primero"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Calent. fallido"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Calent. cama fallido"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Calent. Cám. fallido"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP. REDUN."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CAMARA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err:TEMP. MÁX"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err:TEMP. MIN"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err:TEMP. MÁX CAMA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err:TEMP. MIN CAMA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:TEMP. MÁX CÁMARA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:TEMP. MIN CÁMARA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Origen XY Primero"); + PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETENIDA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Por favor, reinicie"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Calentando..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Enfriando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando Cama..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Enfriando Cama..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Calentando Cámara..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Enfriando Cámara..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibración Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuración Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Est. Altura Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ajustar Sonda Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Acerca de Impresora"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. Impresora"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelando 3puntos"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelando Lineal"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelando Bilineal"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelando UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelando en Mallado"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadísticas Imp."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. Controlador"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz cabina"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo cabina"); -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("CAMBIAR FILAMENTO") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("ELIJE FILAMENTO") -#define MSG_MMU2_MENU _UxGT("MMU") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("¡Actu. MMU Firmware!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU Necesita Cuidado") -#define MSG_MMU2_RESUME _UxGT("Continuar imp.") -#define MSG_MMU2_RESUMING _UxGT("Resumiendo...") -#define MSG_MMU2_LOAD_FILAMENT _UxGT("Cargar Filamento") -#define MSG_MMU2_LOAD_ALL _UxGT("Cargar Todo") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Cargar hasta boqui.") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Expulsar Filamento") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Expulsar Filamento 1") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Expulsar Filamento 2") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Expulsar Filamento 3") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Expulsar Filamento 4") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Expulsar Filamento 5") -#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Descargar Filamento") -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Cargando Fil. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Expulsando Fil. ...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Descargando Fil....") -#define MSG_MMU2_ALL _UxGT("Todo") -#define MSG_MMU2_FILAMENT0 _UxGT("Filamento 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filamento 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filamento 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filamento 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filamento 5") -#define MSG_MMU2_RESET _UxGT("Reiniciar MMU") -#define MSG_MMU2_RESETTING _UxGT("Reiniciando MMU...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Retirar, y pulsar") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Impresora incorrecta"); -#define MSG_MIX _UxGT("Mezcla") -#define MSG_MIX_COMPONENT _UxGT("Componente") -#define MSG_MIXER _UxGT("Miezclador") -#define MSG_GRADIENT _UxGT("Degradado") -#define MSG_FULL_GRADIENT _UxGT("Degradado Total") -#define MSG_TOGGLE_MIX _UxGT("Mezcla Conmutada") -#define MSG_CYCLE_MIX _UxGT("Mezcla Cíclica") -#define MSG_GRADIENT_MIX _UxGT("Mezcla de Degradado") -#define MSG_REVERSE_GRADIENT _UxGT("Degradado inverso") -#define MSG_ACTIVE_VTOOL _UxGT("Activar Herr.V") -#define MSG_START_VTOOL _UxGT("Inicio Herr.V") -#define MSG_END_VTOOL _UxGT(" Fin Herr.V") -#define MSG_GRADIENT_ALIAS _UxGT("Alias Herr.V") -#define MSG_RESET_VTOOLS _UxGT("Reiniciar Herr.V") -#define MSG_COMMIT_VTOOL _UxGT("Cometer mezc. Herr.V") -#define MSG_VTOOLS_RESET _UxGT("Herr.V reiniciados") -#define MSG_START_Z _UxGT("Inicio Z") -#define MSG_END_Z _UxGT(" Fin Z") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Cont. de impresión"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total de imp."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresión más larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruido"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresiones"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Más larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. Mínima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. Máxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fuente alimentación"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza de empuje"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERROR CONEX. TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPC. REINICIO:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar más"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar imp."); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Boquilla: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor de sección"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist de secc. mm"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Ir a origen Fallado"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondeo Fallado"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Muy Frio"); -#define MSG_GAMES _UxGT("Games") -#define MSG_BRICKOUT _UxGT("Brickout") -#define MSG_INVADERS _UxGT("Invaders") -#define MSG_SNAKE _UxGT("Sn4k3") -#define MSG_MAZE _UxGT("Maze") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ELIJE FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("¡Actu. MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Necesita Cuidado"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuar imp."); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Resumiendo..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar hasta boqui."); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Expulsar Filamento 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Expulsar Filamento 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Expulsar Filamento 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Expulsar Filamento 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Expulsar Filamento 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todo"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filamento 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filamento 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filamento 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filamento 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filamento 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reiniciar MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retirar, y pulsar"); -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Pulsar el botón para") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("reanudar impresión") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Aparcando...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando para") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar el cambio") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filamento") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte el filamento") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y pulse el botón") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pulse el botón para") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("calentar la boquilla") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando boquilla") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espere por favor...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Espere para") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("liberar el filamento") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Espere para") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("purgar el filamento") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Pulse para finalizar") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("la purga de filamen.") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impresora") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para reanudar...") -#else - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Pulse para continuar") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Aparcando...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Por Favor espere...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte y Pulse") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pulse para Calentar") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Liberando...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Cargando...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purgando...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Pulse para finalizar") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reanudando...") -#endif + PROGMEM Language_Str MSG_MIX = _UxGT("Mezcla"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Componente 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Componente 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Componente 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Componente 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Componente 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Componente 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Miezclador"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Degradado"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Degradado Total"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mezcla Conmutada"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Mezcla Cíclica"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mezcla de Degradado"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Degradado inverso"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Activar Herr.V"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Inicio Herr.V"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin Herr.V"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias Herr.V"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reiniciar Herr.V"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Cometer mezc. Herr.V"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Herr.V reiniciados"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Inicio Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); -#define MSG_TMC_DRIVERS _UxGT("Controladores TMC") -#define MSG_TMC_CURRENT _UxGT("Amperaje Controlador") -#define MSG_TMC_HYBRID_THRS _UxGT("Límite Hibrido") -#define MSG_TMC_HOMING_THRS _UxGT("Origen sin sensores") -#define MSG_TMC_STEPPING_MODE _UxGT("Modo de pasos") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop Habilit.") + PROGMEM Language_Str MSG_GAMES = _UxGT("Games"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); -#define MSG_SERVICE_RESET _UxGT("Reiniciar") -#define MSG_SERVICE_IN _UxGT(" dentro:") + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Pulsar el botón para", "reanudar impresión")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Aparcando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando para", "iniciar el cambio", "de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserte el filamento", "y pulse el botón", "para continuar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pulse el botón para", "calentar la boquilla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Calentando boquilla", "Espere por favor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Espere para", "liberar el filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere para", "purgar el filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Pulse para finalizar", "la purga de filamen.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impresora", "para reanudar...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Pulse para continuar")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Aparcando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Por Favor espere...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserte y Pulse")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Pulse para Calentar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Calentando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Liberando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Pulse para finalizar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reanudando...")); + #endif -#define MSG_BACKLASH _UxGT("Backlash") -#define MSG_BACKLASH_CORRECTION _UxGT("Correction") -#define MSG_BACKLASH_SMOOTHING _UxGT("Suavizado") + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Controladores TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Amperaje Controlador"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dentro:"); + + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado"); +} diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index a77ae8a7fe..d9c8e2c220 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -32,358 +32,362 @@ #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -#define WELCOME_MSG MACHINE_NAME _UxGT(" prest.") -#define MSG_BACK _UxGT("Atzera") -#define MSG_MEDIA_INSERTED _UxGT("Txartela sartuta") -#define MSG_MEDIA_REMOVED _UxGT("Txartela kenduta") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu nagusia") -#define MSG_AUTOSTART _UxGT("Auto hasiera") -#define MSG_DISABLE_STEPPERS _UxGT("Itzali motoreak") -#define MSG_DEBUG_MENU _UxGT("Arazketa Menua") -#define MSG_PROGRESS_BAR_TEST _UxGT("Prog. Barra Proba") -#define MSG_AUTO_HOME _UxGT("Hasierara joan") -#define MSG_AUTO_HOME_X _UxGT("X jatorrira") -#define MSG_AUTO_HOME_Y _UxGT("Y jatorrira") -#define MSG_AUTO_HOME_Z _UxGT("Z jatorrira") -#define MSG_LEVEL_BED_HOMING _UxGT("XYZ hasieraratzen") -#define MSG_LEVEL_BED_WAITING _UxGT("Klik egin hasteko") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Hurrengo Puntua") -#define MSG_LEVEL_BED_DONE _UxGT("Berdintzea eginda") -//#define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") -#define MSG_SET_HOME_OFFSETS _UxGT("Etxe. offset eza.") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsetak ezarrita") -#define MSG_SET_ORIGIN _UxGT("Hasiera ipini") -#define MSG_PREHEAT_1 _UxGT("Berotu " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Guztia") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Amaia") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Ohea") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Ezarp.") -#define MSG_PREHEAT_2 _UxGT("Berotu " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_1 _UxGT(" Guztia") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Amaia") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_1 _UxGT(" Ohea") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_1 _UxGT(" Ezarp.") -#define MSG_COOLDOWN _UxGT("Hoztu") -#define MSG_SWITCH_PS_ON _UxGT("Energia piztu") -#define MSG_SWITCH_PS_OFF _UxGT("Energia itzali") -#define MSG_EXTRUDE _UxGT("Estruitu") -#define MSG_RETRACT _UxGT("Atzera eragin") -#define MSG_MOVE_AXIS _UxGT("Ardatzak mugitu") -#define MSG_BED_LEVELING _UxGT("Ohe berdinketa") -#define MSG_LEVEL_BED _UxGT("Ohea berdindu") -#define MSG_LEVEL_CORNERS _UxGT("Ertzak berdindu") -#define MSG_NEXT_CORNER _UxGT("Hurrengo ertza") -#define MSG_EDIT_MESH _UxGT("Sarea editatu") -//#define MSG_EDITING_STOPPED _UxGT("Mesh Editing Stopped") -//#define MSG_USER_MENU _UxGT("Custom Commands") +namespace Language_eu { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_UBL_DOING_G29 _UxGT("G29 exekutatzen") -#define MSG_UBL_TOOLS _UxGT("UBL Tresnak") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Sarea eskuz sortu") -//#define MSG_UBL_BC_INSERT _UxGT("Place shim & measure") -#define MSG_UBL_BC_INSERT2 _UxGT("Neurtu") -//#define MSG_UBL_BC_REMOVE _UxGT("Remove & measure bed") -//#define MSG_UBL_MOVING_TO_NEXT _UxGT("Moving to next") -#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktibatu") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL desaktibatu") -#define MSG_UBL_SET_TEMP_BED _UxGT("Ohearen tenperatura") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Mutur beroaren tenp.") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Sarea editatu") -//#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit Custom Mesh") -//#define MSG_UBL_FINE_TUNE_MESH _UxGT("Fine Tuning Mesh") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Sarea editatzea eginda") -//#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Build Custom Mesh") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Sarea sortu") -#define MSG_UBL_BUILD_MESH_M1 _UxGT(PREHEAT_1_LABEL " sarea sortu") -#define MSG_UBL_BUILD_MESH_M2 _UxGT(PREHEAT_2_LABEL " sarea sortu") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Sare hotza sortu") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Sarearen altuera doitu") -//#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Height Amount") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Sarea balioetsi") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT(PREHEAT_1_LABEL " sarea balioetsi") -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT(PREHEAT_2_LABEL " sarea balioetsi") -//#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validate Custom Mesh") -#define MSG_UBL_CONTINUE_MESH _UxGT("Ohe sarea balioetsi") -#define MSG_UBL_MESH_LEVELING _UxGT("Sare berdinketa") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3 puntuko berdinketa") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Lauki-sare berdinketa") -#define MSG_UBL_MESH_LEVEL _UxGT("Sarea berdindu") -//#define MSG_UBL_SIDE_POINTS _UxGT("Side Points") -#define MSG_UBL_MAP_TYPE _UxGT("Mapa mota") -//#define MSG_UBL_OUTPUT_MAP _UxGT("Output Mesh Map") -//#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Output for Host") -//#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Output for CSV") -//#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") -//#define MSG_UBL_INFO_UBL _UxGT("Output UBL Info") -//#define MSG_UBL_FILLIN_AMOUNT _UxGT("Fill-in Amount") -//#define MSG_UBL_MANUAL_FILLIN _UxGT("Manual Fill-in") -//#define MSG_UBL_SMART_FILLIN _UxGT("Smart Fill-in") -//#define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Mesh") -//#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidate All") -//#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidate Closest") -//#define MSG_UBL_FINE_TUNE_ALL _UxGT("Fine Tune All") -//#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Fine Tune Closest") -//#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Storage") -//#define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") -//#define MSG_UBL_LOAD_MESH _UxGT("Load Bed Mesh") -//#define MSG_UBL_SAVE_MESH _UxGT("Save Bed Mesh") -//#define MSG_MESH_LOADED _UxGT("Mesh %i loaded") -//#define MSG_MESH_SAVED _UxGT("Mesh %i saved") -//#define MSG_UBL_NO_STORAGE _UxGT("No storage") -//#define MSG_UBL_SAVE_ERROR _UxGT("Err: UBL Save") -//#define MSG_UBL_RESTORE_ERROR _UxGT("Err: UBL Restore") -//#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") -//#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") -#define MSG_LED_CONTROL _UxGT("LED ezarpenak") -#define MSG_LEDS _UxGT("Argiak") -#define MSG_LED_PRESETS _UxGT("Argi aurrehautaketak") -#define MSG_SET_LEDS_RED _UxGT("Gorria") -#define MSG_SET_LEDS_ORANGE _UxGT("Laranja") -#define MSG_SET_LEDS_YELLOW _UxGT("Horia") -#define MSG_SET_LEDS_GREEN _UxGT("Berdea") -#define MSG_SET_LEDS_BLUE _UxGT("Urdina") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Bioleta") -#define MSG_SET_LEDS_WHITE _UxGT("Zuria") -#define MSG_SET_LEDS_DEFAULT _UxGT("Lehenetsia") -#define MSG_CUSTOM_LEDS _UxGT("Argi pertsonalizatuak") -#define MSG_INTENSITY_R _UxGT("Intentsitate gorria") -#define MSG_INTENSITY_G _UxGT("Intentsitate berdea") -#define MSG_INTENSITY_B _UxGT("Intentsitate urdina") -#define MSG_INTENSITY_W _UxGT("Intentsitate zuria") -#define MSG_LED_BRIGHTNESS _UxGT("Distira") + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Basque-Euskera"); -#define MSG_MOVING _UxGT("Mugitzen...") -#define MSG_FREE_XY _UxGT("Askatu XY") -#define MSG_MOVE_X _UxGT("Mugitu X") -#define MSG_MOVE_Y _UxGT("Mugitu Y") -#define MSG_MOVE_Z _UxGT("Mugitu Z") -#define MSG_MOVE_E _UxGT("Estrusorea") -#define MSG_MOVE_Z_DIST _UxGT("Mugitu %smm") -#define MSG_MOVE_01MM _UxGT("Mugitu 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mugitu 1mm") -#define MSG_MOVE_10MM _UxGT("Mugitu 10mm") -#define MSG_SPEED _UxGT("Abiadura") -#define MSG_BED_Z _UxGT("Z Ohea") -#define MSG_NOZZLE _UxGT("Pita") -#define MSG_BED _UxGT("Ohea") -#define MSG_FAN_SPEED _UxGT("Haizagailu abiadura") -#define MSG_EXTRA_FAN_SPEED _UxGT("Haiz.gehig. abiadura") -#define MSG_FLOW _UxGT("Fluxua") -#define MSG_CONTROL _UxGT("Kontrola") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") -#define MSG_AUTOTEMP _UxGT("Auto tenperatura") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Aukeratu") -#define MSG_ACC _UxGT("Azelerazioa") -#define MSG_JERK _UxGT("Astindua") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-astindua") - #define MSG_VB_JERK _UxGT("Vb-astindua") - #define MSG_VC_JERK _UxGT("Vc-astindua") -#else - #define MSG_VA_JERK _UxGT("Vx-astindua") - #define MSG_VB_JERK _UxGT("Vy-astindua") - #define MSG_VC_JERK _UxGT("Vz-astindua") -#endif -#define MSG_VE_JERK _UxGT("Ve-astindua") -//#define MSG_VELOCITY _UxGT("Velocity") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VBidaia min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retrakt") -#define MSG_A_TRAVEL _UxGT("A-bidaia") -#define MSG_STEPS_PER_MM _UxGT("Pausoak/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A pausoak/mm") - #define MSG_BSTEPS _UxGT("B pausoak/mm") - #define MSG_CSTEPS _UxGT("C pausoak/mm") -#else - #define MSG_ASTEPS _UxGT("X pausoak/mm") - #define MSG_BSTEPS _UxGT("Y pausoak/mm") - #define MSG_CSTEPS _UxGT("Z pausoak/mm") -#endif -#define MSG_ESTEPS _UxGT("E pausoak/mm") -#define MSG_E1STEPS _UxGT("E1 pausoak/mm") -#define MSG_E2STEPS _UxGT("E2 pausoak/mm") -#define MSG_E3STEPS _UxGT("E3 pausoak/mm") -#define MSG_E4STEPS _UxGT("E4 pausoak/mm") -#define MSG_E5STEPS _UxGT("E5 pausoak/mm") -#define MSG_E6STEPS _UxGT("E6 pausoak/mm") -#define MSG_TEMPERATURE _UxGT("Tenperatura") -#define MSG_MOTION _UxGT("Mugimendua") -#define MSG_FILAMENT _UxGT("Harizpia") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E mm3-tan") -#define MSG_FILAMENT_DIAM _UxGT("Hariz. Dia.") -#define MSG_FILAMENT_UNLOAD _UxGT("Deskargatu mm") -#define MSG_FILAMENT_LOAD _UxGT("Kargatu mm") -#define MSG_ADVANCE_K _UxGT("K Aurrerapena") -#define MSG_CONTRAST _UxGT("LCD kontrastea") -#define MSG_STORE_EEPROM _UxGT("Gorde memoria") -#define MSG_LOAD_EEPROM _UxGT("Kargatu memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Larri. berriz.") -#define MSG_INIT_EEPROM _UxGT("EEPROM-a hasieratu") -#define MSG_REFRESH _UxGT("Berriz kargatu") -#define MSG_WATCH _UxGT("Pantaila info") -#define MSG_PREPARE _UxGT("Prestatu") -#define MSG_TUNE _UxGT("Doitu") -#define MSG_PAUSE_PRINT _UxGT("Pausatu inprimak.") -#define MSG_RESUME_PRINT _UxGT("Jarraitu inprima.") -#define MSG_STOP_PRINT _UxGT("Gelditu inprima.") -#define MSG_MEDIA_MENU _UxGT("SD-tik inprimatu") -#define MSG_NO_MEDIA _UxGT("Ez dago SD-rik") -#define MSG_DWELL _UxGT("Lo egin...") -#define MSG_USERWAIT _UxGT("Aginduak zain...") -#define MSG_PRINT_PAUSED _UxGT("Inprim. geldi.") -#define MSG_PRINT_ABORTED _UxGT("Inprim. deusezta.") -#define MSG_NO_MOVE _UxGT("Mugimendu gabe.") -#define MSG_KILLED _UxGT("AKABATUTA. ") -#define MSG_STOPPED _UxGT("GELDITUTA. ") -#define MSG_CONTROL_RETRACT _UxGT("Atzera egin mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Atzera mm") -#define MSG_CONTROL_RETRACTF _UxGT("Atzera egin V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Igo mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Atzera egin mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap Atzera mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Atzera egin V") -//#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("Atzera egin") -#define MSG_FILAMENTCHANGE _UxGT("Aldatu harizpia") -#define MSG_FILAMENTLOAD _UxGT("Harizpia kargatu") -#define MSG_FILAMENTUNLOAD _UxGT("Harizpia deskargatu") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Erabat deskargatu") -#define MSG_INIT_MEDIA _UxGT("Hasieratu SD-a") -#define MSG_CHANGE_MEDIA _UxGT("Aldatu txartela") -#define MSG_ZPROBE_OUT _UxGT("Z zunda kanpora") -#define MSG_SKEW_FACTOR _UxGT("Okertze faktorea") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch AutoProba") -#define MSG_BLTOUCH_RESET _UxGT("BLTouch berrabia.") -#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch jaitsi/luzatu") -#define MSG_BLTOUCH_STOW _UxGT("BLTouch igo/jaso") -#define MSG_HOME_FIRST _UxGT("Etxera %s%s%s lehenengo") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Konpentsatu") -#define MSG_BABYSTEP_X _UxGT("Mikro-urratsa X") -#define MSG_BABYSTEP_Y _UxGT("Mikro-urratsa Y") -#define MSG_BABYSTEP_Z _UxGT("Mikro-urratsa Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop deusezta.") -#define MSG_HEATING_FAILED_LCD _UxGT("Err: Beroketa") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: Tenperatura") -#define MSG_THERMAL_RUNAWAY _UxGT("TENP. KONTROL EZA") -#define MSG_ERR_MAXTEMP _UxGT("Err: Tenp Maximoa") -#define MSG_ERR_MINTEMP _UxGT("Err: Tenp Minimoa") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: Ohe Tenp Max") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: Ohe Tenp Min") -#define MSG_ERR_Z_HOMING _UxGT("Etxera XY lehenengo") -#define MSG_HALTED _UxGT("INPRIMA. GELDIRIK") -#define MSG_PLEASE_RESET _UxGT("Berrabia. Mesedez") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Berotzen...") -#define MSG_BED_HEATING _UxGT("Ohea Berotzen...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibraketa") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibratu X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibratu Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibratu Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibratu Zentrua") -#define MSG_DELTA_SETTINGS _UxGT("Delta ezarpenak") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Kalibraketa") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Alt. Ezar.") -#define MSG_DELTA_DIAG_ROD _UxGT("Barra diagonala") -#define MSG_DELTA_HEIGHT _UxGT("Altuera") -#define MSG_DELTA_RADIUS _UxGT("Erradioa") -#define MSG_INFO_MENU _UxGT("Inprimagailu Inf.") -#define MSG_INFO_PRINTER_MENU _UxGT("Inprimagailu Inf.") -#define MSG_3POINT_LEVELING _UxGT("3 puntuko berdinketa") -#define MSG_LINEAR_LEVELING _UxGT("Berdinketa lineala") -#define MSG_BILINEAR_LEVELING _UxGT("Berdinketa bilinearra") -#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -#define MSG_MESH_LEVELING _UxGT("Sare berdinketa") -#define MSG_INFO_STATS_MENU _UxGT("Inprima. estatis.") -#define MSG_INFO_BOARD_MENU _UxGT("Txartelaren Info.") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistoreak") -#define MSG_INFO_EXTRUDERS _UxGT("Estrusoreak") -#define MSG_INFO_BAUDRATE _UxGT("Baudioak") -#define MSG_INFO_PROTOCOL _UxGT("Protokoloa") -#define MSG_CASE_LIGHT _UxGT("Kabina Argia") -//#define MSG_CASE_LIGHT_BRIGHTNESS -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Inprim. Zenbaketa") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Burututa") - #define MSG_INFO_PRINT_TIME _UxGT("Inprim. denbora") - #define MSG_INFO_PRINT_LONGEST _UxGT("Imprimatze luzeena") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Estruituta guztira") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Inprimatze") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Burututa") - #define MSG_INFO_PRINT_TIME _UxGT("Guztira") - #define MSG_INFO_PRINT_LONGEST _UxGT("Luzeena") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Estrusio") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Tenp. Minimoa") -#define MSG_INFO_MAX_TEMP _UxGT("Tenp. Maximoa") -#define MSG_INFO_PSU _UxGT("Elikadura-iturria") -#define MSG_DRIVE_STRENGTH _UxGT("Driver-aren potentzia") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Idatzi DAC EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("HARIZPIA ALDATU") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("HARIZPIA KARGATU") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("HARIZPIA DESKARGATU") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ALDAKETA AUKERAK:") -//#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purge more") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Inprima. jarraitu") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Pita: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Hasi. huts egin du") -#define MSG_ERR_PROBING_FAILED _UxGT("Neurketak huts egin du") -#define MSG_M600_TOO_COLD _UxGT("M600: hotzegi") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prest."); + PROGMEM Language_Str MSG_BACK = _UxGT("Atzera"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu nagusia"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto hasiera"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Itzali motoreak"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Arazketa Menua"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prog. Barra Proba"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Hasierara joan"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X jatorrira"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y jatorrira"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z jatorrira"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ hasieraratzen"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik egin hasteko"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Hurrengo Puntua"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Berdintzea eginda"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Etxe. offset eza."); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsetak ezarrita"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Hasiera ipini"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Berotu ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Guztia"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ohea"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ezarp."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Berotu ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Berotu ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Guztia"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Ohea"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Ezarp."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Hoztu"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Energia piztu"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Energia itzali"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estruitu"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Atzera eragin"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ardatzak mugitu"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ohe berdinketa"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ohea berdindu"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ertzak berdindu"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Hurrengo ertza"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Sarea editatu"); -#define MSG_EXPECTED_PRINTER _UxGT("Inprimagailu okerra") + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 exekutatzen"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tresnak"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Sarea eskuz sortu"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Neurtu"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktibatu"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL desaktibatu"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ohearen tenperatura"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Mutur beroaren tenp."); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Sarea editatu"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Sarea editatzea eginda"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Sarea sortu"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = PREHEAT_1_LABEL _UxGT(" sarea sortu"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = PREHEAT_2_LABEL _UxGT(" sarea sortu"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Sare hotza sortu"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Sarearen altuera doitu"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sarea balioetsi"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = PREHEAT_1_LABEL _UxGT(" sarea balioetsi"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = PREHEAT_2_LABEL _UxGT(" sarea balioetsi"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ohe sarea balioetsi"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sare berdinketa"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3 puntuko berdinketa"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Lauki-sare berdinketa"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Sarea berdindu"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Mapa mota"); + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED ezarpenak"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Argiak"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Argi aurrehautaketak"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Gorria"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Laranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Horia"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Berdea"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Urdina"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Bioleta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Zuria"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Lehenetsia"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Argi pertsonalizatuak"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intentsitate gorria"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intentsitate berdea"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intentsitate urdina"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intentsitate zuria"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Distira"); -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - //#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wait for start") - //#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("of the filament") - //#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("change") - //#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") - //#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert filament") - //#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("and press button") - //#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("to continue...") - //#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Press button to") - //#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("heat nozzle.") - //#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating nozzle") - //#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Please wait...") - //#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") - //#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("filament purge") - //#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") - //#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Mesedez, itxaron...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Deskargatzen...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Sartu eta click egin") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Berotzen...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Kargatzen...") - //#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purging...") - //#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Resuming...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_MOVING = _UxGT("Mugitzen..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Askatu XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mugitu X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mugitu Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mugitu Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusorea"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Estrusorea ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Estrusorea ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Estrusorea ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Estrusorea ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Estrusorea ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Estrusorea ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mugitu %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mugitu 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mugitu 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Abiadura"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Ohea"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Pita"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Pita ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Pita ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Pita ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Pita ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Pita ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Pita ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Ohea"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Haizagailu abiadura"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Haizagailu abiadura 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Haizagailu abiadura 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Haizagailu abiadura 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Haiz.gehig. abiadura"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Haiz.gehig. abiadura 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Haiz.gehig. abiadura 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Haiz.gehig. abiadura 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxua"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Fluxua ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Fluxua ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Fluxua ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Fluxua ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Fluxua ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Fluxua ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrola"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto tenperatura"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Aukeratu"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Aukeratu ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Aukeratu ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Aukeratu ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Aukeratu ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Aukeratu ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Aukeratu ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Azelerazioa"); + PROGMEM Language_Str MSG_JERK = _UxGT("Astindua"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-astindua"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-astindua"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-astindua"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-astindua"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VBidaia min"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-bidaia"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pausoak/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pausoak/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Tenperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Mugimendua"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Harizpia"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm3-tan"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Hariz. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Hariz. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Hariz. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Hariz. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Hariz. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Hariz. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Hariz. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Deskargatu mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Kargatu mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Aurrerapena"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K Aurrerapena ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K Aurrerapena ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K Aurrerapena ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K Aurrerapena ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K Aurrerapena ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K Aurrerapena ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrastea"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gorde memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Kargatu memoria"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Larri. berriz."); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM-a hasieratu"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Pantaila info"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prestatu"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Doitu"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausatu inprimak."); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jarraitu inprima."); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Gelditu inprima."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD-tik inprimatu"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ez dago SD-rik"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Lo egin..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aginduak zain..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Inprim. geldi."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Inprim. deusezta."); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Mugimendu gabe."); + PROGMEM Language_Str MSG_KILLED = _UxGT("AKABATUTA. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("GELDITUTA. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Atzera egin mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Atzera mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Atzera egin V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Igo mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Atzera egin mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap Atzera mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Atzera egin V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Atzera egin"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Aldatu harizpia"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Aldatu harizpia ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Aldatu harizpia ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Aldatu harizpia ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Aldatu harizpia ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Aldatu harizpia ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Aldatu harizpia ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Harizpia kargatu ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Harizpia kargatu ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Harizpia kargatu ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Harizpia kargatu ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Harizpia kargatu ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Harizpia kargatu ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Harizpia deskargatu ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Harizpia deskargatu ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Harizpia deskargatu ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Harizpia deskargatu ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Harizpia deskargatu ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Harizpia deskargatu ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Erabat deskargatu"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Hasieratu SD-a"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Aldatu txartela"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z zunda kanpora"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Okertze faktorea"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch AutoProba"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch berrabia."); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch jaitsi/luzatu"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch igo/jaso"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Etxera %s%s%s lehenengo"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Konpentsatu"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikro-urratsa X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikro-urratsa Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikro-urratsa Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop deusezta."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err: Beroketa"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: Tenperatura"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TENP. KONTROL EZA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Tenp Maximoa"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Ohe Tenp Max"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Ohe Tenp Min"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Etxera XY lehenengo"); + PROGMEM Language_Str MSG_HALTED = _UxGT("INPRIMA. GELDIRIK"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Berrabia. Mesedez"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Berotzen..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohea Berotzen..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibraketa"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibratu X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibratu Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibratu Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibratu Zentrua"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta ezarpenak"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibraketa"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Alt. Ezar."); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra diagonala"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altuera"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Erradioa"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Inprimagailu Inf."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inprimagailu Inf."); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3 puntuko berdinketa"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Berdinketa lineala"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Berdinketa bilinearra"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Sare berdinketa"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Inprima. estatis."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Txartelaren Info."); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoreak"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusoreak"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudioak"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoloa"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Kabina Argia"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS + = ; + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprim. Zenbaketa"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Inprim. denbora"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Imprimatze luzeena"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruituta guztira"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprimatze"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Guztira"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Luzeena"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estrusio"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Tenp. Minimoa"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Tenp. Maximoa"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Elikadura-iturria"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driver-aren potentzia"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Idatzi DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("HARIZPIA ALDATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("HARIZPIA KARGATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("HARIZPIA DESKARGATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ALDAKETA AUKERAK:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Inprima. jarraitu"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Pita: "); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Hasi. huts egin du"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Neurketak huts egin du"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: hotzegi"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Inprimagailu okerra"); + + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Mesedez, itxaron...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Deskargatzen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sartu eta click egin")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Berotzen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Kargatzen...")); +} diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 2fbf9e2d18..0b6385c213 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -30,142 +30,136 @@ */ #define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" valmis.") -#define MSG_MEDIA_INSERTED _UxGT("Kortti asetettu") -#define MSG_MEDIA_REMOVED _UxGT("Kortti poistettu") -#define MSG_MAIN _UxGT("Palaa") -#define MSG_AUTOSTART _UxGT("Automaatti") -#define MSG_DISABLE_STEPPERS _UxGT("Vapauta moottorit") -#define MSG_AUTO_HOME _UxGT("Aja referenssiin") -#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Click to Begin") -#define MSG_LEVEL_BED_DONE _UxGT("Leveling Done!") -#define MSG_SET_HOME_OFFSETS _UxGT("Set home offsets") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets applied") -#define MSG_SET_ORIGIN _UxGT("Aseta origo") -#define MSG_PREHEAT_1 _UxGT("Esilämmitä " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Esilämmitä " PREHEAT_1_LABEL " ") -#define MSG_PREHEAT_1_ALL _UxGT("Esilä. " PREHEAT_1_LABEL " Kaikki") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Esilä. " PREHEAT_1_LABEL " Alusta") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Esilämm. " PREHEAT_1_LABEL " konf") -#define MSG_PREHEAT_2 _UxGT("Esilämmitä " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Esilämmitä " PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL _UxGT("Esilä. " PREHEAT_2_LABEL " Kaikki") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Esilä. " PREHEAT_2_LABEL " Alusta") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Esilämm. " PREHEAT_2_LABEL " konf") -#define MSG_COOLDOWN _UxGT("Jäähdytä") -#define MSG_SWITCH_PS_ON _UxGT("Virta päälle") -#define MSG_SWITCH_PS_OFF _UxGT("Virta pois") -#define MSG_EXTRUDE _UxGT("Pursota") -#define MSG_RETRACT _UxGT("Vedä takaisin") -#define MSG_MOVE_AXIS _UxGT("Liikuta akseleita") -#define MSG_MOVE_X _UxGT("Liikuta X") -#define MSG_MOVE_Y _UxGT("Liikuta Y") -#define MSG_MOVE_Z _UxGT("Liikuta Z") -#define MSG_MOVE_E _UxGT("Extruder") -#define MSG_MOVE_Z_DIST _UxGT("Liikuta %smm") -#define MSG_MOVE_01MM _UxGT("Liikuta 0.1mm") -#define MSG_MOVE_1MM _UxGT("Liikuta 1mm") -#define MSG_MOVE_10MM _UxGT("Liikuta 10mm") -#define MSG_SPEED _UxGT("Nopeus") -#define MSG_NOZZLE _UxGT("Suutin") -#define MSG_BED _UxGT("Alusta") -#define MSG_FAN_SPEED _UxGT("Tuul. nopeus") -#define MSG_FLOW _UxGT("Virtaus") -#define MSG_CONTROL _UxGT("Kontrolli") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Kerr") -#define MSG_AUTOTEMP _UxGT("Autotemp") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_ACC _UxGT("Kiihtyv") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VLiike min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-peruuta") -#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Asteps/mm") - #define MSG_BSTEPS _UxGT("Bsteps/mm") - #define MSG_CSTEPS _UxGT("Csteps/mm") -#else - #define MSG_ASTEPS _UxGT("Xsteps/mm") - #define MSG_BSTEPS _UxGT("Ysteps/mm") - #define MSG_CSTEPS _UxGT("Zsteps/mm") -#endif -#define MSG_ESTEPS _UxGT("Esteps/mm") -#define MSG_E1STEPS _UxGT("E1steps/mm") -#define MSG_E2STEPS _UxGT("E2steps/mm") -#define MSG_E3STEPS _UxGT("E3steps/mm") -#define MSG_E4STEPS _UxGT("E4steps/mm") -#define MSG_E5STEPS _UxGT("E5steps/mm") -#define MSG_E6STEPS _UxGT("E6steps/mm") -#define MSG_TEMPERATURE _UxGT("Lämpötila") -#define MSG_MOTION _UxGT("Liike") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_CONTRAST _UxGT("LCD kontrasti") -#define MSG_STORE_EEPROM _UxGT("Tallenna muistiin") -#define MSG_LOAD_EEPROM _UxGT("Lataa muistista") -#define MSG_RESTORE_FAILSAFE _UxGT("Palauta oletus") -#define MSG_REFRESH _UxGT("Päivitä") -#define MSG_WATCH _UxGT("Seuraa") -#define MSG_PREPARE _UxGT("Valmistele") -#define MSG_TUNE _UxGT("Säädä") -#define MSG_PAUSE_PRINT _UxGT("Keskeytä tulostus") -#define MSG_RESUME_PRINT _UxGT("Jatka tulostusta") -#define MSG_STOP_PRINT _UxGT("Pysäytä tulostus") -#define MSG_MEDIA_MENU _UxGT("Korttivalikko") -#define MSG_NO_MEDIA _UxGT("Ei korttia") -#define MSG_DWELL _UxGT("Nukkumassa...") -#define MSG_USERWAIT _UxGT("Odotet. valintaa") -#define MSG_PRINT_ABORTED _UxGT("Print aborted") -#define MSG_NO_MOVE _UxGT("Ei liiketta.") -#define MSG_KILLED _UxGT("KILLED. ") -#define MSG_STOPPED _UxGT("STOPPED. ") -#define MSG_CONTROL_RETRACT _UxGT("Vedä mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Va. Vedä mm") -#define MSG_CONTROL_RETRACTF _UxGT("Vedä V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Va. UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoVeto.") -#define MSG_FILAMENTCHANGE _UxGT("Change filament") -#define MSG_INIT_MEDIA _UxGT("Init. SD-Card") -#define MSG_CHANGE_MEDIA _UxGT("Change SD-Card") -#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrointi") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibroi X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibroi Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibroi Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibroi Center") +namespace Language_fi { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_EXPECTED_PRINTER _UxGT("Väärä tulostin") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Finnish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" valmis."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Palaa"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Automaatti"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Aja referenssiin"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Aseta origo"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Kaikki"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Alusta"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Esilämm. ") PREHEAT_1_LABEL _UxGT(" konf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT(" Kaikki"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT(" Alusta"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Esilämm. ") PREHEAT_2_LABEL _UxGT(" konf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Jäähdytä"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Virta päälle"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Virta pois"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Pursota"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Vedä takaisin"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Liikuta akseleita"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Liikuta X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Liikuta Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Liikuta Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extruder ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extruder ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extruder ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extruder ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extruder ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extruder ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Liikuta %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Liikuta 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Liikuta 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Nopeus"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Suutin"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Suutin ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Suutin ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Suutin ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Suutin ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Suutin ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Suutin ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Alusta"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tuul. nopeus"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Tuul. nopeus 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Tuul. nopeus 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Tuul. nopeus 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Virtaus"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Virtaus ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Virtaus ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Virtaus ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Virtaus ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Virtaus ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Virtaus ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrolli"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Kerr"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_ACC = _UxGT("Kiihtyv"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VLiike min"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-peruuta"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Lämpötila"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Liike"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrasti"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Tallenna muistiin"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Lataa muistista"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Palauta oletus"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Seuraa"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Valmistele"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Säädä"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Keskeytä tulostus"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jatka tulostusta"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Pysäytä tulostus"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Korttivalikko"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ei korttia"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Nukkumassa..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Odotet. valintaa"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ei liiketta."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Vedä mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Va. Vedä mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vedä V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVeto."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrointi"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibroi X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibroi Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibroi Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibroi Center"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Väärä tulostin"); +} diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index da9a0d4acd..a770fe46b8 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -30,533 +30,586 @@ */ #define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" prête.") -#define MSG_YES _UxGT("Oui") -#define MSG_NO _UxGT("Non") -#define MSG_BACK _UxGT("Retour") -#define MSG_MEDIA_ABORTING _UxGT("Annulation...") -#define MSG_MEDIA_INSERTED _UxGT("Média inséré") -#define MSG_MEDIA_REMOVED _UxGT("Média retiré") -#define MSG_MEDIA_RELEASED _UxGT("Média libéré") -#define MSG_MEDIA_WAITING _UxGT("Attente média") -#define MSG_MEDIA_READ_ERROR _UxGT("Err lecture média") -#define MSG_MEDIA_USB_REMOVED _UxGT("USB débranché") -#define MSG_MEDIA_USB_FAILED _UxGT("Erreur média USB") -#define MSG_LCD_ENDSTOPS _UxGT("Butées") -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Butées SW") -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_ADVANCED_SETTINGS _UxGT("Config. avancée") -#define MSG_CONFIGURATION _UxGT("Configuration") -#define MSG_AUTOSTART _UxGT("Exéc. auto#.gcode") -#define MSG_DISABLE_STEPPERS _UxGT("Arrêter moteurs") -#define MSG_DEBUG_MENU _UxGT("Menu debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test barre progress.") -#define MSG_AUTO_HOME _UxGT("Origine auto") -#define MSG_AUTO_HOME_X _UxGT("Origine X auto") -#define MSG_AUTO_HOME_Y _UxGT("Origine Y auto") -#define MSG_AUTO_HOME_Z _UxGT("Origine Z auto") -#define MSG_AUTO_Z_ALIGN _UxGT("Align. Z auto") -#define MSG_LEVEL_BED_HOMING _UxGT("Origine XYZ...") -#define MSG_LEVEL_BED_WAITING _UxGT("Clic pour commencer") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Point suivant") -#define MSG_LEVEL_BED_DONE _UxGT("Mise à niveau OK!") -#define MSG_Z_FADE_HEIGHT _UxGT("Hauteur lissée") -#define MSG_SET_HOME_OFFSETS _UxGT("Régl. décal origine") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Décalages appliqués") -#define MSG_SET_ORIGIN _UxGT("Régler origine") -#define MSG_PREHEAT_1 _UxGT("Préchauffage " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Préchauff. " PREHEAT_1_LABEL " ") -#define MSG_PREHEAT_1_ALL _UxGT("Préch. " PREHEAT_1_LABEL " Tout") -#define MSG_PREHEAT_1_END _UxGT("Préch. " PREHEAT_1_LABEL " buse") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Préch. " PREHEAT_1_LABEL " lit") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Régler préch. " PREHEAT_1_LABEL) -#define MSG_PREHEAT_2 _UxGT("Préchauffage " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Préchauff. " PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL _UxGT("Préch. " PREHEAT_2_LABEL " Tout") -#define MSG_PREHEAT_2_END _UxGT("Préch. " PREHEAT_2_LABEL " buse") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Préch. " PREHEAT_2_LABEL " lit") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Régler préch. " PREHEAT_2_LABEL) -#define MSG_PREHEAT_CUSTOM _UxGT("Préchauffage perso") -#define MSG_COOLDOWN _UxGT("Refroidir") -#define MSG_LASER_MENU _UxGT("Contrôle Laser") -#define MSG_LASER_OFF _UxGT("Laser Off") -#define MSG_LASER_ON _UxGT("Laser On") -#define MSG_LASER_POWER _UxGT("Puissance") -#define MSG_SPINDLE_REVERSE _UxGT("Inverser broches") -#define MSG_SWITCH_PS_ON _UxGT("Allumer alim.") -#define MSG_SWITCH_PS_OFF _UxGT("Eteindre alim.") -#define MSG_EXTRUDE _UxGT("Extrusion") -#define MSG_RETRACT _UxGT("Retrait") -#define MSG_MOVE_AXIS _UxGT("Déplacer un axe") -#define MSG_BED_LEVELING _UxGT("Régler Niv. lit") -#define MSG_LEVEL_BED _UxGT("Niveau du lit") -#define MSG_LEVEL_CORNERS _UxGT("Niveau des coins") -#define MSG_NEXT_CORNER _UxGT("Coin suivant") -#define MSG_MESH_EDITOR _UxGT("Edition Maillage") -#define MSG_EDIT_MESH _UxGT("Modifier maille") -#define MSG_EDITING_STOPPED _UxGT("Arrêt édit. maillage") -#define MSG_PROBING_MESH _UxGT("Mesure point") -#define MSG_MESH_X _UxGT("Index X") -#define MSG_MESH_Y _UxGT("Index Y") -#define MSG_MESH_EDIT_Z _UxGT("Valeur Z") -#define MSG_USER_MENU _UxGT("Commandes perso") +namespace Language_fr { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_LCD_TILTING_MESH _UxGT("Touche point") -#define MSG_M48_TEST _UxGT("Ecart sonde Z M48") -#define MSG_M48_DEVIATION _UxGT("Ecart") -#define MSG_M48_POINT _UxGT("Point M48") -#define MSG_IDEX_MENU _UxGT("Mode IDEX") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Copie miroir") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Contrôle complet") -#define MSG_OFFSETS_MENU _UxGT("Offsets Outil") -#define MSG_X_OFFSET _UxGT("Buse 2 X") -#define MSG_Y_OFFSET _UxGT("Buse 2 Y") -#define MSG_Z_OFFSET _UxGT("Buse 2 Z") -#define MSG_G26_HEATING_BED _UxGT("G26 Chauffe lit") -#define MSG_G26_HEATING_NOZZLE _UxGT("G26 Chauffe buse") -#define MSG_G26_MANUAL_PRIME _UxGT("Amorce manuelle...") -#define MSG_G26_FIXED_LENGTH _UxGT("Amorce longueur fixe") -#define MSG_G26_PRIME_DONE _UxGT("Amorce terminée") -#define MSG_G26_CANCELED _UxGT("G26 annulé") -#define MSG_G26_LEAVING _UxGT("Sortie G26") -#define MSG_UBL_DOING_G29 _UxGT("G29 en cours") -#define MSG_UBL_TOOLS _UxGT("Outils UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Niveau lit unifié") -#define MSG_UBL_MANUAL_MESH _UxGT("Maillage manuel") -#define MSG_UBL_BC_INSERT _UxGT("Poser câle & mesurer") -#define MSG_UBL_BC_INSERT2 _UxGT("Mesure") -#define MSG_UBL_BC_REMOVE _UxGT("ôter et mesurer lit") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Aller au suivant") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Activer l'UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Désactiver l'UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Température lit") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Température buse") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Editer maille") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editer maille perso") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Réglage fin maille") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Terminer maille") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Créer maille perso") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Créer maille") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Créer maille " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Créer maille " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Créer maille froide") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajuster haut. maille") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Hauteur") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valider maille") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Valider maille " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Valider maille " PREHEAT_2_LABEL) -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valider maille perso") -#define MSG_UBL_CONTINUE_MESH _UxGT("Continuer maille") -#define MSG_UBL_MESH_LEVELING _UxGT("Niveau par maille") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Niveau à 3 points") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Niveau grille") -#define MSG_UBL_MESH_LEVEL _UxGT("Maille de niveau") -#define MSG_UBL_SIDE_POINTS _UxGT("Point latéral") -#define MSG_UBL_MAP_TYPE _UxGT("Type de carte") -#define MSG_UBL_OUTPUT_MAP _UxGT("Voir maille") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Voir pour hôte") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Voir pour CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Voir pour sauveg.") -#define MSG_UBL_INFO_UBL _UxGT("Voir info UBL") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Taux de remplissage") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Remplissage manuel") -#define MSG_UBL_SMART_FILLIN _UxGT("Remplissage auto") -#define MSG_UBL_FILLIN_MESH _UxGT("Maille remplissage") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Tout annuler") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Annuler le plus près") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Réglage fin (tous)") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Réglage fin (proche)") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Stockage maille") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot mémoire") -#define MSG_UBL_LOAD_MESH _UxGT("Charger maille") -#define MSG_UBL_SAVE_MESH _UxGT("Sauver maille") -#define MSG_MESH_LOADED _UxGT("Maille %i chargée") -#define MSG_MESH_SAVED _UxGT("Maille %i enreg.") -#define MSG_UBL_NO_STORAGE _UxGT("Pas de mémoire") -#define MSG_UBL_SAVE_ERROR _UxGT("Err: Enreg. UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Ouvrir UBL") -#define MSG_UBL_Z_OFFSET _UxGT("Z-Offset: ") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Décal. Z arrêté") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Pas à pas") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Français"); -#define MSG_LED_CONTROL _UxGT("Contrôle LED") -#define MSG_LEDS _UxGT("Lumière") -#define MSG_LED_PRESETS _UxGT("Préregl. LED") -#define MSG_SET_LEDS_RED _UxGT("Rouge") -#define MSG_SET_LEDS_ORANGE _UxGT("Orange") -#define MSG_SET_LEDS_YELLOW _UxGT("Jaune") -#define MSG_SET_LEDS_GREEN _UxGT("Vert") -#define MSG_SET_LEDS_BLUE _UxGT("Bleu") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Violet") -#define MSG_SET_LEDS_WHITE _UxGT("Blanc") -#define MSG_SET_LEDS_DEFAULT _UxGT("Defaut") -#define MSG_CUSTOM_LEDS _UxGT("LEDs perso.") -#define MSG_INTENSITY_R _UxGT("Intensité rouge") -#define MSG_INTENSITY_G _UxGT("Intensité vert") -#define MSG_INTENSITY_B _UxGT("Intensité bleu") -#define MSG_INTENSITY_W _UxGT("Intensité blanc") -#define MSG_LED_BRIGHTNESS _UxGT("Luminosité") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prête."); + PROGMEM Language_Str MSG_YES = _UxGT("Oui"); + PROGMEM Language_Str MSG_NO = _UxGT("Non"); + PROGMEM Language_Str MSG_BACK = _UxGT("Retour"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annulation..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Média inséré"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Média retiré"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Média libéré"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Attente média"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Butées"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. avancée"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Exéc. auto#.gcode"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Arrêter moteurs"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Origine auto"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origine X auto"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origine Y auto"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origine Z auto"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Align. Z auto"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origine XYZ..."); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clic pour commencer"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Point suivant"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Mise à niveau OK!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Hauteur lissée"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Régl. décal origine"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Décalages appliqués"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Régler origine"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Préchauffage ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" Tout"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" lit"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Régler préch. ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Préchauffage ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Préchauffage ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" Tout"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" lit"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Régler préch. ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Préchauffage perso"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refroidir"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Contrôle Laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puissance"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverser broches"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Allumer alim."); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Eteindre alim."); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusion"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrait"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Déplacer un axe"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Régler Niv. lit"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveau du lit"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveau des coins"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Coin suivant"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Edition Maillage"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifier maille"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Arrêt édit. maillage"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Mesure point"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valeur Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Commandes perso"); -#define MSG_MOVING _UxGT("Déplacement...") -#define MSG_FREE_XY _UxGT("Débloquer XY") -#define MSG_MOVE_X _UxGT("Déplacer X") -#define MSG_MOVE_Y _UxGT("Déplacer Y") -#define MSG_MOVE_Z _UxGT("Déplacer Z") -#define MSG_MOVE_E _UxGT("Extrudeur") -#define MSG_HOTEND_TOO_COLD _UxGT("Buse trop froide") -#define MSG_MOVE_Z_DIST _UxGT("Déplacer %smm") -#define MSG_MOVE_01MM _UxGT("Déplacer 0.1mm") -#define MSG_MOVE_1MM _UxGT("Déplacer 1mm") -#define MSG_MOVE_10MM _UxGT("Déplacer 10mm") -#define MSG_SPEED _UxGT("Vitesse") -#define MSG_BED_Z _UxGT("Lit Z") -#define MSG_NOZZLE _UxGT("Buse") -#define MSG_BED _UxGT("Lit") -#define MSG_CHAMBER _UxGT("Caisson") -#define MSG_FAN_SPEED _UxGT("Vitesse ventil.") -#define MSG_EXTRA_FAN_SPEED _UxGT("Extra V ventil.") + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Touche point"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("Ecart sonde Z M48"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Ecart"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("Point M48"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Mode IDEX"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copie miroir"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Contrôle complet"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Offsets Outil"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("Buse 2 X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("Buse 2 Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("Buse 2 Z"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Chauffe lit"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Chauffe buse"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Amorce manuelle..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Amorce longueur fixe"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Amorce terminée"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 annulé"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Sortie G26"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 en cours"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Outils UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Niveau lit unifié"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Maillage manuel"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Poser câle & mesurer"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mesure"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("ôter et mesurer lit"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Aller au suivant"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activer l'UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Désactiver l'UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Température lit"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Température lit"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Température buse"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Température buse"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editer maille"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Editer maille perso"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Réglage fin maille"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Terminer maille"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Créer maille perso"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Créer maille"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Créer maille ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Créer maille ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Créer maille froide"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajuster haut. maille"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Hauteur"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valider maille"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Valider maille ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Valider maille ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valider maille perso"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuer maille"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Niveau par maille"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Niveau à 3 points"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niveau grille"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Maille de niveau"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Point latéral"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Type de carte"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Voir maille"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Voir pour hôte"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Voir pour CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Voir pour sauveg."); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Voir info UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Taux de remplissage"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Remplissage manuel"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Remplissage auto"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Maille remplissage"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tout annuler"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Annuler le plus près"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Réglage fin (tous)"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Réglage fin (proche)"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Stockage maille"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot mémoire"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Charger maille"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Sauver maille"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Maille %i chargée"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Maille %i enreg."); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Pas de mémoire"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Enreg. UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ouvrir UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Décal. Z arrêté"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Pas à pas"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Créer maille froide"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Remplissage auto"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valider maille"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Réglage fin (tous)"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valider maille"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Réglage fin (tous)"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Sauver maille"); -#define MSG_FLOW _UxGT("Flux") -#define MSG_CONTROL _UxGT("Contrôler") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Facteur") -#define MSG_AUTOTEMP _UxGT("Temp. Auto.") -#define MSG_LCD_ON _UxGT("Marche") -#define MSG_LCD_OFF _UxGT("Arrêt") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Sélectionner") -#define MSG_ACC _UxGT("Accélération") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va jerk") - #define MSG_VB_JERK _UxGT("Vb jerk") - #define MSG_VC_JERK _UxGT("Vc jerk") -#else - #define MSG_VA_JERK _UxGT("Vx jerk") - #define MSG_VB_JERK _UxGT("Vy jerk") - #define MSG_VC_JERK _UxGT("Vz jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve jerk") -#define MSG_VELOCITY _UxGT("Vélocité") -#define MSG_JUNCTION_DEVIATION _UxGT("Déviat. jonct.") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin ") -#define MSG_VTRAV_MIN _UxGT("V dépl. min") -#define MSG_ACCELERATION _UxGT("Accélération") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A retrait") -#define MSG_A_TRAVEL _UxGT("A dépl.") -#define MSG_STEPS_PER_MM _UxGT("Pas/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A pas/mm") - #define MSG_BSTEPS _UxGT("B pas/mm") - #define MSG_CSTEPS _UxGT("C pas/mm") -#else - #define MSG_ASTEPS _UxGT("X pas/mm") - #define MSG_BSTEPS _UxGT("Y pas/mm") - #define MSG_CSTEPS _UxGT("Z pas/mm") -#endif -#define MSG_ESTEPS _UxGT("E pas/mm") -#define MSG_E1STEPS _UxGT("E1 pas/mm") -#define MSG_E2STEPS _UxGT("E2 pas/mm") -#define MSG_E3STEPS _UxGT("E3 pas/mm") -#define MSG_E4STEPS _UxGT("E4 pas/mm") -#define MSG_E5STEPS _UxGT("E5 pas/mm") -#define MSG_E6STEPS _UxGT("E6 pas/mm") -#define MSG_TEMPERATURE _UxGT("Température") -#define MSG_MOTION _UxGT("Mouvement") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diamètre fil.") -#define MSG_FILAMENT_UNLOAD _UxGT("Retrait mm") -#define MSG_FILAMENT_LOAD _UxGT("Charger mm") -#define MSG_ADVANCE_K _UxGT("Avance K") -#define MSG_CONTRAST _UxGT("Contraste LCD") -#define MSG_STORE_EEPROM _UxGT("Enregistrer config.") -#define MSG_LOAD_EEPROM _UxGT("Charger config.") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaurer défauts") -#define MSG_INIT_EEPROM _UxGT("Initialiser EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("MaJ Firmware SD") -#define MSG_RESET_PRINTER _UxGT("RaZ imprimante") -#define MSG_REFRESH _UxGT("Actualiser") -#define MSG_WATCH _UxGT("Surveiller") -#define MSG_PREPARE _UxGT("Préparer") -#define MSG_TUNE _UxGT("Régler") -#define MSG_START_PRINT _UxGT("Démarrer impression") -#define MSG_BUTTON_NEXT _UxGT("Suivant") -#define MSG_BUTTON_INIT _UxGT("Init.") -#define MSG_BUTTON_STOP _UxGT("Stop") -#define MSG_BUTTON_PRINT _UxGT("Imprimer") -#define MSG_BUTTON_RESET _UxGT("Reset") -#define MSG_BUTTON_CANCEL _UxGT("Annuler") -#define MSG_BUTTON_DONE _UxGT("Terminé") -#define MSG_PAUSE_PRINT _UxGT("Pause impression") -#define MSG_RESUME_PRINT _UxGT("Reprendre impr.") -#define MSG_STOP_PRINT _UxGT("Arrêter impr.") -#define MSG_OUTAGE_RECOVERY _UxGT("Récupér. coupure") -#define MSG_MEDIA_MENU _UxGT("Impression SD") -#define MSG_NO_MEDIA _UxGT("Pas de média") -#define MSG_DWELL _UxGT("Repos...") -#define MSG_USERWAIT _UxGT("Attente utilis.") -#define MSG_PRINT_PAUSED _UxGT("Impr. en pause") -#define MSG_PRINTING _UxGT("Impression") -#define MSG_PRINT_ABORTED _UxGT("Impr. annulée") -#define MSG_NO_MOVE _UxGT("Moteurs bloqués") -#define MSG_KILLED _UxGT("KILLED") -#define MSG_STOPPED _UxGT("STOPPÉ") -#define MSG_CONTROL_RETRACT _UxGT("Retrait mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Ech. Retr. mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retrait V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Saut Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Rappel mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ech. Rappel mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Rappel V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Ech. Rappel V") -#define MSG_AUTORETRACT _UxGT("Retrait auto") -#define MSG_TOOL_CHANGE _UxGT("Changement outil") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Augmenter Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Vitesse primaire") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Vitesse retrait") -#define MSG_NOZZLE_STANDBY _UxGT("Attente buse") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Distance retrait") -#define MSG_FILAMENT_PURGE_LENGTH _UxGT("Longueur de purge") -#define MSG_FILAMENTCHANGE _UxGT("Changer filament") -#define MSG_FILAMENTLOAD _UxGT("Charger filament") -#define MSG_FILAMENTUNLOAD _UxGT("Retrait filament") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Décharger tout") -#define MSG_INIT_MEDIA _UxGT("Charger le média") -#define MSG_CHANGE_MEDIA _UxGT("Actualiser média") -#define MSG_RELEASE_MEDIA _UxGT("Retirer le média") -#define MSG_ZPROBE_OUT _UxGT("Sonde Z hors lit") -#define MSG_SKEW_FACTOR _UxGT("Facteur écart") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Cmd: Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("Cmd: Reset") -#define MSG_BLTOUCH_STOW _UxGT("Cmd: Ranger") -#define MSG_BLTOUCH_DEPLOY _UxGT("Cmd: Déployer") -#define MSG_BLTOUCH_SW_MODE _UxGT("Cmd: Mode SW") -#define MSG_BLTOUCH_5V_MODE _UxGT("Cmd: Mode 5V") -#define MSG_BLTOUCH_OD_MODE _UxGT("Cmd: Mode OD") -#define MSG_BLTOUCH_MODE_STORE _UxGT("Appliquer Mode") -#define MSG_BLTOUCH_MODE_STORE_5V _UxGT("Mise en 5V") -#define MSG_BLTOUCH_MODE_STORE_OD _UxGT("Mise en OD") -#define MSG_BLTOUCH_MODE_ECHO _UxGT("Afficher Mode") -#define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#define MSG_TOUCHMI_INIT _UxGT("Init. TouchMI") -#define MSG_TOUCHMI_ZTEST _UxGT("Test décalage Z") -#define MSG_TOUCHMI_SAVE _UxGT("Sauvegarde") -#define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("Déployer TouchMI") -#define MSG_MANUAL_DEPLOY _UxGT("Déployer Sonde Z") -#define MSG_MANUAL_STOW _UxGT("Ranger Sonde Z") -#define MSG_HOME_FIRST _UxGT("Origine %s%s%s Premier") -#define MSG_ZPROBE_ZOFFSET _UxGT("Décalage Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Total") -#define MSG_ENDSTOP_ABORT _UxGT("Butée abandon") -#define MSG_HEATING_FAILED_LCD _UxGT("Err de chauffe") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Err de chauffe lit") -#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Err chauffe caisson") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err TEMP. REDONDANTE") -#define MSG_THERMAL_RUNAWAY _UxGT("Err THERMIQUE") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("Err THERMIQUE LIT") -#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("Err THERMIQUE CAISSON") -#define MSG_ERR_MAXTEMP _UxGT("Err TEMP. MAX") -#define MSG_ERR_MINTEMP _UxGT("Err TEMP. MIN") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err TEMP. MAX LIT") -#define MSG_ERR_MINTEMP_BED _UxGT("Err TEMP. MIN LIT") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err MAXTEMP CAISSON") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err MINTEMP CAISSON") -#define MSG_ERR_Z_HOMING _UxGT("Origine XY Premier") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Contrôle LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Lumière"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Préregl. LED"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rouge"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Jaune"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Vert"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Bleu"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Blanc"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Defaut"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("LEDs perso."); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensité rouge"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensité vert"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensité bleu"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensité blanc"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosité"); -#define MSG_HALTED _UxGT("IMPR. STOPPÉE") -#define MSG_PLEASE_RESET _UxGT("Redémarrer SVP") -#define MSG_SHORT_DAY _UxGT("j") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only + PROGMEM Language_Str MSG_MOVING = _UxGT("Déplacement..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Débloquer XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Déplacer X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Déplacer Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Déplacer Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudeur"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrudeur ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrudeur ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrudeur ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrudeur ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrudeur ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrudeur ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Buse trop froide"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Déplacer %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Déplacer 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Déplacer 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Vitesse"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Lit Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Buse"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Buse ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Buse ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Buse ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Buse ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Buse ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Buse ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Lit"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Caisson"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vitesse ventil."); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Vitesse ventil. 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Vitesse ventil. 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Vitesse ventil. 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra V ventil."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Extra V ventil. 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Extra V ventil. 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Extra V ventil. 3"); -#define MSG_HEATING _UxGT("En chauffe...") -#define MSG_COOLING _UxGT("Refroidissement") -#define MSG_BED_HEATING _UxGT("Lit en chauffe...") -#define MSG_BED_COOLING _UxGT("Refroid. du lit...") -#define MSG_CHAMBER_HEATING _UxGT("Chauffe caisson...") -#define MSG_CHAMBER_COOLING _UxGT("Refroid. caisson...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibration Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrer X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrer Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrer Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrer centre") -#define MSG_DELTA_SETTINGS _UxGT("Réglages Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Calibration Auto") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Hauteur Delta") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Delta Z sonde") -#define MSG_DELTA_DIAG_ROD _UxGT("Diagonale") -#define MSG_DELTA_HEIGHT _UxGT("Hauteur") -#define MSG_DELTA_RADIUS _UxGT("Rayon") + PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flux ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flux ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flux ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flux ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flux ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flux ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Contrôler"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Facteur"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Auto."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Marche"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Arrêt"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Sélectionner"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Sélectionner ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Sélectionner ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Sélectionner ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Sélectionner ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Sélectionner ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Sélectionner ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Accélération"); + PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT(" jerk"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT(" jerk"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT(" jerk"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve jerk"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Vélocité"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Déviat. jonct."); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("V dépl. min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accélération"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A retrait"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A dépl."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pas/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pas/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Température"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Mouvement"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diamètre fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Diamètre fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Diamètre fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Diamètre fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Diamètre fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Diamètre fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Diamètre fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Retrait mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Charger mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Avance K ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Avance K ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Avance K ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Avance K ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Avance K ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Avance K ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Enregistrer config."); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Charger config."); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Restaurer défauts"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialiser EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("RaZ imprimante"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Surveiller"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Préparer"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Régler"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Démarrer impression"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Suivant"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimer"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annuler"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Terminé"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause impression"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reprendre impr."); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arrêter impr."); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Récupér. coupure"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Impression SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Pas de média"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Repos..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Attente utilis."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impr. en pause"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Impression"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impr. annulée"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Moteurs bloqués"); + PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPÉ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrait mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ech. Retr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retrait V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saut Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Rappel mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ech. Rappel mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Rappel V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Ech. Rappel V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retrait auto"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Changement outil"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Augmenter Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Vitesse primaire"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Vitesse retrait"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Attente buse"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Distance retrait"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Longueur de purge"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Changer filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Changer filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Changer filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Changer filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Changer filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Changer filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Changer filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Charger filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Charger filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Charger filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Charger filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Charger filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Charger filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Charger filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Retrait filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Retrait filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Retrait filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Retrait filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Retrait filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Retrait filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Décharger tout"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Charger le média"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Actualiser média"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Retirer le média"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonde Z hors lit"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Facteur écart"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Ranger"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Déployer"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Mode SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Mode 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Mode OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Appliquer Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Mise en 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Mise en OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Afficher Mode"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init. TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test décalage Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Sauvegarde"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Déployer TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Déployer Sonde Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ranger Sonde Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origine %s%s%s Premier"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Décalage Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Butée abandon"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err de chauffe"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err TEMP. REDONDANTE"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Err THERMIQUE"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err TEMP. MAX"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err TEMP. MIN"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Origine XY Premier"); -#define MSG_INFO_MENU _UxGT("Infos imprimante") -#define MSG_INFO_PRINTER_MENU _UxGT("Infos imprimante") -#define MSG_3POINT_LEVELING _UxGT("Niveau à 3 points") -#define MSG_LINEAR_LEVELING _UxGT("Niveau linéaire") -#define MSG_BILINEAR_LEVELING _UxGT("Niveau bilinéaire") -#define MSG_UBL_LEVELING _UxGT("Niveau lit unifié") -#define MSG_MESH_LEVELING _UxGT("Niveau maillage") -#define MSG_INFO_STATS_MENU _UxGT("Stats. imprimante") -#define MSG_INFO_BOARD_MENU _UxGT("Infos carte") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistances") -#define MSG_INFO_EXTRUDERS _UxGT("Extrudeurs") -#define MSG_INFO_BAUDRATE _UxGT("Bauds") -#define MSG_INFO_PROTOCOL _UxGT("Protocole") -#define MSG_CASE_LIGHT _UxGT("Lumière caisson") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosité") + PROGMEM Language_Str MSG_HALTED = _UxGT("IMPR. STOPPÉE"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Redémarrer SVP"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("j"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only -#define MSG_EXPECTED_PRINTER _UxGT("Imprimante incorrecte") + PROGMEM Language_Str MSG_HEATING = _UxGT("En chauffe..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Refroidissement"); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Lit en chauffe..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Refroid. du lit..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chauffe caisson..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Refroid. caisson..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibration Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrer centre"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Réglages Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Calibration Auto"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Hauteur Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Delta Z sonde"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diagonale"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Hauteur"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Rayon"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Nbre impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminées") - #define MSG_INFO_PRINT_TIME _UxGT("Tps impr. total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impr. la + longue") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total filament") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminées") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("+ long") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Filament") -#endif + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Infos imprimante"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Infos imprimante"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Niveau à 3 points"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Niveau linéaire"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Niveau bilinéaire"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Niveau lit unifié"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Niveau maillage"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Stats. imprimante"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Infos carte"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistances"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudeurs"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Bauds"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocole"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Lumière caisson"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosité"); -#define MSG_INFO_MIN_TEMP _UxGT("Temp Min") -#define MSG_INFO_MAX_TEMP _UxGT("Temp Max") -#define MSG_INFO_PSU _UxGT("Alimentation") -#define MSG_DRIVE_STRENGTH _UxGT("Puiss. moteur ") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM sauv.") -#define MSG_ERROR_TMC _UxGT("ERREUR CONNEXION TMC") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Imprimante incorrecte"); -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPR. PAUSE") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CHARGER FIL") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("DECHARGER FIL") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPTIONS REPRISE:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purger encore") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Reprendre impr.") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Buse: ") -#define MSG_RUNOUT_SENSOR _UxGT("Capteur fil.") -#define MSG_ERR_HOMING_FAILED _UxGT("Echec origine") -#define MSG_ERR_PROBING_FAILED _UxGT("Echec sonde") -#define MSG_M600_TOO_COLD _UxGT("M600: Trop froid") -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("CHANGER FILAMENT") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("CHOISIR FILAMENT") -#define MSG_MMU2_MENU _UxGT("MMU") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Update MMU firmware!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU ne répond plus") -#define MSG_MMU2_RESUME _UxGT("Continuer impr.") -#define MSG_MMU2_RESUMING _UxGT("Reprise...") -#define MSG_MMU2_LOAD_FILAMENT _UxGT("Charger filament") -#define MSG_MMU2_LOAD_ALL _UxGT("Charger tous") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Charger dans buse") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Ejecter filament") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Ejecter fil. 1") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Ejecter fil. 2") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Ejecter fil. 3") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Ejecter fil. 4") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Ejecter fil. 5") -#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Retrait filament") -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Chargem. fil. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Ejection fil...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Retrait fil....") -#define MSG_MMU2_ALL _UxGT("Tous") -#define MSG_MMU2_FILAMENT0 _UxGT("Filament 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filament 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filament 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filament 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filament 5") -#define MSG_MMU2_RESET _UxGT("Réinit. MMU") -#define MSG_MMU2_RESETTING _UxGT("Réinit. MMU...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Retrait, click") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nbre impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tps impr. total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impr. la + longue"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total filament"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("+ long"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filament"); + #endif -#define MSG_MIX _UxGT("Mix") -#define MSG_MIX_COMPONENT _UxGT("Composante") -#define MSG_MIXER _UxGT("Mixeur") -#define MSG_GRADIENT _UxGT("Dégradé") -#define MSG_FULL_GRADIENT _UxGT("Dégradé complet") -#define MSG_TOGGLE_MIX _UxGT("Toggle mix") -#define MSG_CYCLE_MIX _UxGT("Cycle mix") -#define MSG_GRADIENT_MIX _UxGT("Mix dégradé") -#define MSG_REVERSE_GRADIENT _UxGT("Inverser dégradé") -#define MSG_ACTIVE_VTOOL _UxGT("Active V-tool") -#define MSG_START_VTOOL _UxGT("Début V-tool") -#define MSG_END_VTOOL _UxGT(" Fin V-tool") -#define MSG_GRADIENT_ALIAS _UxGT("Alias V-tool") -#define MSG_RESET_VTOOLS _UxGT("Réinit. V-tools") -#define MSG_COMMIT_VTOOL _UxGT("Valider Mix V-tool") -#define MSG_VTOOLS_RESET _UxGT("V-tools réinit. ok") -#define MSG_START_Z _UxGT("Début Z") -#define MSG_END_Z _UxGT(" Fin Z") -#define MSG_GAMES _UxGT("Jeux") -#define MSG_BRICKOUT _UxGT("Casse-briques") -#define MSG_INVADERS _UxGT("Invaders") -#define MSG_SNAKE _UxGT("Sn4k3") -#define MSG_MAZE _UxGT("Labyrinthe") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alimentation"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Puiss. moteur "); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM sauv."); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERREUR CONNEXION TMC"); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Presser bouton") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("pour reprendre") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parking...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attente filament") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("pour démarrer") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("et app. bouton") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pour continuer...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Presser le bouton") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("pour chauffer...") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Buse en chauffe") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Patienter SVP...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attente") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("retrait du filament") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attente") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("chargement filament") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attente") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Purge filament") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Presser pour finir") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("la purge du filament") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attente reprise") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("impression") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Clic pour continuer") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Patience...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer fil.") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Chauffer ?") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Chauffage...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Retrait fil...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Chargement...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purge...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Terminer ?") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprise...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CHANGER FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPR. PAUSE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CHARGER FIL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DECHARGER FIL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPTIONS REPRISE:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purger encore"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Reprendre impr."); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Buse: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Capteur fil."); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Echec origine"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Echec sonde"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Trop froid"); -#define MSG_TMC_DRIVERS _UxGT("Drivers TMC") -#define MSG_TMC_CURRENT _UxGT("Courant driver") -#define MSG_TMC_HYBRID_THRS _UxGT("Seuil hybride") -#define MSG_TMC_HOMING_THRS _UxGT("Home sans capteur") -#define MSG_TMC_STEPPING_MODE _UxGT("Mode pas à pas") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop activé") -#define MSG_SERVICE_RESET _UxGT("Réinit.") -#define MSG_SERVICE_IN _UxGT(" dans:") -#define MSG_BACKLASH _UxGT("Backlash") -#define MSG_BACKLASH_CORRECTION _UxGT("Correction") -#define MSG_BACKLASH_SMOOTHING _UxGT("Lissage") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOISIR FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU ne répond plus"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuer impr."); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Reprise..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Charger filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Charger tous"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Charger dans buse"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejecter filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Ejecter fil. 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Ejecter fil. 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Ejecter fil. 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Ejecter fil. 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Ejecter fil. 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Retrait filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Chargem. fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejection fil..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Retrait fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tous"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Réinit. MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Réinit. MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retrait, click"); + + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Composante 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Composante 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Composante 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Composante 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Composante 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Composante 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixeur"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Dégradé"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Dégradé complet"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mix dégradé"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverser dégradé"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Début V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Réinit. V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Valider Mix V-tool"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools réinit. ok"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Début Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); + PROGMEM Language_Str MSG_GAMES = _UxGT("Jeux"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Casse-briques"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Labyrinthe"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Presser bouton", "pour reprendre")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Attente filament", "pour démarrer")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insérer filament", "et app. bouton", "pour continuer...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Presser le bouton", "pour chauffer...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Buse en chauffe", "Patienter SVP...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Attente", "retrait du filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Attente", "chargement filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Attente", "Purge filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Presser pour finir", "la purge du filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Attente reprise", "impression")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clic pour continuer")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Patience...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insérer fil.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Chauffer ?")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Chauffage...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Retrait fil...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Chargement...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purge...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Terminer ?")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprise...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Courant driver"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Réinit."); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dans:"); + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Lissage"); +} diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 0de6382e54..554230ca35 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -32,222 +32,241 @@ #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -#define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") -#define MSG_MEDIA_INSERTED _UxGT("Tarxeta inserida") -#define MSG_MEDIA_REMOVED _UxGT("Tarxeta retirada") -#define MSG_LCD_ENDSTOPS _UxGT("FinCarro") -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_AUTOSTART _UxGT("Autoarranque") -#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") -#define MSG_AUTO_HOME _UxGT("Ir a orixe") -#define MSG_AUTO_HOME_X _UxGT("Ir orixe X") -#define MSG_AUTO_HOME_Y _UxGT("Ir orixe Y") -#define MSG_AUTO_HOME_Z _UxGT("Ir orixe Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Ir orixes XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Prema pulsador") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Seguinte punto") -#define MSG_LEVEL_BED_DONE _UxGT("Nivelado feito") -#define MSG_SET_HOME_OFFSETS _UxGT("Offsets na orixe") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets fixados") -#define MSG_SET_ORIGIN _UxGT("Fixar orixe") -#define MSG_PREHEAT_1 _UxGT("Prequentar " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Prequentar " PREHEAT_1_LABEL " ") -#define MSG_PREHEAT_1_ALL _UxGT("Preque. " PREHEAT_1_LABEL " Todo") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Preque. " PREHEAT_1_LABEL " Cama") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Preque. " PREHEAT_1_LABEL " conf") -#define MSG_PREHEAT_2 _UxGT("Prequentar " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Prequentar " PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL _UxGT("Preque. " PREHEAT_2_LABEL " Todo") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Preque. " PREHEAT_2_LABEL " Cama") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Preque. " PREHEAT_2_LABEL " conf") -#define MSG_COOLDOWN _UxGT("Arrefriar") -#define MSG_SWITCH_PS_ON _UxGT("Acender") -#define MSG_SWITCH_PS_OFF _UxGT("Apagar") -#define MSG_EXTRUDE _UxGT("Extrudir") -#define MSG_RETRACT _UxGT("Retraer") -#define MSG_MOVE_AXIS _UxGT("Mover eixe") -#define MSG_BED_LEVELING _UxGT("Nivelar cama") -#define MSG_LEVEL_BED _UxGT("Nivelar cama") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_MOVE_Z_DIST _UxGT("Mover %smm") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidade") -#define MSG_BED_Z _UxGT("Cama Z") -#define MSG_NOZZLE _UxGT("Bico") -#define MSG_BED _UxGT("Cama") -#define MSG_FAN_SPEED _UxGT("Velocidade vent.") -#define MSG_FLOW _UxGT("Fluxo") -//#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -//#define MSG_AUTOTEMP _UxGT("Autotemp") -//#define MSG_LCD_ON _UxGT("On") -//#define MSG_LCD_OFF _UxGT("Off") -//#define MSG_PID_P _UxGT("PID-P") -//#define MSG_PID_I _UxGT("PID-I") -//#define MSG_PID_D _UxGT("PID-D") -//#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Escolla") -#define MSG_ACC _UxGT("Acel") -//#define MSG_JERK _UxGT("Jerk") -//#if IS_KINEMATIC -// #define MSG_VA_JERK _UxGT("Va-jerk") -// #define MSG_VB_JERK _UxGT("Vb-jerk") -// #define MSG_VC_JERK _UxGT("Vc-jerk") -//#else -// #define MSG_VA_JERK _UxGT("Vx-jerk") -// #define MSG_VB_JERK _UxGT("Vy-jerk") -// #define MSG_VC_JERK _UxGT("Vz-jerk") -//#endif -//#define MSG_VE_JERK _UxGT("Ve-jerk") -//#define MSG_VMAX _UxGT("Vmax ") -//#define MSG_VMIN _UxGT("Vmin") -//#define MSG_VTRAV_MIN _UxGT("VTrav min") -//#define MSG_AMAX _UxGT("Amax ") -//#define MSG_A_RETRACT _UxGT("A-retract") -//#define MSG_A_TRAVEL _UxGT("A-travel") -#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#else - #define MSG_ASTEPS _UxGT("X pasos/mm") - #define MSG_BSTEPS _UxGT("Y pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#endif -#define MSG_ESTEPS _UxGT("E pasos/mm") -#define MSG_E1STEPS _UxGT("E1 pasos/mm") -#define MSG_E2STEPS _UxGT("E2 pasos/mm") -#define MSG_E3STEPS _UxGT("E3 pasos/mm") -#define MSG_E4STEPS _UxGT("E4 pasos/mm") -#define MSG_E5STEPS _UxGT("E5 pasos/mm") -#define MSG_E6STEPS _UxGT("E6 pasos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movemento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diam. fil.") -#define MSG_CONTRAST _UxGT("Constraste LCD") -#define MSG_STORE_EEPROM _UxGT("Gardar en memo.") -#define MSG_LOAD_EEPROM _UxGT("Cargar de memo.") -#define MSG_RESTORE_FAILSAFE _UxGT("Cargar de firm.") -#define MSG_REFRESH _UxGT("Volver a cargar") -#define MSG_WATCH _UxGT("Monitorizacion") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Axustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impres.") -#define MSG_RESUME_PRINT _UxGT("Seguir impres.") -#define MSG_STOP_PRINT _UxGT("Deter impres.") -#define MSG_MEDIA_MENU _UxGT("Tarxeta SD") -#define MSG_NO_MEDIA _UxGT("Sen tarxeta SD") -#define MSG_DWELL _UxGT("En repouso...") -#define MSG_USERWAIT _UxGT("A espera...") -#define MSG_PRINT_ABORTED _UxGT("Impre. cancelada") -#define MSG_NO_MOVE _UxGT("Sen movemento.") -#define MSG_KILLED _UxGT("PROGRAMA MORTO") -#define MSG_STOPPED _UxGT("PROGRAMA PARADO") -#define MSG_CONTROL_RETRACT _UxGT("Retraccion mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Cambio retra. mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraccion V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Alzar Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Recup. retra. mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Cambio recup. mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Recuperacion V") -#define MSG_AUTORETRACT _UxGT("Retraccion auto.") -#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamen.") -#define MSG_INIT_MEDIA _UxGT("Iniciando SD") -#define MSG_CHANGE_MEDIA _UxGT("Cambiar SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda-Z sen cama") -//#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -#define MSG_BLTOUCH_SELFTEST _UxGT("Comprobar BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("Iniciar BLTouch") -#define MSG_ZPROBE_ZOFFSET _UxGT("Offset Z") -#define MSG_BABYSTEP_X _UxGT("Micropaso X") -#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") -#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") -#define MSG_ENDSTOP_ABORT _UxGT("Erro fin carro") -#define MSG_HEATING_FAILED_LCD _UxGT("Fallo quentando") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro temperatura") -#define MSG_THERMAL_RUNAWAY _UxGT("Temp. excesiva") -//#define MSG_ERR_MAXTEMP _UxGT("Err: temp. max.") -//#define MSG_ERR_MINTEMP _UxGT("Err: temp. min.") -//#define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") -//#define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") -//#define MSG_ERR_Z_HOMING _UxGT("Home XY first") -#define MSG_HALTED _UxGT("SISTEMA MORTO") -#define MSG_PLEASE_RESET _UxGT("Debe reiniciar!") -//#define MSG_SHORT_DAY _UxGT("d") // One character only -//#define MSG_SHORT_HOUR _UxGT("h") // One character only -//#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Quentando...") -#define MSG_BED_HEATING _UxGT("Quentando cama...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibracion Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_INFO_MENU _UxGT("Acerca de...") -#define MSG_INFO_PRINTER_MENU _UxGT("Informacion") -#define MSG_INFO_STATS_MENU _UxGT("Estadisticas") -#define MSG_INFO_BOARD_MENU _UxGT("Placa nai") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") -#define MSG_INFO_BAUDRATE _UxGT("Baudios") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz") -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Total traballos") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Total completos") - #define MSG_INFO_PRINT_TIME _UxGT("Tempo impresion") - #define MSG_INFO_PRINT_LONGEST _UxGT("Traballo +longo") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total extruido") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Traballos") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completos") - #define MSG_INFO_PRINT_TIME _UxGT("Tempo") - #define MSG_INFO_PRINT_LONGEST _UxGT("O +longo") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruido") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Fonte alime.") -#define MSG_DRIVE_STRENGTH _UxGT("Potencia motor") -#define MSG_DAC_PERCENT _UxGT("Motor %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Garda DAC EEPROM") +namespace Language_gl { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Segue traballo") + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Galician"); -#define MSG_EXPECTED_PRINTER _UxGT("Impresora incorrecta") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" lista."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("FinCarro"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoarranque"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a orixe"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir orixe X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir orixe Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir orixe Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Ir orixes XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Prema pulsador"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Seguinte punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelado feito"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Offsets na orixe"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets fixados"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Fixar orixe"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Prequentar ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Prequentar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Prequentar ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefriar"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Acender"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixe"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelar cama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar cama"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bico"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Cama"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Velocidade vent."); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Velocidade vent. 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Velocidade vent. 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Velocidade vent. 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Fluxo ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Fluxo ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Fluxo ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Fluxo ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Fluxo ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Fluxo ") LCD_STR_N5; + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Escolla"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Escolla ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Escolla ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Escolla ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Escolla ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Escolla ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Escolla ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Acel"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movemento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Diam. fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Diam. fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Diam. fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Diam. fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Diam. fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Diam. fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Constraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gardar en memo."); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar de memo."); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Cargar de firm."); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Volver a cargar"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Monitorizacion"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Axustar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impres."); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Seguir impres."); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Deter impres."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tarxeta SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sen tarxeta SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("En repouso..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("A espera..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impre. cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sen movemento."); + PROGMEM Language_Str MSG_KILLED = _UxGT("PROGRAMA MORTO"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("PROGRAMA PARADO"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraccion mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Cambio retra. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraccion V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Alzar Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Recup. retra. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Cambio recup. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Recuperacion V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retraccion auto."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar filamen."); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Cambiar filamen. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Cambiar filamen. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Cambiar filamen. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Cambiar filamen. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Cambiar filamen. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Cambiar filamen. ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Iniciando SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda-Z sen cama"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Comprobar BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Iniciar BLTouch"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Erro fin carro"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fallo quentando"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro temperatura"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Temp. excesiva"); + PROGMEM Language_Str MSG_HALTED = _UxGT("SISTEMA MORTO"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Debe reiniciar!"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Quentando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Quentando cama..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Acerca de..."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Informacion"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadisticas"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Placa nai"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total traballos"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Total completos"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo impresion"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Traballo +longo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total extruido"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Traballos"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completos"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("O +longo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fonte alime."); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Potencia motor"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Garda DAC EEPROM"); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Agarde para") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar troco") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filamento") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Agarde pola") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("descarga do") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamento") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Introduza o") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("filamento e") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("faga click") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Agarde pola") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("carga do") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamento") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Agarde para") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("seguir co") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("traballo") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Agarde...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Descargando...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Introduza e click") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Cargando...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Seguindo...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Segue traballo"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Impresora incorrecta"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Agarde para", "iniciar troco", "de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Agarde pola", "descarga do", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Introduza o", "filamento e", "faga click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Agarde pola", "carga do", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Agarde para", "seguir co", "traballo")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Agarde...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Descargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Introduza e click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Seguindo...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 6b46d730f2..06822b3ccf 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -30,223 +30,181 @@ */ #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" spreman.") -#define MSG_MEDIA_INSERTED _UxGT("SD kartica umetnuta") -#define MSG_MEDIA_REMOVED _UxGT("SD kartica uklonjena") -//#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -//#define MSG_MAIN _UxGT("Main") -#define MSG_AUTOSTART _UxGT("Auto pokretanje") -#define MSG_DISABLE_STEPPERS _UxGT("Ugasi steppere") -#define MSG_AUTO_HOME _UxGT("Automatski homing") -#define MSG_AUTO_HOME_X _UxGT("Home-aj X") -#define MSG_AUTO_HOME_Y _UxGT("Home-aj Y") -#define MSG_AUTO_HOME_Z _UxGT("Home-aj Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Home-aj XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Klikni za početak") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Sljedeća točka") -#define MSG_LEVEL_BED_DONE _UxGT("Niveliranje gotovo!") -#define MSG_SET_HOME_OFFSETS _UxGT("Postavi home offsete") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets postavljeni") -#define MSG_SET_ORIGIN _UxGT("Postavi ishodište") -#define MSG_PREHEAT_1 _UxGT("Predgrij " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Sve") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Bed") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" conf") -#define MSG_PREHEAT_2 _UxGT("Predgrij " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Sve") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" conf") -#define MSG_COOLDOWN _UxGT("Hlađenje") -#define MSG_SWITCH_PS_ON _UxGT("Uključi napajanje") -#define MSG_SWITCH_PS_OFF _UxGT("Isključi napajanje") -//#define MSG_EXTRUDE _UxGT("Extrude") -//#define MSG_RETRACT _UxGT("Retract") -#define MSG_MOVE_AXIS _UxGT("Miči os") -#define MSG_BED_LEVELING _UxGT("Niveliraj bed") -#define MSG_LEVEL_BED _UxGT("Niveliraj bed") -#define MSG_MOVE_X _UxGT("Miči X") -#define MSG_MOVE_Y _UxGT("Miči Y") -#define MSG_MOVE_Z _UxGT("Miči Z") -//#define MSG_MOVE_E _UxGT("Extruder") -#define MSG_MOVE_Z_DIST _UxGT("Miči %smm") -#define MSG_MOVE_01MM _UxGT("Miči 0.1mm") -#define MSG_MOVE_1MM _UxGT("Miči 1mm") -#define MSG_MOVE_10MM _UxGT("Miči 10mm") -#define MSG_SPEED _UxGT("Brzina") -#define MSG_BED_Z _UxGT("Bed Z") -#define MSG_NOZZLE _UxGT("Dizna") -#define MSG_BED _UxGT("Bed") -#define MSG_FAN_SPEED _UxGT("Brzina ventilatora") -//#define MSG_FLOW _UxGT("Flow") -//#define MSG_CONTROL _UxGT("Control") -//#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -//#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -//#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -//#define MSG_AUTOTEMP _UxGT("Autotemp") -//#define MSG_LCD_ON _UxGT("On") -//#define MSG_LCD_OFF _UxGT("Off") -//#define MSG_PID_P _UxGT("PID-P") -//#define MSG_PID_I _UxGT("PID-I") -//#define MSG_PID_D _UxGT("PID-D") -//#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Odaberi") -//#define MSG_ACC _UxGT("Accel") -//#define MSG_JERK _UxGT("Jerk") -//#if IS_KINEMATIC -// #define MSG_VA_JERK _UxGT("Va-jerk") -// #define MSG_VB_JERK _UxGT("Vb-jerk") -// #define MSG_VC_JERK _UxGT("Vc-jerk") -//#else -// #define MSG_VA_JERK _UxGT("Vx-jerk") -// #define MSG_VB_JERK _UxGT("Vy-jerk") -// #define MSG_VC_JERK _UxGT("Vz-jerk") -//#endif -//#define MSG_VE_JERK _UxGT("Ve-jerk") -//#define MSG_VMAX _UxGT("Vmax ") -//#define MSG_VMIN _UxGT("Vmin") -//#define MSG_VTRAV_MIN _UxGT("VTrav min") -//#define MSG_AMAX _UxGT("Amax ") -//#define MSG_A_RETRACT _UxGT("A-retract") -//#define MSG_A_TRAVEL _UxGT("A-travel") -//#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -//#if IS_KINEMATIC -// #define MSG_ASTEPS _UxGT("Asteps/mm") -// #define MSG_BSTEPS _UxGT("Bsteps/mm") -// #define MSG_CSTEPS _UxGT("Csteps/mm") -//#else -// #define MSG_ASTEPS _UxGT("Xsteps/mm") -// #define MSG_BSTEPS _UxGT("Ysteps/mm") -// #define MSG_CSTEPS _UxGT("Zsteps/mm") -//#endif -//#define MSG_ESTEPS _UxGT("Esteps/mm") -//#define MSG_E1STEPS _UxGT("E1steps/mm") -//#define MSG_E2STEPS _UxGT("E2steps/mm") -//#define MSG_E3STEPS _UxGT("E3steps/mm") -//#define MSG_E4STEPS _UxGT("E4steps/mm") -//#define MSG_E5STEPS _UxGT("E5steps/mm") -//#define MSG_E6STEPS _UxGT("E6steps/mm") -#define MSG_TEMPERATURE _UxGT("Temperature") -#define MSG_MOTION _UxGT("Gibanje") -//#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_CONTRAST _UxGT("Kontrast LCD-a") -#define MSG_STORE_EEPROM _UxGT("Pohrani u memoriju") -#define MSG_LOAD_EEPROM _UxGT("Učitaj memoriju") -#define MSG_RESTORE_FAILSAFE _UxGT("Učitaj failsafe") -#define MSG_REFRESH _UxGT("Osvježi") -#define MSG_WATCH _UxGT("Info screen") -#define MSG_PREPARE _UxGT("Pripremi") -//#define MSG_TUNE _UxGT("Tune") -#define MSG_PAUSE_PRINT _UxGT("Pauziraj print") -#define MSG_RESUME_PRINT _UxGT("Nastavi print") -#define MSG_STOP_PRINT _UxGT("Zaustavi print") -#define MSG_MEDIA_MENU _UxGT("Printaj s SD kartice") -#define MSG_NO_MEDIA _UxGT("Nema SD kartice") -//#define MSG_DWELL _UxGT("Sleep...") -#define MSG_USERWAIT _UxGT("Čekaj korisnika...") -#define MSG_PRINT_ABORTED _UxGT("Print otkazan") -//#define MSG_NO_MOVE _UxGT("No move.") -//#define MSG_KILLED _UxGT("KILLED. ") -#define MSG_STOPPED _UxGT("ZAUSTAVLJEN. ") -//#define MSG_CONTROL_RETRACT _UxGT("Retract mm") -//#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") -//#define MSG_CONTROL_RETRACTF _UxGT("Retract V") -//#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") -//#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -//#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -//#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -//#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENTCHANGE _UxGT("Promijeni filament") -#define MSG_INIT_MEDIA _UxGT("Init. SD karticu") -#define MSG_CHANGE_MEDIA _UxGT("Promijeni SD karticu") -//#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") -//#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -//#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -//#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -//#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") -//#define MSG_BABYSTEP_X _UxGT("Babystep X") -//#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -//#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -//#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -#define MSG_HEATING_FAILED_LCD _UxGT("Grijanje neuspješno") -//#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") -//#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") -//#define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP") -//#define MSG_ERR_MINTEMP _UxGT("Err: MINTEMP") -//#define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") -//#define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") -//#define MSG_ERR_Z_HOMING _UxGT("Home XY first") -//#define MSG_HALTED _UxGT("PRINTER HALTED") -//#define MSG_PLEASE_RESET _UxGT("Please reset") -//#define MSG_SHORT_DAY _UxGT("d") // One character only -//#define MSG_SHORT_HOUR _UxGT("h") // One character only -//#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Grijanje...") -#define MSG_BED_HEATING _UxGT("Grijanje Bed-a...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibracija") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriraj X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriraj Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibriraj Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibriraj Središte") -#define MSG_INFO_MENU _UxGT("O printeru") -#define MSG_INFO_PRINTER_MENU _UxGT("Podaci o printeru") -#define MSG_INFO_STATS_MENU _UxGT("Statistika printera") -#define MSG_INFO_BOARD_MENU _UxGT("Podaci o elektronici") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistori") -#define MSG_INFO_EXTRUDERS _UxGT("Extruderi") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Osvjetljenje") +namespace Language_hr { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_EXPECTED_PRINTER _UxGT("Neispravan pisač") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Croatian"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Broj printova") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Završeni") - #define MSG_INFO_PRINT_TIME _UxGT("Ukupno printanja") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najduži print") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudirano ukupno") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Printovi") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Završeni") - #define MSG_INFO_PRINT_TIME _UxGT("Ukupno") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najduži") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudirano") -#endif + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" spreman."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD kartica umetnuta"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto pokretanje"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Ugasi steppere"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Automatski homing"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home-aj X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home-aj Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home-aj Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home-aj XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klikni za početak"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sljedeća točka"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Niveliranje gotovo!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Postavi home offsete"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets postavljeni"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Postavi ishodište"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Predgrij ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Sve"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Predgrij ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Predgrij ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Sve"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Hlađenje"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Uključi napajanje"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Isključi napajanje"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Miči os"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Niveliraj bed"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveliraj bed"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Miči X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Miči Y"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Miči %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Miči 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Miči 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Miči 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Brzina"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dizna"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Dizna ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Dizna ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Dizna ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Dizna ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Dizna ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Dizna ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Brzina ventilatora"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Brzina ventilatora 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Brzina ventilatora 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Brzina ventilatora 3"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Odaberi"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Odaberi ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Odaberi ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Odaberi ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Odaberi ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Odaberi ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Odaberi ") LCD_STR_E5; + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Gibanje"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD-a"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Pohrani u memoriju"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Učitaj memoriju"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Učitaj failsafe"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info screen"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Pripremi"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pauziraj print"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nastavi print"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zaustavi print"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Printaj s SD kartice"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nema SD kartice"); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekaj korisnika..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print otkazan"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZAUSTAVLJEN. "); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Promijeni filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Promijeni filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Promijeni filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Promijeni filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Promijeni filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Promijeni filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Promijeni filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Init. SD karticu"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Promijeni SD karticu"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Grijanje neuspješno"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Grijanje..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Grijanje Bed-a..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibracija"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriraj X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriraj Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriraj Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriraj Središte"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O printeru"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Podaci o printeru"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika printera"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Podaci o elektronici"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruderi"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvjetljenje"); -//#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -//#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Napajanje") -//#define MSG_DRIVE_STRENGTH _UxGT("Drive Strength") -//#define MSG_DAC_PERCENT _UxGT("Driver %") -//#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Neispravan pisač"); -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Nastavi print") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Broj printova"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno printanja"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži print"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano ukupno"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printovi"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano"); + #endif -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekaj početak") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filamenta") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("promijeni") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čekaj") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Umetni filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i pritisni tipku") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("za nastavak...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Pričekaj") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") - //#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") - //#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Pričekaj...") - //#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...") - //#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") - //#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Loading...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Nastavljam...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Napajanje"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Nastavi print"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Čekaj", "filament unload")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Pričekaj", "filament load")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Nastavljam...")); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekaj početak", "filamenta", "promijeni")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Umetni filament", "i pritisni tipku", "za nastavak...")); + #else + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT("Pričekaj..."); + //PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("?", "?")); + #endif +} diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 976460d2f2..42784026f7 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -31,541 +31,666 @@ #define DISPLAY_CHARSET_ISO10646_1 -#define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") -#define MSG_YES _UxGT("SI") -#define MSG_NO _UxGT("NO") -#define MSG_BACK _UxGT("Indietro") -#define MSG_MEDIA_ABORTING _UxGT("Annullando...") -#define MSG_MEDIA_INSERTED _UxGT("Media inserito") -#define MSG_MEDIA_REMOVED _UxGT("Media rimosso") -#define MSG_MEDIA_RELEASED _UxGT("Media rilasciato") -#define MSG_MEDIA_WAITING _UxGT("Aspettando media") -#define MSG_MEDIA_READ_ERROR _UxGT("Err.leggendo media") -#define MSG_MEDIA_USB_REMOVED _UxGT("Dispos.USB rimosso") -#define MSG_MEDIA_USB_FAILED _UxGT("Avvio USB fallito") -#define MSG_LCD_ENDSTOPS _UxGT("Finecor.") // Max 8 caratteri -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Finecorsa Soft") -#define MSG_MAIN _UxGT("Menu principale") -#define MSG_ADVANCED_SETTINGS _UxGT("Impostaz. avanzate") -#define MSG_CONFIGURATION _UxGT("Configurazione") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Disabilita Motori") -#define MSG_DEBUG_MENU _UxGT("Menu di debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra avanzam.") -#define MSG_AUTO_HOME _UxGT("Auto Home") -#define MSG_AUTO_HOME_X _UxGT("Home asse X") -#define MSG_AUTO_HOME_Y _UxGT("Home asse Y") -#define MSG_AUTO_HOME_Z _UxGT("Home asse Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Allineam.automat. Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Home assi XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Premi per iniziare") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Punto successivo") -#define MSG_LEVEL_BED_DONE _UxGT("Livel. terminato!") -#define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") -#define MSG_SET_HOME_OFFSETS _UxGT("Imp. offset home") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offset applicato") -#define MSG_SET_ORIGIN _UxGT("Imposta Origine") -#define MSG_PREHEAT_1 _UxGT("Preriscalda " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Preris." PREHEAT_1_LABEL " ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1_N _UxGT("Tutto") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1_N _UxGT("Ugello") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1_N _UxGT("Piatto") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1_N _UxGT("conf") -#define MSG_PREHEAT_2 _UxGT("Preriscalda " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Preris." PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2_N _UxGT("Tutto") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2_N _UxGT("Ugello") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2_N _UxGT("Piatto") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2_N _UxGT("conf") -#define MSG_PREHEAT_CUSTOM _UxGT("Prerisc.personal.") -#define MSG_COOLDOWN _UxGT("Raffredda") -#define MSG_LASER_MENU _UxGT("Controllo laser") -#define MSG_LASER_OFF _UxGT("Laser Off") -#define MSG_LASER_ON _UxGT("Laser On") -#define MSG_LASER_POWER _UxGT("Potenza laser") -#define MSG_SPINDLE_MENU _UxGT("Controllo mandrino") -#define MSG_SPINDLE_OFF _UxGT("Mandrino Off") -#define MSG_SPINDLE_ON _UxGT("Mandrino On") -#define MSG_SPINDLE_POWER _UxGT("Potenza mandrino") -#define MSG_SPINDLE_REVERSE _UxGT("Inverti mandrino") -#define MSG_SWITCH_PS_ON _UxGT("Accendi aliment.") -#define MSG_SWITCH_PS_OFF _UxGT("Spegni aliment.") -#define MSG_EXTRUDE _UxGT("Estrudi") -#define MSG_RETRACT _UxGT("Ritrai") -#define MSG_MOVE_AXIS _UxGT("Muovi Asse") -#define MSG_BED_LEVELING _UxGT("Livella piano") -#define MSG_LEVEL_BED MSG_BED_LEVELING -#define MSG_LEVEL_CORNERS _UxGT("Livella spigoli") -#define MSG_NEXT_CORNER _UxGT("Prossimo spigolo") -#define MSG_MESH_EDITOR _UxGT("Editor Mesh") -#define MSG_EDIT_MESH _UxGT("Modifica Mesh") -#define MSG_EDITING_STOPPED _UxGT("Modif. Mesh Fermata") -#define MSG_PROBING_MESH _UxGT("Punto sondato") -#define MSG_MESH_X _UxGT("Indice X") -#define MSG_MESH_Y _UxGT("Indice Y") -#define MSG_MESH_EDIT_Z _UxGT("Valore di Z") -#define MSG_USER_MENU _UxGT("Comandi personaliz.") -#define MSG_LCD_TILTING_MESH _UxGT("Punto inclinaz.") -#define MSG_M48_TEST _UxGT("Test sonda M48") -#define MSG_M48_POINT _UxGT("Punto M48") -#define MSG_M48_DEVIATION _UxGT("Deviazione") -#define MSG_IDEX_MENU _UxGT("Modo IDEX") -#define MSG_OFFSETS_MENU _UxGT("Strumenti Offsets") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplicazione") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Copia speculare") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Pieno controllo") -#define MSG_X_OFFSET _UxGT("2° ugello X") -#define MSG_Y_OFFSET _UxGT("2° ugello Y") -#define MSG_Z_OFFSET _UxGT("2° ugello Z") -#define MSG_UBL_DOING_G29 _UxGT("G29 in corso") -#define MSG_UBL_TOOLS _UxGT("Strumenti UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Mesh Manuale") -#define MSG_UBL_BC_INSERT _UxGT("Metti spes. e misura") -#define MSG_UBL_BC_INSERT2 _UxGT("Misura") -#define MSG_UBL_BC_REMOVE _UxGT("Rimuovi e mis.piatto") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Spostamento succes.") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Attiva UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Disattiva UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Temp. Piatto") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Temp. Ugello") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Modifica Mesh") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Modif.Mesh personal.") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ritocca Mesh") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Modif.Mesh fatta") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Crea Mesh personal.") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Crea Mesh") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Crea Mesh " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Crea Mesh " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Crea Mesh a freddo") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Aggiusta Alt. Mesh") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Altezza") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valida Mesh") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Valida Mesh " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Valida Mesh " PREHEAT_2_LABEL) -#define MSG_G26_HEATING_BED _UxGT("G26 riscald.letto") -#define MSG_G26_HEATING_NOZZLE _UxGT("G26 riscald.ugello") -#define MSG_G26_MANUAL_PRIME _UxGT("Priming manuale...") -#define MSG_G26_FIXED_LENGTH _UxGT("Prime a lung.fissa") -#define MSG_G26_PRIME_DONE _UxGT("Priming terminato") -#define MSG_G26_CANCELED _UxGT("G26 Annullato") -#define MSG_G26_LEAVING _UxGT("Uscita da G26") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valida Mesh pers.") -#define MSG_UBL_CONTINUE_MESH _UxGT("Continua Mesh") -#define MSG_UBL_MESH_LEVELING _UxGT("Livell. Mesh") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Livell. 3 Punti") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Livell. Griglia Mesh") -#define MSG_UBL_MESH_LEVEL _UxGT("Livella Mesh") -#define MSG_UBL_SIDE_POINTS _UxGT("Punti laterali") -#define MSG_UBL_MAP_TYPE _UxGT("Tipo di Mappa") -#define MSG_UBL_OUTPUT_MAP _UxGT("Esporta Mappa") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Esporta per Host") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Esporta in CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Backup esterno") -#define MSG_UBL_INFO_UBL _UxGT("Esporta Info UBL") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Riempimento") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Riempimento Manuale") -#define MSG_UBL_SMART_FILLIN _UxGT("Riempimento Smart") -#define MSG_UBL_FILLIN_MESH _UxGT("Riempimento Mesh") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalida Tutto") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalid.Punto Vicino") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ritocca All") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ritocca Punto Vicino") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Salvate") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot di memoria") -#define MSG_UBL_LOAD_MESH _UxGT("Carica Mesh Piatto") -#define MSG_UBL_SAVE_MESH _UxGT("Salva Mesh Piatto") -#define MSG_MESH_LOADED _UxGT("Mesh %i caricata") -#define MSG_MESH_SAVED _UxGT("Mesh %i salvata") -#define MSG_UBL_NO_STORAGE _UxGT("Nessuna memoria") -#define MSG_UBL_SAVE_ERROR _UxGT("Err: Salvataggio UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Ripristino UBL") -#define MSG_UBL_Z_OFFSET _UxGT("Z-Offset: ") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Fermato") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo passo") +namespace Language_it { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_LED_CONTROL _UxGT("Controllo LED") -#define MSG_LEDS _UxGT("Luci") -#define MSG_LED_PRESETS _UxGT("Preset luce") -#define MSG_SET_LEDS_RED _UxGT("Rosso") -#define MSG_SET_LEDS_ORANGE _UxGT("Arancione") -#define MSG_SET_LEDS_YELLOW _UxGT("Giallo") -#define MSG_SET_LEDS_GREEN _UxGT("Verde") -#define MSG_SET_LEDS_BLUE _UxGT("Blu") -#define MSG_SET_LEDS_INDIGO _UxGT("Indaco") -#define MSG_SET_LEDS_VIOLET _UxGT("Viola") -#define MSG_SET_LEDS_WHITE _UxGT("Bianco") -#define MSG_SET_LEDS_DEFAULT _UxGT("Predefinito") -#define MSG_CUSTOM_LEDS _UxGT("Luci personalizzate") -#define MSG_INTENSITY_R _UxGT("Intensità rosso") -#define MSG_INTENSITY_G _UxGT("Intensità verde") -#define MSG_INTENSITY_B _UxGT("Intensità blu") -#define MSG_INTENSITY_W _UxGT("Intensità bianco") -#define MSG_LED_BRIGHTNESS _UxGT("Luminosità") + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Italian"); -#define MSG_MOVING _UxGT("In movimento...") -#define MSG_FREE_XY _UxGT("XY liberi") -#define MSG_MOVE_X _UxGT("Muovi X") -#define MSG_MOVE_Y _UxGT("Muovi Y") -#define MSG_MOVE_Z _UxGT("Muovi Z") -#define MSG_MOVE_E _UxGT("Estrusore") -#define MSG_HOTEND_TOO_COLD _UxGT("Ugello freddo") -#define MSG_MOVE_Z_DIST _UxGT("Muovi di %smm") -#define MSG_MOVE_01MM _UxGT("Muovi di 0.1mm") -#define MSG_MOVE_1MM _UxGT("Muovi di 1mm") -#define MSG_MOVE_10MM _UxGT("Muovi di 10mm") -#define MSG_SPEED _UxGT("Velocità") -#define MSG_BED_Z _UxGT("Piatto Z") -#define MSG_NOZZLE _UxGT("Ugello") -#define MSG_BED _UxGT("Piatto") -#define MSG_CHAMBER _UxGT("Camera") -#define MSG_FAN_SPEED _UxGT("Velocità ventola") -#define MSG_EXTRA_FAN_SPEED _UxGT("Extra vel. ventola") -#define MSG_FLOW _UxGT("Flusso") -#define MSG_CONTROL _UxGT("Controllo") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Autotemp") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Seleziona") -#define MSG_ACC _UxGT("Accel") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_JUNCTION_DEVIATION _UxGT("Deviaz. giunzioni") -#define MSG_VELOCITY _UxGT("Velocità") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_ACCELERATION _UxGT("Accelerazione") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-Ritrazione") -#define MSG_A_TRAVEL _UxGT("A-Spostamento") -#define MSG_STEPS_PER_MM _UxGT("Passi/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Apassi/mm") - #define MSG_BSTEPS _UxGT("Bpassi/mm") - #define MSG_CSTEPS _UxGT("Cpassi/mm") -#else - #define MSG_ASTEPS _UxGT("Xpassi/mm") - #define MSG_BSTEPS _UxGT("Ypassi/mm") - #define MSG_CSTEPS _UxGT("Zpassi/mm") -#endif -#define MSG_ESTEPS _UxGT("Epassi/mm") -#define MSG_E1STEPS _UxGT("E1passi/mm") -#define MSG_E2STEPS _UxGT("E2passi/mm") -#define MSG_E3STEPS _UxGT("E3passi/mm") -#define MSG_E4STEPS _UxGT("E4passi/mm") -#define MSG_E5STEPS _UxGT("E5passi/mm") -#define MSG_E6STEPS _UxGT("E6passi/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") -#define MSG_FILAMENT_DIAM _UxGT("Diam. filo") -#define MSG_FILAMENT_UNLOAD _UxGT("Rimuovi mm") -#define MSG_FILAMENT_LOAD _UxGT("Carica mm") -#define MSG_ADVANCE_K _UxGT("K Avanzamento") -#define MSG_CONTRAST _UxGT("Contrasto LCD") -#define MSG_STORE_EEPROM _UxGT("Salva impostazioni") -#define MSG_LOAD_EEPROM _UxGT("Carica impostazioni") -#define MSG_RESTORE_FAILSAFE _UxGT("Ripristina imp.") -#define MSG_INIT_EEPROM _UxGT("Inizializza EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Aggiorna media") -#define MSG_RESET_PRINTER _UxGT("Resetta stampante") -#define MSG_REFRESH _UxGT("Aggiorna") -#define MSG_WATCH _UxGT("Schermata info") -#define MSG_PREPARE _UxGT("Prepara") -#define MSG_TUNE _UxGT("Regola") -#define MSG_START_PRINT _UxGT("Avvia stampa") -#define MSG_BUTTON_NEXT _UxGT("Prossimo") -#define MSG_BUTTON_INIT _UxGT("Inizializza") -#define MSG_BUTTON_STOP _UxGT("Stop") -#define MSG_BUTTON_PRINT _UxGT("Stampa") -#define MSG_BUTTON_RESET _UxGT("Resetta") -#define MSG_BUTTON_CANCEL _UxGT("Annulla") -#define MSG_BUTTON_DONE _UxGT("Fatto") -#define MSG_PAUSE_PRINT _UxGT("Pausa stampa") -#define MSG_RESUME_PRINT _UxGT("Riprendi stampa") -#define MSG_STOP_PRINT _UxGT("Arresta stampa") -#define MSG_OUTAGE_RECOVERY _UxGT("Ripresa da PowerLoss") -#define MSG_MEDIA_MENU _UxGT("Stampa da media") -#define MSG_NO_MEDIA _UxGT("Media non presente") -#define MSG_DWELL _UxGT("Sospensione...") -#define MSG_USERWAIT _UxGT("Premi tasto..") -#define MSG_PRINT_PAUSED _UxGT("Stampa sospesa") -#define MSG_PRINTING _UxGT("Stampa...") -#define MSG_PRINT_ABORTED _UxGT("Stampa annullata") -#define MSG_NO_MOVE _UxGT("Nessun Movimento") -#define MSG_KILLED _UxGT("UCCISO. ") -#define MSG_STOPPED _UxGT("ARRESTATO. ") -#define MSG_CONTROL_RETRACT _UxGT("Ritrai mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Scamb. Ritrai mm") -#define MSG_CONTROL_RETRACTF _UxGT("Ritrai V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Salta mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Scamb. UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoRitrai") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Dist. ritrazione") -#define MSG_FILAMENT_PURGE_LENGTH _UxGT("Lunghezza spurgo") -#define MSG_TOOL_CHANGE _UxGT("Cambio utensile") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Risalita Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Velocità innesco") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Velocità retrazione") -#define MSG_NOZZLE_STANDBY _UxGT("Standby ugello") -#define MSG_FILAMENTCHANGE _UxGT("Cambia filamento") -#define MSG_FILAMENTLOAD _UxGT("Carica filamento") -#define MSG_FILAMENTUNLOAD _UxGT("Rimuovi filamento") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Rimuovi tutto") -#define MSG_INIT_MEDIA _UxGT("Inizializ. media") -#define MSG_CHANGE_MEDIA _UxGT("Cambia media") -#define MSG_RELEASE_MEDIA _UxGT("Rilascia media") -#define MSG_ZPROBE_OUT _UxGT("Z probe fuori piatto") -#define MSG_SKEW_FACTOR _UxGT("Fattore distorsione") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("Resetta BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("Estendi BLTouch") -#define MSG_BLTOUCH_SW_MODE _UxGT("BLTouch modo SW") -#define MSG_BLTOUCH_5V_MODE _UxGT("BLTouch modo 5V") -#define MSG_BLTOUCH_OD_MODE _UxGT("BLTouch modo OD") -#define MSG_BLTOUCH_MODE_STORE _UxGT("BLTouch modo mem.") -#define MSG_BLTOUCH_MODE_STORE_5V _UxGT("Metti BLTouch a 5V") -#define MSG_BLTOUCH_MODE_STORE_OD _UxGT("Metti BLTouch a OD") -#define MSG_BLTOUCH_MODE_ECHO _UxGT("Segnala modo") -#define MSG_BLTOUCH_MODE_CHANGE _UxGT("PERICOLO: Impostazioni errate possono cause danni! Procedo comunque?") -#define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#define MSG_TOUCHMI_INIT _UxGT("Inizializ.TouchMI") -#define MSG_TOUCHMI_ZTEST _UxGT("Test Z offset") -#define MSG_TOUCHMI_SAVE _UxGT("Memorizzare") -#define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("Estendi TouchMI") -#define MSG_MANUAL_DEPLOY _UxGT("Estendi Sonda-Z") -#define MSG_BLTOUCH_STOW _UxGT("Ritrai BLTouch") -#define MSG_MANUAL_STOW _UxGT("Ritrai Sonda-Z") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s prima") -#define MSG_ZPROBE_ZOFFSET _UxGT("Offset sonda Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Totali") -#define MSG_ENDSTOP_ABORT _UxGT("Finecorsa annullati") -#define MSG_HEATING_FAILED_LCD _UxGT("Riscald. Fallito") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Risc. piatto fallito") -#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Risc. camera fallito") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP RIDONDANTE") -#define MSG_THERMAL_RUNAWAY _UxGT("TEMP FUORI CONTROLLO") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEMP PIAT.FUORI CTRL") -#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("T.CAMERA FUORI CTRL") -#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MASSIMA") -#define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP MAX PIATTO") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP MIN PIATTO") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err: TEMP MAX CAMERA") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err: TEMP MIN CAMERA") -#define MSG_ERR_Z_HOMING _UxGT("Home XY prima") -#define MSG_HALTED _UxGT("STAMPANTE FERMATA") -#define MSG_PLEASE_RESET _UxGT("Riavviare prego") -#define MSG_SHORT_DAY _UxGT("g") // Un solo carattere -#define MSG_SHORT_HOUR _UxGT("h") // Un solo carattere -#define MSG_SHORT_MINUTE _UxGT("m") // Un solo carattere -#define MSG_HEATING _UxGT("Riscaldamento...") -#define MSG_COOLING _UxGT("Raffreddamento..") -#define MSG_BED_HEATING _UxGT("Risc. piatto...") -#define MSG_BED_COOLING _UxGT("Raffr. piatto...") -#define MSG_CHAMBER_HEATING _UxGT("Risc. camera...") -#define MSG_CHAMBER_COOLING _UxGT("Raffr. camera...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibraz. Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibra X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibra Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibra Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra centro") -#define MSG_DELTA_SETTINGS _UxGT("Impostaz. Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto calibrazione") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Imp. altezza Delta") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Offset sonda-Z") -#define MSG_DELTA_DIAG_ROD _UxGT("Barra Diagonale") -#define MSG_DELTA_HEIGHT _UxGT("Altezza") -#define MSG_DELTA_RADIUS _UxGT("Raggio") -#define MSG_INFO_MENU _UxGT("Riguardo stampante") -#define MSG_INFO_PRINTER_MENU _UxGT("Info. stampante") -#define MSG_3POINT_LEVELING _UxGT("Livel. a 3 punti") -#define MSG_LINEAR_LEVELING _UxGT("Livel. Lineare") -#define MSG_BILINEAR_LEVELING _UxGT("Livel. Bilineare") -#define MSG_UBL_LEVELING _UxGT("Livel.piatto unific.") -#define MSG_MESH_LEVELING _UxGT("Livel. Mesh") -#define MSG_INFO_STATS_MENU _UxGT("Statistiche") -#define MSG_INFO_BOARD_MENU _UxGT("Info. scheda") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistori") -#define MSG_INFO_EXTRUDERS _UxGT("Estrusori") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protocollo") -#define MSG_CASE_LIGHT _UxGT("Luci Case") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosità Luci") -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Contat. stampa") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completati") - #define MSG_INFO_PRINT_TIME _UxGT("Tempo totale") - #define MSG_INFO_PRINT_LONGEST _UxGT("Lavoro più lungo") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Totale estruso") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Stampe") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completati") - #define MSG_INFO_PRINT_TIME _UxGT("Durata") - #define MSG_INFO_PRINT_LONGEST _UxGT("Più lungo") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Estruso") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Temp min") -#define MSG_INFO_MAX_TEMP _UxGT("Temp max") -#define MSG_INFO_PSU _UxGT("Alimentatore") -#define MSG_DRIVE_STRENGTH _UxGT("Potenza Drive") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_ERROR_TMC _UxGT("ERR.CONNESSIONE TMC") -#define MSG_DAC_EEPROM_WRITE _UxGT("Scrivi DAC EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("STAMPA IN PAUSA") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CARICA FILAMENTO") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("RIMUOVI FILAMENTO") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPZIONI RIPRESA:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Spurga di più") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Riprendi stampa") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Ugello: ") -#define MSG_RUNOUT_SENSOR _UxGT("Sens.filo termin.") // Max 17 caratteri -#define MSG_RUNOUT_DISTANCE_MM _UxGT("Dist mm filo term.") -#define MSG_ERR_HOMING_FAILED _UxGT("Home fallito") -#define MSG_ERR_PROBING_FAILED _UxGT("Sondaggio fallito") -#define MSG_M600_TOO_COLD _UxGT("M600:Troppo freddo") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); + PROGMEM Language_Str MSG_YES = _UxGT("SI"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Indietro"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annullando..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media inserito"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media rimosso"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Media rilasciato"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aspettando media"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo media"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principale"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurazione"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu di debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home asse X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Imposta Origine"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Preriscalda ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preriscalda ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Preriscalda ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Tutto"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Piatto"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" conf"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Raffredda"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Controllo laser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Mandrino Off"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Mandrino On"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estrudi"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Ritrai"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muovi Asse"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Livella piano"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Livella piano"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Livella spigoli"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo spigolo"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punto sondato"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Indice X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviazione"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pieno controllo"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2° ugello X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2° ugello Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2° ugello Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 in corso"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Strumenti UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Misura"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Rimuovi e mis.piatto"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Spostamento succes."); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Attiva UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Disattiva UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Piatto"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Piatto"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Ugello"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Ugello"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Modifica Mesh"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.Mesh personal."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca Mesh"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Modif.Mesh fatta"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crea Mesh personal."); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crea Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Crea Mesh ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Crea Mesh ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea Mesh a freddo"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta Alt. Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altezza"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida Mesh"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Valida Mesh ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Valida Mesh ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 riscald.letto"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 riscald.ugello"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Priming manuale..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Prime a lung.fissa"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming terminato"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Annullato"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Uscita da G26"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida Mesh pers."); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continua Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Livell. Mesh"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Livell. 3 Punti"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. Griglia Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Livella Mesh"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punti laterali"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo di Mappa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Esporta Mappa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Esporta in CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup esterno"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Esporta Info UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Riempimento"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento Manuale"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Riempimento Smart"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Riempimento Mesh"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida Tutto"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.Punto Vicino"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca All"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca Punto Vicino"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Salvate"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot di memoria"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Carica Mesh Piatto"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salva Mesh Piatto"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Mesh %i caricata"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Mesh %i salvata"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nessuna memoria"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Salvataggio UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ripristino UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Fermato"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo passo"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea Mesh a freddo"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento Smart"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca All"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca All"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva Mesh Piatto"); -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("CAMBIO FILAMENTO") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("SCELTA FILAMENTO") -#define MSG_MMU2_MENU _UxGT("MMU") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Agg.firmware MMU!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU chiede attenz.") -#define MSG_MMU2_RESUME _UxGT("Riprendi stampa") -#define MSG_MMU2_RESUMING _UxGT("Ripresa...") -#define MSG_MMU2_LOAD_FILAMENT _UxGT("Carica filamento") -#define MSG_MMU2_LOAD_ALL _UxGT("Carica tutto") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Carica fino ugello") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Espelli filamento") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Espelli filam.1") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Espelli filam.2") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Espelli filam.3") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Espelli filam.4") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Espelli filam.5") -#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Scarica filamento") -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Caric.fil. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Esplus.filam. ...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Scaric.filam. ...") -#define MSG_MMU2_ALL _UxGT("Tutto") -#define MSG_MMU2_FILAMENT0 _UxGT("Filamento 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filamento 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filamento 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filamento 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filamento 5") -#define MSG_MMU2_RESET _UxGT("Azzera MMU") -#define MSG_MMU2_RESETTING _UxGT("Azzeramento MMU...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Rimuovi, click") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controllo LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luci"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Preset luce"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rosso"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Arancione"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Giallo"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blu"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indaco"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bianco"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Predefinito"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luci personalizzate"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensità rosso"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensità verde"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensità blu"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensità bianco"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosità"); -#define MSG_MIX _UxGT("Miscela") -#define MSG_MIX_COMPONENT _UxGT("Componente") -#define MSG_MIXER _UxGT("Miscelatore") -#define MSG_GRADIENT _UxGT("Gradiente") -#define MSG_FULL_GRADIENT _UxGT("Gradiente pieno") -#define MSG_TOGGLE_MIX _UxGT("Alterna miscela") -#define MSG_CYCLE_MIX _UxGT("Ciclo miscela") -#define MSG_GRADIENT_MIX _UxGT("Miscela gradiente") -#define MSG_REVERSE_GRADIENT _UxGT("Inverti gradiente") -#define MSG_ACTIVE_VTOOL _UxGT("V-tool attivo") -#define MSG_START_VTOOL _UxGT("V-tool iniziale") -#define MSG_END_VTOOL _UxGT("V-tool finale") -#define MSG_GRADIENT_ALIAS _UxGT("V-tool alias") -#define MSG_RESET_VTOOLS _UxGT("Ripristina V-tools") -#define MSG_COMMIT_VTOOL _UxGT("Commit mix V-tool") -#define MSG_VTOOLS_RESET _UxGT("V-tools ripristin.") -#define MSG_START_Z _UxGT("Z inizio") -#define MSG_END_Z _UxGT("Z fine") + PROGMEM Language_Str MSG_MOVING = _UxGT("In movimento..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY liberi"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Muovi X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Muovi Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Muovi Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusore"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Estrusore ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Estrusore ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Estrusore ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Estrusore ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Estrusore ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Estrusore ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Muovi di %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocità"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Piatto Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ugello"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Ugello ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Ugello ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Ugello ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Ugello ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Ugello ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Ugello ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Piatto"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Camera"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Vel. ventola 1"); // Max 15 characters + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Vel. ventola 2"); // Max 15 characters + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Vel. ventola 3"); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Extra v.vent. 1"); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Extra v.vent. 2"); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Extra v.vent. 3"); // Max 15 characters + PROGMEM Language_Str MSG_FLOW = _UxGT("Flusso"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flusso ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flusso ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flusso ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flusso ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flusso ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flusso ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controllo"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); + PROGMEM Language_Str MSG_AUTOTUNE_PID = _UxGT("PID Autotune"); + PROGMEM Language_Str MSG_AUTOTUNE_PID_E0 = _UxGT("PID Autotune ") LCD_STR_E0; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E1 = _UxGT("PID Autotune ") LCD_STR_E1; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E2 = _UxGT("PID Autotune ") LCD_STR_E2; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E3 = _UxGT("PID Autotune ") LCD_STR_E3; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E4 = _UxGT("PID Autotune ") LCD_STR_E4; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E5 = _UxGT("PID Autotune ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Seleziona"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Seleziona ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Seleziona ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Seleziona ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Seleziona ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Seleziona ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Seleziona ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); + PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-jerk"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-jerk"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-jerk"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-jerk"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Deviaz. giunzioni"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocità"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vmax ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vmax ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vmax ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vmax ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vmax ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vmax ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accelerazione"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Amax ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Amax ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Amax ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Amax ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Amax ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Amax ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Ritrazione"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Spostamento"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passi/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passi/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passi/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassi/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("passi/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. filo"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Diam. filo ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Diam. filo ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Diam. filo ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Diam. filo ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Diam. filo ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Diam. filo ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Rimuovi mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carica mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Avanzamento"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K Avanzamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K Avanzamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K Avanzamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K Avanzamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K Avanzamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K Avanzamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrasto LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salva impostazioni"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carica impostazioni"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Ripristina imp."); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inizializza EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aggiorna media"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetta stampante"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aggiorna"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Schermata info"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Regola"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Avvia stampa"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Prossimo"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inizializza"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Stampa"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetta"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annulla"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fatto"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arresta stampa"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da PowerLoss"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Stampa da media"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Media non presente"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Sospensione..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Premi tasto.."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Stampa sospesa"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Stampa..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Stampa annullata"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nessun Movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("UCCISO. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ARRESTATO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ritrai mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRitrai"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dist. ritrazione"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lunghezza spurgo"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambio utensile"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Risalita Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Velocità innesco"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Velocità retrazione"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Standby ugello"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambia filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Cambia filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Cambia filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Cambia filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Cambia filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Cambia filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Cambia filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Carica filamento"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Carica filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Carica filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Carica filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Carica filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Carica filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Carica filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Rimuovi filamento"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Rimuovi filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Rimuovi filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Rimuovi filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Rimuovi filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Rimuovi filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Rimuovi filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Rimuovi tutto"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Inizializ. media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambia media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Rilascia media"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fattore distorsione"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Autotest BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Resetta BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estendi BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("BLTouch modo SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch modo 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch modo OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("BLTouch modo mem."); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Metti BLTouch a 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Metti BLTouch a OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Segnala modo"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: Impostazioni errate possono cause danni! Procedo comunque?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inizializ.TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Memorizzare"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estendi TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estendi Sonda-Z"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Ritrai BLTouch"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ritrai Sonda-Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s prima"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset sonda Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Totali"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Riscald. Fallito"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Risc. piatto fallito"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Risc. camera fallito"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: TEMP MAX PIATTO"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: TEMP MIN PIATTO"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: TEMP MAX CAMERA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: TEMP MIN CAMERA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY prima"); + PROGMEM Language_Str MSG_HALTED = _UxGT("STAMPANTE FERMATA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Riavviare prego"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("g"); // Un solo carattere + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Un solo carattere + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Un solo carattere + PROGMEM Language_Str MSG_HEATING = _UxGT("Riscaldamento..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Raffreddamento.."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Risc. piatto..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Raffr. piatto..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra centro"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Impostaz. Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto calibrazione"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Imp. altezza Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Offset sonda-Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonale"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altezza"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raggio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Riguardo stampante"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. stampante"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Livel. a 3 punti"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Livel. Lineare"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Livel.piatto unific."); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Livel. Mesh"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistiche"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. scheda"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusori"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocollo"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Controllo fuga: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Controllo fuga: ON"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luci Case"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosità Luci"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Contat. stampa"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Stampe"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Durata"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Più lungo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruso"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alimentatore"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERR.CONNESSIONE TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIO FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("STAMPA IN PAUSA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARICA FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("RIMUOVI FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPZIONI RIPRESA:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Spurga di più"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Ugello: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term."); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Home fallito"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600:Troppo freddo"); -#define MSG_GAMES _UxGT("Giochi") -#define MSG_BRICKOUT _UxGT("Brickout") -#define MSG_INVADERS _UxGT("Invaders") -#define MSG_SNAKE _UxGT("Sn4k3") -#define MSG_MAZE _UxGT("Maze") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SCELTA FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Agg.firmware MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU chiede attenz."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Ripresa..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carica filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carica tutto"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carica fino ugello"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Espelli filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Espelli filam.1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Espelli filam.2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Espelli filam.3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Espelli filam.4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Espelli filam.5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Scarica filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Caric.fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Esplus.filam. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Scaric.filam. ..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tutto"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filamento 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filamento 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filamento 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filamento 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filamento 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Azzera MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Azzeramento MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click"); -#define MSG_EXPECTED_PRINTER _UxGT("Stampante errata") + PROGMEM Language_Str MSG_MIX = _UxGT("Miscela"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Componente 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Componente 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Componente 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Componente 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Componente 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Componente 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Miscelatore"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradiente"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Gradiente pieno"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Alterna miscela"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciclo miscela"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Miscela gradiente"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverti gradiente"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("V-tool attivo"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-tool iniziale"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-tool finale"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-tool alias"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ripristina V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit mix V-tool"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools ripristin."); + PROGMEM Language_Str MSG_START_Z = _UxGT("Z inizio:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Z fine:"); -// -// Le schermate di Cambio Filamento possono visualizzare fino a 3 linee su un display a 4 righe -// ...o fino a 2 linee su un display a 3 righe. -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Premi per") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("riprendere") - #define MSG_ADVANCED_PAUSE_WAITING_3 _UxGT("la stampa") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parcheggiando...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attendere avvio") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del cambio") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("di filamento") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserisci il") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("filamento e premi") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("per continuare") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Premi per") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("riscaldare ugello") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Riscaldam. ugello") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Attendere prego...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attendere") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("l'espulsione") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attendere") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("il caricamento") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attendere") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("lo spurgo") - #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Premi x terminare") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("lo spurgo") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_3 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attendere") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("la ripresa") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("della stampa...") -#else // LCD_HEIGHT < 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Premi x continuare") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attendere...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserisci e premi") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Riscalda ugello") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Riscaldamento...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Espulsione...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Caricamento...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Spurgo filamento") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Premi x terminare") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Ripresa...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_GAMES = _UxGT("Giochi"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); -#define MSG_TMC_DRIVERS _UxGT("Drivers TMC") -#define MSG_TMC_CURRENT _UxGT("Driver in uso") -#define MSG_TMC_HYBRID_THRS _UxGT("Soglia modo ibrido") -#define MSG_TMC_HOMING_THRS _UxGT("Azzer. sensorless") -#define MSG_TMC_STEPPING_MODE _UxGT("Modo stepping") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop abil.") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Stampante errata"); -#define MSG_SERVICE_RESET _UxGT("Resetta") -#define MSG_SERVICE_IN _UxGT(" tra:") + // + // Le schermate di Cambio Filamento possono visualizzare fino a 3 linee su un display a 4 righe + // ...o fino a 2 linee su un display a 3 righe. + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Premi per", "riprendere", "la stampa")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parcheggiando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Attendere avvio", "del cambio", "di filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserisci il", "filamento e premi", "per continuare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premi per", "riscaldare ugello")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Riscaldam. ugello", "Attendere prego...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Attendere", "l'espulsione", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Attendere", "il caricamento", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Attendere", "lo spurgo", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Premi x terminare", "lo spurgo", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Attendere", "la ripresa", "della stampa...")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premi x continuare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Attendere...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserisci e premi")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Riscalda ugello")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Riscaldamento...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Espulsione...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Caricamento...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa...")); + #endif // LCD_HEIGHT < 4 -#define MSG_BACKLASH _UxGT("Gioco") -#define MSG_BACKLASH_CORRECTION _UxGT("Correzione") -#define MSG_BACKLASH_SMOOTHING _UxGT("Smoothing") + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Drivers TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver in uso"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Azzer. sensorless"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo stepping"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetta"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" tra:"); + + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Gioco"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correzione"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); +} diff --git a/Marlin/src/lcd/language/language_jp-kana.h b/Marlin/src/lcd/language/language_jp-kana.h deleted file mode 100644 index 1898ab01d6..0000000000 --- a/Marlin/src/lcd/language/language_jp-kana.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Japanese (Kana) - * UTF-8 for Graphical Display - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ - -#define DISPLAY_CHARSET_ISO10646_KANA -#define CHARSIZE 3 - -// This just to show the potential benefit of unicode. -// This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. - -// 片仮名表示定義 -#define WELCOME_MSG MACHINE_NAME _UxGT(" ready.") -#define MSG_MEDIA_INSERTED _UxGT("カードガソウニュウサレマシタ") // "Card inserted" -#define MSG_MEDIA_REMOVED _UxGT("カードガアリマセン") // "Card removed" -#define MSG_LCD_ENDSTOPS _UxGT("エンドストップ") // "Endstops" // Max length 8 characters -#define MSG_MAIN _UxGT("メイン") // "Main" -#define MSG_AUTOSTART _UxGT("ジドウカイシ") // "Autostart" -#define MSG_DISABLE_STEPPERS _UxGT("モーターデンゲン オフ") // "Disable steppers" -#define MSG_DEBUG_MENU _UxGT("デバッグメニュー") // "Debug Menu" -#define MSG_PROGRESS_BAR_TEST _UxGT("プログレスバー テスト") // "Progress Bar Test" -#define MSG_AUTO_HOME _UxGT("ゲンテンフッキ") // "Auto home" -#define MSG_AUTO_HOME_X _UxGT("Xジク ゲンテンフッキ") // "Home X" -#define MSG_AUTO_HOME_Y _UxGT("Yジク ゲンテンフッキ") // "Home Y" -#define MSG_AUTO_HOME_Z _UxGT("Zジク ゲンテンフッキ") // "Home Z" -#define MSG_LEVEL_BED_HOMING _UxGT("ゲンテンフッキチュウ") // "Homing XYZ" -#define MSG_LEVEL_BED_WAITING _UxGT("レベリングカイシ") // "Click to Begin" -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("ツギノソクテイテンヘ") // "Next Point" -#define MSG_LEVEL_BED_DONE _UxGT("レベリングカンリョウ") // "Leveling Done!" -#define MSG_SET_HOME_OFFSETS _UxGT("キジュンオフセットセッテイ") // "Set home offsets" -#define MSG_HOME_OFFSETS_APPLIED _UxGT("オフセットガテキヨウサレマシタ") // "Offsets applied" -#define MSG_SET_ORIGIN _UxGT("キジュンセット") // "Set origin" -#define MSG_PREHEAT_1 _UxGT(PREHEAT_1_LABEL " ヨネツ") // "Preheat " PREHEAT_1_LABEL -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL _UxGT(PREHEAT_1_LABEL " スベテヨネツ") // " All" -#define MSG_PREHEAT_1_BEDONLY _UxGT(PREHEAT_1_LABEL " ベッドヨネツ") // " Bed" -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT("セッテイ") // " conf" -#define MSG_PREHEAT_2 _UxGT(PREHEAT_2_LABEL " ヨネツ") // "Preheat " PREHEAT_2_LABEL -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL _UxGT(PREHEAT_2_LABEL " スベテヨネツ") // " All" -#define MSG_PREHEAT_2_BEDONLY _UxGT(PREHEAT_2_LABEL " ベッドヨネツ") // " Bed" -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT("セッテイ") // " conf" -#define MSG_COOLDOWN _UxGT("カネツテイシ") // "Cooldown" -#define MSG_SWITCH_PS_ON _UxGT("デンゲン オン") // "Switch power on" -#define MSG_SWITCH_PS_OFF _UxGT("デンゲン オフ") // "Switch power off" -#define MSG_EXTRUDE _UxGT("オシダシ") // "Extrude" -#define MSG_RETRACT _UxGT("ヒキコミセッテイ") // "Retract" -#define MSG_MOVE_AXIS _UxGT("ジクイドウ") // "Move axis" -#define MSG_BED_LEVELING _UxGT("ベッドレベリング") // "Bed leveling" -#define MSG_LEVEL_BED _UxGT("ベッドレベリング") // "Level bed" - -#define MSG_MOVING _UxGT("イドウチュウ") // "Moving..." -#define MSG_FREE_XY _UxGT("XYジク カイホウ") // "Free XY" -#define MSG_MOVE_X _UxGT("Xジク イドウ") // "Move X" -#define MSG_MOVE_Y _UxGT("Yジク イドウ") // "Move Y" -#define MSG_MOVE_Z _UxGT("Zジク イドウ") // "Move Z" -#define MSG_MOVE_E _UxGT("エクストルーダー") // "Extruder" -#define MSG_MOVE_Z_DIST _UxGT("%smm イドウ") // "Move 0.025mm" -#define MSG_MOVE_01MM _UxGT("0.1mm イドウ") // "Move 0.1mm" -#define MSG_MOVE_1MM _UxGT(" 1mm イドウ") // "Move 1mm" -#define MSG_MOVE_10MM _UxGT(" 10mm イドウ") // "Move 10mm" -#define MSG_SPEED _UxGT("ソクド") // "Speed" -#define MSG_BED_Z _UxGT("Zオフセット") // "Bed Z" -#define MSG_NOZZLE _UxGT("ノズル") // "Nozzle" -#define MSG_BED _UxGT("ベッド") // "Bed" -#define MSG_FAN_SPEED _UxGT("ファンソクド") // "Fan speed" -#define MSG_FLOW _UxGT("トシュツリョウ") // "Flow" -#define MSG_CONTROL _UxGT("セイギョ") // "Control" -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" サイテイ") // " Min" -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" サイコウ") // " Max" -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" ファクター") // " Fact" -#define MSG_AUTOTEMP _UxGT("ジドウオンドセイギョ") // "Autotemp" -#define MSG_LCD_ON _UxGT("オン") // "On" -#define MSG_LCD_OFF _UxGT("オフ") // "Off" -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("センタク") // "Select" -#define MSG_ACC _UxGT("カソクド mm/s2") // "Accel" -#define MSG_JERK _UxGT("ヤクド mm/s") // "Jerk" -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Aジク ヤクド mm/s") // "Va-jerk" - #define MSG_VB_JERK _UxGT("Bジク ヤクド mm/s") // "Vb-jerk" - #define MSG_VC_JERK _UxGT("Cジク ヤクド mm/s") // "Vc-jerk" -#else - #define MSG_VA_JERK _UxGT("Xジク ヤクド mm/s") // "Vx-jerk" - #define MSG_VB_JERK _UxGT("Yジク ヤクド mm/s") // "Vy-jerk" - #define MSG_VC_JERK _UxGT("Zジク ヤクド mm/s") // "Vz-jerk" -#endif -#define MSG_VE_JERK _UxGT("エクストルーダー ヤクド") // "Ve-jerk" -#define MSG_VMAX _UxGT("サイダイオクリソクド ") // "Vmax " -#define MSG_VMIN _UxGT("サイショウオクリソクド") // "Vmin" -#define MSG_VTRAV_MIN _UxGT("サイショウイドウソクド") // "VTrav min" -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("サイダイカソクド ") // "Amax " -#define MSG_A_RETRACT _UxGT("ヒキコミカソクド") // "A-retract" -#define MSG_A_TRAVEL _UxGT("イドウカソクド") // "A-travel" -#define MSG_TEMPERATURE _UxGT("オンド") // "Temperature" -#define MSG_MOTION _UxGT("ウゴキセッテイ") // "Motion" -#define MSG_FILAMENT _UxGT("フィラメント") // "Filament" -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("フィラメントチョッケイ") // "Fil. Dia." -#define MSG_CONTRAST _UxGT("LCDコントラスト") // "LCD contrast" -#define MSG_STORE_EEPROM _UxGT("メモリヘカクノウ") // "Store memory" -#define MSG_LOAD_EEPROM _UxGT("メモリカラヨミコミ") // "Load memory" -#define MSG_RESTORE_FAILSAFE _UxGT("セッテイリセット") // "Restore failsafe" -#define MSG_REFRESH _UxGT("リフレッシュ") // "Refresh" -#define MSG_WATCH _UxGT("ジョウホウガメン") // "Info screen" -#define MSG_PREPARE _UxGT("ジュンビセッテイ") // "Prepare" -#define MSG_TUNE _UxGT("チョウセイ") // "Tune" -#define MSG_PAUSE_PRINT _UxGT("イチジテイシ") // "Pause print" -#define MSG_RESUME_PRINT _UxGT("プリントサイカイ") // "Resume print" -#define MSG_STOP_PRINT _UxGT("プリントテイシ") // "Stop print" -#define MSG_MEDIA_MENU _UxGT("SDカードカラプリント") // "Print from SD" -#define MSG_NO_MEDIA _UxGT("SDカードガアリマセン") // "No SD card" -#define MSG_DWELL _UxGT("キュウシ") // "Sleep..." -#define MSG_USERWAIT _UxGT("シバラクオマチクダサイ") // "Wait for user..." -#define MSG_PRINT_ABORTED _UxGT("プリントガチュウシサレマシタ") // "Print aborted" -#define MSG_NO_MOVE _UxGT("ウゴキマセン") // "No move." -#define MSG_KILLED _UxGT("ヒジョウテイシ") // "KILLED. " -#define MSG_STOPPED _UxGT("テイシシマシタ") // "STOPPED. " -#define MSG_CONTROL_RETRACT _UxGT("ヒキコミリョウ mm") // "Retract mm" -#define MSG_CONTROL_RETRACT_SWAP _UxGT("ヒキコミリョウS mm") // "Swap Re.mm" -#define MSG_CONTROL_RETRACTF _UxGT("ヒキコミソクド mm/s") // "Retract V" -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("ノズルタイヒ mm") // "Hop mm" -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("ホショウリョウ mm") // "UnRet mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("ホショウリョウS mm") // "S UnRet mm" -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("ホショウソクド mm/s") // "UnRet V" -#define MSG_AUTORETRACT _UxGT("ジドウヒキコミ") // "AutoRetr." -#define MSG_FILAMENTCHANGE _UxGT("フィラメントコウカン") // "Change filament" -#define MSG_INIT_MEDIA _UxGT("SDカードサイヨミコミ") // "Init. SD card" -#define MSG_CHANGE_MEDIA _UxGT("SDカードコウカン") // "Change SD card" -#define MSG_ZPROBE_OUT _UxGT("Zプローブ ベッドガイ") // "Z probe out. bed" -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch ジコシンダン") // "BLTouch Self-Test" -#define MSG_BLTOUCH_RESET _UxGT("BLTouch リセット") // "Reset BLTouch" -#define MSG_HOME_FIRST _UxGT("サキニ %s%s%s ヲフッキサセテクダサイ") // "Home ... first" -#define MSG_ZPROBE_ZOFFSET _UxGT("Zオフセット") // "Z Offset" -#define MSG_BABYSTEP_X _UxGT("Xジク ビドウ") // "Babystep X" -#define MSG_BABYSTEP_Y _UxGT("Yジク ビドウ") // "Babystep Y" -#define MSG_BABYSTEP_Z _UxGT("Zジク ビドウ") // "Babystep Z" -#define MSG_ENDSTOP_ABORT _UxGT("イドウゲンカイケンチキノウ") // "Endstop abort" -#define MSG_HEATING_FAILED_LCD _UxGT("カネツシッパイ") // "Heating failed" -#define MSG_ERR_REDUNDANT_TEMP _UxGT("エラー:ジョウチョウサーミスターキノウ") // "Err: REDUNDANT TEMP" -#define MSG_THERMAL_RUNAWAY _UxGT("ネツボウソウ") // "THERMAL RUNAWAY" -#define MSG_ERR_MAXTEMP _UxGT("エラー:サイコウオンチョウカ") // "Err: MAXTEMP" -#define MSG_ERR_MINTEMP _UxGT("エラー:サイテイオンミマン") // "Err: MINTEMP" -#define MSG_ERR_MAXTEMP_BED _UxGT("エラー:ベッド サイコウオンチョウカ") // "Err: MAXTEMP BED" -#define MSG_ERR_MINTEMP_BED _UxGT("エラー:ベッド サイテイオンミマン") // "Err: MINTEMP BED" -#define MSG_ERR_Z_HOMING _UxGT("サキニ XY ヲフッキサセテクダサイ") // "Home XY first" -#define MSG_HALTED _UxGT("プリンターハテイシシマシタ") // "PRINTER HALTED" -#define MSG_PLEASE_RESET _UxGT("リセットシテクダサイ") // "Please reset" -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("カネツチュウ") // "Heating..." -#define MSG_BED_HEATING _UxGT("ベッド カネツチュウ") // "Bed Heating..." -#define MSG_DELTA_CALIBRATE _UxGT("デルタ コウセイ") // "Delta Calibration" -#define MSG_DELTA_CALIBRATE_X _UxGT("Xジク コウセイ") // "Calibrate X" -#define MSG_DELTA_CALIBRATE_Y _UxGT("Yジク コウセイ") // "Calibrate Y" -#define MSG_DELTA_CALIBRATE_Z _UxGT("Zジク コウセイ") // "Calibrate Z" -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("チュウシン コウセイ") // "Calibrate Center" -#define MSG_INFO_MENU _UxGT("コノプリンターニツイテ") // "About Printer" -#define MSG_INFO_PRINTER_MENU _UxGT("プリンタージョウホウ") // "Printer Info" -#define MSG_INFO_STATS_MENU _UxGT("プリントジョウキョウ") // "Printer Stats" -#define MSG_INFO_BOARD_MENU _UxGT("セイギョケイジョウホウ") // "Board Info" -#define MSG_INFO_THERMISTOR_MENU _UxGT("サーミスター") // "Thermistors" -#define MSG_INFO_EXTRUDERS _UxGT("エクストルーダースウ") // "Extruders" -#define MSG_INFO_BAUDRATE _UxGT("ボーレート") // "Baud" -#define MSG_INFO_PROTOCOL _UxGT("プロトコル") // "Protocol" -#define MSG_CASE_LIGHT _UxGT("キョウタイナイショウメイ") // "Case light" -#define MSG_INFO_PRINT_COUNT _UxGT("プリントスウ ") // "Print Count" -#define MSG_INFO_COMPLETED_PRINTS _UxGT("カンリョウスウ") // "Completed" -#define MSG_INFO_PRINT_TIME _UxGT("プリントジカンルイケイ") // "Total print time" -#define MSG_INFO_PRINT_LONGEST _UxGT("サイチョウプリントジカン") // "Longest job time" -#define MSG_INFO_PRINT_FILAMENT _UxGT("フィラメントシヨウリョウルイケイ") // "Extruded total" -#define MSG_INFO_MIN_TEMP _UxGT("セッテイサイテイオン") // "Min Temp" -#define MSG_INFO_MAX_TEMP _UxGT("セッテイサイコウオン") // "Max Temp" -#define MSG_INFO_PSU _UxGT("デンゲンシュベツ") // "Power Supply" -#define MSG_DRIVE_STRENGTH _UxGT("モータークドウリョク") // "Drive Strength" -#define MSG_DAC_PERCENT _UxGT("DACシュツリョク %") // "Driver %" -#define MSG_DAC_EEPROM_WRITE MSG_STORE_EEPROM // "DAC EEPROM Write" -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("プリントサイカイ") // "Resume print" -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("コウカンヲカイシシマス") // "Wait for start" -#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("シバラクオマチクダサイ") // "of the filament" -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("フィラメントヌキダシチュウ") // "Wait for" -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("シバラクオマチクダサイ") // "filament unload" -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("フィラメントヲソウニュウシ,") // "Insert filament" -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("クリックスルトゾッコウシマス") // "and press button" -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("フィラメントソウテンチュウ") // "Wait for" -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("シバラクオマチクダサイ") // "filament load" -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("プリントヲサイカイシマス") // "Wait for print" -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("シバラクオマチクダサイ") // "to resume" - -#define MSG_EXPECTED_PRINTER _UxGT("間違ったプリンター") // "Wrong printer" diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h new file mode 100644 index 0000000000..d9538c5251 --- /dev/null +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -0,0 +1,314 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Japanese (Kana) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ + +//#define DISPLAY_CHARSET_ISO10646_KANA + +namespace Language_jp_kana { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("Japanese"); + + // This is just to show the potential benefit of Unicode. + // This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. + + // 片仮名表示定義 + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("メディアガアリマセン"); // "Card removed" + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("メイン"); // "Main" + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ジドウカイシ"); // "Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z" + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("ゲンテンフッキチュウ"); // "Homing XYZ" + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("レベリングカイシ"); // "Click to Begin" + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ツギノソクテイテンヘ"); // "Next Point" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!" + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("キジュンセット"); // "Set origin" + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H0 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N0; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H1 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N1; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H2 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N2; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H3 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N3; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H4 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N4; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H5 = PREHEAT_1_LABEL _UxGT(" ヨネツ ") LCD_STR_N5; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N0; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N1; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N2; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N3; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N4; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N5; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨネツ"); // " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨネツ"); // " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨネツセッテイ"); // " conf" + PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H0 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N0; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H1 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N1; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H2 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N2; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H3 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N3; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H4 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N4; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_H5 = PREHEAT_2_LABEL _UxGT(" ヨネツ ") LCD_STR_N5; // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N0; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N1; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N2; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N3; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N4; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = PREHEAT_2_LABEL _UxGT(" ヨネツノズル ") LCD_STR_N5; // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" スベテヨネツ"); // " All" + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" ベッドヨネツ"); // " Bed" + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" ヨネツセッテイ"); // " conf" + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("カネツテイシ"); // "Cooldown" + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on" + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed" + + PROGMEM Language_Str MSG_MOVING = _UxGT("イドウチュウ"); // "Moving..." + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XYジク カイホウ"); // "Free XY" + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Xジク イドウ"); // "Move X" + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" + PROGMEM Language_Str MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm イドウ"); // "Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" + PROGMEM Language_Str MSG_SPEED = _UxGT("ソクド"); // "Speed" + PROGMEM Language_Str MSG_BED_Z = _UxGT("Zオフセット"); // "Bed Z" + PROGMEM Language_Str MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle" + PROGMEM Language_Str MSG_BED = _UxGT("ベッド"); // "Bed" + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed" + PROGMEM Language_Str MSG_FLOW = _UxGT("トシュツリョウ"); // "Flow" + PROGMEM Language_Str MSG_CONTROL = _UxGT("セイギョ"); // "Control" + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" サイテイ"); // " Min" + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" サイコウ"); // " Max" + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" ファクター"); // " Fact" + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("ジドウオンドセイギョ"); // "Autotemp" + PROGMEM Language_Str MSG_LCD_ON = _UxGT("オン"); // "On" + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("オフ"); // "Off" + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("センタク"); // "Select" + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("センタク ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("センタク ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("センタク ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("センタク ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("センタク ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("センタク ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_A; // "Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_B; // "Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_C; // "Vc-jerk" + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax A" + PROGMEM Language_Str MSG_VMAX_B = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax B" + PROGMEM Language_Str MSG_VMAX_C = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax C" + PROGMEM Language_Str MSG_VMAX_E = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax E" + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("サイダイオクリソクド ") LCD_STR_E0; // "Vmax E1" + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("サイダイオクリソクド ") LCD_STR_E1; // "Vmax E2" + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("サイダイオクリソクド ") LCD_STR_E2; // "Vmax E3" + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("サイダイオクリソクド ") LCD_STR_E3; // "Vmax E4" + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("サイダイオクリソクド ") LCD_STR_E4; // "Vmax E5" + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("サイダイオクリソクド ") LCD_STR_E5; // "Vmax E6" + PROGMEM Language_Str MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_AMAX = _UxGT("サイダイカソクド "); // "Amax " + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature" + PROGMEM Language_Str MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion" + PROGMEM Language_Str MSG_FILAMENT = _UxGT("フィラメント"); // "Filament" + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia." + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("フィラメントチョッケイ ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("フィラメントチョッケイ ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("フィラメントチョッケイ ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("フィラメントチョッケイ ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("フィラメントチョッケイ ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("フィラメントチョッケイ ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory" + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("セッテイリセット"); // "Restore failsafe" + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("リフレッシュ"); // "Refresh" + PROGMEM Language_Str MSG_WATCH = _UxGT("ジョウホウガメン"); // "Info screen" + PROGMEM Language_Str MSG_PREPARE = _UxGT("ジュンビセッテイ"); // "Prepare" + PROGMEM Language_Str MSG_TUNE = _UxGT("チョウセイ"); // "Tune" + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("イチジテイシ"); // "Pause print" + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("プリントサイカイ"); // "Resume print" + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("プリントテイシ"); // "Stop print" + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed" + PROGMEM Language_Str MSG_DWELL = _UxGT("キュウシ"); // "Sleep..." + PROGMEM Language_Str MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..." + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted" + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("ウゴキマセン"); // "No move." + PROGMEM Language_Str MSG_KILLED = _UxGT("ヒジョウテイシ"); // "KILLED. " + PROGMEM Language_Str MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. " + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "UnRet mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S UnRet mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "UnRet V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "AutoRetr." + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed" + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test" + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch" + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("サキニ %s%s%s ヲフッキサセテクダサイ"); // "Home ... first" + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset" + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X" + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z" + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort" + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed" + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY" + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP" + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("エラー:ベッド サイコウオンチョウカ"); // "Err: MAXTEMP BED" + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("エラー:ベッド サイテイオンミマン"); // "Err: MINTEMP BED" + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("サキニ XY ヲフッキサセテクダサイ"); // "Home XY first" + PROGMEM Language_Str MSG_HALTED = _UxGT("プリンターハテイシシマシタ"); // "PRINTER HALTED" + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("カネツチュウ"); // "Heating..." + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..." + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders" + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud" + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol" + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light" + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("プリントスウ "); // "Print Count" + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("カンリョウスウ"); // "Completed" + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("プリントジカンルイケイ"); // "Total print time" + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total" + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("DACシュツリョク %"); // "Driver %" + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("イチジテイシ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume" + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer" + + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("セッテイカンリ"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("ショウサイセッテイ"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("コショカイフク"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROMショキカ"); + + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("ツギヘ"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("ショキカ"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("ストップ"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("プリント"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("リセット"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("キャンセル"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("カンリョウ"); + + PROGMEM Language_Str MSG_YES = _UxGT("ハイ"); + PROGMEM Language_Str MSG_NO = _UxGT("イイエ"); + PROGMEM Language_Str MSG_BACK = _UxGT("モドリ"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("ソクド"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("ユーザーコマンド"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("プリントガイチジテイシサレマシタ"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("プリントチュウ..."); +} diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 20e35af58b..15173a93d5 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -28,386 +28,106 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ +namespace Language_ko_KR { + using namespace Language_en; // Inherit undefined strings from English -#define CHARSIZE 1 + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Korean"); -#define WELCOME_MSG MACHINE_NAME _UxGT(" 준비.") -#define MSG_BACK _UxGT("뒤로") -#define MSG_MEDIA_INSERTED _UxGT("카드 삽입됨") -#define MSG_MEDIA_REMOVED _UxGT("카드 제거됨") -#define MSG_LCD_ENDSTOPS _UxGT("엔드스탑") -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("소프트 엔드스탑") -#define MSG_MAIN _UxGT("뒤로") -#define MSG_ADVANCED_SETTINGS _UxGT("고급 설정") -#define MSG_CONFIGURATION _UxGT("설정") -#define MSG_AUTOSTART _UxGT("자동 시작") -#define MSG_DISABLE_STEPPERS _UxGT("모터 정지") -#define MSG_DEBUG_MENU _UxGT("디버깅 메뉴") -#define MSG_PROGRESS_BAR_TEST _UxGT("프로그레스바 테스트") -#define MSG_AUTO_HOME _UxGT("오토홈") -#define MSG_AUTO_HOME_X _UxGT("X 홈으로") -#define MSG_AUTO_HOME_Y _UxGT("Y 홈으로") -#define MSG_AUTO_HOME_Z _UxGT("Z 홈으로") -#define MSG_LEVEL_BED_HOMING _UxGT("XYZ 홈으로") -#define MSG_LEVEL_BED_WAITING _UxGT("누르면 시작합니다") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("다음 Point") -#define MSG_LEVEL_BED_DONE _UxGT("레벨링 완료!") -//#define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") -//#define MSG_SET_HOME_OFFSETS _UxGT("Set home offsets") -//#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets applied") -//#define MSG_SET_ORIGIN _UxGT("Set origin") -#define MSG_PREHEAT_1 _UxGT("예열하기 - " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" 모두") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" 노즐만") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" 베드만") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" conf") -#define MSG_PREHEAT_2 _UxGT("예열하기 - " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" 모두") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" 노즐만") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" 베드만") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" conf") -#define MSG_PREHEAT_CUSTOM _UxGT("Custom 예열") -#define MSG_COOLDOWN _UxGT("식히기") -#define MSG_SWITCH_PS_ON _UxGT("스위치 전원 켜기") -#define MSG_SWITCH_PS_OFF _UxGT("스위치 전원 끄기") -#define MSG_EXTRUDE _UxGT("밀어내기") -#define MSG_RETRACT _UxGT("당기기") -#define MSG_MOVE_AXIS _UxGT("축 이동") -#define MSG_BED_LEVELING _UxGT("베드 레벨링") -//#define MSG_LEVEL_BED _UxGT("Level bed") -//#define MSG_LEVEL_CORNERS _UxGT("Level corners") -//#define MSG_NEXT_CORNER _UxGT("Next corner") -//#define MSG_EDIT_MESH _UxGT("Edit Mesh") -//#define MSG_EDITING_STOPPED _UxGT("Mesh Editing Stopped") -//#define MSG_USER_MENU _UxGT("Custom User Commands") -//#define MSG_IDEX_MENU _UxGT("IDEX Mode") -//#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") -//#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("미러 사본") -//#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Full control") -//#define MSG_X_OFFSET _UxGT("2nd nozzle X") -//#define MSG_Y_OFFSET _UxGT("2nd nozzle Y") -//#define MSG_Z_OFFSET _UxGT("2nd nozzle Z") -#define MSG_UBL_DOING_G29 _UxGT("오토레벨링 하기") -//#define MSG_UBL_TOOLS _UxGT("UBL Tools") -//#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -//#define MSG_UBL_MANUAL_MESH _UxGT("Manually Build Mesh") -//#define MSG_UBL_BC_INSERT _UxGT("Place shim & measure") -//#define MSG_UBL_BC_INSERT2 _UxGT("Measure") -//#define MSG_UBL_BC_REMOVE _UxGT("Remove & measure bed") -//#define MSG_UBL_MOVING_TO_NEXT _UxGT("Moving to next") -//#define MSG_UBL_ACTIVATE_MESH _UxGT("Activate UBL") -//#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deactivate UBL") -//#define MSG_UBL_SET_TEMP_BED _UxGT("Bed Temp") -//#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -//#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Hotend Temp") -//#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -//#define MSG_UBL_MESH_EDIT _UxGT("Mesh Edit") -//#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit Custom Mesh") -//#define MSG_UBL_FINE_TUNE_MESH _UxGT("Fine Tuning Mesh") -//#define MSG_UBL_DONE_EDITING_MESH _UxGT("Done Editing Mesh") -//#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Build Custom Mesh") -//#define MSG_UBL_BUILD_MESH_MENU _UxGT("Build Mesh") -//#define MSG_UBL_BUILD_MESH_M1 _UxGT("Build Mesh (" PREHEAT_1_LABEL ")") -//#define MSG_UBL_BUILD_MESH_M2 _UxGT("Build Mesh (" PREHEAT_2_LABEL ")") -//#define MSG_UBL_BUILD_COLD_MESH _UxGT("Build Cold Mesh") -//#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Adjust Mesh Height") -//#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Height Amount") -//#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validate Mesh") -//#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Validate " PREHEAT_1_LABEL " Mesh") -//#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Validate Mesh (" PREHEAT_2_LABEL ")") -//#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validate Custom Mesh") -//#define MSG_UBL_CONTINUE_MESH _UxGT("Continue Bed Mesh") -//#define MSG_UBL_MESH_LEVELING _UxGT("Mesh Leveling") -//#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Point Leveling") -//#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Grid Mesh Leveling") -//#define MSG_UBL_MESH_LEVEL _UxGT("Level Mesh") -//#define MSG_UBL_SIDE_POINTS _UxGT("Side Points") -//#define MSG_UBL_MAP_TYPE _UxGT("Map Type") -//#define MSG_UBL_OUTPUT_MAP _UxGT("Output Mesh Map") -//#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Output for Host") -//#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Output for CSV") -//#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") -//#define MSG_UBL_INFO_UBL _UxGT("Output UBL Info") -//#define MSG_UBL_FILLIN_AMOUNT _UxGT("Fill-in Amount") -//#define MSG_UBL_MANUAL_FILLIN _UxGT("Manual Fill-in") -//#define MSG_UBL_SMART_FILLIN _UxGT("Smart Fill-in") -//#define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Mesh") -//#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidate All") -//#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidate Closest") -//#define MSG_UBL_FINE_TUNE_ALL _UxGT("Fine Tune All") -//#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Fine Tune Closest") -//#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Storage") -//#define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") -//#define MSG_UBL_LOAD_MESH _UxGT("Load Bed Mesh") -//#define MSG_UBL_SAVE_MESH _UxGT("Save Bed Mesh") -//#define MSG_MESH_LOADED _UxGT("Mesh %i loaded") -//#define MSG_MESH_SAVED _UxGT("Mesh %i saved") -//#define MSG_UBL_NO_STORAGE _UxGT("No storage") -//#define MSG_UBL_SAVE_ERROR _UxGT("Err: UBL Save") -//#define MSG_UBL_RESTORE_ERROR _UxGT("Err: UBL Restore") -//#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") -//#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") - -//#define MSG_LED_CONTROL _UxGT("LED Control") -//#define MSG_LEDS _UxGT("Lights") -//#define MSG_LED_PRESETS _UxGT("Light Presets") -//#define MSG_SET_LEDS_RED _UxGT("Red") -//#define MSG_SET_LEDS_ORANGE _UxGT("Orange") -//#define MSG_SET_LEDS_YELLOW _UxGT("Yellow") -//#define MSG_SET_LEDS_GREEN _UxGT("Green") -//#define MSG_SET_LEDS_BLUE _UxGT("Blue") -//#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -//#define MSG_SET_LEDS_VIOLET _UxGT("Violet") -//#define MSG_SET_LEDS_WHITE _UxGT("White") -//#define MSG_SET_LEDS_DEFAULT _UxGT("Default") -//#define MSG_CUSTOM_LEDS _UxGT("Custom Lights") -//#define MSG_INTENSITY_R _UxGT("Red Intensity") -//#define MSG_INTENSITY_G _UxGT("Green Intensity") -//#define MSG_INTENSITY_B _UxGT("Blue Intensity") -//#define MSG_INTENSITY_W _UxGT("White Intensity") -//#define MSG_LED_BRIGHTNESS _UxGT("Brightness") - -//#define MSG_MOVING _UxGT("Moving...") -//#define MSG_FREE_XY _UxGT("Free XY") -//#define MSG_MOVE_X _UxGT("Move X") -//#define MSG_MOVE_Y _UxGT("Move Y") -//#define MSG_MOVE_Z _UxGT("Move Z") -//#define MSG_MOVE_E _UxGT("Extruder") -//#define MSG_MOVE_Z_DIST _UxGT("Move %smm") -//#define MSG_MOVE_01MM _UxGT("Move 0.1mm") -//#define MSG_MOVE_1MM _UxGT("Move 1mm") -//#define MSG_MOVE_10MM _UxGT("Move 10mm") -//#define MSG_SPEED _UxGT("Speed") -//#define MSG_BED_Z _UxGT("Bed Z") -#define MSG_NOZZLE _UxGT("노즐") -#define MSG_BED _UxGT("베드") -#define MSG_FAN_SPEED _UxGT("펜 속도") -#define MSG_EXTRA_FAN_SPEED _UxGT("엑스트라 펜 속도") -//#define MSG_FLOW _UxGT("Flow") -//#define MSG_CONTROL _UxGT("Control") -//#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -//#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -//#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -//#define MSG_AUTOTEMP _UxGT("Autotemp") -//#define MSG_LCD_ON _UxGT("On") -//#define MSG_LCD_OFF _UxGT("Off") -//#define MSG_PID_P _UxGT("PID-P") -//#define MSG_PID_I _UxGT("PID-I") -//#define MSG_PID_D _UxGT("PID-D") -//#define MSG_PID_C _UxGT("PID-C") -//#define MSG_SELECT _UxGT("Select") -//#define MSG_ACC _UxGT("Accel") -//#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - //#define MSG_VA_JERK _UxGT("Va-jerk") - //#define MSG_VB_JERK _UxGT("Vb-jerk") - //#define MSG_VC_JERK _UxGT("Vc-jerk") -#else - //#define MSG_VA_JERK _UxGT("Vx-jerk") - //#define MSG_VB_JERK _UxGT("Vy-jerk") - //#define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -//#define MSG_VE_JERK _UxGT("Ve-jerk") -//#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") -//#define MSG_VELOCITY _UxGT("Velocity") -//#define MSG_VMAX _UxGT("Vmax ") -//#define MSG_VMIN _UxGT("Vmin") -//#define MSG_VTRAV_MIN _UxGT("VTrav min") -//#define MSG_ACCELERATION _UxGT("Acceleration") -//#define MSG_AMAX _UxGT("Amax ") -//#define MSG_A_RETRACT _UxGT("A-retract") -//#define MSG_A_TRAVEL _UxGT("A-travel") -//#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#if IS_KINEMATIC - //#define MSG_ASTEPS _UxGT("Asteps/mm") - //#define MSG_BSTEPS _UxGT("Bsteps/mm") - //#define MSG_CSTEPS _UxGT("Csteps/mm") -#else - //#define MSG_ASTEPS _UxGT("Xsteps/mm") - //#define MSG_BSTEPS _UxGT("Ysteps/mm") - //#define MSG_CSTEPS _UxGT("Zsteps/mm") -#endif -//#define MSG_ESTEPS _UxGT("Esteps/mm") -//#define MSG_E1STEPS _UxGT("E1steps/mm") -//#define MSG_E2STEPS _UxGT("E2steps/mm") -//#define MSG_E3STEPS _UxGT("E3steps/mm") -//#define MSG_E4STEPS _UxGT("E4steps/mm") -//#define MSG_E5STEPS _UxGT("E5steps/mm") -//#define MSG_E6STEPS _UxGT("E6steps/mm") -#define MSG_TEMPERATURE _UxGT("온도") -#define MSG_MOTION _UxGT("동작") -//#define MSG_FILAMENT _UxGT("Filament") -//#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -//#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -//#define MSG_FILAMENT_UNLOAD _UxGT("Unload mm") -//#define MSG_FILAMENT_LOAD _UxGT("Load mm") -//#define MSG_ADVANCE_K _UxGT("Advance K") -//#define MSG_CONTRAST _UxGT("LCD contrast") -#define MSG_STORE_EEPROM _UxGT("설정 저장하기") -#define MSG_LOAD_EEPROM _UxGT("설정 읽어오기") -#define MSG_RESTORE_FAILSAFE _UxGT("설정 되돌리기") -#define MSG_INIT_EEPROM _UxGT("EEPROM 초기화") -#define MSG_REFRESH _UxGT("새로고침") -#define MSG_WATCH _UxGT("처음으로") -#define MSG_PREPARE _UxGT("준비하기") -//#define MSG_TUNE _UxGT("Tune") -#define MSG_PAUSE_PRINT _UxGT("일시정지") -#define MSG_RESUME_PRINT _UxGT("재시작") -#define MSG_STOP_PRINT _UxGT("출력중지") -//#define MSG_OUTAGE_RECOVERY _UxGT("Outage Recovery") -#define MSG_MEDIA_MENU _UxGT("SD 카드출력") -#define MSG_NO_MEDIA _UxGT("SD 카드없음") -#define MSG_DWELL _UxGT("슬립모드...") -//#define MSG_USERWAIT _UxGT("Click to resume...") -#define MSG_PRINT_PAUSED _UxGT("일시 정지됨") -#define MSG_PRINTING _UxGT("출력중...") -#define MSG_PRINT_ABORTED _UxGT("취소됨") -//#define MSG_NO_MOVE _UxGT("No move.") -#define MSG_KILLED _UxGT("죽음. ") -#define MSG_STOPPED _UxGT("멈춤. ") -//#define MSG_CONTROL_RETRACT _UxGT("Retract mm") -//#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") -//#define MSG_CONTROL_RETRACTF _UxGT("Retract V") -//#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") -//#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -//#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -//#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -//#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -//#define MSG_AUTORETRACT _UxGT("AutoRetr.") -//#define MSG_FILAMENTCHANGE _UxGT("Change filament") -//#define MSG_FILAMENTLOAD _UxGT("Load filament") -//#define MSG_FILAMENTUNLOAD _UxGT("Unload filament") -//#define MSG_FILAMENTUNLOAD_ALL _UxGT("Unload All") -//#define MSG_INIT_MEDIA _UxGT("Init. SD card") -//#define MSG_CHANGE_MEDIA _UxGT("Change SD card") -//#define MSG_ZPROBE_OUT _UxGT("Z Probe past bed") -//#define MSG_SKEW_FACTOR _UxGT("Skew Factor") -//#define MSG_BLTOUCH _UxGT("BLTouch") -//#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -//#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -//#define MSG_BLTOUCH_DEPLOY _UxGT("Deploy BLTouch") -//#define MSG_BLTOUCH_STOW _UxGT("Stow BLTouch") -//#define MSG_MANUAL_DEPLOY _UxGT("Deploy Z-Probe") -//#define MSG_MANUAL_STOW _UxGT("Stow Z-Probe") -//#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -//#define MSG_ZPROBE_ZOFFSET _UxGT("Probe Z Offset") -//#define MSG_BABYSTEP_X _UxGT("Babystep X") -//#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -//#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -//#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -//#define MSG_HEATING_FAILED_LCD _UxGT("Heating failed") -//#define MSG_HEATING_FAILED_LCD_BED _UxGT("Bed heating failed") -//#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") -//#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") -//#define MSG_THERMAL_RUNAWAY_BED _UxGT("BED THERMAL RUNAWAY") -//#define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP") -//#define MSG_ERR_MINTEMP _UxGT("Err: MINTEMP") -//#define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") -//#define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") -//#define MSG_ERR_Z_HOMING _UxGT("Home XY first") -//#define MSG_HALTED _UxGT("PRINTER HALTED") -//#define MSG_PLEASE_RESET _UxGT("Please reset") -//#define MSG_SHORT_DAY _UxGT("d") // One character only -//#define MSG_SHORT_HOUR _UxGT("h") // One character only -//#define MSG_SHORT_MINUTE _UxGT("m") // One character only -//#define MSG_HEATING _UxGT("Heating...") -//#define MSG_COOLING _UxGT("Cooling...") -//#define MSG_BED_HEATING _UxGT("Bed heating...") -//#define MSG_BED_COOLING _UxGT("Bed cooling...") -//#define MSG_DELTA_CALIBRATE _UxGT("Delta Calibration") -//#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrate X") -//#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrate Y") -//#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrate Z") -//#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrate Center") -//#define MSG_DELTA_SETTINGS _UxGT("Delta Settings") -//#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibration") -//#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Set Delta Height") -//#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Probe Z-offset") -//#define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") -//#define MSG_DELTA_HEIGHT _UxGT("Height") -//#define MSG_DELTA_RADIUS _UxGT("Radius") -//#define MSG_INFO_MENU _UxGT("About Printer") -//#define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") -//#define MSG_3POINT_LEVELING _UxGT("3-Point Leveling") -//#define MSG_LINEAR_LEVELING _UxGT("Linear Leveling") -//#define MSG_BILINEAR_LEVELING _UxGT("Bilinear Leveling") -//#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -//#define MSG_MESH_LEVELING _UxGT("Mesh Leveling") -//#define MSG_INFO_STATS_MENU _UxGT("Printer Stats") -//#define MSG_INFO_BOARD_MENU _UxGT("Board Info") -//#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -//#define MSG_INFO_EXTRUDERS _UxGT("Extruders") -//#define MSG_INFO_BAUDRATE _UxGT("Baud") -//#define MSG_INFO_PROTOCOL _UxGT("Protocol") -//#define MSG_CASE_LIGHT _UxGT("Case light") -//#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Light Brightness") - -#define MSG_EXPECTED_PRINTER _UxGT("잘못된 프린터") - -#if LCD_WIDTH >= 20 - //#define MSG_INFO_PRINT_COUNT _UxGT("Print Count") - //#define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") - //#define MSG_INFO_PRINT_TIME _UxGT("Total print time") - //#define MSG_INFO_PRINT_LONGEST _UxGT("Longest job time") - //#define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded total") -#else - //#define MSG_INFO_PRINT_COUNT _UxGT("Prints") - //#define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") - //#define MSG_INFO_PRINT_TIME _UxGT("Total") - //#define MSG_INFO_PRINT_LONGEST _UxGT("Longest") - //#define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded") -#endif -//#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -//#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -//#define MSG_INFO_PSU _UxGT("PSU") -//#define MSG_DRIVE_STRENGTH _UxGT("Drive Strength") -//#define MSG_DAC_PERCENT _UxGT("Driver %") -//#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") -//#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("PRINT PAUSED") -//#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("LOAD FILAMENT") -//#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("UNLOAD FILAMENT") -//#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("RESUME OPTIONS:") -//#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purge more") -//#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continue") -//#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozzle: ") -//#define MSG_RUNOUT_SENSOR _UxGT("Runout Sensor") -//#define MSG_ERR_HOMING_FAILED _UxGT("Homing failed") -//#define MSG_ERR_PROBING_FAILED _UxGT("Probing failed") -//#define MSG_M600_TOO_COLD _UxGT("M600: Too cold") - -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - //#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wait for start") - //#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("of the filament") - //#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("change") - //#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") - //#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert filament") - //#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("and press button") - //#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("to continue...") - //#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Press button to") - //#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("heat nozzle.") - //#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating nozzle") - //#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Please wait...") - //#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") - //#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Wait for") - //#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("filament purge") - //#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") - //#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") -#else // LCD_HEIGHT < 4 - //#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Please wait...") - //#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...") - //#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") - //#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Click to heat") - //#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating...") - //#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Loading...") - //#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purging...") - //#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Resuming...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" 준비."); + PROGMEM Language_Str MSG_BACK = _UxGT("뒤로"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("카드 삽입됨"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("카드 제거됨"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("엔드스탑"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("소프트 엔드스탑"); + PROGMEM Language_Str MSG_MAIN = _UxGT("뒤로"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("고급 설정"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("설정"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("자동 시작"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("모터 정지"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("디버깅 메뉴"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("프로그레스바 테스트"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("오토홈"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X 홈으로"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y 홈으로"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z 홈으로"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ 홈으로"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("누르면 시작합니다"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("다음 Point"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("레벨링 완료!"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("예열하기 - ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("예열하기 - ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("예열하기 - ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" 노즐 ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Custom 예열"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("식히기"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("스위치 전원 켜기"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("스위치 전원 끄기"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("밀어내기"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("당기기"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("축 이동"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("베드 레벨링"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("미러 사본"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("오토레벨링 하기"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("노즐"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("노즐 ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("노즐 ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("노즐 ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("노즐 ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("노즐 ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("노즐 ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("베드"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("펜 속도"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("펜 속도 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("펜 속도 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("펜 속도 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("엑스트라 펜 속도"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("엑스트라 펜 속도 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("엑스트라 펜 속도 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("엑스트라 펜 속도 3"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("온도"); + PROGMEM Language_Str MSG_MOTION = _UxGT("동작"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("설정 저장하기"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("설정 읽어오기"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("설정 되돌리기"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM 초기화"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("새로고침"); + PROGMEM Language_Str MSG_WATCH = _UxGT("처음으로"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("준비하기"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("일시정지"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("재시작"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("출력중지"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD 카드출력"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD 카드없음"); + PROGMEM Language_Str MSG_DWELL = _UxGT("슬립모드..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("일시 정지됨"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("출력중..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("취소됨"); + PROGMEM Language_Str MSG_KILLED = _UxGT("죽음. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("멈춤. "); + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("잘못된 프린터"); +} diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 483b242501..7555194eb8 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -32,252 +32,270 @@ #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -#define WELCOME_MSG MACHINE_NAME _UxGT(" gereed.") -#define MSG_BACK _UxGT("Terug") -#define MSG_MEDIA_INSERTED _UxGT("Kaart ingestoken") -#define MSG_MEDIA_REMOVED _UxGT("Kaart verwijderd") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Hoofdmenu") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Motoren uit") -#define MSG_DEBUG_MENU _UxGT("Debug Menu") //accepted English terms -#define MSG_PROGRESS_BAR_TEST _UxGT("Vooruitgang Test") -#define MSG_AUTO_HOME _UxGT("Auto home") -#define MSG_AUTO_HOME_X _UxGT("Home X") -#define MSG_AUTO_HOME_Y _UxGT("Home Y") -#define MSG_AUTO_HOME_Z _UxGT("Home Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Klik voor begin") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Volgende Plaats") -#define MSG_LEVEL_BED_DONE _UxGT("Bed level kompl.") -#define MSG_SET_HOME_OFFSETS _UxGT("Zet home offsets") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("H offset toegep.") -#define MSG_SET_ORIGIN _UxGT("Nulpunt instellen") -#define MSG_PREHEAT_1 _UxGT(PREHEAT_1_LABEL " voorverwarmen") -#define MSG_PREHEAT_1_N _UxGT(PREHEAT_1_LABEL " voorverw. ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1_N _UxGT("aan") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Einde") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1_N _UxGT("Bed") -#define MSG_PREHEAT_1_SETTINGS _UxGT(PREHEAT_1_LABEL " verw. conf") -#define MSG_PREHEAT_2 _UxGT(PREHEAT_2_LABEL " voorverwarmen") -#define MSG_PREHEAT_2_N _UxGT(PREHEAT_2_LABEL " voorverw. ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2_N _UxGT("aan") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Einde") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2_N _UxGT("Bed") -#define MSG_PREHEAT_2_SETTINGS _UxGT(PREHEAT_2_LABEL " verw. conf") -#define MSG_COOLDOWN _UxGT("Afkoelen") -#define MSG_SWITCH_PS_ON _UxGT("Stroom aan") -#define MSG_SWITCH_PS_OFF _UxGT("Stroom uit") -#define MSG_EXTRUDE _UxGT("Extrude") -#define MSG_RETRACT _UxGT("Retract") -#define MSG_MOVE_AXIS _UxGT("As verplaatsen") -#define MSG_BED_LEVELING _UxGT("Bed Leveling") -#define MSG_LEVEL_BED _UxGT("Level bed") +namespace Language_nl { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_MOVING _UxGT("Verplaatsen...") -#define MSG_FREE_XY _UxGT("Vrij XY") -#define MSG_MOVE_X _UxGT("Verplaats X") -#define MSG_MOVE_Y _UxGT("Verplaats Y") -#define MSG_MOVE_Z _UxGT("Verplaats Z") -#define MSG_MOVE_E _UxGT("Extruder") -#define MSG_MOVE_Z_DIST _UxGT("Verplaats %smm") -#define MSG_MOVE_01MM _UxGT("Verplaats 0.1mm") -#define MSG_MOVE_1MM _UxGT("Verplaats 1mm") -#define MSG_MOVE_10MM _UxGT("Verplaats 10mm") -#define MSG_SPEED _UxGT("Snelheid") -#define MSG_BED_Z _UxGT("Bed Z") -#define MSG_NOZZLE _UxGT("Nozzle") -#define MSG_BED _UxGT("Bed") -#define MSG_FAN_SPEED _UxGT("Fan snelheid") -#define MSG_FLOW _UxGT("Flow") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Autotemp") -#define MSG_LCD_ON _UxGT("Aan") -#define MSG_LCD_OFF _UxGT("Uit") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Selecteer") -#define MSG_ACC _UxGT("Versn") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retract") -#define MSG_A_TRAVEL _UxGT("A-travel") -#define MSG_STEPS_PER_MM _UxGT("Steps/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Asteps/mm") - #define MSG_BSTEPS _UxGT("Bsteps/mm") - #define MSG_CSTEPS _UxGT("Csteps/mm") -#else - #define MSG_ASTEPS _UxGT("Xsteps/mm") - #define MSG_BSTEPS _UxGT("Ysteps/mm") - #define MSG_CSTEPS _UxGT("Zsteps/mm") -#endif -#define MSG_ESTEPS _UxGT("Esteps/mm") -#define MSG_E1STEPS _UxGT("E1steps/mm") -#define MSG_E2STEPS _UxGT("E2steps/mm") -#define MSG_E3STEPS _UxGT("E3steps/mm") -#define MSG_E4STEPS _UxGT("E4steps/mm") -#define MSG_E5STEPS _UxGT("E5steps/mm") -#define MSG_E6STEPS _UxGT("E6steps/mm") -#define MSG_TEMPERATURE _UxGT("Temperatuur") -#define MSG_MOTION _UxGT("Beweging") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_ADVANCE_K _UxGT("Advance K") //accepted english dutch -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_CONTRAST _UxGT("LCD contrast") -#define MSG_STORE_EEPROM _UxGT("Geheugen opslaan") -#define MSG_LOAD_EEPROM _UxGT("Geheugen laden") -#define MSG_RESTORE_FAILSAFE _UxGT("Noodstop reset") -#define MSG_REFRESH _UxGT("Ververs") -#define MSG_WATCH _UxGT("Info scherm") -#define MSG_PREPARE _UxGT("Voorbereiden") -#define MSG_TUNE _UxGT("Afstellen") -#define MSG_PAUSE_PRINT _UxGT("Print pauzeren") -#define MSG_RESUME_PRINT _UxGT("Print hervatten") -#define MSG_STOP_PRINT _UxGT("Print stoppen") -#define MSG_MEDIA_MENU _UxGT("Print van SD") -#define MSG_NO_MEDIA _UxGT("Geen SD kaart") -#define MSG_DWELL _UxGT("Slapen...") -#define MSG_USERWAIT _UxGT("Wachten...") -#define MSG_PRINT_ABORTED _UxGT("Print afgebroken") -#define MSG_NO_MOVE _UxGT("Geen beweging.") -#define MSG_KILLED _UxGT("Afgebroken. ") -#define MSG_STOPPED _UxGT("Gestopt. ") -#define MSG_CONTROL_RETRACT _UxGT("Retract mm") //accepted English term in Dutch -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Ruil Retract mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retract F") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ruil UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet F") -#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENTCHANGE _UxGT("Verv. Filament") -#define MSG_INIT_MEDIA _UxGT("Init. SD kaart") -#define MSG_CHANGE_MEDIA _UxGT("Verv. SD Kaart") -#define MSG_ZPROBE_OUT _UxGT("Z probe uit. bed") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Zelf-Test") -#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s Eerst") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") //accepted English term in Dutch -#define MSG_BABYSTEP_X _UxGT("Babystap X") -#define MSG_BABYSTEP_Y _UxGT("Babystap Y") -#define MSG_BABYSTEP_Z _UxGT("Babystap Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop afbr.") -#define MSG_HEATING_FAILED_LCD _UxGT("Voorverw. fout") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Redun. temp fout") -#define MSG_THERMAL_RUNAWAY _UxGT("Therm. wegloop") -#define MSG_ERR_MAXTEMP _UxGT("Err: Max. temp") -#define MSG_ERR_MINTEMP _UxGT("Err: Min. temp") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: Max.tmp bed") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: Min.tmp bed") -#define MSG_ERR_Z_HOMING _UxGT("Home XY Eerst") -#define MSG_HALTED _UxGT("PRINTER GESTOPT") -#define MSG_PLEASE_RESET _UxGT("Reset A.U.B.") -#define MSG_SHORT_DAY _UxGT("d") // One character only. Keep English standard -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Voorwarmen...") -#define MSG_BED_HEATING _UxGT("Bed voorverw...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Calibratie") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibreer X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibreer Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibreer Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibreer Midden") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibratie") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Zet Delta Hoogte") + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Dutch"); -#define MSG_INFO_STATS_MENU _UxGT("Printer Stats") -#define MSG_INFO_BOARD_MENU _UxGT("Board Info") //accepted English term in Dutch -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extruders") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_MENU _UxGT("Over Printer") -#define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") -#define MSG_INFO_PROTOCOL _UxGT("Protocol") -#define MSG_CASE_LIGHT _UxGT("Case licht") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gereed."); + PROGMEM Language_Str MSG_BACK = _UxGT("Terug"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kaart ingestoken"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Hoofdmenu"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren uit"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); //accepted English terms + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Vooruitgang Test"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik voor begin"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Volgende Plaats"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level kompl."); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Zet home offsets"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("H offset toegep."); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nulpunt instellen"); + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen"); + PROGMEM Language_Str MSG_PREHEAT_1_H0 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = PREHEAT_1_LABEL _UxGT(" voorverw. ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" voorverw. aan"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" voorverw. Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" verw. conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" voorverwarmen"); + PROGMEM Language_Str MSG_PREHEAT_2_H0 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = PREHEAT_2_LABEL _UxGT(" voorverw. ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" voorverw. Einde"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" voorverw. aan"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" voorverw. Bed"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" verw. conf"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkoelen"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Stroom aan"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Stroom uit"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("As verplaatsen"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level bed"); -#define MSG_EXPECTED_PRINTER _UxGT("Onjuiste printer") + PROGMEM Language_Str MSG_MOVING = _UxGT("Verplaatsen..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Vrij XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Verplaats X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Verplaats Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Verplaats Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extruder ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extruder ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extruder ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extruder ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extruder ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extruder ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Verplaats %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Verplaats 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Verplaats 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Snelheid"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Nozzle ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Nozzle ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Nozzle ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Nozzle ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Nozzle ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Nozzle ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan snelheid"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Fan snelheid 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Fan snelheid 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Fan snelheid 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Flow ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Flow ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Flow ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Flow ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Flow ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Flow ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Aan"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Uit"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Selecteer"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Selecteer ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Selecteer ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Selecteer ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Selecteer ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Selecteer ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Selecteer ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Versn"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatuur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Beweging"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Advance K ") LCD_STR_E0; //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Advance K ") LCD_STR_E1; //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Advance K ") LCD_STR_E2; //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Advance K ") LCD_STR_E3; //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Advance K ") LCD_STR_E4; //accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Advance K ") LCD_STR_E5; //accepted english dutch + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Dia. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Dia. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Dia. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Dia. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Dia. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Dia. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD contrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Geheugen opslaan"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Geheugen laden"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Noodstop reset"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info scherm"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Voorbereiden"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Afstellen"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Print pauzeren"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Print hervatten"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Print stoppen"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print van SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Geen SD kaart"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Slapen..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Wachten..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print afgebroken"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Geen beweging."); + PROGMEM Language_Str MSG_KILLED = _UxGT("Afgebroken. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Gestopt. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); //accepted English term in Dutch + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract F"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet F"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Verv. Filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Verv. Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Verv. Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Verv. Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Verv. Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Verv. Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Verv. Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Init. SD kaart"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Verv. SD Kaart"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe uit. bed"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Zelf-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Eerst"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); //accepted English term in Dutch + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystap X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystap Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystap Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop afbr."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Voorverw. fout"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Redun. temp fout"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Therm. wegloop"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Max. temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Min. temp"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Max.tmp bed"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Min.tmp bed"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY Eerst"); + PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER GESTOPT"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset A.U.B."); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only. Keep English standard + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Voorwarmen..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed voorverw..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibratie"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibreer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibreer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibreer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibreer Midden"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibratie"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Zet Delta Hoogte"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Printed Aantal") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Totaal Voltooid") - #define MSG_INFO_PRINT_TIME _UxGT("Totale Printtijd") - #define MSG_INFO_PRINT_LONGEST _UxGT("Langste Printtijd") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Totaal Extrudeert") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Aantal") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Voltooid") - #define MSG_INFO_PRINT_TIME _UxGT("Printtijd ") - #define MSG_INFO_PRINT_LONGEST _UxGT("Langste") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.") -#endif + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); //accepted English term in Dutch + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruders"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Over Printer"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Printer Info"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case licht"); -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("PSU") //accepted English term in Dutch + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Onjuiste printer"); -#define MSG_DRIVE_STRENGTH _UxGT("Motorstroom") -#define MSG_DAC_PERCENT _UxGT("Driver %") //accepted English term in Dutch -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC Opslaan") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Hervat print") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozzle: ") //accepeted English term -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - // Up to 3 lines - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wacht voor start") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filament te") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("verwisselen") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament uit") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("te laden") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klik knop om...") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("verw. nozzle.") //nozzle accepted English term - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nozzle verw.") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Wacht a.u.b.") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laad filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("en druk knop") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("om verder...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament te") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("laden") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wacht voor print") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("om verder") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("te gaan") -#else // LCD_HEIGHT < 4 - // Up to 2 lines - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("start...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("uitladen...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klik knop om...") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("verw. nozzle.") //nozzle accepted English term - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Verwarmen...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laad filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("en druk knop") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("inladen...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wacht voor") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("printing...") -#endif // LCD_HEIGHT < 4 + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printed Aantal"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Totaal Voltooid"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Totale Printtijd"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste Printtijd"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totaal Extrudeert"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Aantal"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Voltooid"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Printtijd "); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); //accepted English term in Dutch + + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorstroom"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Driver %"); //accepted English term in Dutch + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC Opslaan"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Hervat print"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); //accepeted English term + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + // Up to 3 lines + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wacht voor start", "filament te", "verwisselen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament uit", "te laden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle verw.", "Wacht a.u.b.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Laad filament", "en druk knop", "om verder...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament te", "laden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Wacht voor print", "om verder", "te gaan")); + #else + // Up to 2 lines + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Wacht voor", "start...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wacht voor", "uitladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Verwarmen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Laad filament", "en druk knop")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wacht voor", "inladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wacht voor", "printing...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 97924a7024..9e2810a885 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -22,233 +22,679 @@ #pragma once /** - * Polish for DOGM display - includes accented characters + * Polish - includes accented characters + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ #define DISPLAY_CHARSET_ISO10646_PL -#define CHARSIZE 2 +namespace Language_pl { + using namespace Language_en; // Inherit undefined strings from English -#define WELCOME_MSG MACHINE_NAME _UxGT(" gotowy.") -#define MSG_MEDIA_INSERTED _UxGT("Karta włożona") -#define MSG_MEDIA_REMOVED _UxGT("Karta usunięta") -#define MSG_LCD_ENDSTOPS _UxGT("Kranców.") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu główne") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Wyłącz silniki") -#define MSG_AUTO_HOME _UxGT("Pozycja zerowa") -#define MSG_AUTO_HOME_X _UxGT("Zeruj X") -#define MSG_AUTO_HOME_Y _UxGT("Zeruj Y") -#define MSG_AUTO_HOME_Z _UxGT("Zeruj Z") -#define MSG_LEVEL_BED _UxGT("Poziom. stołu") -#define MSG_LEVEL_BED_HOMING _UxGT("Pozycja zerowa") -#define MSG_LEVEL_BED_WAITING _UxGT("Kliknij by rozp.") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Następny punkt") -#define MSG_LEVEL_BED_DONE _UxGT("Wypoziomowano!") -#define MSG_USER_MENU _UxGT("Własne Polecenia") -#define MSG_SET_HOME_OFFSETS _UxGT("Ust. poz. zer.") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Poz. zerowa ust.") -#define MSG_SET_ORIGIN _UxGT("Ustaw punkt zero") -#define MSG_PREHEAT_1 _UxGT("Rozgrzej " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" wsz.") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Rozgrzej stół " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_SETTINGS _UxGT("Ustaw. rozg. " PREHEAT_1_LABEL) -#define MSG_PREHEAT_2 _UxGT("Rozgrzej " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" wsz.") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Rozgrzej stół " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_SETTINGS _UxGT("Ustaw. rozg. " PREHEAT_2_LABEL) -#define MSG_COOLDOWN _UxGT("Chłodzenie") -#define MSG_SWITCH_PS_ON _UxGT("Włącz zasilacz") -#define MSG_SWITCH_PS_OFF _UxGT("Wyłącz zasilacz") -#define MSG_EXTRUDE _UxGT("Ekstruzja") -#define MSG_RETRACT _UxGT("Wycofanie") -#define MSG_MOVE_AXIS _UxGT("Ruch osi") -#define MSG_BED_LEVELING _UxGT("Poziom. stołu") -#define MSG_MOVE_X _UxGT("Przesuń w X") -#define MSG_MOVE_Y _UxGT("Przesuń w Y") -#define MSG_MOVE_Z _UxGT("Przesuń w Z") -#define MSG_MOVE_E _UxGT("Ekstruzja (os E)") -#define MSG_MOVE_Z_DIST _UxGT("Przesuń co %smm") -#define MSG_MOVE_01MM _UxGT("Przesuń co .1mm") -#define MSG_MOVE_1MM _UxGT("Przesuń co 1mm") -#define MSG_MOVE_10MM _UxGT("Przesuń co 10mm") -#define MSG_SPEED _UxGT("Predkość") -#define MSG_BED_Z _UxGT("Stół Z") -#define MSG_NOZZLE _UxGT("Dysza") -#define MSG_BED _UxGT("Stół") -#define MSG_FAN_SPEED _UxGT("Obroty wiatraka") -#define MSG_FLOW _UxGT("Przepływ") -#define MSG_CONTROL _UxGT("Ustawienia") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Mnożnik") -#define MSG_AUTOTEMP _UxGT("Auto. temperatura") -#define MSG_LCD_ON _UxGT("Wł.") -#define MSG_LCD_OFF _UxGT("Wył.") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Select") -#define MSG_ACC _UxGT("Przyśpieszenie") -#define MSG_JERK _UxGT("Zryw") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Zryw Va") - #define MSG_VB_JERK _UxGT("Zryw Vb") - #define MSG_VC_JERK _UxGT("Zryw Vc") -#else - #define MSG_VA_JERK _UxGT("Zryw Vx") - #define MSG_VB_JERK _UxGT("Zryw Vy") - #define MSG_VC_JERK _UxGT("Zryw Vz") -#endif -#define MSG_VE_JERK _UxGT("Zryw Ve") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vskok min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Amax") -#define MSG_A_RETRACT _UxGT("A-wycofanie") -#define MSG_A_TRAVEL _UxGT("A-przesuń.") -#define MSG_STEPS_PER_MM _UxGT("kroki/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("krokiA/mm") - #define MSG_BSTEPS _UxGT("krokiB/mm") - #define MSG_CSTEPS _UxGT("krokiC/mm") -#else - #define MSG_ASTEPS _UxGT("krokiX/mm") - #define MSG_BSTEPS _UxGT("krokiY/mm") - #define MSG_CSTEPS _UxGT("krokiZ/mm") -#endif -#define MSG_ESTEPS _UxGT("krokiE/mm") -#define MSG_E1STEPS _UxGT("krokiE1/mm") -#define MSG_E2STEPS _UxGT("krokiE2/mm") -#define MSG_E3STEPS _UxGT("krokiE3/mm") -#define MSG_E4STEPS _UxGT("krokiE4/mm") -#define MSG_E5STEPS _UxGT("krokiE5/mm") -#define MSG_E6STEPS _UxGT("krokiE6/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Ruch") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E w mm3") -#define MSG_FILAMENT_DIAM _UxGT("Śr. fil.") -#define MSG_CONTRAST _UxGT("Kontrast LCD") -#define MSG_STORE_EEPROM _UxGT("Zapisz w pamięci") -#define MSG_LOAD_EEPROM _UxGT("Wczytaj z pamięci") -#define MSG_RESTORE_FAILSAFE _UxGT("Ustaw. fabryczne") -#define MSG_REFRESH _UxGT("Odswież") -#define MSG_WATCH _UxGT("Ekran główny") -#define MSG_PREPARE _UxGT("Przygotuj") -#define MSG_TUNE _UxGT("Strojenie") -#define MSG_PAUSE_PRINT _UxGT("Pauza") -#define MSG_RESUME_PRINT _UxGT("Wznowienie") -#define MSG_STOP_PRINT _UxGT("Stop") -#define MSG_MEDIA_MENU _UxGT("Karta SD") -#define MSG_NO_MEDIA _UxGT("Brak karty") -#define MSG_DWELL _UxGT("Uśpij...") -#define MSG_USERWAIT _UxGT("Oczekiwanie...") -#define MSG_PRINT_ABORTED _UxGT("Druk przerwany") -#define MSG_NO_MOVE _UxGT("Brak ruchu") -#define MSG_KILLED _UxGT("Ubity. ") -#define MSG_STOPPED _UxGT("Zatrzymany. ") -#define MSG_CONTROL_RETRACT _UxGT("Wycofaj mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Z Wycof. mm") -#define MSG_CONTROL_RETRACTF _UxGT("Wycofaj V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Skok Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Cof. wycof. mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Z Cof. wyc. mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Cof. wycof. V") -#define MSG_AUTORETRACT _UxGT("Auto. wycofanie") -#define MSG_FILAMENTCHANGE _UxGT("Zmień filament") -#define MSG_INIT_MEDIA _UxGT("Inicjal. karty SD") -#define MSG_CHANGE_MEDIA _UxGT("Zmiana karty SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z za stołem") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -#define MSG_ZPROBE_ZOFFSET _UxGT("Offset Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Błąd krańcówki") -#define MSG_HEATING_FAILED_LCD _UxGT("Rozgrz. nieudane") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Błąd temperatury") -#define MSG_THERMAL_RUNAWAY _UxGT("Zanik temp.") -#define MSG_ERR_MAXTEMP _UxGT("Err max temp") -#define MSG_ERR_MINTEMP _UxGT("Err min temp") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err max temp stołu") -#define MSG_ERR_MINTEMP_BED _UxGT("Err min temp stołu") -#define MSG_ERR_Z_HOMING _UxGT("Home XY first") -#define MSG_HALTED _UxGT("Drukarka zatrzym.") -#define MSG_PLEASE_RESET _UxGT("Proszę zresetować") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("g") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Rozgrzewanie...") -#define MSG_BED_HEATING _UxGT("Rozgrzewanie stołu...") -#define MSG_DELTA_CALIBRATE _UxGT("Kalibrowanie Delty") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibruj X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibruj Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibruj Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibruj środek") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Polish"); -#define MSG_INFO_MENU _UxGT("O drukarce") -#define MSG_INFO_PRINTER_MENU _UxGT("Info drukarki") -#define MSG_INFO_STATS_MENU _UxGT("Statystyki") -#define MSG_INFO_BOARD_MENU _UxGT("Board Info") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistory") -#define MSG_INFO_EXTRUDERS _UxGT("Ekstrudery") -#define MSG_INFO_BAUDRATE _UxGT("Predkość USB") -#define MSG_INFO_PROTOCOL _UxGT("Protokół") -#define MSG_CASE_LIGHT _UxGT("Oświetlenie") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gotowy."); + PROGMEM Language_Str MSG_YES = _UxGT("TAK"); + PROGMEM Language_Str MSG_NO = _UxGT("NIE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Wstecz"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Przerywanie..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta włożona"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta usunięta"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Karta zwolniona"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu główne"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ustawienie zaawansowane"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguracja"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Wyłącz silniki"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debugowania"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testowy pasek postępu"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Pozycja zerowa"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Zeruj X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Zeruj Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zeruj Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Autowyrównanie Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Pozycja zerowa"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknij by rozp."); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Następny punkt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Wypoziomowano!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Wys. zanikania"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ust. poz. zer."); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Poz. zerowa ust."); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ustaw punkt zero"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" wsz."); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" stół"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" ustaw."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" wsz."); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" stół"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" ustaw."); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Rozgrzej własne ust."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Chłodzenie"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Sterowanie Lasera"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Wyłącz Laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Włącz Laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Zasilanie Lasera"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Sterowanie wrzeciona"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Wyłącz wrzeciono"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Włącz wrzeciono"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Zasilanie wrzeciona"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Rewers wrzeciona"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Włącz zasilacz"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Wyłącz zasilacz"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstruzja"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Wycofanie"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ruch osi"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Poziomowanie stołu"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Wypoziomuj stół"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Narożniki poziomowania"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nastepny narożnik"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Edytor siatki"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edycja siatki"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Edycja siatki zatrzymana"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punkt pomiarowy"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Indeks X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indeks Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Wartość Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Własne Polecenia"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punky"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylenie"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Tryb IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Przesunięcie narzędzia"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkowanie"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikowanie"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Kopia lustrzana"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pełne sterowanie"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2ga dysza X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2ga dysza Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2ga dysza Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Wykonywanie G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Narzędzia UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punkt pochylenia"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ręczne Budowanie Siatki"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Umieść podkładkę i zmierz"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmierz"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Usuń & Zmierz Stół"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Przesuwanie do następnego"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktywacja UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Dezaktywacja UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temperatura stołu"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temperatura stołu"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temperatura dyszy"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temperatura dyszy"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Edycja siatki"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edycja własnej siatki"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Dostrajanie siatki"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec edycji siati"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Buduj własna siatkę"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Buduj siatkę"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Buduj siatkę (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Buduj siatkę (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Buduj siatkę na zimno"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Dostrojenie wysokości siatki"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Wartość wysokości"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sprawdzenie siatki"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Sprawdzenie siatki (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Sprawdzenie siatki (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Sprawdzenie własnej siatki"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Nagrzewanie stołu"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Nagrzewanie dyszy"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Napełnianie ręczne..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Napełnij kreśloną długością"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Napełianie zakończone"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Przewane"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opuszczanie G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Kontynuuj tworzenie siatki"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Poziomowanie siatką"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Poziomowaie 3-punktowe"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Poziomowaie według siatki"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Poziomuj siatkę"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punkty boczne"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Rodzaj mapy"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Wyslij mapę siatki"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Wyslij do Hosta"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Wyslij do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Kopia poza drukarką"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Wyslij info UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Stopień wypełnienia"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ręczne wypełnienie"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Inteligentne wypełnienie"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Wypełnienie siatki"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Unieważnij wszystko"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Unieważnij najbliższy"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Dostrajaj wszystko"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Dostrajaj najbliższy"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Przechowywanie siatki"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot Pamięci"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Załaduj siatke stołu"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Zapisz siatke stołu"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Siatka %i załadowana"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Siatka %i Zapisana"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Brak magazynu"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Błąd: Zapis UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Bład: Odczyt UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Przesunięcie Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Przesunięcie Z zatrzymane"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Krok po kroku"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Tworzeni ezimnej siatki"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligentne wypełnienie"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Sprawdzenie siatki"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Dostrojenie wszystkiego"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Sprawdzenie siatki"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Dostrojenie wszystkiego"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Zapis siatki stołu"); -#define MSG_EXPECTED_PRINTER _UxGT("Niepoprawna drukarka") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Sterowanie LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Światła"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Ustawienia świateł"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Czerwony"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Pomarańczowy"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Zółty"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zielony"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Niebieski"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indygo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fioletowy"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biały"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Domyślny"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Własne światła"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Czerwony"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zielony"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Niebieski"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Biały"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jasność"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukończono") - #define MSG_INFO_PRINT_TIME _UxGT("Czas druku") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdł. druk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Użyty fil.") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukończono") - #define MSG_INFO_PRINT_TIME _UxGT("Razem") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdł. druk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Użyty fil.") -#endif + PROGMEM Language_Str MSG_MOVING = _UxGT("Ruch..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Swobodne XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Przesuń w X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Przesuń w Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Przesuń w Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruzja (os E)"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Ekstruzja (os E) ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Ekstruzja (os E) ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Ekstruzja (os E) ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Ekstruzja (os E) ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Ekstruzja (os E) ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Ekstruzja (os E) ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Dysza za zimna"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Przesuń co %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Przesuń co .1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Przesuń co 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Przesuń co 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Predkość"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Stół Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dysza"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Dysza ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Dysza ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Dysza ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Dysza ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Dysza ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Dysza ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Stół"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Obudowa"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Obroty wiatraka"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Obroty wiatraka 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Obroty wiatraka 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Obroty wiatraka 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Obroty dodatkowego wiatraka"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Obroty dodatkowego wiatraka 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Obroty dodatkowego wiatraka 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Obroty dodatkowego wiatraka 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Przepływ"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Przepływ ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Przepływ ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Przepływ ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Przepływ ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Przepływ ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Przepływ ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ustawienia"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Mnożnik"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto. temperatura"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Wł."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Wył."); + PROGMEM Language_Str MSG_AUTOTUNE_PID = _UxGT("PID Autostrojenie"); + PROGMEM Language_Str MSG_AUTOTUNE_PID_E0 = _UxGT("PID Autostrojenie ") LCD_STR_E0; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E1 = _UxGT("PID Autostrojenie ") LCD_STR_E1; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E2 = _UxGT("PID Autostrojenie ") LCD_STR_E2; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E3 = _UxGT("PID Autostrojenie ") LCD_STR_E3; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E4 = _UxGT("PID Autostrojenie ") LCD_STR_E4; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E5 = _UxGT("PID Autostrojenie ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Wybierz"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Wybierz ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Wybierz ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Wybierz ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Wybierz ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Wybierz ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Wybierz ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Przyspieszenie"); + PROGMEM Language_Str MSG_JERK = _UxGT("Zryw"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Zryw V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Zryw V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Zryw V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Zryw Ve"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Prędkość (V)"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vmax ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vmax ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vmax ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vmax ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vmax ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vmax ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vskok min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Przyspieszenie (A)"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Amax ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Amax ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Amax ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Amax ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Amax ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Amax ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-wycofanie"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-przesuń."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("kroki/mm"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("kroki") LCD_STR_A _UxGT("/mm"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("kroki") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("kroki") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("krokiE/mm"); + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("kroki ") LCD_STR_E0 _UxGT("/mm"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("kroki ") LCD_STR_E1 _UxGT("/mm"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("kroki ") LCD_STR_E2 _UxGT("/mm"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("kroki ") LCD_STR_E3 _UxGT("/mm"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("kroki ") LCD_STR_E4 _UxGT("/mm"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("kroki ") LCD_STR_E5 _UxGT("/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Ruch"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Śr. fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Śr. fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Śr. fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Śr. fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Śr. fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Śr. fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Śr. fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Wyładuj mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Załaduj mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Advance K ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Advance K ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Advance K ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Advance K ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Advance K ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Advance K ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Zapisz w pamięci"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Wczytaj z pamięci"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Ustaw. fabryczne"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initializuj EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Uaktualnij kartę"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetuj drukarkę"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Ekran główny"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Przygotuj"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Strojenie"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start wydruku"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Następny"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inic."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drukuj"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetuj"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Przerwij"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Gotowe"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Wstrzymaj druk"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Wznowienie"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Odzyskiwanie po awarii"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Karta SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Brak karty"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uśpij..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Oczekiwanie..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druk wstrzymany"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Drukowanie..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druk przerwany"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Brak ruchu"); + PROGMEM Language_Str MSG_KILLED = _UxGT("Ubity. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Zatrzymany. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Wycofaj mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Z Wycof. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Wycofaj V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Skok Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Cof. wycof. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Z Cof. wyc. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Cof. wycof. V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto. wycofanie"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Długość zmiany"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Długość oczyszczania"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Zmiana narzędzia"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Podniesienie Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Prędkość napełniania"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Prędkość wycofania"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Dysza w oczekiwaniu"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Zmień filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Zmień filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Zmień filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Zmień filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Zmień filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Zmień filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Zmień filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Załaduj Filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Załaduj Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Załaduj Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Załaduj Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Załaduj Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Załaduj Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Załaduj Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Wyładuj Filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Wyładuj Filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Wyładuj Filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Wyładuj Filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Wyładuj Filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Wyładuj Filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Wyładuj Filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Wyładuj wszystkie"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Inicjal. karty SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Zmiana karty SD"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Zwolnienie karty"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z za stołem"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Współczynik skrzywienia"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("NIEBEZPIECZNE: Złe ustawienia mogą uszkodzić drukarkę. Kontynuować?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najpierw Home %s%s%s"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Łącznie"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Błąd krańcówki"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Rozgrz. nieudane"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Rozgrz. stołu nieudane"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Rozgrz. komory nieudane"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Błąd temperatury"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ZANIK TEMPERATURY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ZANIK TEMP. STOŁU"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ZANIK TEMP.KOMORY"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Błąd: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Błąd: MINTEMP"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Błąd: MAXTEMP STÓŁ"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Błąd: MINTEMP STÓŁ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Błąd: MAXTEMP KOMORA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Błąd: MINTEMP KOMORA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Najpierw Home XY"); + PROGMEM Language_Str MSG_HALTED = _UxGT("Drukarka zatrzym."); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Proszę zresetować"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Rozgrzewanie..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Chłodzenie..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Rozgrzewanie stołu..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chłodzenie stołu..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Rozgrzewanie komory..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chłodzenie komory..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Kalibrowanie Delty"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibruj X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibruj Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibruj Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibruj środek"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Ustawienia delty"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibrowanie"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ustaw wysokość delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Przesun. Z sondy"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Ukośne ramię"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Wysokość"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Promień"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O drukarce"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info drukarki"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Poziomowanie 3-punktowe"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Poziomowanie liniowe"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Poziomowanie biliniowe"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Poziomowanie siatką"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statystyki"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info płyty"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstrudery"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Predkość USB"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokół"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Zegar pracy: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Zegar pracy: ON"); -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Zasilacz") + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Oświetlenie obudowy"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jasność oświetlenia"); + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Niepoprawna drukarka"); -#define MSG_DRIVE_STRENGTH _UxGT("Siła silnika") -#define MSG_DAC_PERCENT _UxGT("Siła %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Zapisz DAC EEPROM") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Czas druku"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Razem"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); + #endif -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("ZMIEŃ FILAMENT") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ZMIEŃ OPCJE:") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Wznów drukowanie") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Zasilacz"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Siła silnika"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Siła %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC BŁĄD POŁĄCZENIA"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Zapisz DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ZMIEŃ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("WYDRUK WSTRZYMANY"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAŁADUJ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("WYŁADUJ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCJE WZNOWIENIA:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Oczyść więcej"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Kontynuuj"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Dysza: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Czujnik filamentu"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dystans do czujnika mm"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Zerowanie nieudane"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondowanie nieudane"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: za zimne"); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Czekam na ") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("zmianę filamentu") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("wyjęcie filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Włóz filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i naciśnij przycisk") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("aby kontynuować...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("włożenie filamentu") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("wznowienie druku") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Proszę czekać...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wysuwanie...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Włóż i naciśnij prz.") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ładowanie...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wznowienie...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("WYBIERZ FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Uaktualnij firmware MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU wymaga uwagi."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Wznów wydruk"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Wznawianie..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Załaduj filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Załaduj wszystko"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Załaduj do dyszy"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Wysuń filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Wysuń filament 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Wysuń filament 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Wysuń filament 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Wysuń filament 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Wysuń filament 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Wyładuj filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Ładowanie fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Wysuwanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Wyładowywanie fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Wszystko"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetuj MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetowanie MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Usuń, kliknij"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Miks"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Komponent 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Komponent 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Komponent 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Komponent 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Komponent 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Komponent 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mikser"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Pełny gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Przełacz miks"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Odwrotny gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" End V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" End Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Games"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); + + #define MSG_1_LINE(A) A "\0" "\0" + #define MSG_2_LINE(A,B) A "\0" B "\0" + #define MSG_3_LINE(A,B,C) A "\0" B "\0" C + + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nacisnik przycisk", "by wznowić drukowanie")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkowanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Czekam na", "zmianę filamentu", "by wystartować")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Włóż filament", "i naciśnij przycisk", "by kontynuować")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Naciśnij przycisk", "by nagrzać dyszę")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nagrzewanie dyszy", "Proszę czekać...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Czekam na", "wyjęcie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Czekam na", "włożenie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Czekam na", "oczyszczenie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kliknij by zakończyć", "oczyszczanie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Czekam na", "wznowienie wydruku...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknij by kontynuować")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkowanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Proszę czekać...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Włóż i kliknij")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknij by nagrzać")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nagrzewanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Wysuwanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ładowanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Oczyszczanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Kliknij by zakończyć")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Wznawianie...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Current"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); +} diff --git a/Marlin/src/lcd/language/language_pt-br.h b/Marlin/src/lcd/language/language_pt-br.h deleted file mode 100644 index d78bd5a138..0000000000 --- a/Marlin/src/lcd/language/language_pt-br.h +++ /dev/null @@ -1,444 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Portuguese (Brazil) - * UTF-8 for Graphical Display - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ - -// Put characters here that should be displayed with M117 -//_UxGT("áãàçÉéêíóõ") - -#define CHARSIZE 2 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") - -#define MSG_BACK _UxGT("Voltar") -#define MSG_MEDIA_INSERTED _UxGT("Cartão inserido") -#define MSG_MEDIA_REMOVED _UxGT("Cartão removido") -#define MSG_LCD_ENDSTOPS _UxGT("Fins de curso") -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Fins curso") -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_ADVANCED_SETTINGS _UxGT("Config. Avançada") -#define MSG_CONFIGURATION _UxGT("Configuração") -#define MSG_AUTOSTART _UxGT("Início automático") -#define MSG_DISABLE_STEPPERS _UxGT("Desabilit. motores") -#define MSG_DEBUG_MENU _UxGT("Menu Debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Testar Barra Progres") -#define MSG_AUTO_HOME _UxGT("Ir a origem XYZ") -#define MSG_AUTO_HOME_X _UxGT("Ir na origem X") -#define MSG_AUTO_HOME_Y _UxGT("Ir na origem Y") -#define MSG_AUTO_HOME_Z _UxGT("Ir na origem Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Auto alinhar Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") -#define MSG_LEVEL_BED_WAITING _UxGT("Clique para Iniciar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo Ponto") -#define MSG_LEVEL_BED_DONE _UxGT("Fim nivelação!") -#define MSG_Z_FADE_HEIGHT _UxGT("Suavizar altura") -#define MSG_SET_HOME_OFFSETS _UxGT("Compensar origem") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Alteração aplicada") -#define MSG_SET_ORIGIN _UxGT("Ajustar Origem") -#define MSG_PREHEAT_1 _UxGT("Pre-aquecer " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL _UxGT("Pre-aq.Todo " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_END _UxGT("Extrusora " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_BEDONLY _UxGT("Pre-aq.Mesa " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_SETTINGS _UxGT("Ajustar " PREHEAT_1_LABEL) -#define MSG_PREHEAT_2 _UxGT("Pre-aquecer " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL _UxGT("Pre-aq.Todo " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_END _UxGT("Extrusora " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_BEDONLY _UxGT("Pre-aq.Mesa " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_SETTINGS _UxGT("Ajustar " PREHEAT_2_LABEL) -#define MSG_PREHEAT_CUSTOM _UxGT("Customizar Pre-aq.") -#define MSG_COOLDOWN _UxGT("Esfriar") -#define MSG_SWITCH_PS_ON _UxGT("Ligar") -#define MSG_SWITCH_PS_OFF _UxGT("Desligar") -#define MSG_EXTRUDE _UxGT("Extrusar") -#define MSG_RETRACT _UxGT("Retrair") -#define MSG_MOVE_AXIS _UxGT("Mover eixo") -#define MSG_BED_LEVELING _UxGT("Nivelação Mesa") -#define MSG_LEVEL_BED _UxGT("Nivelar Mesa") -#define MSG_LEVEL_CORNERS _UxGT("Nivelar Cantos") -#define MSG_NEXT_CORNER _UxGT("Próximo Canto") -#define MSG_EDIT_MESH _UxGT("Editar Malha") -#define MSG_EDITING_STOPPED _UxGT("Fim da Edição") -#define MSG_MESH_X _UxGT("Índice X") -#define MSG_MESH_Y _UxGT("Índice Y") -#define MSG_MESH_EDIT_Z _UxGT("Valor Z") -#define MSG_USER_MENU _UxGT("Comando customizado") - -#define MSG_IDEX_MENU _UxGT("Modo IDEX") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Estacionar") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplicação") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Cópia espelhada") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Controle Total") -#define MSG_X_OFFSET _UxGT("2o bico X") -#define MSG_Y_OFFSET _UxGT("2o bico Y") -#define MSG_Z_OFFSET _UxGT("2o bico Z") - -#define MSG_UBL_DOING_G29 _UxGT("Executando G29") -#define MSG_UBL_TOOLS _UxGT("Ferramentas UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Nivel. Mesa Unif.") -#define MSG_UBL_MANUAL_MESH _UxGT("Fazer malha manual") -#define MSG_UBL_BC_INSERT _UxGT("Calçar e calibrar") -#define MSG_UBL_BC_INSERT2 _UxGT("Medir") -#define MSG_UBL_BC_REMOVE _UxGT("Remover e calibrar") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Movendo para Próximo") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Ativar UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Desativar UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Temp. Mesa") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Temp. Extrusora") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Editar Malha") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editar Malha Custom") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ajuste Fino da Malha") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Fim da Edição") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Montar Malha Custom") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Montar ") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Montar " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Montar " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Montar Malha fria") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajustar Altura") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Quant. de Altura") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validar Malha") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Checar " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Checar " PREHEAT_2_LABEL) -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validar Malha Custom") -#define MSG_UBL_CONTINUE_MESH _UxGT("Continuar Malha") -#define MSG_UBL_MESH_LEVELING _UxGT("Nivelação da Malha") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelação 3 pontos") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivelação Grid") -#define MSG_UBL_MESH_LEVEL _UxGT("Nivelar Malha") -#define MSG_UBL_SIDE_POINTS _UxGT("Cantos") -#define MSG_UBL_MAP_TYPE _UxGT("Tipo de Mapa") -#define MSG_UBL_OUTPUT_MAP _UxGT("Salvar Mapa da Malha") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Enviar Para Host") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Salvar Malha CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Salvar Backup") -#define MSG_UBL_INFO_UBL _UxGT("Informação do UBL") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Qtd de Enchimento") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Enchimento Manual") -#define MSG_UBL_SMART_FILLIN _UxGT("Enchimento Smart") -#define MSG_UBL_FILLIN_MESH _UxGT("Preencher malha") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidar tudo") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar próximo") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ajuste Fino de Todos") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajustar Mais Próximo") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Armazenamento Malha") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot de Memória") -#define MSG_UBL_LOAD_MESH _UxGT("Ler Malha") -#define MSG_UBL_SAVE_MESH _UxGT("Salvar Malha") -#define MSG_MESH_LOADED _UxGT("Malha %i carregada") -#define MSG_MESH_SAVED _UxGT("Malha %i salva") -#define MSG_UBL_NO_STORAGE _UxGT("Sem armazenamento") -#define MSG_UBL_SAVE_ERROR _UxGT("Erro ao salvar UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Erro no restauro UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Compensação Z parou") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo a passo") -#define MSG_LED_CONTROL _UxGT("Controle do LED") -#define MSG_LEDS _UxGT("Luz") -#define MSG_LED_PRESETS _UxGT("Configuração da Luz") -#define MSG_SET_LEDS_RED _UxGT("Luz Vermelha") -#define MSG_SET_LEDS_ORANGE _UxGT("Luz Laranja") -#define MSG_SET_LEDS_YELLOW _UxGT("Luz Amarela") -#define MSG_SET_LEDS_GREEN _UxGT("Luz Verde") -#define MSG_SET_LEDS_BLUE _UxGT("Luz Azul") -#define MSG_SET_LEDS_INDIGO _UxGT("Luz Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Luz Violeta") -#define MSG_SET_LEDS_WHITE _UxGT("Luz Branca") -#define MSG_SET_LEDS_DEFAULT _UxGT("Luz Padrão") -#define MSG_CUSTOM_LEDS _UxGT("Luz Customizada") -#define MSG_INTENSITY_R _UxGT("Intensidade Vermelho") -#define MSG_INTENSITY_G _UxGT("Intensidade Verde") -#define MSG_INTENSITY_B _UxGT("Intensidade Azul") -#define MSG_INTENSITY_W _UxGT("Intensidade Branco") -#define MSG_LED_BRIGHTNESS _UxGT("Brilho") -#define MSG_MOVING _UxGT("Movendo...") -#define MSG_FREE_XY _UxGT("Liberar XY") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Mover Extrusor") -#define MSG_HOTEND_TOO_COLD _UxGT("Extrus. mto fria") -#define MSG_MOVE_Z_DIST _UxGT("Mover %smm") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidade") -#define MSG_BED_Z _UxGT("Base Z") -#define MSG_NOZZLE _UxGT("Bocal") -#define MSG_BED _UxGT("Mesa") -#define MSG_FAN_SPEED _UxGT("Vel. Ventoinha") -#define MSG_EXTRA_FAN_SPEED _UxGT("+Vel. Ventoinha") -#define MSG_FLOW _UxGT("Vazão") -#define MSG_CONTROL _UxGT("Controle") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Máx") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fator") -#define MSG_AUTOTEMP _UxGT("Temp. Automática") -#define MSG_LCD_ON _UxGT("Ligado") -#define MSG_LCD_OFF _UxGT("Desligado") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Selecionar") -#define MSG_ACC _UxGT("Acel.") -#define MSG_JERK _UxGT("Arrancada") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("arrancada VA") - #define MSG_VB_JERK _UxGT("arrancada VB") - #define MSG_VC_JERK _UxGT("arrancada VC") -#else - #define MSG_VA_JERK _UxGT("arrancada VX") - #define MSG_VB_JERK _UxGT("arrancada VY") - #define MSG_VC_JERK _UxGT("arrancada VZ") -#endif -#define MSG_VE_JERK _UxGT("arrancada VE") -#define MSG_JUNCTION_DEVIATION _UxGT("Desv. Junção") -#define MSG_VELOCITY _UxGT("Velocidade") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VDeslocamento min") -#define MSG_ACCELERATION _UxGT("Aceleração") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("Retrair A") -#define MSG_A_TRAVEL _UxGT("Movimento A") -#define MSG_STEPS_PER_MM _UxGT("Passo/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Passo A/mm") - #define MSG_BSTEPS _UxGT("Passo B/mm") - #define MSG_CSTEPS _UxGT("Passo C/mm") -#else - #define MSG_ASTEPS _UxGT("Passo X/mm") - #define MSG_BSTEPS _UxGT("Passo Y/mm") - #define MSG_CSTEPS _UxGT("Passo Z/mm") -#endif -#define MSG_ESTEPS _UxGT("E/mm") -#define MSG_E1STEPS _UxGT("E1/mm") -#define MSG_E2STEPS _UxGT("E2/mm") -#define MSG_E3STEPS _UxGT("E3/mm") -#define MSG_E4STEPS _UxGT("E4/mm") -#define MSG_E5STEPS _UxGT("E5/mm") -#define MSG_E6STEPS _UxGT("E6/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Extrusão em mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diâmetro Fil.") -#define MSG_FILAMENT_UNLOAD _UxGT("Descarr. mm") -#define MSG_FILAMENT_LOAD _UxGT("Carregar mm") -#define MSG_ADVANCE_K _UxGT("Avanço K") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Salvar Configuração") -#define MSG_LOAD_EEPROM _UxGT("Ler Configuração") -#define MSG_RESTORE_FAILSAFE _UxGT("Restauro seguro") -#define MSG_INIT_EEPROM _UxGT("Iniciar EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Atualiz. SD") -#define MSG_RESET_PRINTER _UxGT("Resetar Impressora") -#define MSG_REFRESH _UxGT("Atualização") -#define MSG_WATCH _UxGT("Informações") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") -#define MSG_RESUME_PRINT _UxGT("Resumir impressão") -#define MSG_STOP_PRINT _UxGT("Parar impressão") -#define MSG_OUTAGE_RECOVERY _UxGT("Recuperar Impressão") -#define MSG_MEDIA_MENU _UxGT("Imprimir do SD") -#define MSG_NO_MEDIA _UxGT("Sem cartão SD") -#define MSG_DWELL _UxGT("Dormindo...") -#define MSG_USERWAIT _UxGT("Clique para retomar") -#define MSG_PRINT_PAUSED _UxGT("Impressão Pausada") -#define MSG_PRINTING _UxGT("Imprimindo...") -#define MSG_PRINT_ABORTED _UxGT("Impressão Abortada") -#define MSG_NO_MOVE _UxGT("Sem movimento") -#define MSG_KILLED _UxGT("PARADA DE EMERGÊNCIA") -#define MSG_STOPPED _UxGT("PAROU. ") -#define MSG_CONTROL_RETRACT _UxGT("Retrair mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Retrair Troca mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retrair V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Saltar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Des-Retrair mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Des-RetTroca mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Des-Retrair V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Des-RetTroca V") -#define MSG_AUTORETRACT _UxGT("Retração Automática") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Distancia Retração") -#define MSG_TOOL_CHANGE _UxGT("Mudar Ferramenta") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Levantar Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Preparar Veloc.") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Veloc. Retração") -#define MSG_FILAMENTCHANGE _UxGT("Trocar Filamento") -#define MSG_FILAMENTLOAD _UxGT("Carregar Filamento") -#define MSG_FILAMENTUNLOAD _UxGT("Descarreg. Filamento") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Descarregar Todos") -#define MSG_INIT_MEDIA _UxGT("Iniciar SD") -#define MSG_CHANGE_MEDIA _UxGT("Trocar SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda fora da mesa") -#define MSG_SKEW_FACTOR _UxGT("Fator de Cisalho") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Testar BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("Estender BLTouch") -#define MSG_BLTOUCH_STOW _UxGT("Recolher BLTouch") -#define MSG_MANUAL_DEPLOY _UxGT("Estender Sonda-Z") -#define MSG_MANUAL_STOW _UxGT("Recolher Sonda-Z") - -#define MSG_HOME_FIRST _UxGT("Home %s%s%s Primeiro") -#define MSG_ZPROBE_ZOFFSET _UxGT("Compensar Sonda em Z") -#define MSG_BABYSTEP_X _UxGT("Passinho X") -#define MSG_BABYSTEP_Y _UxGT("Passinho Y") -#define MSG_BABYSTEP_Z _UxGT("Passinho Z") -#define MSG_ENDSTOP_ABORT _UxGT("Abortar Fim de Curso") -#define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Aquecer mesa falhou") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro:Temp Redundante") -#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TÉRMICO") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("ESCAPE TÉRMICO MESA") -#define MSG_ERR_MAXTEMP _UxGT("Erro:Temp Máxima") -#define MSG_ERR_MINTEMP _UxGT("Erro:Temp Mínima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Erro:Temp Mesa Máx") -#define MSG_ERR_MINTEMP_BED _UxGT("Erro:Temp Mesa Mín") -#define MSG_ERR_Z_HOMING _UxGT("Home XY Primeiro") -#define MSG_HALTED _UxGT("IMPRESSORA PAROU") -#define MSG_PLEASE_RESET _UxGT("Favor resetar") -#define MSG_SHORT_DAY _UxGT("d") -#define MSG_SHORT_HOUR _UxGT("h") -#define MSG_SHORT_MINUTE _UxGT("m") -#define MSG_HEATING _UxGT("Aquecendo...") -#define MSG_COOLING _UxGT("Resfriando...") -#define MSG_BED_HEATING _UxGT("Aquecendo mesa...") -#define MSG_BED_COOLING _UxGT("Esfriando mesa...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibrar Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") - -#define MSG_DELTA_SETTINGS _UxGT("Configuração Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-Calibração") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Calibrar Altura") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Desloc. Sonda Z") -#define MSG_DELTA_DIAG_ROD _UxGT("Haste Diagonal") -#define MSG_DELTA_HEIGHT _UxGT("Altura") -#define MSG_DELTA_RADIUS _UxGT("Raio") -#define MSG_INFO_MENU _UxGT("Sobre") -#define MSG_INFO_PRINTER_MENU _UxGT("Impressora") -#define MSG_3POINT_LEVELING _UxGT("Nivelamento 3 pontos") -#define MSG_LINEAR_LEVELING _UxGT("Nivelamento Linear") -#define MSG_BILINEAR_LEVELING _UxGT("Nivelamento Bilinear") -#define MSG_UBL_LEVELING _UxGT("Nivelamento UBL") -#define MSG_MESH_LEVELING _UxGT("Nivelamento da Malha") -#define MSG_INFO_STATS_MENU _UxGT("Estatísticas") -#define MSG_INFO_BOARD_MENU _UxGT("Info. da Placa") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusoras") -#define MSG_INFO_BAUDRATE _UxGT("Taxa de Transmissão") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz da Impressora") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Intensidade Brilho") - -#define MSG_EXPECTED_PRINTER _UxGT("Impressora Incorreta") - -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Total de Impressões") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Realizadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tempo de Impressão") - #define MSG_INFO_PRINT_LONGEST _UxGT("Trabalho Mais longo") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusão") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Qtd de Impressões") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Realizadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tempo de Impressão") - #define MSG_INFO_PRINT_LONGEST _UxGT("Maior trabalho") - #define MSG_INFO_PRINT_FILAMENT _UxGT("T. Extrusão") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Temp Mín") -#define MSG_INFO_MAX_TEMP _UxGT("Temp Máx") -#define MSG_INFO_PSU _UxGT("PSU") -#define MSG_DRIVE_STRENGTH _UxGT("Força do Motor") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escrever EEPROM DAC") - -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPRESSÃO PAUSADA") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CARREGAR FILAMENTO") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("DESCARREG. FILAMENTO") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Config. de Retomada") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purgar mais") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar Impressão") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Bocal: ") -#define MSG_RUNOUT_SENSOR _UxGT("Sensor filamento") -#define MSG_ERR_HOMING_FAILED _UxGT("Falha ao ir à origem") -#define MSG_ERR_PROBING_FAILED _UxGT("Falha ao sondar") -#define MSG_M600_TOO_COLD _UxGT("M600: Muito frio") - -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Aperte o botão para") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("continuar impressão") - - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando o") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("inicio da") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("troca de filamento") - - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Coloque filamento") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("pressione o botão") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") - - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pressione o botão") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("p/ aquecer o bocal") - - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo o bocal") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Aguarde...") - - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("remoção de filamento") - - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamento") - - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Espere pela") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("purga de filamento") - - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Clique para finaliz.") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("purga de filamento") - - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressão") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") -#else // LCD_HEIGHT < 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Clique p. continuar") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregando...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purgando...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Clique p. finalizar") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Continuando...") -#endif diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 9fde8f89ba..7f3288f155 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -30,159 +30,186 @@ * */ -#define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 + #define DISPLAY_CHARSET_ISO10646_1 -#define WELCOME_MSG MACHINE_NAME _UxGT(" pronta.") -#define MSG_MEDIA_INSERTED _UxGT("Cartão inserido") -#define MSG_MEDIA_REMOVED _UxGT("Cartão removido") -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Desactivar motores") -#define MSG_AUTO_HOME _UxGT("Ir para origem") -#define MSG_AUTO_HOME_X _UxGT("Ir para origem X") -#define MSG_AUTO_HOME_Y _UxGT("Ir para origem Y") -#define MSG_AUTO_HOME_Z _UxGT("Ir para origem Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") -#define MSG_LEVEL_BED_WAITING _UxGT("Click para iniciar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo ponto") -#define MSG_LEVEL_BED_DONE _UxGT("Pronto !") -#define MSG_SET_HOME_OFFSETS _UxGT("Definir desvio") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets aplicados") -#define MSG_SET_ORIGIN _UxGT("Definir origem") -#define MSG_PREHEAT_1 _UxGT("Pre-aquecer " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N _UxGT("Pre-aquecer " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_ALL _UxGT("Pre-aq. " PREHEAT_1_LABEL " Tudo") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Pre-aq. " PREHEAT_1_LABEL " ") LCD_STR_THERMOMETER _UxGT("Base") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Definições " PREHEAT_1_LABEL) -#define MSG_PREHEAT_2 _UxGT("Pre-aquecer " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N _UxGT("Pre-aquecer " PREHEAT_2_LABEL " ") -#define MSG_PREHEAT_2_ALL _UxGT("Pre-aq. " PREHEAT_2_LABEL " Tudo") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Pre-aq. " PREHEAT_2_LABEL " ") LCD_STR_THERMOMETER _UxGT("Base") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Definições " PREHEAT_2_LABEL) -#define MSG_COOLDOWN _UxGT("Arrefecer") -#define MSG_SWITCH_PS_ON _UxGT("Ligar") -#define MSG_SWITCH_PS_OFF _UxGT("Desligar") -#define MSG_EXTRUDE _UxGT("Extrudir") -#define MSG_RETRACT _UxGT("Retrair") -#define MSG_MOVE_AXIS _UxGT("Mover eixo") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Mover Extrusor") -#define MSG_MOVE_Z_DIST _UxGT("Mover %smm") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidade") -#define MSG_BED_Z _UxGT("Base Z") -#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Bico") -#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Base") -#define MSG_FAN_SPEED _UxGT("Vel. ventoinha") -#define MSG_FLOW _UxGT("Fluxo") -#define MSG_CONTROL _UxGT("Controlo") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Temp. Automática") -#define MSG_LCD_ON _UxGT("On") -#define MSG_LCD_OFF _UxGT("Off") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_ACC _UxGT("Acc") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT(" Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retracção") -#define MSG_A_TRAVEL _UxGT("A-movimento") -#define MSG_STEPS_PER_MM _UxGT("Passo/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A passo/mm") - #define MSG_BSTEPS _UxGT("B passo/mm") - #define MSG_CSTEPS _UxGT("C passo/mm") -#else - #define MSG_ASTEPS _UxGT("X passo/mm") - #define MSG_BSTEPS _UxGT("Y passo/mm") - #define MSG_CSTEPS _UxGT("Z passo/mm") -#endif -#define MSG_ESTEPS _UxGT("E passo/mm") -#define MSG_E1STEPS _UxGT("E1 passo/mm") -#define MSG_E2STEPS _UxGT("E2 passo/mm") -#define MSG_E3STEPS _UxGT("E3 passo/mm") -#define MSG_E4STEPS _UxGT("E4 passo/mm") -#define MSG_E5STEPS _UxGT("E5 passo/mm") -#define MSG_E6STEPS _UxGT("E6 passo/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E em mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Diam.") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Guardar na memoria") -#define MSG_LOAD_EEPROM _UxGT("Carregar da memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Rest. de emergen.") -#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Recarregar") -#define MSG_WATCH _UxGT("Monitorizar") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Afinar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") -#define MSG_RESUME_PRINT _UxGT("Retomar impressão") -#define MSG_STOP_PRINT _UxGT("Parar impressão") -#define MSG_MEDIA_MENU _UxGT("Imprimir do SD") -#define MSG_NO_MEDIA _UxGT("Sem cartão SD") -#define MSG_DWELL _UxGT("Em espera...") -#define MSG_USERWAIT _UxGT("Á espera de ordem") -#define MSG_PRINT_ABORTED _UxGT("Impressão cancelada") -#define MSG_NO_MOVE _UxGT("Sem movimento") -#define MSG_KILLED _UxGT("EMERGÊNCIA. ") -#define MSG_STOPPED _UxGT("PARADO. ") -#define MSG_CONTROL_RETRACT _UxGT(" Retrair mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Troca Retrair mm") -#define MSG_CONTROL_RETRACTF _UxGT(" Retrair V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT(" Levantar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT(" DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Troca DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT(" DesRet V") -#define MSG_AUTORETRACT _UxGT(" AutoRetr.") -#define MSG_FILAMENTCHANGE _UxGT("Trocar filamento") -#define MSG_INIT_MEDIA _UxGT("Inici. cartão SD") -#define MSG_CHANGE_MEDIA _UxGT("Trocar cartão SD") -#define MSG_ZPROBE_OUT _UxGT("Sensor fora/base") -#define MSG_HOME_FIRST _UxGT("Home %s%s%s first") -#define MSG_ZPROBE_ZOFFSET _UxGT("Desvio Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Fim de curso") -#define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") -#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") -#define MSG_ERR_MAXTEMP _UxGT("Err: T Máxima") -#define MSG_ERR_MINTEMP _UxGT("Err: T Mínima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: T Base Máxima") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: T Base Mínima") -#define MSG_HEATING _UxGT("Aquecendo...") -#define MSG_BED_HEATING _UxGT("Aquecendo base...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibração Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") +namespace Language_pt { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_LCD_ENDSTOPS _UxGT("Fim de curso") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese"); -#define MSG_EXPECTED_PRINTER _UxGT("Impressora Incorreta") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactivar motores"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir para origem"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir para origem X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir para origem Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir para origem Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click para iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo ponto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Pronto !"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Definir desvio"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets aplicados"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Definir origem"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" Tudo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Definições ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Pre-aq. ") PREHEAT_2_LABEL _UxGT(" Tudo"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_2_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Definições ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefecer"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Mover Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Mover Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Mover Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Mover Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Mover Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Mover Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Bico"); + PROGMEM Language_Str MSG_NOZZLE_0 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = " " LCD_STR_THERMOMETER _UxGT(" Bico ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Base"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventoinha"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Vel. ventoinha 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Vel. ventoinha 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Vel. ventoinha 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Fluxo ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Fluxo ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Fluxo ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Fluxo ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Fluxo ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Fluxo ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controlo"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retracção"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-movimento"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E passo/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Diam."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Fil. Diam. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Fil. Diam. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Fil. Diam. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Fil. Diam. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Fil. Diam. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Fil. Diam. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar na memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carregar da memoria"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Rest. de emergen."); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Recarregar"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Monitorizar"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Afinar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Retomar impressão"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Em espera..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Á espera de ordem"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("EMERGÊNCIA. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("PARADO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT(" Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Troca Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT(" Retrair V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT(" Levantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT(" DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Troca DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT(" DesRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(" AutoRetr."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Trocar filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Trocar filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Trocar filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Trocar filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Trocar filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Trocar filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Inici. cartão SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar cartão SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sensor fora/base"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desvio Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Fim de curso"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: T Máxima"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: T Mínima"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: T Base Máxima"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: T Base Mínima"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo base..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibração Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); + + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fim de curso"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); +} diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h new file mode 100644 index 0000000000..548ba4cd97 --- /dev/null +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -0,0 +1,492 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Portuguese (Brazil) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ +namespace Language_pt_br { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese (BR)"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); + + PROGMEM Language_Str MSG_BACK = _UxGT("Voltar"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fins de curso"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. Avançada"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuração"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Início automático"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desabilit. motores"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testar Barra Progres"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a origem XYZ"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir na origem X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir na origem Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir na origem Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alinhar Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clique para Iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo Ponto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Fim nivelação!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Suavizar altura"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Compensar origem"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Alteração aplicada"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ajustar Origem"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Extrusora ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ajustar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Extrusora ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Extrusora ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ajustar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Customizar Pre-aq."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Esfriar"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusar"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelação Mesa"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Mesa"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Cantos"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Próximo Canto"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Malha"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Fim da Edição"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comando customizado"); + + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicação"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Cópia espelhada"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Controle Total"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2o bico X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2o bico Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2o bico Z"); + + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Executando G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Ferramentas UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivel. Mesa Unif."); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Fazer malha manual"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Calçar e calibrar"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remover e calibrar"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Movendo para Próximo"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ativar UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desativar UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Mesa"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Extrusora"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Malha"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Editar Malha Custom"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste Fino da Malha"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Fim da Edição"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Montar Malha Custom"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Montar "); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Montar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Montar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Montar Malha fria"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar Altura"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Quant. de Altura"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malha"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Checar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Checar ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malha Custom"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malha"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelação da Malha"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelação 3 pontos"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelação Grid"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malha"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Cantos"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salvar Mapa da Malha"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar Para Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salvar Malha CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Salvar Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Informação do UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Qtd de Enchimento"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Enchimento Manual"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Enchimento Smart"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Preencher malha"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar tudo"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar próximo"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Mais Próximo"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Armazenamento Malha"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot de Memória"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ler Malha"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salvar Malha"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Malha %i carregada"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Malha %i salva"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sem armazenamento"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Erro ao salvar UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Erro no restauro UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Compensação Z parou"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo a passo"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Montar Malha fria"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Enchimento Smart"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Validar Malha"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Validar Malha"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salvar Malha"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controle do LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luz"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Configuração da Luz"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Luz Vermelha"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Luz Laranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Luz Amarela"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Luz Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Luz Azul"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Luz Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Luz Violeta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Luz Branca"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Luz Padrão"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luz Customizada"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidade Vermelho"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidade Verde"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidade Azul"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidade Branco"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brilho"); + PROGMEM Language_Str MSG_MOVING = _UxGT("Movendo..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Liberar XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Mover Extrusor ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Mover Extrusor ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Mover Extrusor ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Mover Extrusor ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Mover Extrusor ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Mover Extrusor ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Extrus. mto fria"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bocal"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Bocal ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Bocal ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Bocal ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Bocal ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Bocal ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Bocal ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Mesa"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventoinha"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Vel. Ventoinha 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Vel. Ventoinha 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Vel. Ventoinha 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("+Vel. Ventoinha"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("+Vel. Ventoinha 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("+Vel. Ventoinha 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("+Vel. Ventoinha 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Vazão"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Vazão ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Vazão ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Vazão ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Vazão ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Vazão ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Vazão ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controle"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Máx"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fator"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Automática"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ligado"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Desligado"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Selecionar"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Selecionar ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Selecionar ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Selecionar ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Selecionar ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Selecionar ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Selecionar ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Acel."); + PROGMEM Language_Str MSG_JERK = _UxGT("Arrancada"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("arrancada V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("arrancada V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("arrancada V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("arrancada VE"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Desv. Junção"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VDeslocamento min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Aceleração"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Retrair A"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Movimento A"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Passo ") LCD_STR_A _UxGT("/mm"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Passo ") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Passo ") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diâmetro Fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Diâmetro Fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Diâmetro Fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Diâmetro Fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Diâmetro Fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Diâmetro Fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Diâmetro Fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarr. mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carregar mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avanço K"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("Avanço K ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("Avanço K ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("Avanço K ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("Avanço K ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("Avanço K ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("Avanço K ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salvar Configuração"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Ler Configuração"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Restauro seguro"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Iniciar EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Atualiz. SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetar Impressora"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Informações"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resumir impressão"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impressão"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Dormindo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Clique para retomar"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impressão Pausada"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimindo..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão Abortada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("PARADA DE EMERGÊNCIA"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("PAROU. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Retrair Troca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retrair V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saltar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Des-Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Des-RetTroca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Des-Retrair V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Des-RetTroca V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retração Automática"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Distancia Retração"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Mudar Ferramenta"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Preparar Veloc."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Veloc. Retração"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar Filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Trocar Filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Trocar Filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Trocar Filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Trocar Filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Trocar Filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Trocar Filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Carregar Filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Carregar Filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Carregar Filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Carregar Filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Carregar Filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Carregar Filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Descarreg. Filamento ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Descarreg. Filamento ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Descarreg. Filamento ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Descarreg. Filamento ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Descarreg. Filamento ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Descarreg. Filamento ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descarregar Todos"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Iniciar SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda fora da mesa"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fator de Cisalho"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Testar BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Recolher BLTouch"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda-Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Recolher Sonda-Z"); + + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Primeiro"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Compensar Sonda em Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Passinho X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Passinho Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Passinho Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Aquecer mesa falhou"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:Temp Máxima"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:Temp Mínima"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Erro:Temp Mesa Máx"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:Temp Mesa Mín"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY Primeiro"); + PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PAROU"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Resfriando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo mesa..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Esfriando mesa..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibrar Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); + + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuração Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-Calibração"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Calibrar Altura"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Desloc. Sonda Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Haste Diagonal"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Sobre"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Impressora"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelamento 3 pontos"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelamento Linear"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelamento Bilinear"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelamento UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelamento da Malha"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estatísticas"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. da Placa"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusoras"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Taxa de Transmissão"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz da Impressora"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Intensidade Brilho"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total de Impressões"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Trabalho Mais longo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total de Extrusão"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Qtd de Impressões"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Maior trabalho"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("T. Extrusão"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Mín"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Máx"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força do Motor"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escrever EEPROM DAC"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESSÃO PAUSADA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARREGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARREG. FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Config. de Retomada"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar mais"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar Impressão"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bocal: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor filamento"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Falha ao ir à origem"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Muito frio"); + + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Aperte o botão para", "continuar impressão")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando o", "inicio da", "troca de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Coloque filamento", "pressione o botão", "para continuar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pressione o botão", "p/ aquecer o bocal")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Aquecendo o bocal", "Aguarde...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperando", "remoção de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperando", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere pela", "purga de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Clique para finaliz.", "purga de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impressão", "continuar")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clique p. continuar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Aguarde...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insira e Clique")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Aquecendo...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejetando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Clique p. finalizar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index e825dbe7d0..f19b33dd0c 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -28,434 +28,544 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ - #define DISPLAY_CHARSET_ISO10646_5 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" готов.") -#define MSG_BACK _UxGT("Назад") -#define MSG_MEDIA_INSERTED _UxGT("Карта вставлена") -#define MSG_MEDIA_REMOVED _UxGT("Карта извлечена") -#define MSG_MEDIA_RELEASED _UxGT("SD карта не активна") -#define MSG_LCD_ENDSTOPS _UxGT("Эндстопы") // Max length 8 characters -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Прогр. эндстопы") -#define MSG_MAIN _UxGT("Меню") -#define MSG_ADVANCED_SETTINGS _UxGT("Другие настройки") -#define MSG_CONFIGURATION _UxGT("Настройки") -#define MSG_AUTOSTART _UxGT("Автостарт") -#define MSG_DISABLE_STEPPERS _UxGT("Выкл. двигатели") -#define MSG_DEBUG_MENU _UxGT("Меню отладки") -#define MSG_PROGRESS_BAR_TEST _UxGT("Тест индикатора") -#define MSG_AUTO_HOME _UxGT("Авто парковка") -#define MSG_AUTO_HOME_X _UxGT("Парковка X") -#define MSG_AUTO_HOME_Y _UxGT("Парковка Y") -#define MSG_AUTO_HOME_Z _UxGT("Парковка Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Нулевое положение") -#define MSG_LEVEL_BED_WAITING _UxGT("Нажмите чтобы начать") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Следующая точка") -#define MSG_LEVEL_BED_DONE _UxGT("Выравнивание готово!") -#define MSG_Z_FADE_HEIGHT _UxGT("Высота спада") -#define MSG_SET_HOME_OFFSETS _UxGT("Запомнить парковку") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Коррекции применены") -#define MSG_SET_ORIGIN _UxGT("Запомнить ноль") -#define MSG_PREHEAT_1 _UxGT("Преднагрев " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" всё") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" сопло") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" стол") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" настр.") -#define MSG_PREHEAT_2 _UxGT("Преднагрев " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" всё") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" сопло") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" стол") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" настр.") -#define MSG_COOLDOWN _UxGT("Охлаждение") -#define MSG_SWITCH_PS_ON _UxGT("Включить питание") -#define MSG_SWITCH_PS_OFF _UxGT("Выключить питание") -#define MSG_EXTRUDE _UxGT("Экструзия") -#define MSG_RETRACT _UxGT("Втягивание") -#define MSG_MOVE_AXIS _UxGT("Движение по осям") -#define MSG_BED_LEVELING _UxGT("Калибровка стола") -#define MSG_LEVEL_BED _UxGT("Калибровать стол") -#define MSG_LEVEL_CORNERS _UxGT("Выровнять углы") -#define MSG_NEXT_CORNER _UxGT("Следующий угол") -#define MSG_EDIT_MESH _UxGT("Редактировать сетку") -#define MSG_EDITING_STOPPED _UxGT("Ред. сетки завершено") -#define MSG_USER_MENU _UxGT("Свои команды") +namespace Language_ru { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_M48_TEST _UxGT("Проверка датчика Z") -#define MSG_M48_DEVIATION _UxGT("Отклонение") -#define MSG_M48_POINT _UxGT("Измерение") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Russian"); -// TODO: IDEX Menu -#define MSG_OFFSETS_MENU _UxGT("Размещение сопел") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" готов."); + PROGMEM Language_Str MSG_BACK = _UxGT("Назад"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Карта вставлена"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Карта извлечена"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("SD карта не активна"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Эндстопы"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. эндстопы"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Другие настройки"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Настройки"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Выкл. двигатели"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню отладки"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Тест индикатора"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Авто парковка"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Парковка X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Парковка Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Парковка Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Нулевое положение"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Нажмите чтобы начать"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Следующая точка"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Выравнивание готово!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Высота спада"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Запомнить парковку"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Коррекции применены"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Запомнить ноль"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Преднагрев ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" всё"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" стол"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Преднагрев ") PREHEAT_1_LABEL _UxGT(" настр."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Преднагрев ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Преднагрев ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" всё"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" стол"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Преднагрев ") PREHEAT_2_LABEL _UxGT(" настр."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Включить питание"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Выключить питание"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Экструзия"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Втягивание"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Движение по осям"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Калибровка стола"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Калибровать стол"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Выровнять углы"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Следующий угол"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Редактировать сетку"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ред. сетки завершено"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Свои команды"); -#define MSG_X_OFFSET _UxGT("2-е сопло X") -#define MSG_Y_OFFSET _UxGT("2-е сопло Y") -#define MSG_Z_OFFSET _UxGT("2-е сопло Z") + PROGMEM Language_Str MSG_M48_TEST = _UxGT("Проверка датчика Z"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("Измерение"); -#define MSG_UBL_DOING_G29 _UxGT("Выполняем G29") -#define MSG_UBL_TOOLS _UxGT("Утилиты UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Калибровка UBL") -#define MSG_UBL_MANUAL_MESH _UxGT("Постр. сетку от руки") -#define MSG_UBL_BC_INSERT _UxGT("Пост. шимм и измер.") -#define MSG_UBL_BC_INSERT2 _UxGT("Измерение") -#define MSG_UBL_BC_REMOVE _UxGT("Удал. и измер. стол") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Двигаемся дальше") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Активировать UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Деактивировать UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Температура стола") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Температура сопла") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Редактор сеток") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Редакт. свою сетку") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Точная настр. сетки") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Ред. сетки завершено") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Построить свою сетку") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Построить сетку") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Построить сетку " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Построить сетку " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Построить хол. сетку") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Устан. высоту сетки") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Высота") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Проверить сетку") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Проверить сетку " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Проверить сетку " PREHEAT_2_LABEL) -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Проверить свою сетку") -#define MSG_UBL_CONTINUE_MESH _UxGT("Продолжить сетку") -#define MSG_UBL_MESH_LEVELING _UxGT("Калибровка сетки") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Калибровка 3-х точек") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Калибровка растера") -#define MSG_UBL_MESH_LEVEL _UxGT("Выровнить сетку") -#define MSG_UBL_SIDE_POINTS _UxGT("Крайние точки") -#define MSG_UBL_MAP_TYPE _UxGT("Тип карты") -#define MSG_UBL_OUTPUT_MAP _UxGT("Вывести карту сетки") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Вывести на хост") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Вывести в CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Забекапить сетку") -#define MSG_UBL_INFO_UBL _UxGT("Вывод информации UBL") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Кол-во заполнителя") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Ручное заполнение") -#define MSG_UBL_SMART_FILLIN _UxGT("Умное заполнение") -#define MSG_UBL_FILLIN_MESH _UxGT("Заполнить сетку") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Аннулировать всё") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Аннулир. ближ. точку") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Точная настр. всего") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Настр. ближ. точки") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Хранилище сетей") -#define MSG_UBL_STORAGE_SLOT _UxGT("Слот памяти") -#define MSG_UBL_LOAD_MESH _UxGT("Загрузить сетку стола") -#define MSG_UBL_SAVE_MESH _UxGT("Сохранить сетку стола") -#define MSG_MESH_LOADED _UxGT("Сетка %i загружена") -#define MSG_MESH_SAVED _UxGT("Сетка %i сохранена") -#define MSG_UBL_NO_STORAGE _UxGT("Нет хранилища") -#define MSG_UBL_SAVE_ERROR _UxGT("Ошибка: Сохран. UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Ошибка: Восстан. UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Смещение Z останов.") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Пошаговое UBL") + // TODO: IDEX Menu + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение сопел"); -#define MSG_LED_CONTROL _UxGT("Настройки LED") -#define MSG_LEDS _UxGT("Подсветку") -#define MSG_LED_PRESETS _UxGT("Предустановки света") -#define MSG_SET_LEDS_RED _UxGT("Красный свет") -#define MSG_SET_LEDS_ORANGE _UxGT("Оранжевый свет") -#define MSG_SET_LEDS_YELLOW _UxGT("Жёлтый свет") -#define MSG_SET_LEDS_GREEN _UxGT("Зелёный свет") -#define MSG_SET_LEDS_BLUE _UxGT("Синий свет") -#define MSG_SET_LEDS_INDIGO _UxGT("Индиго свет") -#define MSG_SET_LEDS_VIOLET _UxGT("Фиолетовый свет") -#define MSG_SET_LEDS_WHITE _UxGT("Белый свет") -#define MSG_SET_LEDS_DEFAULT _UxGT("Свет по умолчанию") -#define MSG_CUSTOM_LEDS _UxGT("Свои настр. света") -#define MSG_INTENSITY_R _UxGT("Интенсивн. красного") -#define MSG_INTENSITY_G _UxGT("Интенсивн. зелёного") -#define MSG_INTENSITY_B _UxGT("Интенсивн. синего") -#define MSG_INTENSITY_W _UxGT("Интенсивн. белого") -#define MSG_LED_BRIGHTNESS _UxGT("Яркость") + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2-е сопло X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2-е сопло Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2-е сопло Z"); -#define MSG_MOVING _UxGT("Движемся...") -#define MSG_FREE_XY _UxGT("Освобождаем XY") -#define MSG_MOVE_X _UxGT("Движение по X") -#define MSG_MOVE_Y _UxGT("Движение по Y") -#define MSG_MOVE_Z _UxGT("Движение по Z") -#define MSG_MOVE_E _UxGT("Экструдер") -#define MSG_MOVE_Z_DIST _UxGT("Движение %sмм") -#define MSG_MOVE_01MM _UxGT("Движение 0.1мм") -#define MSG_MOVE_1MM _UxGT("Движение 1мм") -#define MSG_MOVE_10MM _UxGT("Движение 10мм") -#define MSG_SPEED _UxGT("Скорость") -#define MSG_BED_Z _UxGT("Z стола") -#define MSG_NOZZLE _UxGT("Сопло") -#define MSG_BED _UxGT("Стол") -#define MSG_FAN_SPEED _UxGT("Кулер") -#define MSG_EXTRA_FAN_SPEED _UxGT("Кулер доп.") -#define MSG_FLOW _UxGT("Поток") -#define MSG_CONTROL _UxGT("Настройки") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Мин") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Макс") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Фактор") -#define MSG_AUTOTEMP _UxGT("Автотемпература") -#define MSG_LCD_ON _UxGT("Вкл.") -#define MSG_LCD_OFF _UxGT("Выкл.") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Выбор") -#define MSG_ACC _UxGT("Ускорение") -#define MSG_JERK _UxGT("Рывок") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-рывок") - #define MSG_VB_JERK _UxGT("Vb-рывок") - #define MSG_VC_JERK _UxGT("Vc-рывок") -#else - #define MSG_VX_JERK _UxGT("Vx-рывок") - #define MSG_VY_JERK _UxGT("Vy-рывок") - #define MSG_VZ_JERK _UxGT("Vz-рывок") -#endif -#define MSG_VE_JERK _UxGT("Ve-рывок") -#define MSG_VELOCITY _UxGT("Быстрота") -#define MSG_VMAX _UxGT("Vмакс ") -#define MSG_VMIN _UxGT("Vмин") -#define MSG_VTRAV_MIN _UxGT("Vпутеш. мин") -#define MSG_ACCELERATION _UxGT("Ускорение") -#define MSG_AMAX _UxGT("Aмакс ") -#define MSG_A_RETRACT _UxGT("A-втягивание") -#define MSG_A_TRAVEL _UxGT("A-путеш.") -#define MSG_STEPS_PER_MM _UxGT("Шаг/мм") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Aшаг/мм") - #define MSG_BSTEPS _UxGT("Bшаг/мм") - #define MSG_CSTEPS _UxGT("Cшаг/мм") -#else - #define MSG_ASTEPS _UxGT("Xшаг/мм") - #define MSG_BSTEPS _UxGT("Yшаг/мм") - #define MSG_CSTEPS _UxGT("Zшаг/мм") -#endif -#define MSG_ESTEPS _UxGT("Eшаг/мм") -#define MSG_E1STEPS _UxGT("E1шаг/мм") -#define MSG_E2STEPS _UxGT("E2шаг/мм") -#define MSG_E3STEPS _UxGT("E3шаг/мм") -#define MSG_E4STEPS _UxGT("E4шаг/мм") -#define MSG_E5STEPS _UxGT("E5шаг/мм") -#define MSG_E6STEPS _UxGT("E6шаг/мм") -#define MSG_TEMPERATURE _UxGT("Температура") -#define MSG_MOTION _UxGT("Движение") -#define MSG_FILAMENT _UxGT("Филамент") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E в мм3") -#define MSG_FILAMENT_DIAM _UxGT("Диаметр филамента") -#define MSG_FILAMENT_UNLOAD _UxGT("Загрузка мм") -#define MSG_FILAMENT_LOAD _UxGT("Выгрузка мм") -#define MSG_ADVANCE_K _UxGT("K продвижения") -#define MSG_CONTRAST _UxGT("Контраст LCD") -#define MSG_STORE_EEPROM _UxGT("Сохранить настройки") -#define MSG_LOAD_EEPROM _UxGT("Загрузить настройки") -#define MSG_RESTORE_FAILSAFE _UxGT("Вернуть настройки") -#define MSG_INIT_EEPROM _UxGT("Инициализация EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Обновление прошивки") -#define MSG_RESET_PRINTER _UxGT("Сброс принтера") -#define MSG_REFRESH _UxGT("Обновить") -#define MSG_WATCH _UxGT("Информационный экран") -#define MSG_PREPARE _UxGT("Подготовить") -#define MSG_TUNE _UxGT("Настроить") -#define MSG_START_PRINT _UxGT("Начало печати") -#define MSG_BUTTON_NEXT _UxGT("Дальше") -#define MSG_BUTTON_INIT _UxGT("Инициализация") -#define MSG_BUTTON_STOP _UxGT("Остановить") -#define MSG_BUTTON_PRINT _UxGT("Печать") -#define MSG_BUTTON_RESET _UxGT("Сброс") -#define MSG_BUTTON_CANCEL _UxGT("Отмена") -#define MSG_BUTTON_DONE _UxGT("Готово") -#define MSG_PAUSE_PRINT _UxGT("Пауза печати") -#define MSG_RESUME_PRINT _UxGT("Продолжить печать") -#define MSG_STOP_PRINT _UxGT("Остановить печать") -#define MSG_OUTAGE_RECOVERY _UxGT("Восстановение сбоя") -#define MSG_MEDIA_MENU _UxGT("Печать с SD карты") -#define MSG_NO_MEDIA _UxGT("Нет SD карты") -#define MSG_DWELL _UxGT("Сон...") -#define MSG_USERWAIT _UxGT("Продолжить...") -#define MSG_PRINT_PAUSED _UxGT("Печать на паузе") -#define MSG_PRINT_ABORTED _UxGT("Печать отменена") -#define MSG_NO_MOVE _UxGT("Нет движения.") -#define MSG_KILLED _UxGT("УБИТО. ") -#define MSG_STOPPED _UxGT("ОСТАНОВЛЕНО. ") -#define MSG_CONTROL_RETRACT _UxGT("Втягивание мм") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Втягивание смены мм") -#define MSG_CONTROL_RETRACTF _UxGT("Втягивание V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Втяг. прыжка мм") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Возврат мм") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Возврат смены мм") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Возврат V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Возврат смены V") -#define MSG_AUTORETRACT _UxGT("Авто Втягивание") + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Выполняем G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Утилиты UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Калибровка UBL"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Постр. сетку от руки"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Пост. шимм и измер."); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Измерение"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Удал. и измер. стол"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Двигаемся дальше"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Активировать UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивировать UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура стола"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура сопла"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редактор сеток"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редакт. свою сетку"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точная настр. сетки"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Ред. сетки завершено"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою сетку"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Построить сетку"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Построить сетку ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Построить сетку ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Построить хол. сетку"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Устан. высоту сетки"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Высота"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить сетку"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Проверить сетку ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Проверить сетку ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить свою сетку"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продолжить сетку"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Калибровка сетки"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Калибровка 3-х точек"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Калибровка растера"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Выровнить сетку"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Крайние точки"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Тип карты"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Вывести карту сетки"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Вывести на хост"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Вывести в CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Забекапить сетку"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителя"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручное заполнение"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Умное заполнение"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заполнить сетку"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Аннулировать всё"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Аннулир. ближ. точку"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точная настр. всего"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Настр. ближ. точки"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Хранилище сетей"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Слот памяти"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Загрузить сетку стола"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Сохранить сетку стола"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Сетка %i загружена"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Сетка %i сохранена"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Нет хранилища"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ошибка: Сохран. UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: Восстан. UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Смещение Z останов."); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Пошаговое UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Построить хол. сетку"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Умное заполнение"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Проверить сетку"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точная настр. всего"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Проверить сетку"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точная настр. всего"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Сохранить сетку стола"); -// TODO: Filament Change Swap / Purge Length + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Настройки LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Подсветку"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Предустановки света"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Красный свет"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Оранжевый свет"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Жёлтый свет"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Зелёный свет"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Синий свет"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Индиго свет"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фиолетовый свет"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Белый свет"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Свет по умолчанию"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свои настр. света"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Интенсивн. красного"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Интенсивн. зелёного"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Интенсивн. синего"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Интенсивн. белого"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Яркость"); -#define MSG_TOOL_CHANGE _UxGT("Смена сопел") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Поднятие по Z") + PROGMEM Language_Str MSG_MOVING = _UxGT("Движемся..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Освобождаем XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Экструдер"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Экструдер ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Экструдер ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Экструдер ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Экструдер ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Экструдер ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Экструдер ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Движение %sмм"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Движение 0.1мм"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Движение 1мм"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Движение 10мм"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Скорость"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z стола"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Стол"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Кулер"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Кулер 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Кулер 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Кулер 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Кулер доп."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Кулер доп. 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Кулер доп. 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Кулер доп. 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Поток"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Поток ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Поток ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Поток ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Поток ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Поток ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Поток ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Настройки"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Мин"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Макс"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Автотемпература"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Выкл."); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Выбор"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Выбор ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Выбор ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Выбор ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Выбор ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Выбор ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Выбор ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Ускорение"); + PROGMEM Language_Str MSG_JERK = _UxGT("Рывок"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-рывок"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-рывок"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-рывок"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-рывок"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Быстрота"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vмакс ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vмакс ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vмакс ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vмакс ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vмакс ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vмакс ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vмакс ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vмакс ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vмакс ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vмакс ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vмин"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vпутеш. мин"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Ускорение"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aмакс ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aмакс ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aмакс ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aмакс ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Aмакс ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Aмакс ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Aмакс ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Aмакс ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Aмакс ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Aмакс ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-втягивание"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-путеш."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Шаг/мм"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Eшаг/мм"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("шаг/мм"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Филамент"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диаметр филамента"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Диаметр филамента ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Диаметр филамента ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Диаметр филамента ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Диаметр филамента ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Диаметр филамента ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Диаметр филамента ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Загрузка мм"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Выгрузка мм"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K продвижения"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K продвижения ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K продвижения ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K продвижения ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K продвижения ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K продвижения ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K продвижения ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Контраст LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Сохранить настройки"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Загрузить настройки"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Вернуть настройки"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализация EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Обновление прошивки"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Сброс принтера"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Обновить"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Информационный экран"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Подготовить"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Настроить"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Начало печати"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Дальше"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Инициализация"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Остановить"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Печать"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Сброс"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Отмена"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза печати"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Продолжить печать"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Остановить печать"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Восстановение сбоя"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Печать с SD карты"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Нет SD карты"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Сон..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продолжить..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Печать на паузе"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Печать отменена"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Нет движения."); + PROGMEM Language_Str MSG_KILLED = _UxGT("УБИТО. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ОСТАНОВЛЕНО. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягивание мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Втягивание смены мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Втягивание V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Втяг. прыжка мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Возврат мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возврат смены мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Возврат V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возврат смены V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Авто Втягивание"); -// TODO: Singlenozzle, nozzle standby + // TODO: Filament Change Swap / Purge Length -#define MSG_FILAMENTCHANGE _UxGT("Смена филамента") -#define MSG_FILAMENTLOAD _UxGT("Загрузка филамента") -#define MSG_FILAMENTUNLOAD _UxGT("Выгрузка филамента") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Выгрузить всё") -#define MSG_INIT_MEDIA _UxGT("Активировать SD") -#define MSG_CHANGE_MEDIA _UxGT("Сменить SD карту") -#define MSG_RELEASE_MEDIA _UxGT("Деактивировать SD") -#define MSG_ZPROBE_OUT _UxGT("Z датчик вне стола") -#define MSG_SKEW_FACTOR _UxGT("Фактор наклона") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Тестирование BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("Сброс BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("Установка BLTouch") -#define MSG_BLTOUCH_STOW _UxGT("Набивка BLTouch") + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Смена сопел"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Поднятие по Z"); -// TODO: TouchMI Probe, Manual deploy/stow + // TODO: Singlenozzle, nozzle standby -#define MSG_HOME_FIRST _UxGT("Паркуй %s%s%s сначала") -#define MSG_ZPROBE_ZOFFSET _UxGT("Смещение Z") -#define MSG_BABYSTEP_X _UxGT("Микрошаг X") -#define MSG_BABYSTEP_Y _UxGT("Микрошаг Y") -#define MSG_BABYSTEP_Z _UxGT("Микрошаг Z") -#define MSG_ENDSTOP_ABORT _UxGT("Сработал концевик") -#define MSG_HEATING_FAILED_LCD _UxGT("Разогрев не удался") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Неудача нагрева стола") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Ошибка: Избыточная Т") -#define MSG_THERMAL_RUNAWAY _UxGT("УБЕГАНИЕ ТЕПЛА") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("УБЕГАНИЕ ТЕПЛА СТОЛА") -// TODO: Heated chamber -#define MSG_ERR_MAXTEMP _UxGT("Ошибка: Т макс.") -#define MSG_ERR_MINTEMP _UxGT("Ошибка: Т мин.") -#define MSG_ERR_MAXTEMP_BED _UxGT("Ошибка: Т стола макс") -#define MSG_ERR_MINTEMP_BED _UxGT("Ошибка: Т стола мин.") -// TODO: Heated chamber -#define MSG_ERR_Z_HOMING _UxGT("Паркуй XY сначала") -#define MSG_HALTED _UxGT("ПРИНТЕР ОСТАНОВЛЕН") -#define MSG_PLEASE_RESET _UxGT("Сделайте сброс") -#define MSG_SHORT_DAY _UxGT("д") // One character only -#define MSG_SHORT_HOUR _UxGT("ч") // One character only -#define MSG_SHORT_MINUTE _UxGT("м") // One character only -#define MSG_HEATING _UxGT("Нагрев...") -#define MSG_COOLING _UxGT("Охлаждение...") -#define MSG_BED_HEATING _UxGT("Нагрев стола...") -#define MSG_BED_COOLING _UxGT("Охлаждение стола...") -// TODO: Heated chamber -#define MSG_DELTA_CALIBRATE _UxGT("Калибровка Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Калибровать X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Калибровать Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Калибровать Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калибровать центр") -#define MSG_DELTA_SETTINGS _UxGT("Настройки Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Авто калибровка") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Задать высоту Delta") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Задать Z-смещение") -#define MSG_DELTA_DIAG_ROD _UxGT("Диаг. стержень") -#define MSG_DELTA_HEIGHT _UxGT("Высота") -#define MSG_DELTA_RADIUS _UxGT("Радиус") -#define MSG_INFO_MENU _UxGT("О принтере") -#define MSG_INFO_PRINTER_MENU _UxGT("Инф. о принтере") -#define MSG_3POINT_LEVELING _UxGT("Калибровка 3-х точек") -#define MSG_LINEAR_LEVELING _UxGT("Линейная калибровка") -#define MSG_BILINEAR_LEVELING _UxGT("Билинейная калибр.") -#define MSG_UBL_LEVELING _UxGT("Калибровка UBL") -#define MSG_MESH_LEVELING _UxGT("Калибровка сетки") -#define MSG_INFO_STATS_MENU _UxGT("Статистика принтера") -#define MSG_INFO_BOARD_MENU _UxGT("Информация о плате") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Термисторы") -#define MSG_INFO_EXTRUDERS _UxGT("Экструдеры") -#define MSG_INFO_BAUDRATE _UxGT("Бод") -#define MSG_INFO_PROTOCOL _UxGT("Протокол") -#define MSG_CASE_LIGHT _UxGT("Подсветка корпуса") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Яркость подсветки") + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Смена филамента"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Смена филамента ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Смена филамента ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Смена филамента ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Смена филамента ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Смена филамента ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Смена филамента ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Загрузка филамента"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Загрузка филамента ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Загрузка филамента ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Загрузка филамента ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Загрузка филамента ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Загрузка филамента ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Загрузка филамента ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Выгрузка филамента ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Выгрузка филамента ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Выгрузка филамента ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Выгрузка филамента ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Выгрузка филамента ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Выгрузка филамента ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Выгрузить всё"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Активировать SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Сменить SD карту"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Деактивировать SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z датчик вне стола"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор наклона"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Тестирование BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Сброс BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Установка BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Набивка BLTouch"); -#define MSG_EXPECTED_PRINTER _UxGT("Неверный принтер") + // TODO: TouchMI Probe, Manual deploy/stow -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Счётчик печати") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Закончено") - #define MSG_INFO_PRINT_TIME _UxGT("Общее время печати") - #define MSG_INFO_PRINT_LONGEST _UxGT("Наидольшее задание") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Длина филамента") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Отпечатков") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Закончено") - #define MSG_INFO_PRINT_TIME _UxGT("Всего") - #define MSG_INFO_PRINT_LONGEST _UxGT("Наидольшее") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Выдавлено") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Мин. Т") -#define MSG_INFO_MAX_TEMP _UxGT("Макс. Т") -#define MSG_INFO_PSU _UxGT("БП") -#define MSG_DRIVE_STRENGTH _UxGT("Сила привода") -#define MSG_DAC_PERCENT _UxGT("Привод %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Запись DAC EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("ПЕЧАТЬ НА ПАУЗЕ") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ЗАГРУЗКА ФИЛАМЕНТА") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("ВЫГРУЗКА ФИЛАМЕНТА") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ОПЦИИ ВОЗОБНОВЛЕНИЯ:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Выдавить ещё") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Возобновить печать") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Сопла: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Возврат не удался") -#define MSG_ERR_PROBING_FAILED _UxGT("Не удалось прощупать") -#define MSG_M600_TOO_COLD _UxGT("M600: Низкая Т") + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Паркуй %s%s%s сначала"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Микрошаг X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Микрошаг Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Микрошаг Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удался"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Неудача нагрева стола"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка: Избыточная Т"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УБЕГАНИЕ ТЕПЛА"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УБЕГАНИЕ ТЕПЛА СТОЛА"); + // TODO: Heated chamber + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макс."); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин."); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Ошибка: Т стола макс"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Ошибка: Т стола мин."); + // TODO: Heated chamber + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Паркуй XY сначала"); + PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ОСТАНОВЛЕН"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Сделайте сброс"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ч"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("м"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Нагрев..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Охлаждение..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрев стола..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охлаждение стола..."); + // TODO: Heated chamber + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровать Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровать Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровать центр"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Настройки Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Авто калибровка"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Задать высоту Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Задать Z-смещение"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Диаг. стержень"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Высота"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Радиус"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("О принтере"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Инф. о принтере"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Калибровка 3-х точек"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Линейная калибровка"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Билинейная калибр."); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Калибровка UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Калибровка сетки"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика принтера"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Информация о плате"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Термисторы"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Экструдеры"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Бод"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Подсветка корпуса"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яркость подсветки"); -// TODO: MMU2 + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Неверный принтер"); -// TODO: Mixing + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Счётчик печати"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Закончено"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Общее время печати"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее задание"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Длина филамента"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Отпечатков"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Закончено"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Всего"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Выдавлено"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мин. Т"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Макс. Т"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("БП"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила привода"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Привод %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запись DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ПЕЧАТЬ НА ПАУЗЕ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗАГРУЗКА ФИЛАМЕНТА"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВЫГРУЗКА ФИЛАМЕНТА"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ОПЦИИ ВОЗОБНОВЛЕНИЯ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Выдавить ещё"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Возобновить печать"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопла: "); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Возврат не удался"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Не удалось прощупать"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Низкая Т"); -#define MSG_GAMES _UxGT("Игры") -#define MSG_BRICKOUT _UxGT("Кирпичи") -#define MSG_INVADERS _UxGT("Вторжение") -#define MSG_SNAKE _UxGT("Змейка") -#define MSG_MAZE _UxGT("Лабиринт") + // TODO: MMU2 -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Ожидайте") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("начала смены") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("филамента") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ожидайте") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("выгрузки") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("филамента") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставьте пруток") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("и нажмите кнопку") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("для продолжения") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Нажмите кнопку для") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("нагрева сопла...") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Нагрев сопла") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Ждите...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ожидайте") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("загрузки прутка") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Ожидайте") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("экструзии") - #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("филамента") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Ожидайте") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("возобновления") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("печати") -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Ожидайте...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Выгрузка...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставь и нажми") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Нагрев...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Загрузка...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Выдавливание...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Возобновление...") -#endif // LCD_HEIGHT < 4 + // TODO: Mixing -#define MSG_TMC_DRIVERS _UxGT("Драйвера TMC") -#define MSG_TMC_CURRENT _UxGT("Текущие настройки") -#define MSG_TMC_HYBRID_THRS _UxGT("Гибридный режим") -#define MSG_TMC_HOMING_THRS _UxGT("Режим без эндстопов") -#define MSG_TMC_STEPPING_MODE _UxGT("Режим шага") -#define MSG_TMC_STEALTH_ENABLED _UxGT("Тихий режим вкл") + PROGMEM Language_Str MSG_GAMES = _UxGT("Игры"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Кирпичи"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Вторжение"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Змейка"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Лабиринт"); -// TODO: Service + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Ожидайте", "начала смены", "филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставьте пруток", "и нажмите кнопку", "для продолжения")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Нажмите кнопку для", "нагрева сопла...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Нагрев сопла", "Ждите...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Ожидайте", "загрузки прутка")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "экструзии", "филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновления", "печати")); + #else + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставь и нажми")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрев...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Выдавливание...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление...")); + #endif -// TODO: Backlash + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Драйвера TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Текущие настройки"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Режим без эндстопов"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим шага"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); + + // TODO: Service + + // TODO: Backlash +} diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 8897ff2310..176834a811 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -32,534 +32,669 @@ * http://www.facebook.com/farmamam * */ - #define DISPLAY_CHARSET_ISO10646_SK -#define CHARSIZE 2 -// Characters that can be displayed with M117 -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("äÄáÁčČďĎéÉíÍĺĹľĽňŇóÓôÔŕŔšŠťŤúÚýÝžŽ³") +namespace Language_sk { + using namespace Language_en; // Inherit undefined strings from English -#define WELCOME_MSG MACHINE_NAME _UxGT(" pripravená.") -#define MSG_YES _UxGT("ÁNO") -#define MSG_NO _UxGT("NIE") -#define MSG_BACK _UxGT("Naspäť") -#define MSG_MEDIA_INSERTED _UxGT("Karta vložená") -#define MSG_MEDIA_REMOVED _UxGT("Karta vybraná") -#define MSG_MEDIA_RELEASED _UxGT("Karta odpojená") -#define MSG_LCD_ENDSTOPS _UxGT("Endstopy") // max 8 znakov -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft. endstopy") -#define MSG_MAIN _UxGT("Hlavná ponuka") -#define MSG_ADVANCED_SETTINGS _UxGT("Pokročilé nastav.") -#define MSG_CONFIGURATION _UxGT("Konfigurácia") -#define MSG_AUTOSTART _UxGT("Auto-štart") -#define MSG_DISABLE_STEPPERS _UxGT("Uvolniť motory") -#define MSG_DEBUG_MENU _UxGT("Ponuka ladenia") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test uk. priebehu") -#define MSG_AUTO_HOME _UxGT("Domovská pozícia") -#define MSG_AUTO_HOME_X _UxGT("Domov os X") -#define MSG_AUTO_HOME_Y _UxGT("Domov os Y") -#define MSG_AUTO_HOME_Z _UxGT("Domov os Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Auto-zarovn. Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Parkovanie XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Kliknutím spusťte") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Ďalší bod") -#define MSG_LEVEL_BED_DONE _UxGT("Meranie hotové!") -#define MSG_Z_FADE_HEIGHT _UxGT("Výška rovnania") -#define MSG_SET_HOME_OFFSETS _UxGT("Nastaviť ofsety") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Ofsety nastavené") -#define MSG_SET_ORIGIN _UxGT("Nastaviť začiatok") -#define MSG_PREHEAT_1 _UxGT("Zahriať " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" všetko") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podlož") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast.") -#define MSG_PREHEAT_2 _UxGT("Zahriať " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" všetko") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podlož") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast.") -#define MSG_PREHEAT_CUSTOM _UxGT("Vlastná teplota") -#define MSG_COOLDOWN _UxGT("Schladiť") -#define MSG_LASER_MENU _UxGT("Nastavenie lasera") -#define MSG_LASER_OFF _UxGT("Vypnúť laser") -#define MSG_LASER_ON _UxGT("Zapnúť laser") -#define MSG_LASER_POWER _UxGT("Výkon lasera") -#define MSG_SPINDLE_MENU _UxGT("Nastavenie vretena") -#define MSG_SPINDLE_OFF _UxGT("Vypnúť vreteno") -#define MSG_SPINDLE_ON _UxGT("Zapnúť vreteno") -#define MSG_SPINDLE_POWER _UxGT("Výkon vretena") -#define MSG_SPINDLE_REVERSE _UxGT("Spätný chod") -#define MSG_SWITCH_PS_ON _UxGT("Zapnúť napájanie") -#define MSG_SWITCH_PS_OFF _UxGT("Vypnúť napájanie") -#define MSG_EXTRUDE _UxGT("Vytlačiť (extr.)") -#define MSG_RETRACT _UxGT("Vytiahnuť (retr.)") -#define MSG_MOVE_AXIS _UxGT("Posunúť osy") -#define MSG_BED_LEVELING _UxGT("Vyrovnanie podložky") -#define MSG_LEVEL_BED _UxGT("Vyrovnať podložku") -#define MSG_LEVEL_CORNERS _UxGT("Vyrovnať rohy") -#define MSG_NEXT_CORNER _UxGT("Ďalší roh") -#define MSG_EDIT_MESH _UxGT("Upraviť sieť bodov") -#define MSG_EDITING_STOPPED _UxGT("Koniec úprav siete") -#define MSG_PROBING_MESH _UxGT("Skúšam bod") -#define MSG_MESH_X _UxGT("Index X") -#define MSG_MESH_Y _UxGT("Index Y") -#define MSG_MESH_EDIT_Z _UxGT("Hodnota Z") -#define MSG_USER_MENU _UxGT("Vlastné príkazy") -#define MSG_M48_TEST _UxGT("M48 Test sondy") -#define MSG_M48_POINT _UxGT("M48 Bod") -#define MSG_M48_DEVIATION _UxGT("Odchýlka") -#define MSG_IDEX_MENU _UxGT("IDEX režim") -#define MSG_OFFSETS_MENU _UxGT("Ofset nástrojov") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-parkovanie") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplikácia") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Zrkadlená kópia") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Plná kontrola") -#define MSG_X_OFFSET _UxGT("2. tryska X") -#define MSG_Y_OFFSET _UxGT("2. tryska Y") -#define MSG_Z_OFFSET _UxGT("2. tryska Z") -#define MSG_UBL_DOING_G29 _UxGT("Vykonávam G29") -#define MSG_UBL_TOOLS _UxGT("Nástroje UBL") -#define MSG_UBL_LEVEL_BED _UxGT("UBL rovnanie") -#define MSG_LCD_TILTING_MESH _UxGT("Vyrovnávam bod") -#define MSG_UBL_MANUAL_MESH _UxGT("Manuálna sieť bodov") -#define MSG_UBL_BC_INSERT _UxGT("Položte a zmerajte") -#define MSG_UBL_BC_INSERT2 _UxGT("Zmerajte") -#define MSG_UBL_BC_REMOVE _UxGT("Odstráňte a zmerajte") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Presun na ďalší") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Aktivovať UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deaktivovať UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Teplota podložky") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Teplota hotendu") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Úprava siete bodov") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Upraviť vlastnú sieť") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Doladiť sieť bodov") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Koniec úprav siete") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Vlastná sieť") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Vytvoriť sieť") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Sieť bodov " PREHEAT_1_LABEL) -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Sieť bodov " PREHEAT_2_LABEL) -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Studená sieť bodov") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Upraviť výšku siete") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Výška") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Skontrolovať sieť") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Kontrola siete " PREHEAT_1_LABEL) -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Kontrola siete " PREHEAT_2_LABEL) -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Kontrola vlast.siete") -#define MSG_UBL_CONTINUE_MESH _UxGT("Pokračovať v sieti") -#define MSG_UBL_MESH_LEVELING _UxGT("Sieťové rovnanie") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-bodové rovnanie") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Mriežkové rovnanie") -#define MSG_UBL_MESH_LEVEL _UxGT("Vyrovnať podložku") -#define MSG_UBL_SIDE_POINTS _UxGT("Postranné body") -#define MSG_UBL_MAP_TYPE _UxGT("Typ siete bodov") -#define MSG_UBL_OUTPUT_MAP _UxGT("Exportovať sieť") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovať do PC") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovať do CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Záloha do PC") -#define MSG_UBL_INFO_UBL _UxGT("Info. o UBL do PC") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mriežky") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Ručné vyplnenie") -#define MSG_UBL_SMART_FILLIN _UxGT("Chytré vyplnenie") -#define MSG_UBL_FILLIN_MESH _UxGT("Vyplniť mriežku") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Zrušiť všetko") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrušiť najbližší") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Upraviť všetky") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Upraviť najbližší") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Úložisko sietí") -#define MSG_UBL_STORAGE_SLOT _UxGT("Pamäťový slot") -#define MSG_UBL_LOAD_MESH _UxGT("Načítať sieť bodov") -#define MSG_UBL_SAVE_MESH _UxGT("Uložiť sieť bodov") -#define MSG_MESH_LOADED _UxGT("Sieť %i načítaná") -#define MSG_MESH_SAVED _UxGT("Sieť %i uložená") -#define MSG_UBL_NO_STORAGE _UxGT("Nedostatok miesta") -#define MSG_UBL_SAVE_ERROR _UxGT("Chyba: Ukladanie UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Chyba: Obnovenie UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Koniec kompenz. Z") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Postupné UBL") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Slovak"); -#define MSG_LED_CONTROL _UxGT("Nastavenie LED") -#define MSG_LEDS _UxGT("Svetlo") -#define MSG_LED_PRESETS _UxGT("Prednastavené farby") -#define MSG_SET_LEDS_RED _UxGT("Červená") -#define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") -#define MSG_SET_LEDS_YELLOW _UxGT("Žltá") -#define MSG_SET_LEDS_GREEN _UxGT("Zelená") -#define MSG_SET_LEDS_BLUE _UxGT("Modrá") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Fialová") -#define MSG_SET_LEDS_WHITE _UxGT("Biela") -#define MSG_SET_LEDS_DEFAULT _UxGT("Obnoviť nastavenie") -#define MSG_CUSTOM_LEDS _UxGT("Vlastná farba") -#define MSG_INTENSITY_R _UxGT("Inten. červenej") -#define MSG_INTENSITY_G _UxGT("Inten. zelenej") -#define MSG_INTENSITY_B _UxGT("Inten. modrej") -#define MSG_INTENSITY_W _UxGT("Inten. bielej") -#define MSG_LED_BRIGHTNESS _UxGT("Jas") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); + PROGMEM Language_Str MSG_YES = _UxGT("ÁNO"); + PROGMEM Language_Str MSG_NO = _UxGT("NIE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Naspäť"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Ruším..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložená"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vybraná"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Karta odpojená"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čakám na kartu"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán."); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavná ponuka"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Pokročilé nastav."); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurácia"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto-štart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Ponuka ladenia"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozícia"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domov os X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím spusťte"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Ďalší bod"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Meranie hotové!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška rovnania"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Nastaviť ofsety"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastaviť začiatok"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahriať ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Zahriať ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" všetko"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" nast."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Zahriať ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Zahriať ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" hotend ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" všetko"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" nast."); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Schladiť"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnúť laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnúť laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vypnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Zapnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačiť (extr.)"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Vytiahnuť (retr.)"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunúť osy"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnať podložku"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnať rohy"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Ďalší roh"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sieťe bodov"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upraviť sieť bodov"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Koniec úprav siete"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Skúšam bod"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchýlka"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX režim"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-parkovanie"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikácia"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrkadlená kópia"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2. tryska X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2. tryska Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2. tryska Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Vykonávam G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Nástroje UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL rovnanie"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Vyrovnávam bod"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuálna sieť bodov"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Položte a zmerajte"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmerajte"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstráňte a zmerajte"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Presun na ďalší"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovať UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovať UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava siete bodov"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upraviť vlastnú sieť"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladiť sieť bodov"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieť"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvoriť sieť"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Sieť bodov ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Sieť bodov ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieť bodov"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upraviť výšku siete"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Skontrolovať sieť"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Kontrola siete ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Kontrola siete ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž."); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ručné čistenie..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Čistenie pevn. dĺž."); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Čistenie dokončené"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 zrušený"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opúšťam G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovať v sieti"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sieťové rovnanie"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnanie"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Vyrovnať podložku"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranné body"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ siete bodov"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovať sieť"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Exportovať do PC"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Exportovať do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Záloha do PC"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info. o UBL do PC"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mriežky"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ručné vyplnenie"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytré vyplnenie"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Vyplniť mriežku"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušiť všetko"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušiť najbližší"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upraviť všetky"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upraviť najbližší"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Úložisko sietí"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Pamäťový slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načítať sieť bodov"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložiť sieť bodov"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Sieť %i načítaná"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Sieť %i uložená"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatok miesta"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Chyba: Ukladanie UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Chyba: Obnovenie UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Koniec kompenz. Z"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Postupné UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Studená sieť bodov"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Chytré vyplnenie"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Skontrolovať sieť"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точная настр. всего"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Skontrolovať sieť"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точная настр. всего"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Uložiť sieť bodov"); -#define MSG_MOVING _UxGT("Posúvam...") -#define MSG_FREE_XY _UxGT("Uvolniť XY") -#define MSG_MOVE_X _UxGT("Posunúť X") -#define MSG_MOVE_Y _UxGT("Posunúť Y") -#define MSG_MOVE_Z _UxGT("Posunúť Z") -#define MSG_MOVE_E _UxGT("Extrudér") -#define MSG_HOTEND_TOO_COLD _UxGT("Hotend je studený") -#define MSG_MOVE_Z_DIST _UxGT("Posunúť o %smm") -#define MSG_MOVE_01MM _UxGT("Posunúť o 0,1mm") -#define MSG_MOVE_1MM _UxGT("Posunúť o 1mm") -#define MSG_MOVE_10MM _UxGT("Posunúť o 10mm") -#define MSG_SPEED _UxGT("Rýchlosť") -#define MSG_BED_Z _UxGT("Výška podl.") -#define MSG_NOZZLE _UxGT("Tryska") -#define MSG_BED _UxGT("Podložka") -#define MSG_CHAMBER _UxGT("Komora") -#define MSG_FAN_SPEED _UxGT("Rýchlosť vent.") -#define MSG_EXTRA_FAN_SPEED _UxGT("Rýchlosť ex. vent.") -#define MSG_FLOW _UxGT("Prietok") -#define MSG_CONTROL _UxGT("Ovládanie") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") -#define MSG_AUTOTEMP _UxGT("Auto-teplota") -#define MSG_LCD_ON _UxGT("Zap") -#define MSG_LCD_OFF _UxGT("Vyp") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Vybrať") -#define MSG_ACC _UxGT("Zrýchlenie") -#define MSG_JERK _UxGT("Skok") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-skok") - #define MSG_VB_JERK _UxGT("Vb-skok") - #define MSG_VC_JERK _UxGT("Vc-skok") -#else - #define MSG_VA_JERK _UxGT("Vx-skok") - #define MSG_VB_JERK _UxGT("Vy-skok") - #define MSG_VC_JERK _UxGT("Vz-skok") -#endif -#define MSG_VE_JERK _UxGT("Ve-skok") -#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") -#define MSG_VELOCITY _UxGT("Rýchlosť") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_ACCELERATION _UxGT("Akcelerácia") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retrakt") -#define MSG_A_TRAVEL _UxGT("A-prejazd") -#define MSG_STEPS_PER_MM _UxGT("Kroky/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Akrokov/mm") - #define MSG_BSTEPS _UxGT("Bkrokov/mm") - #define MSG_CSTEPS _UxGT("Ckrokov/mm") -#else - #define MSG_ASTEPS _UxGT("Xkrokov/mm") - #define MSG_BSTEPS _UxGT("Ykrokov/mm") - #define MSG_CSTEPS _UxGT("Zkrokov/mm") -#endif -#define MSG_ESTEPS _UxGT("Ekrokov/mm") -#define MSG_E1STEPS _UxGT("E1krokov/mm") -#define MSG_E2STEPS _UxGT("E2krokov/mm") -#define MSG_E3STEPS _UxGT("E3krokov/mm") -#define MSG_E4STEPS _UxGT("E4krokov/mm") -#define MSG_E5STEPS _UxGT("E5krokov/mm") -#define MSG_E6STEPS _UxGT("E6krokov/mm") -#define MSG_TEMPERATURE _UxGT("Teplota") -#define MSG_MOTION _UxGT("Pohyb") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E na mm³") -#define MSG_FILAMENT_DIAM _UxGT("Priem. fil.") -#define MSG_FILAMENT_UNLOAD _UxGT("Vysunúť mm") -#define MSG_FILAMENT_LOAD _UxGT("Zaviesť mm") -#define MSG_ADVANCE_K _UxGT("K pre posun") -#define MSG_CONTRAST _UxGT("Kontrast LCD") -#define MSG_STORE_EEPROM _UxGT("Uložiť nastavenie") -#define MSG_LOAD_EEPROM _UxGT("Načítať nastavenie") -#define MSG_RESTORE_FAILSAFE _UxGT("Obnoviť nastavenie") -#define MSG_INIT_EEPROM _UxGT("Inicializ. EEPROM") -#define MSG_MEDIA_UPDATE _UxGT("Aktualizovať z SD") -#define MSG_RESET_PRINTER _UxGT("Reštart. tlačiar.") -#define MSG_REFRESH _UxGT("Obnoviť") -#define MSG_WATCH _UxGT("Info. obrazovka") -#define MSG_PREPARE _UxGT("Príprava tlače") -#define MSG_TUNE _UxGT("Doladenie tlače") -#define MSG_START_PRINT _UxGT("Spustiť tlač") -#define MSG_BUTTON_NEXT _UxGT("Ďalší") -#define MSG_BUTTON_INIT _UxGT("Inicial.") -#define MSG_BUTTON_STOP _UxGT("Zastaviť") -#define MSG_BUTTON_PRINT _UxGT("Tlačiť") -#define MSG_BUTTON_RESET _UxGT("Vynulovať") -#define MSG_BUTTON_CANCEL _UxGT("Zrušiť") -#define MSG_BUTTON_DONE _UxGT("Hotovo") -#define MSG_PAUSE_PRINT _UxGT("Pozastaviť tlač") -#define MSG_RESUME_PRINT _UxGT("Obnoviť tlač") -#define MSG_STOP_PRINT _UxGT("Zastaviť tlač") -#define MSG_OUTAGE_RECOVERY _UxGT("Obnova po výp. nap.") -#define MSG_MEDIA_MENU _UxGT("Tlačiť z SD") -#define MSG_NO_MEDIA _UxGT("Žiadna SD karta") -#define MSG_DWELL _UxGT("Spím...") -#define MSG_USERWAIT _UxGT("Pokrač. kliknutím...") -#define MSG_PRINT_PAUSED _UxGT("Tlač pozastavená") -#define MSG_PRINTING _UxGT("Tlačím...") -#define MSG_PRINT_ABORTED _UxGT("Tlač zrušená") -#define MSG_NO_MOVE _UxGT("Žiadny pohyb.") -#define MSG_KILLED _UxGT("PRERUŠENÉ. ") -#define MSG_STOPPED _UxGT("ZASTAVENÉ. ") -#define MSG_CONTROL_RETRACT _UxGT("Retrakt mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Výmena Re.mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraktovať V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Zdvih Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Dĺžka výmeny") -#define MSG_FILAMENT_PURGE_LENGTH _UxGT("Dĺžka vytlačenia") -#define MSG_TOOL_CHANGE _UxGT("Výmena nástroja") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Zdvihnúť Z") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Primárna rýchl.") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Rýchl. retrakcie") -#define MSG_NOZZLE_STANDBY _UxGT("Záložná tryska") -#define MSG_FILAMENTCHANGE _UxGT("Vymeniť filament") -#define MSG_FILAMENTLOAD _UxGT("Zaviesť filament") -#define MSG_FILAMENTUNLOAD _UxGT("Vysunúť filament") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Vysunúť všetko") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavenie LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Svetlo"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Prednastavené farby"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žltá"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biela"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Obnoviť nastavenie"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastná farba"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Inten. červenej"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Inten. zelenej"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Inten. modrej"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Inten. bielej"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); -#define MSG_INIT_MEDIA _UxGT("Načítať SD kartu") -#define MSG_CHANGE_MEDIA _UxGT("Vymeniť SD kartu") -#define MSG_RELEASE_MEDIA _UxGT("Odpojiť SD kartu") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z mimo podl.") -#define MSG_SKEW_FACTOR _UxGT("Faktor skosenia") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Cmd: Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("Cmd: Reset") -#define MSG_BLTOUCH_STOW _UxGT("Cmd: Zasunúť") -#define MSG_BLTOUCH_DEPLOY _UxGT("Cmd: Vysunúť") -#define MSG_BLTOUCH_SW_MODE _UxGT("Cmd: Režim SW") -#define MSG_BLTOUCH_5V_MODE _UxGT("Cmd: Režim 5V") -#define MSG_BLTOUCH_OD_MODE _UxGT("Cmd: Režim OD") -#define MSG_BLTOUCH_MODE_STORE _UxGT("Cmd: Ulož. režim") -#define MSG_BLTOUCH_MODE_STORE_5V _UxGT("Prepnúť do 5V") -#define MSG_BLTOUCH_MODE_STORE_OD _UxGT("Prepnúť do OD") -#define MSG_BLTOUCH_MODE_ECHO _UxGT("Zobraziť režim") -#define MSG_BLTOUCH_MODE_CHANGE _UxGT("POZOR: Zlé nastav. môže spôsobiť poškoden. Pokračovať?") -#define MSG_TOUCHMI_PROBE _UxGT("TouchMI") -#define MSG_TOUCHMI_INIT _UxGT("Inicializ. TouchMI") -#define MSG_TOUCHMI_ZTEST _UxGT("Test ofsetu Z") -#define MSG_TOUCHMI_SAVE _UxGT("Uložiť") -#define MSG_MANUAL_DEPLOY_TOUCHMI _UxGT("Zasunúť TouchMI") -#define MSG_MANUAL_DEPLOY _UxGT("Zasunúť sondu Z") -#define MSG_MANUAL_STOW _UxGT("Vysunúť sondu Z") -#define MSG_HOME_FIRST _UxGT("Najskôr os %s%s%s domov") -#define MSG_ZPROBE_ZOFFSET _UxGT("Ofset sondy Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_BABYSTEP_TOTAL _UxGT("Celkom") -#define MSG_ENDSTOP_ABORT _UxGT("Zastavenie Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Chyba ohrevu") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Chyba ohrevu podl.") -#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Chyba ohrevu komory") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Chyba: REDUND. TEP.") -#define MSG_THERMAL_RUNAWAY _UxGT("TEPLOTNÝ SKOK") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEPLOTNÝ SKOK PODL.") -#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("TEPLOTNÝ SKOK KOMO.") -#define MSG_ERR_MAXTEMP _UxGT("Chyba: MAXTEMP") -#define MSG_ERR_MINTEMP _UxGT("Chyba: MINTEMP") -#define MSG_ERR_MAXTEMP_BED _UxGT("Chyba: MAXTEMP PODL.") -#define MSG_ERR_MINTEMP_BED _UxGT("Chyba: MINTEMP PODL.") -#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Chyba: MAXTEMP KOMO.") -#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Chyba: MINTEMP KOMO.") -#define MSG_ERR_Z_HOMING _UxGT("Najskôr os XY domov") -#define MSG_HALTED _UxGT("TLAČIAREŇ ZASTAVENÁ") -#define MSG_PLEASE_RESET _UxGT("Reštartuje ju") -#define MSG_SHORT_DAY _UxGT("d") -#define MSG_SHORT_HOUR _UxGT("h") -#define MSG_SHORT_MINUTE _UxGT("m") -#define MSG_HEATING _UxGT("Ohrev...") -#define MSG_COOLING _UxGT("Ochladzovanie...") -#define MSG_BED_HEATING _UxGT("Ohrev podložky...") -#define MSG_BED_COOLING _UxGT("Ochladz. podložky...") -#define MSG_CHAMBER_HEATING _UxGT("Ohrev komory...") -#define MSG_CHAMBER_COOLING _UxGT("Ochladz. komory...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrácia") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrovať X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrovať Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrovať Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrovať stred") -#define MSG_DELTA_SETTINGS _UxGT("Delta nastavenia") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-kalibrácia") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Nast. výšku delty") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Ofset sondy Z") -#define MSG_DELTA_DIAG_ROD _UxGT("Diag. rameno") -#define MSG_DELTA_HEIGHT _UxGT("Výška") -#define MSG_DELTA_RADIUS _UxGT("Polomer") -#define MSG_INFO_MENU _UxGT("O tlačiarni") -#define MSG_INFO_PRINTER_MENU _UxGT("Info. o tlačiarni") -#define MSG_3POINT_LEVELING _UxGT("3-bodové rovnanie") -#define MSG_LINEAR_LEVELING _UxGT("Lineárne rovnanie") -#define MSG_BILINEAR_LEVELING _UxGT("Bilineárne rovnanie") -#define MSG_UBL_LEVELING _UxGT("UBL rovnanie") -#define MSG_MESH_LEVELING _UxGT("Mriežkové rovnanie") -#define MSG_INFO_STATS_MENU _UxGT("Štatistika") -#define MSG_INFO_BOARD_MENU _UxGT("Info. o doske") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistory") -#define MSG_INFO_EXTRUDERS _UxGT("Extrudéry") -#define MSG_INFO_BAUDRATE _UxGT("Rýchlosť") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Osvetlenie") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Jas svetla") + PROGMEM Language_Str MSG_MOVING = _UxGT("Posúvam..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolniť XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunúť X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunúť Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunúť Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Extrudér ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Extrudér ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Extrudér ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Extrudér ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Extrudér ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Extrudér ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunúť o %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Rýchlosť"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Tryska ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Tryska ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Tryska ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Tryska ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Tryska ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Tryska ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rýchlosť vent."); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Rýchlosť vent. 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Rýchlosť vent. 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Rýchlosť vent. 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rýchlosť ex. vent."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Rýchlosť ex. vent. 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Rýchlosť ex. vent. 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Rýchlosť ex. vent. 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Prietok"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Prietok ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Prietok ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Prietok ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Prietok ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Prietok ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Prietok ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládanie"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto-teplota"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); + PROGMEM Language_Str MSG_AUTOTUNE_PID = _UxGT("PID kalibrácia"); + PROGMEM Language_Str MSG_AUTOTUNE_PID_E0 = _UxGT("PID kalibrácia ") LCD_STR_E0; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E1 = _UxGT("PID kalibrácia ") LCD_STR_E1; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E2 = _UxGT("PID kalibrácia ") LCD_STR_E2; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E3 = _UxGT("PID kalibrácia ") LCD_STR_E3; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E4 = _UxGT("PID kalibrácia ") LCD_STR_E4; + PROGMEM Language_Str MSG_AUTOTUNE_PID_E5 = _UxGT("PID kalibrácia ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrať"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Vybrať ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Vybrať ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Vybrať ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Vybrať ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Vybrať ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Vybrať ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Zrýchlenie"); + PROGMEM Language_Str MSG_JERK = _UxGT("Skok"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-skok"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-skok"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-skok"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-skok"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rýchlosť"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vmax ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vmax ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vmax ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vmax ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vmax ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vmax ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VPrej Min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Akcelerácia"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Amax ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Amax ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Amax ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Amax ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Amax ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Amax ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-prejazd"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroky/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekrokov/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Priem. fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Priem. fil. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Priem. fil. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Priem. fil. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Priem. fil. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Priem. fil. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Priem. fil. ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunúť mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zaviesť mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pre posun"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K pre posun ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K pre posun ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K pre posun ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K pre posun ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K pre posun ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K pre posun ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložiť nastavenie"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načítať nastavenie"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Obnoviť nastavenie"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializ. EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizovať z SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reštart. tlačiar."); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Info. obrazovka"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Príprava tlače"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Doladenie tlače"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Spustiť tlač"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Ďalší"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicial."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Zastaviť"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tlačiť"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Vynulovať"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušiť"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastaviť tlač"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova po výp. nap."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tlačiť z SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žiadna SD karta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Spím..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pokrač. kliknutím..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tlač pozastavená"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Tlačím..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tlač zrušená"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žiadny pohyb."); + PROGMEM Language_Str MSG_KILLED = _UxGT("PRERUŠENÉ. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENÉ. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výmena Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovať V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zdvih Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dĺžka výmeny"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Dĺžka vytlačenia"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výmena nástroja"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvihnúť Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Primárna rýchl."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Rýchl. retrakcie"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Záložná tryska"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vymeniť filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Vymeniť filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Vymeniť filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Vymeniť filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Vymeniť filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Vymeniť filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Vymeniť filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zaviesť filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Zaviesť filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Zaviesť filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Zaviesť filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Zaviesť filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Zaviesť filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Zaviesť filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Vysunúť filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Vysunúť filament ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Vysunúť filament ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Vysunúť filament ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Vysunúť filament ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Vysunúť filament ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Vysunúť filament ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunúť všetko"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Načítať SD kartu"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vymeniť SD kartu"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Odpojiť SD kartu"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl."); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor skosenia"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Zasunúť"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Vysunúť"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Režim SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Režim 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Režim OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Ulož. režim"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Prepnúť do 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Prepnúť do OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Zobraziť režim"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("POZOR: Zlé nastav. môže spôsobiť poškoden. Pokračovať?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inicializ. TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test ofsetu Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Uložiť"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Zasunúť TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Zasunúť sondu Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Vysunúť sondu Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najskôr os %s%s%s domov"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Ofset sondy Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkom"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba ohrevu podl."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chyba ohrevu komory"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Chyba: REDUND. TEP."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÝ SKOK"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPLOTNÝ SKOK PODL."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPLOTNÝ SKOK KOMO."); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Chyba: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Chyba: MINTEMP"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Chyba: MAXTEMP PODL."); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Chyba: MINTEMP PODL."); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Chyba: MAXTEMP KOMO."); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Chyba: MINTEMP KOMO."); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Najskôr os XY domov"); + PROGMEM Language_Str MSG_HALTED = _UxGT("TLAČIAREŇ ZASTAVENÁ"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reštartuje ju"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Ohrev..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Ochladzovanie..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohrev podložky..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ochladz. podložky..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ohrev komory..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovať X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovať Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovať Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovať stred"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavenia"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-kalibrácia"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast. výšku delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ofset sondy Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag. rameno"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Polomer"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tlačiarni"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. o tlačiarni"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnanie"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárne rovnanie"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineárne rovnanie"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("UBL rovnanie"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Štatistika"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. o doske"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rýchlosť"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Tepl. ochrana: VYP"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Tepl. ochrana: ZAP"); -#define MSG_EXPECTED_PRINTER _UxGT("Nesprávna tlačiareň") + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvetlenie"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas svetla"); + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Nesprávna tlačiareň"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Počet tlačí") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Dokončené") - #define MSG_INFO_PRINT_TIME _UxGT("Celkový čas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdlhšia tlač") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Celkom vytlačené") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Tlače") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Hotovo") - #define MSG_INFO_PRINT_TIME _UxGT("Čas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdlhšia") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Vytlačené") -#endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tlačí"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončené"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia tlač"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkom vytlačené"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tlače"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačené"); + #endif -#define MSG_INFO_MIN_TEMP _UxGT("Teplota min") -#define MSG_INFO_MAX_TEMP _UxGT("Teplota max") -#define MSG_INFO_PSU _UxGT("Nap. zdroj") -#define MSG_DRIVE_STRENGTH _UxGT("Budenie motorov") -#define MSG_DAC_PERCENT _UxGT("Motor %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Uložiť do EEPROM") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Budenie motorov"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Motor %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("CHYBA KOMUNIKÁ. TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Uložiť do EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMENA FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PAUZA TLAČE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENIE FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTIE FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI POKRAČ.:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačiť viacej"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz."); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Parkovanie zlyhalo"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Príliš studený"); -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("PAUZA TLAČE") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ZAVEDENIE FILAMENTU") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("VYSUNUTIE FILAMENTU") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("MOŽNOSTI POKRAČ.:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Vytlačiť viacej") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Obnoviť tlač") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Tryska: ") -#define MSG_RUNOUT_SENSOR _UxGT("Senzor filamentu") -#define MSG_RUNOUT_DISTANCE_MM _UxGT("Vzd. mm fil. senz.") -#define MSG_ERR_HOMING_FAILED _UxGT("Parkovanie zlyhalo") -#define MSG_ERR_PROBING_FAILED _UxGT("Kalibrácia zlyhala") -#define MSG_M600_TOO_COLD _UxGT("M600: Príliš studený") + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU2"); + PROGMEM Language_Str MSG_MMU2_WRONG_FIRMWARE = _UxGT("Aktualizujte FW MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potrebuje zásah."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovovanie..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zaviesť filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zaviesť všetky"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zaviesť po trysku"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunúť filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT0 = _UxGT("Vysunúť filament 1"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT1 = _UxGT("Vysunúť filament 2"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT2 = _UxGT("Vysunúť filament 3"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT3 = _UxGT("Vysunúť filament 4"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT4 = _UxGT("Vysunúť filament 5"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vyňať filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádzanie fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vysúvanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysúvanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všetky"); + PROGMEM Language_Str MSG_MMU2_FILAMENT0 = _UxGT("Filament 1"); + PROGMEM Language_Str MSG_MMU2_FILAMENT1 = _UxGT("Filament 2"); + PROGMEM Language_Str MSG_MMU2_FILAMENT2 = _UxGT("Filament 3"); + PROGMEM Language_Str MSG_MMU2_FILAMENT3 = _UxGT("Filament 4"); + PROGMEM Language_Str MSG_MMU2_FILAMENT4 = _UxGT("Filament 5"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reštartovať MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reštart MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite"); -#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("VÝMENA FILAMENTU") -#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("VYBERTE FILAMENT") -#define MSG_MMU2_MENU _UxGT("MMU2") -#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Aktualizujte FW MMU!") -#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU potrebuje zásah.") -#define MSG_MMU2_RESUME _UxGT("Obnoviť tlač") -#define MSG_MMU2_RESUMING _UxGT("Obnovovanie...") -#define MSG_MMU2_LOAD_FILAMENT _UxGT("Zaviesť filament") -#define MSG_MMU2_LOAD_ALL _UxGT("Zaviesť všetky") -#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Zaviesť po trysku") -#define MSG_MMU2_EJECT_FILAMENT _UxGT("Vysunúť filament") -#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Vysunúť filament 1") -#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Vysunúť filament 2") -#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Vysunúť filament 3") -#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Vysunúť filament 4") -#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Vysunúť filament 5") -#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Vyňať filament") -#define MSG_MMU2_LOADING_FILAMENT _UxGT("Zavádzanie fil. %i...") -#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Vysúvanie fil. ...") -#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Vysúvanie fil. ...") -#define MSG_MMU2_ALL _UxGT("Všetky") -#define MSG_MMU2_FILAMENT0 _UxGT("Filament 1") -#define MSG_MMU2_FILAMENT1 _UxGT("Filament 2") -#define MSG_MMU2_FILAMENT2 _UxGT("Filament 3") -#define MSG_MMU2_FILAMENT3 _UxGT("Filament 4") -#define MSG_MMU2_FILAMENT4 _UxGT("Filament 5") -#define MSG_MMU2_RESET _UxGT("Reštartovať MMU") -#define MSG_MMU2_RESETTING _UxGT("Reštart MMU...") -#define MSG_MMU2_EJECT_RECOVER _UxGT("Odstráňte, kliknite") + PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); + PROGMEM Language_Str MSG_MIX_COMPONENT_1 = _UxGT("Zložka 1"); + PROGMEM Language_Str MSG_MIX_COMPONENT_2 = _UxGT("Zložka 2"); + PROGMEM Language_Str MSG_MIX_COMPONENT_3 = _UxGT("Zložka 3"); + PROGMEM Language_Str MSG_MIX_COMPONENT_4 = _UxGT("Zložka 4"); + PROGMEM Language_Str MSG_MIX_COMPONENT_5 = _UxGT("Zložka 5"); + PROGMEM Language_Str MSG_MIX_COMPONENT_6 = _UxGT("Zložka 6"); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Prepnúť mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cyklický mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradientný mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Otočiť gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktívny V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Počiat. V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Konečn. V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Vynulovať V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložiť V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools vynulované"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Počiat.Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Konečn.Z:"); -#define MSG_MIX _UxGT("Mix") -#define MSG_MIX_COMPONENT _UxGT("Zložka") -#define MSG_MIXER _UxGT("Mixér") -#define MSG_GRADIENT _UxGT("Gradient") -#define MSG_FULL_GRADIENT _UxGT("Plný gradient") -#define MSG_TOGGLE_MIX _UxGT("Prepnúť mix") -#define MSG_CYCLE_MIX _UxGT("Cyklický mix") -#define MSG_GRADIENT_MIX _UxGT("Gradientný mix") -#define MSG_REVERSE_GRADIENT _UxGT("Otočiť gradient") -#define MSG_ACTIVE_VTOOL _UxGT("Aktívny V-tool") -#define MSG_START_VTOOL _UxGT("Počiat. V-tool") -#define MSG_END_VTOOL _UxGT("Konečn. V-tool") -#define MSG_GRADIENT_ALIAS _UxGT("Alias V-tool") -#define MSG_RESET_VTOOLS _UxGT("Vynulovať V-tools") -#define MSG_COMMIT_VTOOL _UxGT("Uložiť V-tool Mix") -#define MSG_VTOOLS_RESET _UxGT("V-tools vynulované") -#define MSG_START_Z _UxGT("Počiat.Z") -#define MSG_END_Z _UxGT("Konečn.Z") -#define MSG_GAMES _UxGT("Hry") -#define MSG_BRICKOUT _UxGT("Brickout") -#define MSG_INVADERS _UxGT("Nájazdníci") -#define MSG_SNAKE _UxGT("Had") -#define MSG_MAZE _UxGT("Bludisko") + PROGMEM Language_Str MSG_GAMES = _UxGT("Hry"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Nájazdníci"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Had"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Bludisko"); -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Stlačte tlačidlo") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("pre obnovu tlače") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parkovanie...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čakajte prosím") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("na spustenie") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("výmeny filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("a stlačte tlačidlo") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pre pokračovanie") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Stlačte tlačidlo") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("pre ohrev trysky") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Ohrev trysky") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Čakajte prosím...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čakajte prosím") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("na vysunutie") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Čakajte prosím") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("na zavedenie") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Čakajte prosím") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("na vytlačenie") - #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Stlačte tlačidlo") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("pre dokončenie") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_3 _UxGT("vytláčania filam.") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Čakajte prosím na") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("obnovenie tlače...") -#else // LCD_HEIGHT < 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Kliknite pre pokr.") - #define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parkovanie...") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čakajte prosím...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte a kliknite") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Kliknite pre ohrev") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Ohrev...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysúvanie...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavádzanie...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlačovanie...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Klik. pre dokonč.") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Pokračovanie...") -#endif // LCD_HEIGHT < 4 -#define MSG_TMC_DRIVERS _UxGT("Ovládače TMC") -#define MSG_TMC_CURRENT _UxGT("Prúd ovládača") -#define MSG_TMC_HYBRID_THRS _UxGT("Hybridný prah") -#define MSG_TMC_HOMING_THRS _UxGT("Bezsenzor. domov") -#define MSG_TMC_STEPPING_MODE _UxGT("Režim krokovania") -#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop zapnutý") - -#define MSG_SERVICE_RESET _UxGT("Vynulovať") -#define MSG_SERVICE_IN _UxGT(" za:") -#define MSG_BACKLASH _UxGT("Kompenz. vôle") -#define MSG_BACKLASH_CORRECTION _UxGT("Korekcia") -#define MSG_BACKLASH_SMOOTHING _UxGT("Vyhladzovanie") + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre obnovu tlače")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čakajte prosím", "na spustenie", "výmeny filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stlačte tlačidlo", "pre pokračovanie")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre ohrev trysky")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Ohrev trysky", "Čakajte prosím...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na vysunutie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na zavedenie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Čakajte prosím", "na vytlačenie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Stlačte tlačidlo", "pre dokončenie", "vytláčania filam.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Čakajte prosím na", "obnovenie tlače...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknite pre pokr.")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Parkovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čakajte prosím...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte a kliknite")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknite pre ohrev")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ohrev...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysúvanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádzanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klik. pre dokonč.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračovanie...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Ovládače TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Prúd ovládača"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Vynulovať"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT("za:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Kompenz. vôle"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korekcia"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhladzovanie"); +} diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h index b2be749a00..8098fdd872 100644 --- a/Marlin/src/lcd/language/language_test.h +++ b/Marlin/src/lcd/language/language_test.h @@ -114,114 +114,145 @@ #define STRG_OKTAL_e "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" #define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" -#if ENABLED(DISPLAYTEST) - #define WELCOME_MSG _UxGT("Language TEST") +namespace Language_test { + using namespace Language_en; // Inherit undefined strings from English - #define MSG_WATCH _UxGT("Display test") - #define MSG_PREPARE STRG_OKTAL_b - #define MSG_CONTROL STRG_OKTAL_c -#endif + constexpr uint8_t CHARSIZE = 1; -#if ENABLED(WEST) - #define WELCOME_MSG _UxGT("Language TEST") + #if ENABLED(DISPLAYTEST) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); - #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") - #define MSG_PREPARE _UxGT("UTF8") - #define MSG_CONTROL _UxGT("ASCII") + PROGMEM Language_Str MSG_WATCH = _UxGT("Display test"); + PROGMEM Language_Str MSG_PREPARE = STRG_OKTAL_b; + PROGMEM Language_Str MSG_CONTROL = STRG_OKTAL_c; + #endif - //#define MSG_MAIN _UxGT("..") - #define MSG_DISABLE_STEPPERS STRG_C2_8 - #define MSG_AUTO_HOME STRG_C2_9 - #define MSG_SET_HOME_OFFSETS STRG_C2_a - #define MSG_PREHEAT_1 STRG_C2_b - #define MSG_PREHEAT_2 STRG_C3_8 - #define MSG_COOLDOWN STRG_C3_9 - #define MSG_SWITCH_PS_OFF STRG_C3_a - #define MSG_MOVE_AXIS STRG_C3_b + #if ENABLED(WEST) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); - #define MSG_MAIN STRG_OKTAL_2 - #define MSG_TEMPERATURE STRG_OKTAL_3 - #define MSG_MOTION STRG_OKTAL_4 - #define MSG_FILAMENT STRG_OKTAL_5 - #define MSG_CONTRAST STRG_OKTAL_6 - #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 + PROGMEM Language_Str MSG_WATCH = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); - #define MSG_NOZZLE STRG_OKTAL_8 - #define MSG_FAN_SPEED STRG_OKTAL_9 - #define MSG_AUTOTEMP STRG_OKTAL_a - #define MSG_MIN STRG_OKTAL_b - #define MSG_MAX STRG_OKTAL_c - #define MSG_FACTOR STRG_OKTAL_d - #define MSG_PID_P STRG_OKTAL_e - #define MSG_PID_I STRG_OKTAL_f + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_C2_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_C2_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_C2_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_C2_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_C3_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_C3_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_C3_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_C3_b; -#endif + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = STRG_OKTAL_7; -#if ENABLED(CYRIL) - #define WELCOME_MSG _UxGT("Language TEST") + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_0 = STRG_OKTAL_8 " " LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = STRG_OKTAL_8 " " LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = STRG_OKTAL_8 " " LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = STRG_OKTAL_8 " " LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = STRG_OKTAL_8 " " LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = STRG_OKTAL_8 " " LCD_STR_N5; + PROGMEM Language_Str MSG_FAN_SPEED = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_1 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_2 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_3 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; - #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") - #define MSG_PREPARE _UxGT("UTF8") - #define MSG_CONTROL _UxGT("ASCII") + #endif - //#define MSG_MAIN _UxGT("..") - #define MSG_DISABLE_STEPPERS STRG_D0_8 - #define MSG_AUTO_HOME STRG_D0_9 - #define MSG_SET_HOME_OFFSETS STRG_D0_a - #define MSG_PREHEAT_1 STRG_D0_b - #define MSG_PREHEAT_2 STRG_D1_8 - #define MSG_COOLDOWN STRG_D1_9 - #define MSG_SWITCH_PS_OFF STRG_D1_a - #define MSG_MOVE_AXIS STRG_D1_b + #if ENABLED(CYRIL) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); - #define MSG_MAIN STRG_OKTAL_2 - #define MSG_TEMPERATURE STRG_OKTAL_3 - #define MSG_MOTION STRG_OKTAL_4 - #define MSG_FILAMENT STRG_OKTAL_5 - #define MSG_CONTRAST STRG_OKTAL_6 - #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 + PROGMEM Language_Str MSG_WATCH = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); - #define MSG_NOZZLE STRG_OKTAL_8 - #define MSG_FAN_SPEED STRG_OKTAL_9 - #define MSG_AUTOTEMP STRG_OKTAL_a - #define MSG_MIN STRG_OKTAL_b - #define MSG_MAX STRG_OKTAL_c - #define MSG_FACTOR STRG_OKTAL_d - #define MSG_PID_P STRG_OKTAL_e - #define MSG_PID_I STRG_OKTAL_f + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_D0_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_D0_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_D0_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_D0_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_D1_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_D1_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_D1_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_D1_b; -#endif + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = STRG_OKTAL_7; -#if ENABLED(KANA) - #define WELCOME_MSG _UxGT("Language TEST") + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_0 = STRG_OKTAL_8 " " LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = STRG_OKTAL_8 " " LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = STRG_OKTAL_8 " " LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = STRG_OKTAL_8 " " LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = STRG_OKTAL_8 " " LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = STRG_OKTAL_8 " " LCD_STR_N5; + PROGMEM Language_Str MSG_FAN_SPEED_1 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_2 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_3 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; - #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") - #define MSG_PREPARE _UxGT("UTF8") - #define MSG_CONTROL _UxGT("ASCII") + #endif - //#define MSG_MAIN _UxGT("..") - #define MSG_DISABLE_STEPPERS STRG_E382_8 - #define MSG_AUTO_HOME STRG_E382_9 - #define MSG_SET_HOME_OFFSETS STRG_E382_a - #define MSG_PREHEAT_1 STRG_E382_b - #define MSG_PREHEAT_2 STRG_E383_8 - #define MSG_COOLDOWN STRG_E383_9 - #define MSG_SWITCH_PS_OFF STRG_E383_a - #define MSG_MOVE_AXIS STRG_E383_b + #if ENABLED(KANA) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); - #define MSG_MAIN STRG_OKTAL_2 - #define MSG_TEMPERATURE STRG_OKTAL_3 - #define MSG_MOTION STRG_OKTAL_4 - #define MSG_FILAMENT STRG_OKTAL_5 - #define MSG_CONTRAST STRG_OKTAL_6 - #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 + PROGMEM Language_Str MSG_WATCH = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); - #define MSG_NOZZLE STRG_OKTAL_8 - #define MSG_FAN_SPEED STRG_OKTAL_9 - #define MSG_AUTOTEMP STRG_OKTAL_a - #define MSG_MIN STRG_OKTAL_b - #define MSG_MAX STRG_OKTAL_c - #define MSG_FACTOR STRG_OKTAL_d - #define MSG_PID_P STRG_OKTAL_e - #define MSG_PID_I STRG_OKTAL_f -#endif + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_E382_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_E382_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_E382_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_E382_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_E383_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_E383_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_E383_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_E383_b; + + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = STRG_OKTAL_7; + + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_0 = STRG_OKTAL_8 " " LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = STRG_OKTAL_8 " " LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = STRG_OKTAL_8 " " LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = STRG_OKTAL_8 " " LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = STRG_OKTAL_8 " " LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = STRG_OKTAL_8 " " LCD_STR_N5; + PROGMEM Language_Str MSG_FAN_SPEED_1 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_2 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_3 = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; + #endif +} diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 3e025934a7..26ec1e35fe 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -34,402 +34,484 @@ */ #define DISPLAY_CHARSET_ISO10646_TR -#define CHARSIZE 2 -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("İÖÇğüşöç³") -#define WELCOME_MSG MACHINE_NAME _UxGT(" hazır.") -#define MSG_BACK _UxGT("Geri") -#define MSG_MEDIA_INSERTED _UxGT("SD K. Yerleştirildi.") -#define MSG_MEDIA_REMOVED _UxGT("SD Kart Çıkarıldı.") -#define MSG_LCD_ENDSTOPS _UxGT("Enstops") // Max length 8 characters -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Yazılımsal Endstops") -#define MSG_MAIN _UxGT("Ana") -#define MSG_ADVANCED_SETTINGS _UxGT("Gelişmiş Ayarlar") -#define MSG_CONFIGURATION _UxGT("Yapılandırma") -#define MSG_AUTOSTART _UxGT("Oto. Başlat") -#define MSG_DISABLE_STEPPERS _UxGT("Motorları Durdur") -#define MSG_DEBUG_MENU _UxGT("Hata Ayıklama") -#define MSG_PROGRESS_BAR_TEST _UxGT("Durum Çubuğu Testi") -#define MSG_AUTO_HOME _UxGT("Eksenleri Sıfırla") -#define MSG_AUTO_HOME_X _UxGT("X Sıfırla") -#define MSG_AUTO_HOME_Y _UxGT("Y Sıfırla") -#define MSG_AUTO_HOME_Z _UxGT("Z Sıfırla") -#define MSG_AUTO_Z_ALIGN _UxGT("Oto. Z-Hizalama") -#define MSG_LEVEL_BED_HOMING _UxGT("XYZ Sıfırlanıyor") -#define MSG_LEVEL_BED_WAITING _UxGT("Başlatmak için tıkla") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Sonraki Nokta") -#define MSG_LEVEL_BED_DONE _UxGT("Hizalama Tamam!") -#define MSG_Z_FADE_HEIGHT _UxGT("Kaçınma Yüksekliği") -#define MSG_SET_HOME_OFFSETS _UxGT("Offset Ayarla") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offset Tamam") -#define MSG_SET_ORIGIN _UxGT("Sıfır Belirle") -#define MSG_PREHEAT_1 _UxGT("Ön Isınma " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tüm") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Nozul") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Tabla") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Ayarlar") -#define MSG_PREHEAT_2 _UxGT("Ön Isınma " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tüm") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Nozul") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Tabla") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Ayarlar") -#define MSG_PREHEAT_CUSTOM _UxGT("Özel Ön Isınma") -#define MSG_COOLDOWN _UxGT("Soğut") -#define MSG_SWITCH_PS_ON _UxGT("Gücü Aç") -#define MSG_SWITCH_PS_OFF _UxGT("Gücü Kapat") -#define MSG_EXTRUDE _UxGT("Ekstrüzyon") -#define MSG_RETRACT _UxGT("Geri Çek") -#define MSG_MOVE_AXIS _UxGT("Eksen Hareketleri") -#define MSG_BED_LEVELING _UxGT("Tabla Hizalama") -#define MSG_LEVEL_BED _UxGT("Tabla Hizası") -#define MSG_LEVEL_CORNERS _UxGT("Hizalama Köşeleri") -#define MSG_NEXT_CORNER _UxGT("Sonraki Köşe") -#define MSG_EDIT_MESH _UxGT("Mesh Düzenle") -#define MSG_EDITING_STOPPED _UxGT("Mesh Düzenleme Durdu") -#define MSG_MESH_X _UxGT("İndeks X") -#define MSG_MESH_Y _UxGT("İndeks Y") -#define MSG_MESH_EDIT_Z _UxGT("Z Değeri") -#define MSG_USER_MENU _UxGT("Özel Komutlar") -#define MSG_IDEX_MENU _UxGT("IDEX Modu") -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Oto-Park") -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Kopyala") -#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Yansıtılmış kopya") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Tam Kontrol") -#define MSG_X_OFFSET _UxGT("2. nozul X") -#define MSG_Y_OFFSET _UxGT("2. nozul Y") -#define MSG_Z_OFFSET _UxGT("2. nozul Z") -#define MSG_UBL_DOING_G29 _UxGT("G29 Çalışıyor") -#define MSG_UBL_TOOLS _UxGT("UBL Araçları") -#define MSG_UBL_LEVEL_BED _UxGT("UBL Yatak Hizalama") -#define MSG_UBL_MANUAL_MESH _UxGT("Elle Mesh Oluştur") -#define MSG_UBL_BC_INSERT _UxGT("Altlık & Ölçü Ver") -#define MSG_UBL_BC_INSERT2 _UxGT("Ölçü") -#define MSG_UBL_BC_REMOVE _UxGT("Yataktan Ölçü Kaldır") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Sonrakine Git") -#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL'yi Etkinleştir") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL'yi Etkisizleştir") -#define MSG_UBL_SET_TEMP_BED _UxGT("Yatak Sıcaklığı") -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Nozul Sıcaklığı") -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Mesh Düzenleme") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Özel Mesh Düzenleme") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("İnce Ayar Mesh") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Mesh Düzenleme Tamam") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Özel Mesh Oluştur") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Mesh Oluştur") -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Mesh Oluştur (" PREHEAT_1_LABEL ")") -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Mesh Oluştur (" PREHEAT_2_LABEL ")") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Soğuk Mesh Oluştur") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Mesh Yükseklik Ayarı") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Yükseklik miktarı") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Doğrulama Mesh") -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Doğrulama Mesh (" PREHEAT_1_LABEL ")") -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Doğrulama Mesh (" PREHEAT_2_LABEL ")") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Özel Mesh Doğrulama") -#define MSG_UBL_CONTINUE_MESH _UxGT("Tabla Mesh Devam et") -#define MSG_UBL_MESH_LEVELING _UxGT("Mesh Hizalama") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Nokta Hizalama") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Kafes Mesh Hizalama") -#define MSG_UBL_MESH_LEVEL _UxGT("Mesh Seviyesi") -#define MSG_UBL_SIDE_POINTS _UxGT("Yan Noktalar") -#define MSG_UBL_MAP_TYPE _UxGT("Haritalama Türü") -#define MSG_UBL_OUTPUT_MAP _UxGT("Mesh Çıkış Haritası") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Host için Çıktı") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("CSV için Çıktı") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Yazıcıda Yedek Kpalı") -#define MSG_UBL_INFO_UBL _UxGT("UBL Çıkış Bilgisi") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Dolgu Miktarı") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Manuel Dolgu") -#define MSG_UBL_SMART_FILLIN _UxGT("Akıllı Dogu") -#define MSG_UBL_FILLIN_MESH _UxGT("Mesh Dolgu") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Tümünü Geçersiz Kıl") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Yakını Geçersiz Kıl") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Tümünü İnce Ayarla") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Yakını İnce Ayarla") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Depolama") -#define MSG_UBL_STORAGE_SLOT _UxGT("Bellek Yuvası") -#define MSG_UBL_LOAD_MESH _UxGT("Yatak Mesh Yükle") -#define MSG_UBL_SAVE_MESH _UxGT("Yatak Mesh Kayıt Et") -#define MSG_MESH_LOADED _UxGT("Mesh %i yüklendi") -#define MSG_MESH_SAVED _UxGT("Mesh %i kayıtlandı") -#define MSG_UBL_NO_STORAGE _UxGT("Depolama Yok") -#define MSG_UBL_SAVE_ERROR _UxGT("Hata: UBL Kayıt") -#define MSG_UBL_RESTORE_ERROR _UxGT("Hata: UBL Yenileme") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Ofset Durduruldu") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Adım Adım UBL") -#define MSG_LED_CONTROL _UxGT("LED Kontrolü") -#define MSG_LEDS _UxGT("Işıklar") -#define MSG_LED_PRESETS _UxGT("Işık Hazır Ayarları") -#define MSG_SET_LEDS_RED _UxGT("Kırmızı") -#define MSG_SET_LEDS_ORANGE _UxGT("Turuncu") -#define MSG_SET_LEDS_YELLOW _UxGT("Sarı") -#define MSG_SET_LEDS_GREEN _UxGT("Yeşil") -#define MSG_SET_LEDS_BLUE _UxGT("Mavi") -#define MSG_SET_LEDS_INDIGO _UxGT("Lacivert") -#define MSG_SET_LEDS_VIOLET _UxGT("Menekşe") -#define MSG_SET_LEDS_WHITE _UxGT("Beyaz") -#define MSG_SET_LEDS_DEFAULT _UxGT("Varsayılan") -#define MSG_CUSTOM_LEDS _UxGT("Özel Işıklar") -#define MSG_INTENSITY_R _UxGT("Kırmızı Şiddeti") -#define MSG_INTENSITY_G _UxGT("Yeşil Şiddeti") -#define MSG_INTENSITY_B _UxGT("Mavi Şiddeti") -#define MSG_INTENSITY_W _UxGT("Beyaz Şiddeti") -#define MSG_LED_BRIGHTNESS _UxGT("Parlaklık") -#define MSG_MOVING _UxGT("Hareket Ediyor..") -#define MSG_FREE_XY _UxGT("Durdur XY") -#define MSG_MOVE_X _UxGT("X Hareketi") -#define MSG_MOVE_Y _UxGT("Y Hareketi") -#define MSG_MOVE_Z _UxGT("Z Hareketi") -#define MSG_MOVE_E _UxGT("Ekstruder") -#define MSG_HOTEND_TOO_COLD _UxGT("Nozul Çok Soğuk") -#define MSG_MOVE_Z_DIST _UxGT("%smm") -#define MSG_MOVE_01MM _UxGT("0.1mm") -#define MSG_MOVE_1MM _UxGT("1mm") -#define MSG_MOVE_10MM _UxGT("10mm") -#define MSG_SPEED _UxGT("Hız") -#define MSG_BED_Z _UxGT("Z Mesafesi") -#define MSG_NOZZLE _UxGT("Nozul") -#define MSG_BED _UxGT("Tabla") -#define MSG_FAN_SPEED _UxGT("Fan Hızı") -#define MSG_EXTRA_FAN_SPEED _UxGT("Ekstra Fan Hızı") -#define MSG_FLOW _UxGT("Akış") -#define MSG_CONTROL _UxGT("Kontrol") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Çarpan") -#define MSG_AUTOTEMP _UxGT("Oto. Sıcaklık") -#define MSG_LCD_ON _UxGT("Açık") -#define MSG_LCD_OFF _UxGT("Kapalı") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Seç") -#define MSG_ACC _UxGT("İvme") -#define MSG_JERK _UxGT("Sarsım") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-Sarsım") - #define MSG_VB_JERK _UxGT("Vb-Sarsım") - #define MSG_VC_JERK _UxGT("Vc-Sarsım") -#else - #define MSG_VA_JERK _UxGT("Vx-Sarsım") - #define MSG_VB_JERK _UxGT("Vy-Sarsım") - #define MSG_VC_JERK _UxGT("Vz-Sarsım") -#endif -#define MSG_VE_JERK _UxGT("Ve-Sarsım") -#define MSG_JUNCTION_DEVIATION _UxGT("Jonksiyon Sapması") -#define MSG_VELOCITY _UxGT("Hız Vektörü") -#define MSG_VMAX _UxGT("HızVektör.max ") -#define MSG_VMIN _UxGT("HızVektör.min") -#define MSG_VTRAV_MIN _UxGT("HV.gezinme min") -#define MSG_ACCELERATION _UxGT("Ivme") -#define MSG_AMAX _UxGT("Max. ivme ") -#define MSG_A_RETRACT _UxGT("Ivme-geri çekme") -#define MSG_A_TRAVEL _UxGT("Ivme-gezinme") -#define MSG_STEPS_PER_MM _UxGT("Adım/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A adım/mm") - #define MSG_BSTEPS _UxGT("B adım/mm") - #define MSG_CSTEPS _UxGT("C adım/mm") -#else - #define MSG_ASTEPS _UxGT("X adım/mm") - #define MSG_BSTEPS _UxGT("Y adım/mm") - #define MSG_CSTEPS _UxGT("Z adım/mm") -#endif -#define MSG_ESTEPS _UxGT("E adım/mm") -#define MSG_E1STEPS _UxGT("E1 adım/mm") -#define MSG_E2STEPS _UxGT("E2 adım/mm") -#define MSG_E3STEPS _UxGT("E3 adım/mm") -#define MSG_E4STEPS _UxGT("E4 adım/mm") -#define MSG_E5STEPS _UxGT("E5 adım/mm") -#define MSG_E6STEPS _UxGT("E6 adım/mm") -#define MSG_TEMPERATURE _UxGT("Sıcaklık") -#define MSG_MOTION _UxGT("Hareket") -#define MSG_FILAMENT _UxGT("Filaman") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Ekstrüzyon/mm³") -#define MSG_FILAMENT_DIAM _UxGT("Filaman Çapı") -#define MSG_FILAMENT_UNLOAD _UxGT("Çıkart mm") -#define MSG_FILAMENT_LOAD _UxGT("Yükle mm") -#define MSG_ADVANCE_K _UxGT("K İlerlet") -#define MSG_CONTRAST _UxGT("LCD Kontrast") -#define MSG_STORE_EEPROM _UxGT("Hafızaya Al") -#define MSG_LOAD_EEPROM _UxGT("Hafızadan Yükle") -#define MSG_RESTORE_FAILSAFE _UxGT("Fabrika Ayarları") -#define MSG_INIT_EEPROM _UxGT("EEPROM'u başlat") -#define MSG_MEDIA_UPDATE _UxGT("SD Güncellemesi") -#define MSG_RESET_PRINTER _UxGT("Yazıcıyı Resetle") -#define MSG_REFRESH _UxGT("Yenile") -#define MSG_WATCH _UxGT("Bilgi Ekranı") -#define MSG_PREPARE _UxGT("Hazırlık") -#define MSG_TUNE _UxGT("Ayar") -#define MSG_PAUSE_PRINT _UxGT("Duraklat") -#define MSG_RESUME_PRINT _UxGT("Sürdür") -#define MSG_STOP_PRINT _UxGT("Durdur") -#define MSG_OUTAGE_RECOVERY _UxGT("Kesinti Kurtarma") -#define MSG_MEDIA_MENU _UxGT("SD Karttan Yazdır") -#define MSG_NO_MEDIA _UxGT("SD Kart Yok!") -#define MSG_DWELL _UxGT("Uyku...") -#define MSG_USERWAIT _UxGT("Operatör bekleniyor.") -#define MSG_PRINT_PAUSED _UxGT("Baskı Duraklatıldı") -#define MSG_PRINTING _UxGT("Baskı Yapılıyor...") -#define MSG_PRINT_ABORTED _UxGT("Baskı Durduruldu!") -#define MSG_NO_MOVE _UxGT("İşlem yok.") -#define MSG_KILLED _UxGT("Kilitlendi. ") -#define MSG_STOPPED _UxGT("Durdu. ") -#define MSG_CONTROL_RETRACT _UxGT("Geri Çek mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") -#define MSG_CONTROL_RETRACTF _UxGT("Geri Çekme V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Atlama mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("Oto. Geri Çekme") -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("G.Çekme Boyu") -#define MSG_TOOL_CHANGE _UxGT("Takım Değişimi") -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Z Yükselt") -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Birincil Hız") -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Geri Çekme Hızı") -#define MSG_FILAMENTCHANGE _UxGT("Filaman Değiştir") -#define MSG_FILAMENTLOAD _UxGT("Filaman Yükle") -#define MSG_FILAMENTUNLOAD _UxGT("Filaman Çıkart") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Tümünü Çıkart") -#define MSG_INIT_MEDIA _UxGT("SD Kart Başlatılıyor") -#define MSG_CHANGE_MEDIA _UxGT("SD Kart Değiştir") -#define MSG_ZPROBE_OUT _UxGT("Z Prob Açık. Tabla") -#define MSG_SKEW_FACTOR _UxGT("Çarpıklık Faktörü") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("Sıfırla BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch Aç") -#define MSG_BLTOUCH_STOW _UxGT("BLTouch Kapat") -#define MSG_MANUAL_DEPLOY _UxGT("Z-Prob Aç") -#define MSG_MANUAL_STOW _UxGT("Z-Sensör Kapat") -#define MSG_HOME_FIRST _UxGT("Sıfırla %s%s%s Önce") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") -#define MSG_BABYSTEP_X _UxGT("Miniadım X") -#define MSG_BABYSTEP_Y _UxGT("Miniadım Y") -#define MSG_BABYSTEP_Z _UxGT("Miniadım Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop iptal") -#define MSG_HEATING_FAILED_LCD _UxGT("Isınma başarısız") -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Yatak Isınma Başrsız") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Hata: Sıcaklık Aşımı") -#define MSG_THERMAL_RUNAWAY _UxGT("TERMAL PROBLEM") -#define MSG_THERMAL_RUNAWAY_BED _UxGT("TABLA TERMAL PROBLEM") -#define MSG_ERR_MAXTEMP _UxGT("Hata: MAX.SICAKLIK") -#define MSG_ERR_MINTEMP _UxGT("Hata: MIN.SICAKLIK") -#define MSG_ERR_MAXTEMP_BED _UxGT("Hata: MAX.SIC. TABLA") -#define MSG_ERR_MINTEMP_BED _UxGT("Hata: MIN.SIC. TABLA") -#define MSG_ERR_Z_HOMING _UxGT("Önce XY Sıfırla") -#define MSG_HALTED _UxGT("YAZICI DURDURULDU") -#define MSG_PLEASE_RESET _UxGT("Lütfen Resetleyin") -#define MSG_SHORT_DAY _UxGT("G") // One character only -#define MSG_SHORT_HOUR _UxGT("S") // One character only -#define MSG_SHORT_MINUTE _UxGT("D") // One character only -#define MSG_HEATING _UxGT("Isınıyor...") -#define MSG_COOLING _UxGT("Soğuyor...") -#define MSG_BED_HEATING _UxGT("Tabla Isınıyor...") -#define MSG_BED_COOLING _UxGT("Tabla Soğuyor...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrasyonu") -#define MSG_DELTA_CALIBRATE_X _UxGT("Ayarla X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Ayarla Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Ayarla Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Ayarla Merkez") -#define MSG_DELTA_SETTINGS _UxGT("Delta Ayarları") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Oto Kalibrasyon") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Yük. Ayarla") -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Z Prob Ofseti") -#define MSG_DELTA_DIAG_ROD _UxGT("Çapral Mil") -#define MSG_DELTA_HEIGHT _UxGT("Yükseklik") -#define MSG_DELTA_RADIUS _UxGT("Yarıçap") -#define MSG_INFO_MENU _UxGT("Yazıcı Hakkında") -#define MSG_INFO_PRINTER_MENU _UxGT("Yazıcı Bilgisi") -#define MSG_3POINT_LEVELING _UxGT("3-Nokta Hizalama") -#define MSG_LINEAR_LEVELING _UxGT("Doğrusal Hizalama") -#define MSG_BILINEAR_LEVELING _UxGT("İki Yönlü Doğ. Hiza.") -#define MSG_UBL_LEVELING _UxGT("Birleşik Tabla Hiza.") -#define MSG_MESH_LEVELING _UxGT("Mesh Hizalama") -#define MSG_INFO_STATS_MENU _UxGT("İstatistikler") -#define MSG_INFO_BOARD_MENU _UxGT("Kontrolcü Bilgisi") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistörler") -#define MSG_INFO_EXTRUDERS _UxGT("Ekstruderler") -#define MSG_INFO_BAUDRATE _UxGT("İletişim Hızı") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Aydınlatmayı Aç") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Aydınlatma Parlaklğı") +namespace Language_tr { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_EXPECTED_PRINTER _UxGT("Yanlış Yazıcı") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Turkish"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Baskı Sayısı") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Tamamlanan") - #define MSG_INFO_PRINT_TIME _UxGT("Toplam Baskı Süresi") - #define MSG_INFO_PRINT_LONGEST _UxGT("En Uzun Baskı Süresi") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Toplam Filaman") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Baskı") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Tamamlanan") - #define MSG_INFO_PRINT_TIME _UxGT("Süre") - #define MSG_INFO_PRINT_LONGEST _UxGT("En Uzun") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Filaman") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Min Sıc.") -#define MSG_INFO_MAX_TEMP _UxGT("Max Sıc.") -#define MSG_INFO_PSU _UxGT("Güç Kaynağı") -#define MSG_DRIVE_STRENGTH _UxGT("Sürücü Gücü") -#define MSG_DAC_PERCENT _UxGT("Sürücü %") -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Yaz") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("BASKI DURAKLATILDI") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("FILAMAN YüKLE") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("FILAMAN ÇIKART") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Seçenekler:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Daha Fazla Tasviye") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Baskıyı sürdür") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozul: ") -#define MSG_RUNOUT_SENSOR _UxGT("Runout Sensörü") -#define MSG_ERR_HOMING_FAILED _UxGT("Sıfırlama Başarısız") -#define MSG_ERR_PROBING_FAILED _UxGT("Probing Başarısız") -#define MSG_M600_TOO_COLD _UxGT("M600: Çok Soğuk") -// -// Filament Değiştirme ekranları, 4 satırlı bir ekranda 3 satıra kadar gösterilir -// ...veya 3 satırlı ekranda 2 satıra kadar -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Baskıya devam etmek") - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("için Butona bas") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Filaman değişimi") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("için başlama") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("bekleniyor") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filamanı yükle") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("ve devam için") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tuşa bas...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Nozulü Isıtmak için") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Butona Bas.") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nozul Isınıyor") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Lütfen Bekleyin...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Filamanın çıkması") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("bekleniyor") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Filamanın yüklenmesi") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("bekleniyor..") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Filaman Temizlemesi") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("için bekle") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Filaman Temizlemesi") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("bitirmek için tıkla") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Baskının devam ") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("etmesi için bekle") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Sürdürmek İçin Tıkla") - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Lütfen bekleyiniz...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Yükle ve bas") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Isıtmak için Tıkla") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Isınıyor...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Çıkartılıyor...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Yüklüyor...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Temizleniyor...") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Bitirmek için Tıkla") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Sürdürülüyor...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" hazır."); + PROGMEM Language_Str MSG_BACK = _UxGT("Geri"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi."); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı."); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Enstops"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Yazılımsal Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Ana"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Gelişmiş Ayarlar"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Yapılandırma"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Oto. Başlat"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hata Ayıklama"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Durum Çubuğu Testi"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Eksenleri Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Sıfırla"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Oto. Z-Hizalama"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Sıfırlanıyor"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Başlatmak için tıkla"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sonraki Nokta"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Hizalama Tamam!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Kaçınma Yüksekliği"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Offset Ayarla"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset Tamam"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sıfır Belirle"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tüm"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tabla"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Ayarlar"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Tüm"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Tabla"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Ayarlar"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Özel Ön Isınma"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Soğut"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Gücü Aç"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Gücü Kapat"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstrüzyon"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Geri Çek"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Eksen Hareketleri"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Tabla Hizalama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Tabla Hizası"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Hizalama Köşeleri"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Sonraki Köşe"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Mesh Düzenle"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Düzenleme Durdu"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("İndeks X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("İndeks Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Değeri"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Özel Komutlar"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Modu"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Oto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Kopyala"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Yansıtılmış kopya"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Tam Kontrol"); + PROGMEM Language_Str MSG_X_OFFSET = _UxGT("2. nozul X"); + PROGMEM Language_Str MSG_Y_OFFSET = _UxGT("2. nozul Y"); + PROGMEM Language_Str MSG_Z_OFFSET = _UxGT("2. nozul Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 Çalışıyor"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Araçları"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL Yatak Hizalama"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Elle Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Altlık & Ölçü Ver"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Ölçü"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Yataktan Ölçü Kaldır"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Sonrakine Git"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL'yi Etkinleştir"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL'yi Etkisizleştir"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Yatak Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Yatak Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nozul Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Nozul Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Düzenleme"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Özel Mesh Düzenleme"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("İnce Ayar Mesh"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Mesh Düzenleme Tamam"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Özel Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Mesh Oluştur (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Mesh Oluştur (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Soğuk Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Mesh Yükseklik Ayarı"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Yükseklik miktarı"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Doğrulama Mesh"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Doğrulama Mesh (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Doğrulama Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Özel Mesh Doğrulama"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tabla Mesh Devam et"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Hizalama"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Nokta Hizalama"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Kafes Mesh Hizalama"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Mesh Seviyesi"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Yan Noktalar"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Haritalama Türü"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Mesh Çıkış Haritası"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host için Çıktı"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV için Çıktı"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Yazıcıda Yedek Kpalı"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Çıkış Bilgisi"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Dolgu Miktarı"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuel Dolgu"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Akıllı Dogu"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mesh Dolgu"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tümünü Geçersiz Kıl"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Yakını Geçersiz Kıl"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Yakını İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Depolama"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Bellek Yuvası"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Yatak Mesh Yükle"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Yatak Mesh Kayıt Et"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Mesh %i yüklendi"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Mesh %i kayıtlandı"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Depolama Yok"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hata: UBL Kayıt"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hata: UBL Yenileme"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Ofset Durduruldu"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Adım Adım UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Soğuk Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Akıllı Dogu"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Doğrulama Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Doğrulama Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Yatak Mesh Kayıt Et"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Kontrolü"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Işıklar"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Işık Hazır Ayarları"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Kırmızı"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Turuncu"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sarı"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Yeşil"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Mavi"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Lacivert"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Menekşe"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Beyaz"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Varsayılan"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Özel Işıklar"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Kırmızı Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Yeşil Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Mavi Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Beyaz Şiddeti"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Parlaklık"); + PROGMEM Language_Str MSG_MOVING = _UxGT("Hareket Ediyor.."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Durdur XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Hareketi"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Hareketi"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Hareketi"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruder"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Ekstruder ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Ekstruder ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Ekstruder ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Ekstruder ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Ekstruder ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Ekstruder ") LCD_STR_E5; + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Nozul Çok Soğuk"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Hız"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Mesafesi"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozul"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Nozul ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Nozul ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Nozul ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Nozul ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Nozul ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Nozul ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Tabla"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Hızı"); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Fan Hızı 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Fan Hızı 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Fan Hızı 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Ekstra Fan Hızı"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Ekstra Fan Hızı 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Ekstra Fan Hızı 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Ekstra Fan Hızı 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Akış"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Akış ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Akış ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Akış ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Akış ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Akış ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Akış ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Çarpan"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Oto. Sıcaklık"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Açık"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Kapalı"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Seç"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Seç ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Seç ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Seç ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Seç ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Seç ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Seç ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("İvme"); + PROGMEM Language_Str MSG_JERK = _UxGT("Sarsım"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Sarsım"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Jonksiyon Sapması"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Hız Vektörü"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("HızVektör.max ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("HızVektör.max ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("HızVektör.max ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("HızVektör.max ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("HızVektör.max ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("HızVektör.max ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("HızVektör.max ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("HızVektör.max ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("HızVektör.max ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("HızVektör.max ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("HızVektör.min"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("HV.gezinme min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Ivme"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max. ivme ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max. ivme ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max. ivme ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max. ivme ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Max. ivme ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Max. ivme ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Max. ivme ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Max. ivme ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Max. ivme ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Max. ivme ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Ivme-geri çekme"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Ivme-gezinme"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Adım/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E adım/mm"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Sıcaklık"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Hareket"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filaman"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filaman Çapı"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Filaman Çapı ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Filaman Çapı ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Filaman Çapı ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Filaman Çapı ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Filaman Çapı ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Filaman Çapı ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Çıkart mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Yükle mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K İlerlet"); + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K İlerlet ") LCD_STR_E0; + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K İlerlet ") LCD_STR_E1; + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K İlerlet ") LCD_STR_E2; + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K İlerlet ") LCD_STR_E3; + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K İlerlet ") LCD_STR_E4; + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K İlerlet ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Hafızaya Al"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hafızadan Yükle"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Fabrika Ayarları"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM'u başlat"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("SD Güncellemesi"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Yazıcıyı Resetle"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Bilgi Ekranı"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Hazırlık"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ayar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Duraklat"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Sürdür"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Durdur"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kesinti Kurtarma"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD Karttan Yazdır"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD Kart Yok!"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uyku..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Operatör bekleniyor."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Baskı Duraklatıldı"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Baskı Yapılıyor..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Baskı Durduruldu!"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("İşlem yok."); + PROGMEM Language_Str MSG_KILLED = _UxGT("Kilitlendi. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Durdu. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Geri Çek mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Geri Çekme V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Atlama mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Oto. Geri Çekme"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("G.Çekme Boyu"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Takım Değişimi"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Yükselt"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Birincil Hız"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Geri Çekme Hızı"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filaman Değiştir"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Filaman Değiştir ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Filaman Değiştir ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Filaman Değiştir ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Filaman Değiştir ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Filaman Değiştir ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Filaman Değiştir ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Filaman Yükle ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Filaman Yükle ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Filaman Yükle ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Filaman Yükle ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Filaman Yükle ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Filaman Yükle ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Filaman Çıkart ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Filaman Çıkart ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Filaman Çıkart ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Filaman Çıkart ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Filaman Çıkart ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Filaman Çıkart ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Tümünü Çıkart"); + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("SD Kart Başlatılıyor"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("SD Kart Değiştir"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Prob Açık. Tabla"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Çarpıklık Faktörü"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Sıfırla BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch Aç"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch Kapat"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Prob Aç"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Sensör Kapat"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Sıfırla %s%s%s Önce"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Miniadım X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Miniadım Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Miniadım Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop iptal"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Isınma başarısız"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Yatak Isınma Başrsız"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hata: Sıcaklık Aşımı"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TERMAL PROBLEM"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TABLA TERMAL PROBLEM"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hata: MAX.SICAKLIK"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hata: MIN.SICAKLIK"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Hata: MAX.SIC. TABLA"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Hata: MIN.SIC. TABLA"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Önce XY Sıfırla"); + PROGMEM Language_Str MSG_HALTED = _UxGT("YAZICI DURDURULDU"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Lütfen Resetleyin"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("G"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("S"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("D"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Isınıyor..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Soğuyor..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Tabla Isınıyor..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Tabla Soğuyor..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrasyonu"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Ayarla X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Ayarla Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Ayarla Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Ayarla Merkez"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Ayarları"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Oto Kalibrasyon"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Yük. Ayarla"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Prob Ofseti"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Çapral Mil"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Yükseklik"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Yarıçap"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Yazıcı Hakkında"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Yazıcı Bilgisi"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Nokta Hizalama"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Doğrusal Hizalama"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("İki Yönlü Doğ. Hiza."); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Birleşik Tabla Hiza."); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Hizalama"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("İstatistikler"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kontrolcü Bilgisi"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistörler"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstruderler"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("İletişim Hızı"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Aydınlatmayı Aç"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Aydınlatma Parlaklğı"); + + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Yanlış Yazıcı"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı Sayısı"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Toplam Baskı Süresi"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun Baskı Süresi"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Toplam Filaman"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Süre"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filaman"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Sıc."); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Sıc."); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Güç Kaynağı"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sürücü Gücü"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("Sürücü %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Yaz"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("BASKI DURAKLATILDI"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMAN YüKLE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMAN ÇIKART"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Seçenekler:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Daha Fazla Tasviye"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Baskıyı sürdür"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozul: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensörü"); + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Sıfırlama Başarısız"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Başarısız"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Çok Soğuk"); + // + // Filament Değiştirme ekranları, 4 satırlı bir ekranda 3 satıra kadar gösterilir + // ...veya 3 satırlı ekranda 2 satıra kadar + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Baskıya devam etmek", "için Butona bas")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Filaman değişimi", "için başlama", "bekleniyor")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filamanı yükle", "ve devam için", "tuşa bas...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nozulü Isıtmak için", "Butona Bas.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozul Isınıyor", "Lütfen Bekleyin...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Filamanın çıkması", "bekleniyor")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Filamanın yüklenmesi", "bekleniyor..")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "için bekle")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "bitirmek için tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Baskının devam ", "etmesi için bekle")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Sürdürmek İçin Tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Lütfen bekleyiniz...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Yükle ve bas")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Isıtmak için Tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Isınıyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Çıkartılıyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Yüklüyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Temizleniyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Bitirmek için Tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Sürdürülüyor...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index b358743be6..769d1c97ef 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -30,213 +30,304 @@ */ #define DISPLAY_CHARSET_ISO10646_5 -#define CHARSIZE 2 -#define WELCOME_MSG MACHINE_NAME _UxGT(" готовий.") -#define MSG_MEDIA_INSERTED _UxGT("Картка вставлена") -#define MSG_MEDIA_REMOVED _UxGT("Картка видалена") -#define MSG_LCD_ENDSTOPS _UxGT("Кінцевик") // Max length 8 characters -#define MSG_MAIN _UxGT("Меню") -#define MSG_AUTOSTART _UxGT("Автостарт") -#define MSG_DISABLE_STEPPERS _UxGT("Вимк. двигуни") -#define MSG_AUTO_HOME _UxGT("Авто паркування") -#define MSG_AUTO_HOME_X _UxGT("Паркування X") -#define MSG_AUTO_HOME_Y _UxGT("Паркування Y") -#define MSG_AUTO_HOME_Z _UxGT("Паркування Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Паркування XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Почати") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Слідуюча Точка") -#define MSG_LEVEL_BED_DONE _UxGT("Завершено!") -#define MSG_SET_HOME_OFFSETS _UxGT("Зберегти паркув.") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Зміщення застос.") -#define MSG_SET_ORIGIN _UxGT("Встанов. початок") -#define MSG_PREHEAT_1 _UxGT("Нагрів " PREHEAT_1_LABEL) -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Все") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Стіл") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" нал.") -#define MSG_PREHEAT_2 _UxGT("Нагрів " PREHEAT_2_LABEL) -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Все") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Стіл") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" нал.") -#define MSG_COOLDOWN _UxGT("Охолодження") -#define MSG_SWITCH_PS_ON _UxGT("Увімкнути живлення") -#define MSG_SWITCH_PS_OFF _UxGT("Вимкнути живлення") -#define MSG_EXTRUDE _UxGT("Екструзія") -#define MSG_RETRACT _UxGT("Втягування") -#define MSG_MOVE_AXIS _UxGT("Рух по осям") -#define MSG_BED_LEVELING _UxGT("Нівелювання столу") -#define MSG_LEVEL_BED _UxGT("Нівелювання столу") -#define MSG_MOVE_X _UxGT("Рух по X") -#define MSG_MOVE_Y _UxGT("Рух по Y") -#define MSG_MOVE_Z _UxGT("Рух по Z") -#define MSG_MOVE_E _UxGT("Екструдер") -#define MSG_MOVE_Z_DIST _UxGT("Рух по %smm") -#define MSG_MOVE_01MM _UxGT("Рух по 0.1mm") -#define MSG_MOVE_1MM _UxGT("Рух по 1mm") -#define MSG_MOVE_10MM _UxGT("Рух по 10mm") -#define MSG_SPEED _UxGT("Швидкість") -#define MSG_BED_Z _UxGT("Z Столу") -#define MSG_NOZZLE _UxGT("Сопло") -#define MSG_BED _UxGT("Стіл") -#define MSG_FAN_SPEED _UxGT("Охолодж.") -#define MSG_FLOW _UxGT("Потік") -#define MSG_CONTROL _UxGT("Налаштування") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Мін") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Макс") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Факт") -#define MSG_AUTOTEMP _UxGT("Автотемпер.") -#define MSG_LCD_ON _UxGT("Увімк.") -#define MSG_LCD_OFF _UxGT("Вимк.") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Вибрати") -#define MSG_ACC _UxGT("Приск.") -#define MSG_JERK _UxGT("Ривок") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-ривок") - #define MSG_VB_JERK _UxGT("Vb-ривок") - #define MSG_VC_JERK _UxGT("Vc-ривок") -#else - #define MSG_VA_JERK _UxGT("Vx-ривок") - #define MSG_VB_JERK _UxGT("Vy-ривок") - #define MSG_VC_JERK _UxGT("Vz-ривок") -#endif -#define MSG_VE_JERK _UxGT("Ve-ривок") -#define MSG_VMAX _UxGT("Vмакс") -#define MSG_VMIN _UxGT("Vмін") -#define MSG_VTRAV_MIN _UxGT("Vруху мін") -#define MSG_AMAX _UxGT("Aмакс ") -#define MSG_A_RETRACT _UxGT("A-втягув.") -#define MSG_A_TRAVEL _UxGT("A-руху") -#define MSG_STEPS_PER_MM _UxGT("Кроків/мм") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Aкроків/мм") - #define MSG_BSTEPS _UxGT("Bкроків/мм") - #define MSG_CSTEPS _UxGT("Cкроків/мм") -#else - #define MSG_ASTEPS _UxGT("Xкроків/мм") - #define MSG_BSTEPS _UxGT("Yкроків/мм") - #define MSG_CSTEPS _UxGT("Zкроків/мм") -#endif -#define MSG_ESTEPS _UxGT("Eкроків/мм") -#define MSG_E1STEPS _UxGT("E1кроків/мм") -#define MSG_E2STEPS _UxGT("E2кроків/мм") -#define MSG_E3STEPS _UxGT("E3кроків/мм") -#define MSG_E4STEPS _UxGT("E4кроків/мм") -#define MSG_E5STEPS _UxGT("E5кроків/мм") -#define MSG_E6STEPS _UxGT("E6кроків/мм") -#define MSG_TEMPERATURE _UxGT("Температура") -#define MSG_MOTION _UxGT("Рух") -#define MSG_FILAMENT _UxGT("Волокно") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E в мм3") -#define MSG_FILAMENT_DIAM _UxGT("Діам. волок.") -#define MSG_CONTRAST _UxGT("контраст LCD") -#define MSG_STORE_EEPROM _UxGT("Зберегти в ПЗП") -#define MSG_LOAD_EEPROM _UxGT("Зчитати з ПЗП") -#define MSG_RESTORE_FAILSAFE _UxGT("Відновити базові") -#define MSG_REFRESH _UxGT("Поновити") -#define MSG_WATCH _UxGT("Інформація") -#define MSG_PREPARE _UxGT("Підготувати") -#define MSG_TUNE _UxGT("Підлаштування") -#define MSG_PAUSE_PRINT _UxGT("Призупинити друк") -#define MSG_RESUME_PRINT _UxGT("Відновити друк") -#define MSG_STOP_PRINT _UxGT("Скасувати друк") -#define MSG_MEDIA_MENU _UxGT("Друкувати з SD") -#define MSG_NO_MEDIA _UxGT("Відсутня SD карт.") -#define MSG_DWELL _UxGT("Сплячка...") -#define MSG_USERWAIT _UxGT("Очікування дій...") -#define MSG_PRINT_ABORTED _UxGT("Друк скасовано") -#define MSG_NO_MOVE _UxGT("Немає руху.") -#define MSG_KILLED _UxGT("ПЕРЕРВАНО. ") -#define MSG_STOPPED _UxGT("ЗУПИНЕНО. ") -#define MSG_FILAMENTCHANGE _UxGT("Зміна волокна") -#define MSG_INIT_MEDIA _UxGT("Старт SD картки") -#define MSG_CHANGE_MEDIA _UxGT("Заміна SD карти") -#define MSG_ZPROBE_OUT _UxGT("Z дет. не в межах") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Само-Тест") -#define MSG_BLTOUCH_RESET _UxGT("Скинути BLTouch") -#define MSG_HOME_FIRST _UxGT("Дім %s%s%s перший") -#define MSG_ZPROBE_ZOFFSET _UxGT("Зміщення Z") -#define MSG_BABYSTEP_X _UxGT("Мікрокрок X") -#define MSG_BABYSTEP_Y _UxGT("Мікрокрок Y") -#define MSG_BABYSTEP_Z _UxGT("Мікрокрок Z") -#define MSG_ENDSTOP_ABORT _UxGT("невдача кінцевика") -#define MSG_HEATING_FAILED_LCD _UxGT("Невдалий нагрів") -#define MSG_THERMAL_RUNAWAY _UxGT("ЗБІЙ ТЕМПЕРАТУРИ") -#define MSG_ERR_Z_HOMING _UxGT("Дім XY перший") -#define MSG_HALTED _UxGT("ПРИНТЕР ЗУПИНЕНО") -#define MSG_PLEASE_RESET _UxGT("Перезавантажте") -#define MSG_SHORT_DAY _UxGT("д") // One character only -#define MSG_SHORT_HOUR _UxGT("г") // One character only -#define MSG_SHORT_MINUTE _UxGT("х") // One character only -#define MSG_HEATING _UxGT("Нагрівання...") -#define MSG_BED_HEATING _UxGT("Нагрівання столу...") -#define MSG_DELTA_CALIBRATE _UxGT("Калібр. Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Калібрування X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Калібрування Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Калібрування Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калібр. Центру") +namespace Language_uk { + using namespace Language_en; // Inherit undefined strings from English -#define MSG_INFO_MENU _UxGT("Про принтер") -#define MSG_INFO_PRINTER_MENU _UxGT("Інформація") -#define MSG_INFO_STATS_MENU _UxGT("Статистика") -#define MSG_INFO_BOARD_MENU _UxGT("Про плату") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Термістори") -#define MSG_INFO_EXTRUDERS _UxGT("Екструдери") -#define MSG_INFO_BAUDRATE _UxGT("біт/с") -#define MSG_INFO_PROTOCOL _UxGT("Протокол") -#define MSG_CASE_LIGHT _UxGT("Підсвітка") + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Ukranian"); -#define MSG_EXPECTED_PRINTER _UxGT("Неправильний принтер") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" готовий."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Картка вставлена"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Картка видалена"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимк. двигуни"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Авто паркування"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Паркування X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Паркування Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Паркування Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Паркування XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Почати"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Слідуюча Точка"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Завершено!"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Зберегти паркув."); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Зміщення застос."); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Встанов. початок"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Нагрів ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Нагрів ") PREHEAT_1_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Все"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" Стіл"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" нал."); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Нагрів ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Нагрів ") PREHEAT_2_LABEL " " LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Все"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" Стіл"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Нагрів ") PREHEAT_2_LABEL _UxGT(" нал."); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охолодження"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Увімкнути живлення"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живлення"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Екструзія"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Втягування"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Рух по осям"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Нівелювання столу"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Нівелювання столу"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Рух по X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Рух по Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Рух по Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Екструдер"); + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Екструдер ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Екструдер ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Екструдер ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Екструдер ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Екструдер ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Екструдер ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Рух по %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Швидкість"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Столу"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло"); + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Сопло ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Сопло ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Сопло ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Сопло ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Сопло ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Сопло ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = _UxGT("Стіл"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Охолодж."); + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Охолодж. 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Охолодж. 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Охолодж. 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Потік"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Потік ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Потік ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Потік ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Потік ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Потік ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Потік ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Налаштування"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Мін"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Макс"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Факт"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Автотемпер."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Увімк."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Вимк."); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Вибрати"); + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Вибрати ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Вибрати ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Вибрати ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Вибрати ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Вибрати ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Вибрати ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Приск."); + PROGMEM Language_Str MSG_JERK = _UxGT("Ривок"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-ривок"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-ривок"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-ривок"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-ривок"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vмакс") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vмакс") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vмакс") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vмакс") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vмакс ") LCD_STR_E0; + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vмакс ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vмакс ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vмакс ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vмакс ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vмакс ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("Vмін"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vруху мін"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aмакс ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aмакс ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aмакс ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aмакс ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Aмакс ") LCD_STR_E0; + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Aмакс ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Aмакс ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Aмакс ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Aмакс ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Aмакс ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-втягув."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-руху"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Кроків/мм"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Eкроків/мм"); + PROGMEM Language_Str MSG_E0_STEPS = LCD_STR_E0 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E1_STEPS = LCD_STR_E1 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E2_STEPS = LCD_STR_E2 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E3_STEPS = LCD_STR_E3 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E4_STEPS = LCD_STR_E4 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_E5_STEPS = LCD_STR_E5 _UxGT("кроків/мм"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Рух"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Волокно"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм3"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. волок."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Діам. волок. ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Діам. волок. ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Діам. волок. ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Діам. волок. ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Діам. волок. ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Діам. волок. ") LCD_STR_E5; + PROGMEM Language_Str MSG_CONTRAST = _UxGT("контраст LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Зберегти в ПЗП"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зчитати з ПЗП"); + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Відновити базові"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Поновити"); + PROGMEM Language_Str MSG_WATCH = _UxGT("Інформація"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Підготувати"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Підлаштування"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Призупинити друк"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Відновити друк"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Скасувати друк"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Друкувати з SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Відсутня SD карт."); + PROGMEM Language_Str MSG_DWELL = _UxGT("Сплячка..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Очікування дій..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Друк скасовано"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Немає руху."); + PROGMEM Language_Str MSG_KILLED = _UxGT("ПЕРЕРВАНО. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ЗУПИНЕНО. "); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Зміна волокна"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Зміна волокна ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Зміна волокна ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Зміна волокна ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Зміна волокна ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Зміна волокна ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Зміна волокна ") LCD_STR_E5; + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("Старт SD картки"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Заміна SD карти"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z дет. не в межах"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Само-Тест"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Скинути BLTouch"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Дім %s%s%s перший"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Зміщення Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("невдача кінцевика"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Невдалий нагрів"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ЗБІЙ ТЕМПЕРАТУРИ"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Дім XY перший"); + PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ЗУПИНЕНО"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("г"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("х"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Нагрівання..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрівання столу..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібр. Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрування X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрування Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калібрування Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. Центру"); -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("К-сть друків") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Завершено") - #define MSG_INFO_PRINT_TIME _UxGT("Весь час друку") - #define MSG_INFO_PRINT_LONGEST _UxGT("Найдовший час") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Екструдовано") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Друків") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Завершено") - #define MSG_INFO_PRINT_TIME _UxGT("Загалом") - #define MSG_INFO_PRINT_LONGEST _UxGT("Найдовший") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Ексдруд.") -#endif + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Про принтер"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Інформація"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Про плату"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Термістори"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Екструдери"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("біт/с"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Підсвітка"); -#define MSG_INFO_MIN_TEMP _UxGT("Мін Темп.") -#define MSG_INFO_MAX_TEMP _UxGT("Макс Темп.") -#define MSG_INFO_PSU _UxGT("Джерело жив.") + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("Неправильний принтер"); -#define MSG_DRIVE_STRENGTH _UxGT("Сила мотору") -#define MSG_DAC_PERCENT _UxGT("% мотору") -#define MSG_DAC_EEPROM_WRITE _UxGT("Запис ЦАП на ПЗП") + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("К-сть друків"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Весь час друку"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший час"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Екструдовано"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Друків"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Загалом"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Ексдруд."); + #endif -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Відновити друк") + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мін Темп."); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Макс Темп."); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Джерело жив."); -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Зачекайте на") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("початок заміни") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("волокна") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Зачекайте на") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("вивід волокна") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставте волокно") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("та натисніть для") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("продовження...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Зачекайте на") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("ввід волокна") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Зачекайте на") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("відновлення") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("друку") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Зачекайте...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Вивід...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставте і нат.") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ввід...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Відновлення...") -#endif // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила мотору"); + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("% мотору"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запис ЦАП на ПЗП"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Відновити друк"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте на", "початок заміни", "волокна")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте на", "вивід волокна")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставте волокно", "та натисніть для", "продовження...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Зачекайте на", "ввід волокна")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Зачекайте на", "відновлення", "друку")); + #else + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Зачекайте...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Вивід...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставте і нат.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ввід...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Відновлення...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 3b8885e707..abb96a58a1 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -28,410 +28,518 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ +namespace Language_vi { + using namespace Language_en; // Inherit undefined strings from English -#define CHARSIZE 2 + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Vietnamese"); -#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("àạậẵắấầđẻểếềìỉởộỗợúự") + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Sẵn sàng."); // Ready + PROGMEM Language_Str MSG_BACK = _UxGT("Trở lại"); // Back + PROGMEM Language_Str MSG_SD_INSERTED = _UxGT("Thẻ được cắm vào"); // Card inserted + PROGMEM Language_Str MSG_SD_REMOVED = _UxGT("Thẻ được rút ra"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // soft Endstops + PROGMEM Language_Str MSG_MAIN = _UxGT("Chính"); // Main + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Khởi chạy tự động"); // Autostart + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Tắt động cơ bước"); // Disable steppers + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu gỡ lỗi"); // Debug Menu + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến độ"); // Progress bar test + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Về nhà tự động"); // Auto home + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // home x + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // home y + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Chỉnh canh Z tự động"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Đang về nhà XYZ"); // Homing XYZ + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Nhấn để bắt đầu"); // Click to Begin + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Điểm tiếp theo"); // Next Point + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("San lấp được hoàn thành"); // Leveling Done! + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Chiều cao mờ dần"); // Fade Height + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Đặt bù đắp nhà"); // Set home offsets + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Bù đắp được áp dụng"); // Offsets applied + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Đặt nguồn gốc"); // Set origin + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N0; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N1; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N2; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N3; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N4; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ") LCD_STR_N5; // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N0; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N1; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N2; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N3; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N4; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trước ") LCD_STR_N5; // Preheat + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N0; + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N1; + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N2; + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N3; + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N4; + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Đầu ") LCD_STR_N5; + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Tất cả"); // all + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Cấu hình"); // conf + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Sự nóng trước tự chọn"); // Preheat Custom + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Nguội xuống"); // Cooldown + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bật nguồn"); // Switch power on + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Tắt nguồn"); // Switch power off + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ép đùn"); // Extrude + PROGMEM Language_Str MSG_RETRACT = _UxGT("Rút lại"); // Retract + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Di chuyển trục"); // Move axis + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("San Lấp Bàn"); // Bed Leveling + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Làm bằng mặt bàn"); // Level bed + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Làm bằng góc bàn"); // Level corners + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Góc tiếp theo"); // Next corner + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Chỉnh lưới đã dừng"); // Mesh Editing Stopped + PROGMEM Language_Str MSG_MESH_X = _UxGT("Mục lục X"); // Index X + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Mục lục Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Các lệnh tự chọn"); // Custom Commands + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Đang chạy G29"); // Doing G29 + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("chế độ IDEX"); // IDEX Mode + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Đậu tự động"); // Auto-Park + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Sự gấp đôi"); // Duplication + PROGMEM Language_Str MSG_IDEX_MODE_SCALED_COPY = _UxGT("Bản sao thu nhỏ"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Toàn quyền điều khiển"); // Full control + PROGMEM Language_Str MSG_IDEX_X_OFFSET = _UxGT("Đầu phun X nhì"); // 2nd nozzle X + PROGMEM Language_Str MSG_IDEX_Y_OFFSET = _UxGT("Đầu phun Y nhì"); + PROGMEM Language_Str MSG_IDEX_Z_OFFSET = _UxGT("Đầu phun Z nhì"); + PROGMEM Language_Str MSG_IDEX_SAVE_OFFSETS = _UxGT("Lưu bù đắp"); // Save offsets + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Tự xây dựng lưới"); // Manually Build Mesh + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Đặt chêm và đo"); // Place shim & measure + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Đo"); // Measure + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Tháo và đo bàn"); // Remove & measure bed + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // moving to next + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Bật UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Tắt UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Nhiệt độ bàn"); // Bed Temp + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nhiệt độ đầu phun"); // Hotend Temp + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Chỉnh sửa lưới"); // Mesh Edit + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Chỉnh sửa lưới tự chọn"); // Edit Custom Mesh + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Chỉnh lưới chính xác"); // Fine tuning mesh + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Chỉnh sửa xong lưới"); // Done Editing Mesh + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Xây dựng lưới tự chọn"); // Build Custom Mesh + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Xây dựng lưới"); // Build Mesh + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Xây dựng lưới (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Xây dựng lưới (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Xây dựng lưới lạnh"); // Build cold mesh + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Điều chỉnh chiều cao lưới"); // Adjust Mesh Height + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Số lượng chiều cao"); // Height Amount + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Thẩm tra lưới"); // Validate Mesh + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Thẩm tra lưới (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Thẩm tra lưới (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lưới tự chọn"); // validate custom mesh + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tiếp tục xây lưới bàn"); // Continue Bed Mesh + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Đang san lấp lưới"); // Mesh Leveling + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Đang san lấp 3-điểm"); // 3-Point Leveling + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Đang san lấp lưới phẳng"); // Grid (planar) Mesh Leveling + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Làm bằng lưới"); // Level Mesh + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Điểm bên cạnh"); // Side Points + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Loại bản đồ"); // Map Type + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Đầu ra bản đồ lưới"); // Output Mesh Map + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Đầu ra cho máy chủ"); // Output for Host + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Đầu ra cho CSV"); // Output for CSV + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Hỗ trợ lưới"); // Off Printer Backup | backup mesh + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Đầu ra thông tin UBL"); // Output UBL Info + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Chỉnh sửa lưới"); // Edit mesh + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Số lượng lấp đầy"); // Fill-in Amount + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Tự lấp đầy"); // Manual Fill-in + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Lấp đầy thông minh"); // Smart Fill-in + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Lưới lấp đầy"); // Fill-in Mesh + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Bác bỏ tất cả"); // Invalidate All + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Bác bỏ gần nhất"); // Invalidate Closest + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Chỉnh chính xác tất cả"); // Fine Tune ALl + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Chỉnh chính xác gần nhất"); // Fine Tune Closest + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Lưu trữ lưới"); // Mesh Storage + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Khe nhớ"); // Memory Slot + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Tải lưới bàn"); // Load Bed Mesh + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Lưu lưới bàn"); // Save Bed Mesh + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 %i lưới được nạp"); // Mesh %i loaded + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 %i lưới đã lưu"); + PROGMEM Language_Str MSG_NO_STORAGE = _UxGT("Không lưu trữ"); // No Storage + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Điều sai: Lưu UBL"); // Err: UBL Save + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Điều Sai: Khôi Phục UBL"); // Err: UBL Restore + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Đầu Dò-Z Đã Ngừng"); // Z-Offset Stopped + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Bước-Từng-Bước UBL"); // Step-By-Step UBL + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Xây dựng lưới lạnh"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Lấp đầy thông minh"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Thẩm tra lưới"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Chỉnh chính xác tất cả"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Thẩm tra lưới"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Chỉnh chính xác tất cả"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Lưu lưới bàn"); -#define WELCOME_MSG MACHINE_NAME _UxGT(" Sẵn sàng.") // Ready -#define MSG_BACK _UxGT("Trở lại") // Back -#define MSG_SD_INSERTED _UxGT("Thẻ được cắm vào") // Card inserted -#define MSG_SD_REMOVED _UxGT("Thẻ được rút ra") -#define MSG_LCD_ENDSTOPS _UxGT("Công tắc") // Endstops - công tắc hành trình -#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Công tắc mềm") // soft Endstops -#define MSG_MAIN _UxGT("Chính") // Main -#define MSG_ADVANCED_SETTINGS _UxGT("Thiết lập cấp cao") // Advanced Settings -#define MSG_CONFIGURATION _UxGT("Cấu hình") // Configuration -#define MSG_AUTOSTART _UxGT("Khởi chạy tự động") // Autostart -#define MSG_DISABLE_STEPPERS _UxGT("Tắt động cơ bước") // Disable steppers -#define MSG_DEBUG_MENU _UxGT("Menu gỡ lỗi") // Debug Menu -#define MSG_PROGRESS_BAR_TEST _UxGT("Kiểm tra tiến độ") // Progress bar test -#define MSG_AUTO_HOME _UxGT("Về nhà tự động") // Auto home -#define MSG_AUTO_HOME_X _UxGT("Về nhà X") // home x -#define MSG_AUTO_HOME_Y _UxGT("Về nhà Y") // home y -#define MSG_AUTO_HOME_Z _UxGT("Về nhà Z") -#define MSG_AUTO_Z_ALIGN _UxGT("Chỉnh canh Z tự động") -#define MSG_LEVEL_BED_HOMING _UxGT("Đang về nhà XYZ") // Homing XYZ -#define MSG_LEVEL_BED_WAITING _UxGT("Nhấn để bắt đầu") // Click to Begin -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Điểm tiếp theo") // Next Point -#define MSG_LEVEL_BED_DONE _UxGT("San lấp được hoàn thành") // Leveling Done! -#define MSG_Z_FADE_HEIGHT _UxGT("Chiều cao mờ dần") // Fade Height -#define MSG_SET_HOME_OFFSETS _UxGT("Đặt bù đắp nhà") // Set home offsets -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Bù đắp được áp dụng") // Offsets applied -#define MSG_SET_ORIGIN _UxGT("Đặt nguồn gốc") // Set origin -#define MSG_PREHEAT_1 _UxGT("Làm nóng " PREHEAT_1_LABEL " trước") // Preheat -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tất cả") // all -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Đầu") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Bàn") // bed -- using vietnamese term for 'table' instead -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Cấu hình") // conf -#define MSG_PREHEAT_2 _UxGT("Làm nóng " PREHEAT_2_LABEL " trước") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tất cả") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Đầu") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bàn") // bed -- using vietnamese term for 'table' instead -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Cấu hình") -#define MSG_PREHEAT_CUSTOM _UxGT("Sự nóng trước tự chọn") // Preheat Custom -#define MSG_COOLDOWN _UxGT("Nguội xuống") // Cooldown -#define MSG_SWITCH_PS_ON _UxGT("Bật nguồn") // Switch power on -#define MSG_SWITCH_PS_OFF _UxGT("Tắt nguồn") // Switch power off -#define MSG_EXTRUDE _UxGT("Ép đùn") // Extrude -#define MSG_RETRACT _UxGT("Rút lại") // Retract -#define MSG_MOVE_AXIS _UxGT("Di chuyển trục") // Move axis -#define MSG_BED_LEVELING _UxGT("San Lấp Bàn") // Bed Leveling -#define MSG_LEVEL_BED _UxGT("Làm bằng mặt bàn") // Level bed -#define MSG_LEVEL_CORNERS _UxGT("Làm bằng góc bàn") // Level corners -#define MSG_NEXT_CORNER _UxGT("Góc tiếp theo") // Next corner -#define MSG_EDITING_STOPPED _UxGT("Chỉnh lưới đã dừng") // Mesh Editing Stopped -#define MSG_MESH_X _UxGT("Mục lục X") // Index X -#define MSG_MESH_Y _UxGT("Mục lục Y") -#define MSG_MESH_EDIT_Z _UxGT("Giá trị Z") // Z Value -#define MSG_USER_MENU _UxGT("Các lệnh tự chọn") // Custom Commands -#define MSG_UBL_DOING_G29 _UxGT("Đang chạy G29") // Doing G29 -#define MSG_UBL_TOOLS _UxGT("Công cụ UBL") // UBL tools -#define MSG_UBL_LEVEL_BED _UxGT("San Lấp Bàn Thống Nhất (UBL)") // Unified Bed Leveling -#define MSG_IDEX_MENU _UxGT("chế độ IDEX") // IDEX Mode -#define MSG_IDEX_MODE_AUTOPARK _UxGT("Đậu tự động") // Auto-Park -#define MSG_IDEX_MODE_DUPLICATE _UxGT("Sự gấp đôi") // Duplication -#define MSG_IDEX_MODE_SCALED_COPY _UxGT("Bản sao thu nhỏ") -#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Toàn quyền điều khiển") // Full control -#define MSG_IDEX_X_OFFSET _UxGT("Đầu phun X nhì") // 2nd nozzle X -#define MSG_IDEX_Y_OFFSET _UxGT("Đầu phun Y nhì") -#define MSG_IDEX_Z_OFFSET _UxGT("Đầu phun Z nhì") -#define MSG_IDEX_SAVE_OFFSETS _UxGT("Lưu bù đắp") // Save offsets -#define MSG_UBL_MANUAL_MESH _UxGT("Tự xây dựng lưới") // Manually Build Mesh -#define MSG_UBL_BC_INSERT _UxGT("Đặt chêm và đo") // Place shim & measure -#define MSG_UBL_BC_INSERT2 _UxGT("Đo") // Measure -#define MSG_UBL_BC_REMOVE _UxGT("Tháo và đo bàn") // Remove & measure bed -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Chuyển sang tiếp theo") // moving to next -#define MSG_UBL_ACTIVATE_MESH _UxGT("Bật UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Tắt UBL") -#define MSG_UBL_SET_TEMP_BED _UxGT("Nhiệt độ bàn") // Bed Temp -#define MSG_UBL_BED_TEMP_CUSTOM MSG_UBL_SET_TEMP_BED -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("Nhiệt độ đầu phun") // Hotend Temp -#define MSG_UBL_HOTEND_TEMP_CUSTOM MSG_UBL_SET_TEMP_HOTEND -#define MSG_UBL_MESH_EDIT _UxGT("Chỉnh sửa lưới") // Mesh Edit -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Chỉnh sửa lưới tự chọn") // Edit Custom Mesh -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Chỉnh lưới chính xác") // Fine tuning mesh -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Chỉnh sửa xong lưới") // Done Editing Mesh -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Xây dựng lưới tự chọn") // Build Custom Mesh -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Xây dựng lưới") // Build Mesh -#define MSG_UBL_BUILD_MESH_M1 _UxGT("Xây dựng lưới (" PREHEAT_1_LABEL ")") -#define MSG_UBL_BUILD_MESH_M2 _UxGT("Xây dựng lưới (" PREHEAT_2_LABEL ")") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Xây dựng lưới lạnh") // Build cold mesh -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Điều chỉnh chiều cao lưới") // Adjust Mesh Height -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Số lượng chiều cao") // Height Amount -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Thẩm tra lưới") // Validate Mesh -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("Thẩm tra lưới (" PREHEAT_1_LABEL ")") -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("Thẩm tra lưới (" PREHEAT_2_LABEL ")") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Thẩm tra lưới tự chọn") // validate custom mesh -#define MSG_UBL_CONTINUE_MESH _UxGT("Tiếp tục xây lưới bàn") // Continue Bed Mesh -#define MSG_UBL_MESH_LEVELING _UxGT("Đang san lấp lưới") // Mesh Leveling -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Đang san lấp 3-điểm") // 3-Point Leveling -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Đang san lấp lưới phẳng") // Grid (planar) Mesh Leveling -#define MSG_UBL_MESH_LEVEL _UxGT("Làm bằng lưới") // Level Mesh -#define MSG_UBL_SIDE_POINTS _UxGT("Điểm bên cạnh") // Side Points -#define MSG_UBL_MAP_TYPE _UxGT("Loại bản đồ") // Map Type -#define MSG_UBL_OUTPUT_MAP _UxGT("Đầu ra bản đồ lưới") // Output Mesh Map -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Đầu ra cho máy chủ") // Output for Host -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Đầu ra cho CSV") // Output for CSV -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Hỗ trợ lưới") // Off Printer Backup | backup mesh -#define MSG_UBL_INFO_UBL _UxGT("Đầu ra thông tin UBL") // Output UBL Info -#define MSG_EDIT_MESH _UxGT("Chỉnh sửa lưới") // Edit mesh -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Số lượng lấp đầy") // Fill-in Amount -#define MSG_UBL_MANUAL_FILLIN _UxGT("Tự lấp đầy") // Manual Fill-in -#define MSG_UBL_SMART_FILLIN _UxGT("Lấp đầy thông minh") // Smart Fill-in -#define MSG_UBL_FILLIN_MESH _UxGT("Lưới lấp đầy") // Fill-in Mesh -#define MSG_UBL_INVALIDATE_ALL _UxGT("Bác bỏ tất cả") // Invalidate All -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Bác bỏ gần nhất") // Invalidate Closest -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Chỉnh chính xác tất cả") // Fine Tune ALl -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Chỉnh chính xác gần nhất") // Fine Tune Closest -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Lưu trữ lưới") // Mesh Storage -#define MSG_UBL_STORAGE_SLOT _UxGT("Khe nhớ") // Memory Slot -#define MSG_UBL_LOAD_MESH _UxGT("Tải lưới bàn") // Load Bed Mesh -#define MSG_UBL_SAVE_MESH _UxGT("Lưu lưới bàn") // Save Bed Mesh -#define MSG_MESH_LOADED _UxGT("%i lưới được nạp") // Mesh %i loaded -#define MSG_MESH_SAVED _UxGT("%i lưới đã lưu") -#define MSG_NO_STORAGE _UxGT("Không lưu trữ") // No Storage -#define MSG_UBL_SAVE_ERROR _UxGT("Điều sai: Lưu UBL") // Err: UBL Save -#define MSG_UBL_RESTORE_ERROR _UxGT("Điều Sai: Khôi Phục UBL") // Err: UBL Restore -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Đầu Dò-Z Đã Ngừng") // Z-Offset Stopped -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Bước-Từng-Bước UBL") // Step-By-Step UBL + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Điều khiển LED"); // LED Control + PROGMEM Language_Str MSG_LEDS = _UxGT("Đèn"); // Lights + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Đèn định sẵn"); // Light Presets + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Đỏ"); // Red + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Cam"); // Orange + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Vàng"); // Yellow + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Xanh Lá"); // Green + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Xanh"); // Blue + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Xanh Đậm"); // Indigo + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Tím"); // Violet + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Trắng"); // White + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Mặc định"); // Default + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Đèn Tự Chọn"); // Custom Lights + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Cường Độ Đỏ"); // Red Intensity + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Cường Độ Xanh Lá"); // Green Intensity + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Cường Độ Xanh"); // Blue Intensity + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Cường Độ Trắng"); // White Intensity + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("độ sáng"); // Brightness -#define MSG_LED_CONTROL _UxGT("Điều khiển LED") // LED Control -#define MSG_LEDS _UxGT("Đèn") // Lights -#define MSG_LED_PRESETS _UxGT("Đèn định sẵn") // Light Presets -#define MSG_SET_LEDS_RED _UxGT("Đỏ") // Red -#define MSG_SET_LEDS_ORANGE _UxGT("Cam") // Orange -#define MSG_SET_LEDS_YELLOW _UxGT("Vàng") // Yellow -#define MSG_SET_LEDS_GREEN _UxGT("Xanh Lá") // Green -#define MSG_SET_LEDS_BLUE _UxGT("Xanh") // Blue -#define MSG_SET_LEDS_INDIGO _UxGT("Xanh Đậm") // Indigo -#define MSG_SET_LEDS_VIOLET _UxGT("Tím") // Violet -#define MSG_SET_LEDS_WHITE _UxGT("Trắng") // White -#define MSG_SET_LEDS_DEFAULT _UxGT("Mặc định") // Default -#define MSG_CUSTOM_LEDS _UxGT("Đèn Tự Chọn") // Custom Lights -#define MSG_INTENSITY_R _UxGT("Cường Độ Đỏ") // Red Intensity -#define MSG_INTENSITY_G _UxGT("Cường Độ Xanh Lá") // Green Intensity -#define MSG_INTENSITY_B _UxGT("Cường Độ Xanh") // Blue Intensity -#define MSG_INTENSITY_W _UxGT("Cường Độ Trắng") // White Intensity -#define MSG_LED_BRIGHTNESS _UxGT("độ sáng") // Brightness + PROGMEM Language_Str MSG_MOVING = _UxGT("Di chuyển..."); // Moving + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Giải phóng XY"); // Free XY + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Di chuyển X"); // Move X + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Di chuyển Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Di chuyển Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Máy đùn"); // Extruder + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("Máy đùn ") LCD_STR_E0; // Extruder + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("Máy đùn ") LCD_STR_E1; // Extruder + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("Máy đùn ") LCD_STR_E2; // Extruder + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("Máy đùn ") LCD_STR_E3; // Extruder + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("Máy đùn ") LCD_STR_E4; // Extruder + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("Máy đùn ") LCD_STR_E5; // Extruder + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Đầu nóng quá lạnh"); // Hotend too cold + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Di chuyển 0.1mm"); // Move 0.1mm + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Di chuyển 1mm"); // Move 1mm + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Di chuyển 10mm"); // Move 10mm + PROGMEM Language_Str MSG_SPEED = _UxGT("Tốc độ"); // Speed + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Bàn"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle + PROGMEM Language_Str MSG_NOZZLE_0 = _UxGT("Đầu phun ") LCD_STR_N0; // Nozzle + PROGMEM Language_Str MSG_NOZZLE_1 = _UxGT("Đầu phun ") LCD_STR_N1; // Nozzle + PROGMEM Language_Str MSG_NOZZLE_2 = _UxGT("Đầu phun ") LCD_STR_N2; // Nozzle + PROGMEM Language_Str MSG_NOZZLE_3 = _UxGT("Đầu phun ") LCD_STR_N3; // Nozzle + PROGMEM Language_Str MSG_NOZZLE_4 = _UxGT("Đầu phun ") LCD_STR_N4; // Nozzle + PROGMEM Language_Str MSG_NOZZLE_5 = _UxGT("Đầu phun ") LCD_STR_N5; // Nozzle + PROGMEM Language_Str MSG_BED = _UxGT("Bàn"); // bed + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // fan speed + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("Tốc độ quạt 1"); // fan speed + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("Tốc độ quạt 2"); // fan speed + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("Tốc độ quạt 3"); // fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Tốc độ quạt phụ"); // Extra fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("Tốc độ quạt phụ 1"); // Extra fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("Tốc độ quạt phụ 2"); // Extra fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("Tốc độ quạt phụ 3"); // Extra fan speed + PROGMEM Language_Str MSG_FLOW = _UxGT("Lưu Lượng"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("Lưu Lượng ") LCD_STR_N0; + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("Lưu Lượng ") LCD_STR_N1; + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("Lưu Lượng ") LCD_STR_N2; + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("Lưu Lượng ") LCD_STR_N3; + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("Lưu Lượng ") LCD_STR_N4; + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("Lưu Lượng ") LCD_STR_N5; + PROGMEM Language_Str MSG_CONTROL = _UxGT("Điều khiển"); // Control + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // min + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // factor + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Nhiệt độ tự động"); // Autotemp + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Bật"); // on + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Tắt"); // off + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("Lựa"); // Select + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("Lựa ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("Lựa ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("Lựa ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("Lựa ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("Lựa ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("Lựa ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("Tăng Tốc"); + PROGMEM Language_Str MSG_JERK = _UxGT("Giật"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Giật-V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Giật-V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Giật-V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Giật-Ve"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Độ Lệch Chỗ Giao"); // Junction Dev + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Vận tốc"); // velocity + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vđa") LCD_STR_A; // Vmax + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vđa") LCD_STR_B; // Vmax + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vđa") LCD_STR_C; // Vmax + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vđa") LCD_STR_E; // Vmax + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("Vđa ") LCD_STR_E0; // Vmax + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("Vđa ") LCD_STR_E1; // Vmax + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("Vđa ") LCD_STR_E2; // Vmax + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("Vđa ") LCD_STR_E3; // Vmax + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("Vđa ") LCD_STR_E4; // Vmax + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("Vđa ") LCD_STR_E5; // Vmax + PROGMEM Language_Str MSG_VMIN = _UxGT("Vthiểu"); // Vmin + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vchuyển thiểu"); // VTrav min + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Sự tăng tốc"); // Acceleration + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Tăng tốc ca") LCD_STR_A; // Amax + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Tăng tốc ca") LCD_STR_B; // Amax + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Tăng tốc ca") LCD_STR_C; // Amax + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Tăng tốc ca") LCD_STR_E; // Amax + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("Tăng tốc ca ") LCD_STR_E0; // Amax + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("Tăng tốc ca ") LCD_STR_E1; // Amax + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("Tăng tốc ca ") LCD_STR_E2; // Amax + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("Tăng tốc ca ") LCD_STR_E3; // Amax + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("Tăng tốc ca ") LCD_STR_E4; // Amax + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("Tăng tốc ca ") LCD_STR_E5; // Amax + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bước") LCD_STR_A _UxGT("/mm"); // Asteps/mm + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bước") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bước") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("BướcE/mm"); + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("Bước ") LCD_STR_E0 _UxGT("/mm"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("Bước ") LCD_STR_E1 _UxGT("/mm"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("Bước ") LCD_STR_E2 _UxGT("/mm"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("Bước ") LCD_STR_E3 _UxGT("/mm"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("Bước ") LCD_STR_E4 _UxGT("/mm"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("Bước ") LCD_STR_E5 _UxGT("/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature + PROGMEM Language_Str MSG_MOTION = _UxGT("Chuyển động"); // Motion + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhựa + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm³"); // E in mm + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai. + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("Đường kính nhựa ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("Đường kính nhựa ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("Đường kính nhựa ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("Đường kính nhựa ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("Đường kính nhựa ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("Đường kính nhựa ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Nạp mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E0 = _UxGT("K Cấp Cao ") LCD_STR_E0; // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E1 = _UxGT("K Cấp Cao ") LCD_STR_E1; // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E2 = _UxGT("K Cấp Cao ") LCD_STR_E2; // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E3 = _UxGT("K Cấp Cao ") LCD_STR_E3; // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E4 = _UxGT("K Cấp Cao ") LCD_STR_E4; // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E5 = _UxGT("K Cấp Cao ") LCD_STR_E5; // Advance K + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("Khôi phục phòng hư"); // Restore failsafe + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM + PROGMEM Language_Str MSG_SD_UPDATE = _UxGT("Cập Nhật SD"); // SD Update + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Bặt Lại Máy In"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh + PROGMEM Language_Str MSG_WATCH = _UxGT("Màn Hình Thông Tin"); // Info screen + PROGMEM Language_Str MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare + PROGMEM Language_Str MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery + PROGMEM Language_Str MSG_CARD_MENU = _UxGT("In từ SD"); // Print from SD + PROGMEM Language_Str MSG_NO_CARD = _UxGT("Không có thẻ SD"); // No SD card + PROGMEM Language_Str MSG_DWELL = _UxGT("Ngủ..."); // Sleep + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue') + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // print paused + PROGMEM Language_Str MSG_PRINTING = _UxGT("Đang in..."); // printing + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move. + PROGMEM Language_Str MSG_KILLED = _UxGT("Đà CHẾT. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Đà NGỪNG. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Rút V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // UnRet mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S UnRet mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // AutoRetr. + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPD = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPD = _UxGT("Tốc Độ Rút Lại"); // Retract Speed + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("Thay dây nhựa ") LCD_STR_E0; // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("Thay dây nhựa ") LCD_STR_E1; // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("Thay dây nhựa ") LCD_STR_E2; // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("Thay dây nhựa ") LCD_STR_E3; // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("Thay dây nhựa ") LCD_STR_E4; // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("Thay dây nhựa ") LCD_STR_E5; // change filament + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("Nạp dây nhựa ") LCD_STR_E0; // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("Nạp dây nhựa ") LCD_STR_E1; // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("Nạp dây nhựa ") LCD_STR_E2; // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("Nạp dây nhựa ") LCD_STR_E3; // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("Nạp dây nhựa ") LCD_STR_E4; // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("Nạp dây nhựa ") LCD_STR_E5; // load filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("Dỡ dây nhựa ") LCD_STR_E0; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("Dỡ dây nhựa ") LCD_STR_E1; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("Dỡ dây nhựa ") LCD_STR_E2; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("Dỡ dây nhựa ") LCD_STR_E3; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("Dỡ dây nhựa ") LCD_STR_E4; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("Dỡ dây nhựa ") LCD_STR_E5; // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All + PROGMEM Language_Str MSG_INIT_SDCARD = _UxGT("Khởi tạo thẻ SD "); // Init. SD card + PROGMEM Language_Str MSG_CHANGE_SDCARD = _UxGT("Thay thẻ SD"); // Change SD card + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Về nhà %s%s%s Trước"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Nhít Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Nhít Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Hủy bỏ công tắc"); // Endstop abort + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Sưởi bàn không thành công"); // Bed heating failed + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Điều sai: nhiệt độ dư"); // Err: REDUNDANT TEMP + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Vấn đề nhiệt"); // THERMAL RUNAWAY | problem + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn đề nhiệt bàn"); // BED THERMAL RUNAWAY + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Điều sai: nhiệt độ bàn tối đa"); // Err: MAXTEMP BED + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Điều sai: nhiệt độ bàn tối thiểu"); // Err: MINTEMP BED + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Về nhà XY Trước"); // Home XY First + PROGMEM Language_Str MSG_HALTED = _UxGT("MÁY IN Đà DỪNG LẠI"); // PRINTER HALTED + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Đang sưởi nóng..."); // heating + PROGMEM Language_Str MSG_COOLING = _UxGT("Đang làm nguội..."); // cooling + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // bed heating + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // bed cooling + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Chỉnh X lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Chỉnh Y lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Chỉnh Z lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Đặt Chiều Cao Delta"); // Set Delta Height + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Đầu Dò Z-Bù Đắp"); // Probe Z-offset + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Về Máy In"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("In"); // prints + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // total + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Đã ép đùn"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("% trình điều khiển"); // Driver % + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("Nạp dây nhựa"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // continue + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle + PROGMEM Language_Str MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Quá lạnh"); -#define MSG_MOVING _UxGT("Di chuyển...") // Moving -#define MSG_FREE_XY _UxGT("Giải phóng XY") // Free XY -#define MSG_MOVE_X _UxGT("Di chuyển X") // Move X -#define MSG_MOVE_Y _UxGT("Di chuyển Y") -#define MSG_MOVE_Z _UxGT("Di chuyển Z") -#define MSG_MOVE_E _UxGT("Máy đùn") // Extruder -#define MSG_HOTEND_TOO_COLD _UxGT("Đầu nóng quá lạnh") // Hotend too cold -#define MSG_MOVE_01MM _UxGT("Di chuyển 0.1mm") // Move 0.1mm -#define MSG_MOVE_1MM _UxGT("Di chuyển 1mm") // Move 1mm -#define MSG_MOVE_10MM _UxGT("Di chuyển 10mm") // Move 10mm -#define MSG_SPEED _UxGT("Tốc độ") // Speed -#define MSG_BED_Z _UxGT("Z Bàn") -#define MSG_NOZZLE _UxGT("Đầu phun") // Nozzle -#define MSG_BED _UxGT("Bàn") // bed -#define MSG_FAN_SPEED _UxGT("Tốc độ quạt") // fan speed -#define MSG_EXTRA_FAN_SPEED _UxGT("Tốc độ quạt phụ") // Extra fan speed -#define MSG_FLOW _UxGT("Lưu Lượng") -#define MSG_CONTROL _UxGT("Điều khiển") // Control -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Đa") // min -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Thiểu") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Hệ Số") // factor -#define MSG_AUTOTEMP _UxGT("Nhiệt độ tự động") // Autotemp -#define MSG_LCD_ON _UxGT("Bật") // on -#define MSG_LCD_OFF _UxGT("Tắt") // off -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Lựa") // Select -#define MSG_ACC _UxGT("Tăng Tốc") -#define MSG_JERK _UxGT("Giật") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Giật-Va") - #define MSG_VB_JERK _UxGT("Giật-Vb") - #define MSG_VC_JERK _UxGT("Giật-Vc") -#else - #define MSG_VA_JERK _UxGT("Giật-Vx") - #define MSG_VB_JERK _UxGT("Giật-Vy") - #define MSG_VC_JERK _UxGT("Giật-Vz") -#endif -#define MSG_VE_JERK _UxGT("Giật-Ve") -#define MSG_JUNCTION_DEVIATION _UxGT("Độ Lệch Chỗ Giao") // Junction Dev -#define MSG_VELOCITY _UxGT("Vận tốc") // velocity -#define MSG_VMAX _UxGT("Vđa") // Vmax -#define MSG_VMIN _UxGT("Vthiểu") // Vmin -#define MSG_VTRAV_MIN _UxGT("Vchuyển thiểu") // VTrav min -#define MSG_ACCELERATION _UxGT("Sự tăng tốc") // Acceleration -#define MSG_AMAX _UxGT("Tăng tốc ca") // Amax -#define MSG_A_RETRACT _UxGT("TT-Rút") // A-retract -#define MSG_A_TRAVEL _UxGT("TT-Chuyển") // A-travel -#define MSG_STEPS_PER_MM _UxGT("Bước/mm") // Steps -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("BướcA/mm") // Asteps/mm - #define MSG_BSTEPS _UxGT("BướcB/mm") - #define MSG_CSTEPS _UxGT("BướcC/mm") -#else - #define MSG_ASTEPS _UxGT("BướcX/mm") // Xsteps/mm - #define MSG_BSTEPS _UxGT("BướcY/mm") - #define MSG_CSTEPS _UxGT("BướcZ/mm") -#endif -#define MSG_ESTEPS _UxGT("BướcE/mm") -#define MSG_E1STEPS _UxGT("BướcE1/mm") -#define MSG_E2STEPS _UxGT("BướcE2/mm") -#define MSG_E3STEPS _UxGT("BướcE3/mm") -#define MSG_E4STEPS _UxGT("BướcE4/mm") -#define MSG_E5STEPS _UxGT("BướcE5/mm") -#define MSG_E6STEPS _UxGT("BướcE6/mm") -#define MSG_TEMPERATURE _UxGT("Nhiệt độ") // Temperature -#define MSG_MOTION _UxGT("Chuyển động") // Motion -#define MSG_FILAMENT _UxGT("Vật liệu in") // dây nhựa -#define MSG_VOLUMETRIC_ENABLED _UxGT("E bằng mm") MSG_CUBED // E in mm -#define MSG_FILAMENT_DIAM _UxGT("Đường kính nhựa") // Fil. Dai. -#define MSG_FILAMENT_UNLOAD _UxGT("Dỡ mm") // unload mm -#define MSG_FILAMENT_LOAD _UxGT("Nạp mm") -#define MSG_ADVANCE_K _UxGT("K Cấp Cao") // Advance K -#define MSG_CONTRAST _UxGT("Độ tương phản LCD") // LCD contrast -#define MSG_STORE_EEPROM _UxGT("Lưu các thiết lập") // Store settings -#define MSG_LOAD_EEPROM _UxGT("Tải các cài đặt") // Load settings -#define MSG_RESTORE_FAILSAFE _UxGT("Khôi phục phòng hư") // Restore failsafe -#define MSG_INIT_EEPROM _UxGT("Khởi Tạo EEPROM") // Initialize EEPROM -#define MSG_SD_UPDATE _UxGT("Cập Nhật SD") // SD Update -#define MSG_RESET_PRINTER _UxGT("Bặt Lại Máy In") -#define MSG_REFRESH _UxGT("Cập Nhật") // Refresh -#define MSG_WATCH _UxGT("Màn Hình Thông Tin") // Info screen -#define MSG_PREPARE _UxGT("Chuẩn bị") // Prepare -#define MSG_TUNE _UxGT("Điều Chỉnh") // Tune -#define MSG_PAUSE_PRINT _UxGT("Tạm dừng in") // Pause print -#define MSG_RESUME_PRINT _UxGT("Tiếp tục in") // Resume print -#define MSG_STOP_PRINT _UxGT("Ngừng in") // Stop print -#define MSG_OUTAGE_RECOVERY _UxGT("Phục Hồi Mất Điện") // Outage Recovery -#define MSG_CARD_MENU _UxGT("In từ SD") // Print from SD -#define MSG_NO_CARD _UxGT("Không có thẻ SD") // No SD card -#define MSG_DWELL _UxGT("Ngủ...") // Sleep -#define MSG_USERWAIT _UxGT("Nhấn để tiếp tục...") // Click to resume (same as 'continue') -#define MSG_PRINT_PAUSED _UxGT("In tạm dừng") // print paused -#define MSG_PRINTING _UxGT("Đang in...") // printing -#define MSG_PRINT_ABORTED _UxGT("In đã hủy bỏ") // Print aborted -#define MSG_NO_MOVE _UxGT("Không di chuyển.") // No move. -#define MSG_KILLED _UxGT("Đà CHẾT. ") -#define MSG_STOPPED _UxGT("Đà NGỪNG. ") -#define MSG_CONTROL_RETRACT _UxGT("Rút mm") // Retract mm -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Rút Trao.mm") // Swap Re.mm -#define MSG_CONTROL_RETRACTF _UxGT("Rút V") -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Nhảy mm") // hop -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("BỏRút mm") // UnRet mm -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("BỏRút T mm") // S UnRet mm -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("BỏRút V") // UnRet V -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("BỏRút T V") // S UnRet V -#define MSG_AUTORETRACT _UxGT("RútTựĐộng") // AutoRetr. -#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Khoảng Cách Rút") // Retract Distance -#define MSG_TOOL_CHANGE _UxGT("Thay Đổi Công Cụ") // Tool Change -#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Đưa Lên Z") // Z Raise -#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Tốc Độ Tuôn Ra") // Prime Speed -#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Tốc Độ Rút Lại") // Retract Speed -#define MSG_FILAMENTCHANGE _UxGT("Thay dây nhựa") // change filament -#define MSG_FILAMENTLOAD _UxGT("Nạp dây nhựa") // load filament -#define MSG_FILAMENTUNLOAD _UxGT("Dỡ dây nhựa") // unload filament -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Dỡ tất cả") // Unload All -#define MSG_INIT_SDCARD _UxGT("Khởi tạo thẻ SD ") // Init. SD card -#define MSG_CHANGE_SDCARD _UxGT("Thay thẻ SD") // Change SD card -#define MSG_ZPROBE_OUT _UxGT("Đầu Dò Z qua bàn") // Z Probe past bed -#define MSG_SKEW_FACTOR _UxGT("Hệ số nghiêng") // Skew Factor -#define MSG_BLTOUCH _UxGT("BLTOUCH") // BLTouch -#define MSG_BLTOUCH_SELFTEST _UxGT("Tự kiểm tra BLTOUCH ") // BLTouch Self-Test -#define MSG_BLTOUCH_RESET _UxGT("Bặt lại BLTouch") // Reset BLTouch -#define MSG_BLTOUCH_DEPLOY _UxGT("Đem BLTouch") // Deploy BLTouch -#define MSG_BLTOUCH_STOW _UxGT("Cất BLTouch") // Stow BLTouch -#define MSG_MANUAL_DEPLOY _UxGT("Đem Đầu Dò-Z") // Deploy Z-Probe -#define MSG_MANUAL_STOW _UxGT("Cất Đầu Dò-Z") // Stow Z-Probe -#define MSG_HOME_FIRST _UxGT("Về nhà %s%s%s Trước") -#define MSG_ZPROBE_ZOFFSET _UxGT("Đầu Dò Bù Đắp Z") // Probe Z Offset -#define MSG_BABYSTEP_X _UxGT("Nhít X") // Babystep X -#define MSG_BABYSTEP_Y _UxGT("Nhít Y") -#define MSG_BABYSTEP_Z _UxGT("Nhít Z") -#define MSG_ENDSTOP_ABORT _UxGT("Hủy bỏ công tắc") // Endstop abort -#define MSG_HEATING_FAILED_LCD _UxGT("Sưởi đầu phun không thành công") // Heating failed -#define MSG_HEATING_FAILED_LCD_BED _UxGT("Sưởi bàn không thành công") // Bed heating failed -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Điều sai: nhiệt độ dư") // Err: REDUNDANT TEMP -#define MSG_THERMAL_RUNAWAY _UxGT("Vấn đề nhiệt") // THERMAL RUNAWAY | problem -#define MSG_THERMAL_RUNAWAY_BED _UxGT("Vấn đề nhiệt bàn") // BED THERMAL RUNAWAY -#define MSG_ERR_MAXTEMP _UxGT("Điều sai: nhiệt độ tối đa") // Err: MAXTEMP -#define MSG_ERR_MINTEMP _UxGT("Điều sai: nhiệt độ tối thiểu") // Err: MINTEMP -#define MSG_ERR_MAXTEMP_BED _UxGT("Điều sai: nhiệt độ bàn tối đa") // Err: MAXTEMP BED -#define MSG_ERR_MINTEMP_BED _UxGT("Điều sai: nhiệt độ bàn tối thiểu") // Err: MINTEMP BED -#define MSG_ERR_Z_HOMING _UxGT("Về nhà XY Trước") // Home XY First -#define MSG_HALTED _UxGT("MÁY IN Đà DỪNG LẠI") // PRINTER HALTED -#define MSG_PLEASE_RESET _UxGT("Xin bặt lại") // Please reset -#define MSG_SHORT_DAY _UxGT("n") // d - ngày - One character only -#define MSG_SHORT_HOUR _UxGT("g") // h - giờ - One character only -#define MSG_SHORT_MINUTE _UxGT("p") // m - phút - One character only -#define MSG_HEATING _UxGT("Đang sưởi nóng...") // heating -#define MSG_COOLING _UxGT("Đang làm nguội...") // cooling -#define MSG_BED_HEATING _UxGT("Đang sưởi nong bàn...") // bed heating -#define MSG_BED_COOLING _UxGT("Đang làm nguội bàn...") // bed cooling -#define MSG_DELTA_CALIBRATE _UxGT("Cân Chỉnh Delta") // Delta calibration -#define MSG_DELTA_CALIBRATE_X _UxGT("Chỉnh X lại") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Chỉnh Y lại") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Chỉnh Z lại") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Chỉnh Z Center") // Calibrate Center -#define MSG_DELTA_SETTINGS _UxGT("Cài Đặt Delta") // Delta Settings -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Cân Chỉnh Tự Động") // Auto Calibration -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Đặt Chiều Cao Delta") // Set Delta Height -#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Đầu Dò Z-Bù Đắp") // Probe Z-offset -#define MSG_DELTA_DIAG_ROD _UxGT("Gậy Chéo") // Diag Rod -#define MSG_DELTA_HEIGHT _UxGT("Chiều Cao") // Height -#define MSG_DELTA_RADIUS _UxGT("Bán Kính") // Radius -#define MSG_INFO_MENU _UxGT("Về Máy In") -#define MSG_INFO_PRINTER_MENU _UxGT("Thông Tin Máy In") // Printer Info -#define MSG_3POINT_LEVELING _UxGT("San lấp 3-Điểm") // 3-Point Leveling -#define MSG_LINEAR_LEVELING _UxGT("San Lấp Tuyến Tính") // Linear Leveling -#define MSG_BILINEAR_LEVELING _UxGT("San Lấp Song Tuyến") // Bilinear Leveling -#define MSG_UBL_LEVELING _UxGT("San Lấp Bàn Thống Nhất") // Unified Bed Leveling -#define MSG_MESH_LEVELING _UxGT("Lưới San Lấp") // Mesh Leveling -#define MSG_INFO_STATS_MENU _UxGT("Thống Kê Máy In") // Printer Stats -#define MSG_INFO_BOARD_MENU _UxGT("Thông Tin Bo Mạch") // Board Info -#define MSG_INFO_THERMISTOR_MENU _UxGT("Điện Trở Nhiệt") // Thermistors -#define MSG_INFO_EXTRUDERS _UxGT("Máy đùn") // Extruders -#define MSG_INFO_BAUDRATE _UxGT("Baud") // Baud -#define MSG_INFO_PROTOCOL _UxGT("Giao Thức") // Protocol -#define MSG_CASE_LIGHT _UxGT("Đèn Khuông") // Case light -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Độ Sáng") // Light Brightness -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Số In") // Print Count - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Đã hoàn thành") - #define MSG_INFO_PRINT_TIME _UxGT("Tổng số thời gian in") // Total print time - #define MSG_INFO_PRINT_LONGEST _UxGT("Thời gian việc lâu nhất") // Longest job time - #define MSG_INFO_PRINT_FILAMENT _UxGT("Tổng số đùn") // Extruded total -#else - #define MSG_INFO_PRINT_COUNT _UxGT("In") // prints - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Đã hoàn thành") // Completed - #define MSG_INFO_PRINT_TIME _UxGT("Tổng số") // total - #define MSG_INFO_PRINT_LONGEST _UxGT("Dài nhất") // Longest - #define MSG_INFO_PRINT_FILAMENT _UxGT("Đã ép đùn") -#endif -#define MSG_INFO_MIN_TEMP _UxGT("Nhiệt độ tối thiểu") // Min Temp -#define MSG_INFO_MAX_TEMP _UxGT("Nhiệt độ tối đa") // Max temp -#define MSG_INFO_PSU _UxGT("Bộ nguồn") // PSU -#define MSG_DRIVE_STRENGTH _UxGT("Sức mạnh ổ đĩa") // Drive Strength -#define MSG_DAC_PERCENT _UxGT("% trình điều khiển") // Driver % -#define MSG_DAC_EEPROM_WRITE _UxGT("Ghi DAC EEPROM") // DAC EEPROM Write -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("In tạm dừng") // PRINT PAUSED -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("Nạp dây nhựa") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("Dỡ dây nhựa") // unload filament -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Tùy chọn hồi phục:") // RESUME OPTIONS -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Xả thêm") // Purge more -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Tiếp tục") // continue -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Đầu Phun: ") // Nozzle -#define MSG_RUNOUT_SENSOR_ENABLE _UxGT("Cảm Biến Hết") // Runout Sensor -#define MSG_ERR_HOMING_FAILED _UxGT("Sự nhà không thành công") // Homing failed -#define MSG_ERR_PROBING_FAILED _UxGT(" không thành công") // Probing failed -#define MSG_M600_TOO_COLD _UxGT("M600: Quá lạnh") + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nhấn nút", "để tiếp tục in")); // Press button to resume print + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // wait for filament change to start + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // insert filament and press button to continue // + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nhấn nút", "để làm nóng đầu phun")); // Press button to heat nozzle + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Đầu phun đang nóng lên", "Xin chờ...")); // Nozzle heating Please wait + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // wait for filament purge + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Nhấn nút để kết thúc", "xả dây nhựa")); // Click to finish dây nhựa purge + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Chờ tro in", "tiếp tục...")); // Wait for print to resume + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Xin chờ...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming + #endif // LCD_HEIGHT < 4 -// -// Filament Change screens show up to 3 lines on a 4-line display -// ...or up to 2 lines on a 3-line display -// -#if LCD_HEIGHT >= 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Nhấn nút") // Press button - #define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("để tiếp tục in") // to resume print - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Chờ cho sự") // wait for - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("thay đổi dây nhựa") // filament change - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("bắt đầu") // to start - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Đút dây nhựa vào") // insert filament - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("và nhấn nút") // and press button - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("để tiếp tục") // to continue - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Nhấn nút") // Press button - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("để làm nóng đầu phun") // to heat nozzle - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Đầu phun đang nóng lên") // Nozzle heating - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Xin chờ...") // Please wait - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Chờ tro") // Wait for - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("dây nhựa ra") // filament unload - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Chờ tro") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("dây nhựa vào") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Chờ tro") // wait for filament purge - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("xả dây nhựa") - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Nhấn nút để kết thúc") // Click to finish - #define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("xả dây nhựa") // dây nhựa purge - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Chờ tro in") // Wait for print to resume - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("tiếp tục...") -#else // LCD_HEIGHT < 4 - #define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Nhấn nút để tiếp tục") // Click to continue - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Xin chờ...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Chèn và nhấn") // Insert and Click - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Nhấn để sưởi") // Click to heat - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Đang sưởi nóng") // Heating - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Đang dỡ ra...") // Ejecting - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Đang nạp...") // Loading - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Đang xả...") // Purging - #define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Nhấn nút để kết thúc") // Click to finish - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Đang tiếp tục...") // Resuming -#endif // LCD_HEIGHT < 4 - -#define MSG_TMC_DRIVERS _UxGT("Trình điều khiển TMC") // TMC drivers -#define MSG_TMC_CURRENT _UxGT("Dòng điện trình điều khiển") // Driver current -#define MSG_TMC_HYBRID_THRS _UxGT("Ngưỡng Hỗn Hợp") // Hybrid threshold -#define MSG_TMC_HOMING_THRS _UxGT("Vô cảm biến") // Sensorless homing -#define MSG_TMC_STEPPING_MODE _UxGT("Chế độ từng bước") // Stepping mode -#define MSG_TMC_STEALTH_ENABLED _UxGT("CắtTàngHình được kích hoạt") // StealthChop enabled + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled +} diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index a87f469a0e..a9286b0f48 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -28,357 +28,463 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ +namespace Language_zh_CN { + using namespace Language_en; // Inherit undefined strings from English -#define CHARSIZE 3 + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("Simplified Chinese"); -#define WELCOME_MSG MACHINE_NAME _UxGT("已就绪.") //" ready." -#define MSG_BACK _UxGT("返回") // ”Back“ -#define MSG_MEDIA_INSERTED _UxGT("存储卡已插入") //"Card inserted" -#define MSG_MEDIA_REMOVED _UxGT("存储卡被拔出") //"Card removed" -#define MSG_LCD_ENDSTOPS _UxGT("挡块") //"Endstops" // Max length 8 characters -#define MSG_MAIN _UxGT("主菜单") //"Main" -#define MSG_AUTOSTART _UxGT("自动开始") //"Autostart" -#define MSG_DISABLE_STEPPERS _UxGT("关闭步进电机") //"Disable steppers" -#define MSG_DEBUG_MENU _UxGT("调试菜单") // "Debug Menu" -#define MSG_PROGRESS_BAR_TEST _UxGT("进度条测试") // "Progress Bar Test" -#define MSG_AUTO_HOME _UxGT("回原点") //"Auto home" -#define MSG_AUTO_HOME_X _UxGT("回X原位") //"Home X" -#define MSG_AUTO_HOME_Y _UxGT("回Y原位") //"Home Y" -#define MSG_AUTO_HOME_Z _UxGT("回Z原位") //"Home Z" -#define MSG_LEVEL_BED_HOMING _UxGT("平台调平XYZ归原位") //"Homing XYZ" -#define MSG_LEVEL_BED_WAITING _UxGT("单击开始热床调平") //"Click to Begin" -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("下个热床调平点") //"Next Point" -#define MSG_LEVEL_BED_DONE _UxGT("完成热床调平") //"Leveling Done!" -#define MSG_Z_FADE_HEIGHT _UxGT("淡出高度") // "Fade Height" -#define MSG_SET_HOME_OFFSETS _UxGT("设置原点偏移") //"Set home offsets" -#define MSG_HOME_OFFSETS_APPLIED _UxGT("偏移已启用") //"Offsets applied" -#define MSG_SET_ORIGIN _UxGT("设置原点") //"Set origin" -#define MSG_PREHEAT_1 _UxGT("预热" PREHEAT_1_LABEL) //"Preheat PREHEAT_2_LABEL" -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") //MSG_PREHEAT_1 " " -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" 全部") //MSG_PREHEAT_1 " All" -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" 热床") //MSG_PREHEAT_1 " Bed" -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" 设置") //MSG_PREHEAT_1 " conf" -#define MSG_PREHEAT_2 _UxGT("预热" PREHEAT_2_LABEL) //"Preheat PREHEAT_2_LABEL" -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") //MSG_PREHEAT_2 " " -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" 全部") //MSG_PREHEAT_2 " All" -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" 热床") //MSG_PREHEAT_2 " Bed" -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" 设置") //MSG_PREHEAT_2 " conf" -#define MSG_COOLDOWN _UxGT("降温") //"Cooldown" -#define MSG_SWITCH_PS_ON _UxGT("电源打开") //"Switch power on" -#define MSG_SWITCH_PS_OFF _UxGT("电源关闭") //"Switch power off" -#define MSG_EXTRUDE _UxGT("挤出") //"Extrude" -#define MSG_RETRACT _UxGT("回抽") //"Retract" -#define MSG_MOVE_AXIS _UxGT("移动轴") //"Move axis" -#define MSG_BED_LEVELING _UxGT("调平热床") //"Bed leveling" -#define MSG_LEVEL_BED _UxGT("调平热床") //"Level bed" -#define MSG_LEVEL_CORNERS _UxGT("调平边角") // "Level corners" + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); //" ready." + PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // ”Back“ + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); //"Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); //"Card removed" + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("挡块"); //"Endstops" // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("主菜单"); //"Main" + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自动开始"); //"Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); //"Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("回原点"); //"Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原位"); //"Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原位"); //"Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原位"); //"Home Z" + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); //"Homing XYZ" + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); //"Click to Begin" + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); //"Next Point" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); //"Leveling Done!" + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); //"Set home offsets" + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); //"Offsets applied" + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("设置原点"); //"Set origin" + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N0; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N1; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N2; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N3; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N4; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("预热 ") PREHEAT_1_LABEL " " LCD_STR_N5; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N0; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N1; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N2; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N3; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N4; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ") LCD_STR_N5; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("预热 ") PREHEAT_2_LABEL; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N0; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N1; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N2; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N3; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N4; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("预热 ") PREHEAT_2_LABEL " " LCD_STR_N5; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N0; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N1; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N2; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N3; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N4; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ") LCD_STR_N5; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 全部"); //MSG_PREHEAT_2 " All" + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 热床"); //MSG_PREHEAT_2 " Bed" + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 设置"); //MSG_PREHEAT_2 " conf" + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("降温"); //"Cooldown" + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("电源打开"); //"Switch power on" + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("电源关闭"); //"Switch power off" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("挤出"); //"Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("回抽"); //"Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移动轴"); //"Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("调平热床"); //"Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("调平热床"); //"Level bed" + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("调平边角"); // "Level corners" -#define MSG_NEXT_CORNER _UxGT("下个边角") // "Next corner" -#define MSG_EDIT_MESH _UxGT("编辑网格") // "Edit Mesh" -#define MSG_EDITING_STOPPED _UxGT("网格编辑已停止") // "Mesh Editing Stopped" -#define MSG_USER_MENU _UxGT("定制命令") // "Custom Commands" + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner" + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh" + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped" + PROGMEM Language_Str MSG_USER_MENU = _UxGT("定制命令"); // "Custom Commands" -#define MSG_UBL_DOING_G29 _UxGT("执行G29") // "Doing G29" -#define MSG_UBL_TOOLS _UxGT("UBL工具") // "UBL Tools" -#define MSG_UBL_LEVEL_BED _UxGT("统一热床调平(UBL)") // "Unified Bed Leveling" -#define MSG_UBL_MANUAL_MESH _UxGT("手工创设网格") // "Manually Build Mesh" -#define MSG_UBL_BC_INSERT _UxGT("放置垫片并测量") // "Place shim & measure" -#define MSG_UBL_BC_INSERT2 _UxGT("测量") // "Measure" -#define MSG_UBL_BC_REMOVE _UxGT("移除并测量热床") // "Remove & measure bed" -#define MSG_UBL_MOVING_TO_NEXT _UxGT("移动到下一个") // "Moving to next" -#define MSG_UBL_ACTIVATE_MESH _UxGT("激活UBL") // "Activate UBL" -#define MSG_UBL_DEACTIVATE_MESH _UxGT("关闭UBL") // "Deactivate UBL" -#define MSG_UBL_SET_TEMP_BED _UxGT("设置热床温度") // "Bed Temp" -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("热端温度") // "Hotend Temp" -#define MSG_UBL_MESH_EDIT _UxGT("网格编辑") // "Mesh Edit" -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("编辑客户网格") // "Edit Custom Mesh" -#define MSG_UBL_FINE_TUNE_MESH _UxGT("细调网格") // "Fine Tuning Mesh" -#define MSG_UBL_DONE_EDITING_MESH _UxGT("完成编辑网格") // "Done Editing Mesh" -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("创设客户网格") // "Build Custom Mesh" -#define MSG_UBL_BUILD_MESH_MENU _UxGT("创设网格") // "Build Mesh" -#define MSG_UBL_BUILD_MESH_M1 _UxGT("创设" PREHEAT_1_LABEL "网格") // "Build PREHEAT_1_LABEL Mesh" -#define MSG_UBL_BUILD_MESH_M2 _UxGT("创设" PREHEAT_2_LABEL "网格") // "Build PREHEAT_2_LABEL Mesh" -#define MSG_UBL_BUILD_COLD_MESH _UxGT("创设冷网格") // "Build Cold Mesh" -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("调整网格高度") // "Adjust Mesh Height" -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("高度合计") // "Height Amount" -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("批准网格") // "Validate Mesh" -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("批准" PREHEAT_1_LABEL "网格") // "Validate PREHEAT_1_LABEL Mesh" -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("批准" PREHEAT_2_LABEL "网格") // "Validate PREHEAT_2_LABEL Mesh" -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("批准客户网格") // "Validate Custom Mesh" -#define MSG_UBL_CONTINUE_MESH _UxGT("继续热床网格") // "Continue Bed Mesh" -#define MSG_UBL_MESH_LEVELING _UxGT("网格调平") // "Mesh Leveling" -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("三点调平") // "3-Point Leveling" -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("格子网格调平") // "Grid Mesh Leveling" -#define MSG_UBL_MESH_LEVEL _UxGT("调平网格") // "Level Mesh" -#define MSG_UBL_SIDE_POINTS _UxGT("边点") // "Side Points" -#define MSG_UBL_MAP_TYPE _UxGT("图类型") // "Map Type" -#define MSG_UBL_OUTPUT_MAP _UxGT("输出网格图") // "Output Mesh Map" -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("输出到主机") // "Output for Host" -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("输出到CSV") // "Output for CSV" -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("输出到备份") // "Off Printer Backup" -#define MSG_UBL_INFO_UBL _UxGT("输出UBL信息") // "Output UBL Info" -#define MSG_UBL_FILLIN_AMOUNT _UxGT("填充合计") // "Fill-in Amount" -#define MSG_UBL_MANUAL_FILLIN _UxGT("手工填充") // "Manual Fill-in" -#define MSG_UBL_SMART_FILLIN _UxGT("聪明填充") // "Smart Fill-in" -#define MSG_UBL_FILLIN_MESH _UxGT("填充网格") // "Fill-in Mesh" -#define MSG_UBL_INVALIDATE_ALL _UxGT("作废所有的") // "Invalidate All" -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("作废最近的") // "Invalidate Closest" -#define MSG_UBL_FINE_TUNE_ALL _UxGT("细调所有的") // "Fine Tune All" -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("细调最近的") // "Fine Tune Closest" -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("网格存储") // "Mesh Storage" -#define MSG_UBL_STORAGE_SLOT _UxGT("存储槽") // "Memory Slot" -#define MSG_UBL_LOAD_MESH _UxGT("装载热床网格") // "Load Bed Mesh" -#define MSG_UBL_SAVE_MESH _UxGT("保存热床网格") // "Save Bed Mesh" -#define MSG_MESH_LOADED _UxGT("网格 %i 已装载") // "Mesh %i loaded" -#define MSG_MESH_SAVED _UxGT("网格 %i 已保存") // "Mesh %i saved" -#define MSG_UBL_NO_STORAGE _UxGT("没有存储") // "No storage" -#define MSG_UBL_SAVE_ERROR _UxGT("错误: UBL保存") // "Err: UBL Save" -#define MSG_UBL_RESTORE_ERROR _UxGT("错误: UBL还原") // "Err: UBL Restore" -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z偏移已停止") // "Z-Offset Stopped" -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("执行G29"); // "Doing G29" + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("手工创设网格"); // "Manually Build Mesh" + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("放置垫片并测量"); // "Place shim & measure" + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("测量"); // "Measure" + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("移除并测量热床"); // "Remove & measure bed" + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("移动到下一个"); // "Moving to next" + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("激活UBL"); // "Activate UBL" + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL" + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("设置热床温度"); // "Bed Temp" + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp" + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("网格编辑"); // "Mesh Edit" + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("编辑客户网格"); // "Edit Custom Mesh" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("细调网格"); // "Fine Tuning Mesh" + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("创设 ") PREHEAT_1_LABEL _UxGT(" 网格"); // "Build PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("创设 ") PREHEAT_2_LABEL _UxGT(" 网格"); // "Build PREHEAT_2_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh" + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height" + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合计"); // "Height Amount" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("批准 ") PREHEAT_1_LABEL _UxGT(" 网格"); // "Validate PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("批准 ") PREHEAT_2_LABEL _UxGT(" 网格"); // "Validate PREHEAT_2_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("继续热床网格"); // "Continue Bed Mesh" + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子网格调平"); // "Grid Mesh Leveling" + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("调平网格"); // "Level Mesh" + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("边点"); // "Side Points" + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("图类型"); // "Map Type" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("输出网格图"); // "Output Mesh Map" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("输出到主机"); // "Output for Host" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("输出到CSV"); // "Output for CSV" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup" + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "Output UBL Info" + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合计"); // "Fill-in Amount" + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("聪明填充"); // "Smart Fill-in" + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("填充网格"); // "Fill-in Mesh" + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("作废所有的"); // "Invalidate All" + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作废最近的"); // "Invalidate Closest" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("细调所有的"); // "Fine Tune All" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("细调最近的"); // "Fine Tune Closest" + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("网格存储"); // "Mesh Storage" + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("存储槽"); // "Memory Slot" + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("装载热床网格"); // "Load Bed Mesh" + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("保存热床网格"); // "Save Bed Mesh" + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 网格 %i 已装载"); // "Mesh %i loaded" + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 网格 %i 已保存"); // "Mesh %i saved" + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage" + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save" + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore" + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 创设冷网格"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聪明填充"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准网格"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 细调所有的"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准网格"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 细调所有的"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存热床网格"); -#define MSG_LED_CONTROL _UxGT("灯管控制") // "LED Control") -#define MSG_LEDS _UxGT("灯") // "Lights") -#define MSG_LED_PRESETS _UxGT("灯预置") // "Light Presets") -#define MSG_SET_LEDS_RED _UxGT("红") // "Red") -#define MSG_SET_LEDS_ORANGE _UxGT("橙") // "Orange") -#define MSG_SET_LEDS_YELLOW _UxGT("黄") // "Yellow") -#define MSG_SET_LEDS_GREEN _UxGT("绿") // "Green") -#define MSG_SET_LEDS_BLUE _UxGT("蓝") // "Blue") -#define MSG_SET_LEDS_INDIGO _UxGT("青") // "Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("紫") // "Violet") -#define MSG_SET_LEDS_WHITE _UxGT("白") // "White") -#define MSG_SET_LEDS_DEFAULT _UxGT("缺省") // "Default") -#define MSG_CUSTOM_LEDS _UxGT("定制灯") // "Custom Lights") -#define MSG_INTENSITY_R _UxGT("红饱和度") // "Red Intensity") -#define MSG_INTENSITY_G _UxGT("绿饱和度") // "Green Intensity") -#define MSG_INTENSITY_B _UxGT("蓝饱和度") // "Blue Intensity") -#define MSG_INTENSITY_W _UxGT("白饱和度") // "White Intensity") -#define MSG_LED_BRIGHTNESS _UxGT("亮度") // "Brightness") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("灯管控制"); // "LED Control") + PROGMEM Language_Str MSG_LEDS = _UxGT("灯"); // "Lights") + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("灯预置"); // "Light Presets") + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("红"); // "Red") + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange") + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("黄"); // "Yellow") + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("绿"); // "Green") + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("蓝"); // "Blue") + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo") + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet") + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("白"); // "White") + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default") + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("定制灯"); // "Custom Lights") + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("红饱和度"); // "Red Intensity") + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("绿饱和度"); // "Green Intensity") + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("蓝饱和度"); // "Blue Intensity") + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity") + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness") -#define MSG_MOVING _UxGT("移动 ...") // "Moving...") -#define MSG_FREE_XY _UxGT("释放 XY") // "Free XY") -#define MSG_MOVE_X _UxGT("移动X") //"Move X" -#define MSG_MOVE_Y _UxGT("移动Y") //"Move Y" -#define MSG_MOVE_Z _UxGT("移动Z") //"Move Z" -#define MSG_MOVE_E _UxGT("挤出机") //"Extruder" -#define MSG_MOVE_Z_DIST _UxGT("移动 %s mm") //"Move 0.025mm" -#define MSG_MOVE_01MM _UxGT("移动 0.1 mm") //"Move 0.1mm" -#define MSG_MOVE_1MM _UxGT("移动 1 mm") //"Move 1mm" -#define MSG_MOVE_10MM _UxGT("移动 10 mm") //"Move 10mm" -#define MSG_SPEED _UxGT("速率") //"Speed" -#define MSG_BED_Z _UxGT("热床Z") //"Bed Z" -#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 喷嘴") //"Nozzle" 噴嘴 -#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 热床") //"Bed" -#define MSG_FAN_SPEED _UxGT("风扇速率") //"Fan speed" -#define MSG_EXTRA_FAN_SPEED _UxGT("额外风扇速率") // "Extra fan speed" -#define MSG_FLOW _UxGT("挤出速率") //"Flow" -#define MSG_CONTROL _UxGT("控制") //"Control" -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最小") //" " LCD_STR_THERMOMETER " Min" -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最大") //" " LCD_STR_THERMOMETER " Max" -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 因数") //" " LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP _UxGT("自动控温") //"Autotemp" -#define MSG_LCD_ON _UxGT("开") //"On" -#define MSG_LCD_OFF _UxGT("关") //"Off" -#define MSG_PID_P _UxGT("PID-P") //"PID-P" -#define MSG_PID_I _UxGT("PID-I") //"PID-I" -#define MSG_PID_D _UxGT("PID-D") //"PID-D" -#define MSG_PID_C _UxGT("PID-C") //"PID-C" -#define MSG_SELECT _UxGT("选择") //"Select" -#define MSG_ACC _UxGT("加速度") //"Accel" acceleration -#define MSG_JERK _UxGT("抖动速率") // "Jerk" -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("A轴抖动速率") //"Va-jerk" - #define MSG_VB_JERK _UxGT("B轴抖动速率") //"Vb-jerk" - #define MSG_VC_JERK _UxGT("C轴抖动速率") //"Vc-jerk" -#else - #define MSG_VA_JERK _UxGT("X轴抖动速率") //"Vx-jerk" - #define MSG_VB_JERK _UxGT("Y轴抖动速率") //"Vy-jerk" - #define MSG_VC_JERK _UxGT("Z轴抖动速率") //"Vz-jerk" -#endif -#define MSG_VE_JERK _UxGT("挤出机抖动速率") //"Ve-jerk" -#define MSG_VELOCITY _UxGT("速度") // "Velocity" -#define MSG_VMAX _UxGT("最大进料速率") //"Vmax " max_feedrate_mm_s -#define MSG_VMIN _UxGT("最小进料速率") //"Vmin" min_feedrate_mm_s -#define MSG_VTRAV_MIN _UxGT("最小移动速率") //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move -#define MSG_ACCELERATION _UxGT("加速度") // "Acceleration" -#define MSG_AMAX _UxGT("最大打印加速度") //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves -#define MSG_A_RETRACT _UxGT("收进加速度") //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts -#define MSG_A_TRAVEL _UxGT("非打印移动加速度") //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves -#define MSG_STEPS_PER_MM _UxGT("轴步数/mm") //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A轴步数/mm") //"Asteps/mm" - #define MSG_BSTEPS _UxGT("B轴步数/mm") //"Bsteps/mm" - #define MSG_CSTEPS _UxGT("C轴步数/mm") //"Csteps/mm" -#else - #define MSG_ASTEPS _UxGT("X轴步数/mm") //"Xsteps/mm" - #define MSG_BSTEPS _UxGT("Y轴步数/mm") //"Ysteps/mm" - #define MSG_CSTEPS _UxGT("Z轴步数/mm") //"Zsteps/mm" -#endif -#define MSG_ESTEPS _UxGT("挤出机步数/mm") //"Esteps/mm" -#define MSG_E1STEPS _UxGT("挤出机1步数/mm") //"E1steps/mm" -#define MSG_E2STEPS _UxGT("挤出机2步数/mm") //"E2steps/mm" -#define MSG_E3STEPS _UxGT("挤出机3步数/mm") //"E3steps/mm" -#define MSG_E4STEPS _UxGT("挤出机4步数/mm") //"E4steps/mm" -#define MSG_E5STEPS _UxGT("挤出机5步数/mm") //"E5steps/mm" -#define MSG_E6STEPS _UxGT("挤出机6步数/mm") //"E6steps/mm" -#define MSG_TEMPERATURE _UxGT("温度") //"Temperature" -#define MSG_MOTION _UxGT("运动") //"Motion" -#define MSG_FILAMENT _UxGT("丝料测容") //"Filament" menu_advanced_filament -#define MSG_VOLUMETRIC_ENABLED _UxGT("测容积mm³") //"E in mm3" volumetric_enabled -#define MSG_FILAMENT_DIAM _UxGT("丝料直径") //"Fil. Dia." -#define MSG_FILAMENT_UNLOAD _UxGT("卸载 mm") // "Unload mm" -#define MSG_FILAMENT_LOAD _UxGT("装载 mm") // "Load mm" -#define MSG_ADVANCE_K _UxGT("Advance K") // "Advance K" -#define MSG_CONTRAST _UxGT("LCD对比度") //"LCD contrast" -#define MSG_STORE_EEPROM _UxGT("保存设置") //"Store memory" -#define MSG_LOAD_EEPROM _UxGT("装载设置") //"Load memory" -#define MSG_RESTORE_FAILSAFE _UxGT("恢复安全值") //"Restore failsafe" -#define MSG_INIT_EEPROM _UxGT("初始化设置") // "Initialize EEPROM" -#define MSG_REFRESH _UxGT("刷新") //"Refresh" -#define MSG_WATCH _UxGT("信息屏") //"Info screen" -#define MSG_PREPARE _UxGT("准备") //"Prepare" -#define MSG_TUNE _UxGT("调整") //"Tune" -#define MSG_PAUSE_PRINT _UxGT("暂停打印") //"Pause print" -#define MSG_RESUME_PRINT _UxGT("恢复打印") //"Resume print" -#define MSG_STOP_PRINT _UxGT("停止打印") //"Stop print" -#define MSG_MEDIA_MENU _UxGT("从存储卡上打印") //"Print from SD" -#define MSG_NO_MEDIA _UxGT("无存储卡") //"No SD card" -#define MSG_DWELL _UxGT("休眠中 ...") //"Sleep..." -#define MSG_USERWAIT _UxGT("点击继续 ...") //"Click to resume..." -#define MSG_PRINT_PAUSED _UxGT("暫停打印") // "Print paused" -#define MSG_PRINT_ABORTED _UxGT("已取消打印") //"Print aborted" -#define MSG_NO_MOVE _UxGT("无移动") //"No move." -#define MSG_KILLED _UxGT("已杀掉") //"KILLED. " -#define MSG_STOPPED _UxGT("已停止") //"STOPPED. " -#define MSG_CONTROL_RETRACT _UxGT("回抽长度mm") //"Retract mm" retract_length, retract length (positive mm) -#define MSG_CONTROL_RETRACT_SWAP _UxGT("换手回抽长度mm") //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change -#define MSG_CONTROL_RETRACTF _UxGT("回抽速率mm/s") //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") //"Hop mm" retract_zraise, retract Z-lift -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("回抽恢复长度mm") //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("换手回抽恢复长度mm") //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("回抽恢复后进料速率mm/s") //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") // "S UnRet V" -#define MSG_AUTORETRACT _UxGT("自动抽回") //"AutoRetr." autoretract_enabled, -#define MSG_FILAMENTCHANGE _UxGT("更换丝料") //"Change filament" -#define MSG_FILAMENTLOAD _UxGT("装载丝料") // "Load filament" -#define MSG_FILAMENTUNLOAD _UxGT("卸载丝料") // "Unload filament" -#define MSG_FILAMENTUNLOAD_ALL _UxGT("卸载全部") // "Unload All" -#define MSG_INIT_MEDIA _UxGT("初始化存储卡") //"Init. SD card" -#define MSG_CHANGE_MEDIA _UxGT("更换存储卡") //"Change SD card" -#define MSG_ZPROBE_OUT _UxGT("Z探针在热床之外") //"Z probe out. bed" Z probe is not within the physical limits -#define MSG_SKEW_FACTOR _UxGT("偏斜因数") // "Skew Factor" -#define MSG_BLTOUCH _UxGT("BLTouch") // "BLTouch" -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch 自检") // "BLTouch Self-Test" -#define MSG_BLTOUCH_RESET _UxGT("重置BLTouch") // "Reset BLTouch" -#define MSG_BLTOUCH_DEPLOY _UxGT("部署BLTouch") // "Deploy BLTouch" -#define MSG_BLTOUCH_STOW _UxGT("装载BLTouch") // "Stow BLTouch" -#define MSG_HOME_FIRST _UxGT("归位 %s%s%s 先") //"Home ... first" -#define MSG_ZPROBE_ZOFFSET _UxGT("Z偏移") //"Z Offset" -#define MSG_BABYSTEP_X _UxGT("微量调整X轴") //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts -#define MSG_BABYSTEP_Y _UxGT("微量调整Y轴") //"Babystep Y" -#define MSG_BABYSTEP_Z _UxGT("微量调整Z轴") //"Babystep Z" -#define MSG_ENDSTOP_ABORT _UxGT("挡块终止") //"Endstop abort" -#define MSG_HEATING_FAILED_LCD _UxGT("加热失败") //"Heating failed" -#define MSG_ERR_REDUNDANT_TEMP _UxGT("错误:REDUNDANT TEMP") //"Err: REDUNDANT TEMP" -#define MSG_THERMAL_RUNAWAY _UxGT("温控失控") //"THERMAL RUNAWAY" -#define MSG_ERR_MAXTEMP _UxGT("错误:最高温度") //"Err: MAXTEMP" -#define MSG_ERR_MINTEMP _UxGT("错误:最低温度") //"Err: MINTEMP" -#define MSG_ERR_MAXTEMP_BED _UxGT("错误:最高热床温度") //"Err: MAXTEMP BED" -#define MSG_ERR_MINTEMP_BED _UxGT("错误:最低热床温度") //"Err: MINTEMP BED" -#define MSG_ERR_Z_HOMING _UxGT("归位 XY 先") // "Home XY First" -#define MSG_HALTED _UxGT("打印停机") //"PRINTER HALTED" -#define MSG_PLEASE_RESET _UxGT("请重置") //"Please reset" -#define MSG_SHORT_DAY _UxGT("天") //"d" // One character only -#define MSG_SHORT_HOUR _UxGT("时") //"h" // One character only -#define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only -#define MSG_HEATING _UxGT("加热中 ...") //"Heating..." -#define MSG_BED_HEATING _UxGT("加热热床中 ...") //"Bed Heating..." -#define MSG_DELTA_CALIBRATE _UxGT("⊿校准") //"Delta Calibration" -#define MSG_DELTA_CALIBRATE_X _UxGT("⊿校准X") //"Calibrate X" -#define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校准Y") //"Calibrate Y" -#define MSG_DELTA_CALIBRATE_Z _UxGT("⊿校准Z") //"Calibrate Z" -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("⊿校准中心") //"Calibrate Center" -#define MSG_DELTA_SETTINGS _UxGT("⊿设置") // "Delta Settings" -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("⊿自动校准") // "Auto Calibration" -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("设置⊿高度") // "Set Delta Height" -#define MSG_DELTA_DIAG_ROD _UxGT("⊿斜柱") // "Diag Rod" -#define MSG_DELTA_HEIGHT _UxGT("⊿高度") // "Height" -#define MSG_DELTA_RADIUS _UxGT("⊿半径") // "Radius" -#define MSG_INFO_MENU _UxGT("关于打印机") //"About Printer" -#define MSG_INFO_PRINTER_MENU _UxGT("打印机信息") //"Printer Info" -#define MSG_3POINT_LEVELING _UxGT("三点调平") // "3-Point Leveling" -#define MSG_LINEAR_LEVELING _UxGT("线性调平") // "Linear Leveling" -#define MSG_BILINEAR_LEVELING _UxGT("双线性调平") // "Bilinear Leveling" -#define MSG_UBL_LEVELING _UxGT("统一热床调平(UBL)") // "Unified Bed Leveling" -#define MSG_MESH_LEVELING _UxGT("网格调平") // "Mesh Leveling" -#define MSG_INFO_STATS_MENU _UxGT("打印机统计") //"Printer Stats" -#define MSG_INFO_BOARD_MENU _UxGT("主板信息") //"Board Info" -#define MSG_INFO_THERMISTOR_MENU _UxGT("温度计") //"Thermistors" -#define MSG_INFO_EXTRUDERS _UxGT("挤出机") //"Extruders" -#define MSG_INFO_BAUDRATE _UxGT("波特率") //"Baud" -#define MSG_INFO_PROTOCOL _UxGT("协议") //"Protocol" -#define MSG_CASE_LIGHT _UxGT("外壳灯") // "Case light" -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("灯亮度") // "Light BRIGHTNESS" + PROGMEM Language_Str MSG_MOVING = _UxGT("移动 ..."); // "Moving...") + PROGMEM Language_Str MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY") + PROGMEM Language_Str MSG_MOVE_X = _UxGT("移动X"); //"Move X" + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移动Y"); //"Move Y" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移动Z"); //"Move Z" + PROGMEM Language_Str MSG_MOVE_E = _UxGT("挤出机"); //"Extruder" + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("挤出机 ") LCD_STR_E0; //"Extruder" + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("挤出机 ") LCD_STR_E1; //"Extruder" + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("挤出机 ") LCD_STR_E2; //"Extruder" + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("挤出机 ") LCD_STR_E3; //"Extruder" + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("挤出机 ") LCD_STR_E4; //"Extruder" + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("挤出机 ") LCD_STR_E5; //"Extruder" + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移动 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); //"Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移动 1 mm"); //"Move 1mm" + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移动 10 mm"); //"Move 10mm" + PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed" + PROGMEM Language_Str MSG_BED_Z = _UxGT("热床Z"); //"Bed Z" + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴"); //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_0 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N0; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_1 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N1; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_2 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N2; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_3 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N3; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_4 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N4; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_5 = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ") LCD_STR_N5; //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 热床"); //"Bed" + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("风扇速率"); //"Fan speed" + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("风扇速率 1"); //"Fan speed" + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("风扇速率 2"); //"Fan speed" + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("风扇速率 3"); //"Fan speed" + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("额外风扇速率"); // "Extra fan speed" + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("额外风扇速率 1"); // "Extra fan speed" + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("额外风扇速率 2"); // "Extra fan speed" + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("额外风扇速率 3"); // "Extra fan speed" + PROGMEM Language_Str MSG_FLOW = _UxGT("挤出速率"); //"Flow" + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("挤出速率 ") LCD_STR_N0; //"Flow" + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("挤出速率 ") LCD_STR_N1; //"Flow" + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("挤出速率 ") LCD_STR_N2; //"Flow" + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("挤出速率 ") LCD_STR_N3; //"Flow" + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("挤出速率 ") LCD_STR_N4; //"Flow" + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("挤出速率 ") LCD_STR_N5; //"Flow" + PROGMEM Language_Str MSG_CONTROL = _UxGT("控制"); //"Control" + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); //" " LCD_STR_THERMOMETER " Min" + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); //" " LCD_STR_THERMOMETER " Fact" + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("自动控温"); //"Autotemp" + PROGMEM Language_Str MSG_LCD_ON = _UxGT("开"); //"On" + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("关"); //"Off" + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); //"PID-P" + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); //"PID-I" + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); //"PID-D" + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); //"PID-C" + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("选择"); //"Select" + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("选择 ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("选择 ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("选择 ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("选择 ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("选择 ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("选择 ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration + PROGMEM Language_Str MSG_JERK = _UxGT("抖动速率"); // "Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("轴抖动速率") LCD_STR_A; //"Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("轴抖动速率") LCD_STR_B; //"Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("轴抖动速率") LCD_STR_C; //"Vc-jerk" + PROGMEM Language_Str MSG_VE_JERK = _UxGT("挤出机抖动速率"); //"Ve-jerk" + PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大进料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_B = _UxGT("最大进料速率") LCD_STR_B; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_C = _UxGT("最大进料速率") LCD_STR_C; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E = _UxGT("最大进料速率") LCD_STR_E; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("最大进料速率 ") LCD_STR_E0; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("最大进料速率 ") LCD_STR_E1; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("最大进料速率 ") LCD_STR_E2; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("最大进料速率 ") LCD_STR_E3; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("最大进料速率 ") LCD_STR_E4; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("最大进料速率 ") LCD_STR_E5; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMIN = _UxGT("最小进料速率"); //"Vmin" min_feedrate_mm_s + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移动速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大打印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_B = _UxGT("最大打印加速度") LCD_STR_B; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_C = _UxGT("最大打印加速度") LCD_STR_C; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E = _UxGT("最大打印加速度") LCD_STR_E; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("最大打印加速度 ") LCD_STR_E0; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("最大打印加速度 ") LCD_STR_E1; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("最大打印加速度 ") LCD_STR_E2; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("最大打印加速度 ") LCD_STR_E3; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("最大打印加速度 ") LCD_STR_E4; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("最大打印加速度 ") LCD_STR_E5; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("收进加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非打印移动加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("轴步数/mm"); //"Asteps/mm" + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("轴步数/mm"); //"Bsteps/mm" + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("轴步数/mm"); //"Csteps/mm" + PROGMEM Language_Str MSG_E_STEPS = _UxGT("挤出机步数/mm"); //"Esteps/mm" + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("挤出机") LCD_STR_N0 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("挤出机") LCD_STR_N1 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("挤出机") LCD_STR_N2 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("挤出机") LCD_STR_N3 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("挤出机") LCD_STR_N4 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("挤出机") LCD_STR_N5 _UxGT("步数/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("温度"); //"Temperature" + PROGMEM Language_Str MSG_MOTION = _UxGT("运动"); //"Motion" + PROGMEM Language_Str MSG_FILAMENT = _UxGT("丝料测容"); //"Filament" menu_advanced_filament + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("测容积mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("丝料直径"); //"Fil. Dia." + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("丝料直径 ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("丝料直径 ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("丝料直径 ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("丝料直径 ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("丝料直径 ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("丝料直径 ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("卸载 mm"); // "Unload mm" + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "Load mm" + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD对比度"); //"LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存设置"); //"Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("装载设置"); //"Load memory" + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("恢复安全值"); //"Restore failsafe" + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("初始化设置"); // "Initialize EEPROM" + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新"); //"Refresh" + PROGMEM Language_Str MSG_WATCH = _UxGT("信息屏"); //"Info screen" + PROGMEM Language_Str MSG_PREPARE = _UxGT("准备"); //"Prepare" + PROGMEM Language_Str MSG_TUNE = _UxGT("调整"); //"Tune" + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("暂停打印"); //"Pause print" + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("恢复打印"); //"Resume print" + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("停止打印"); //"Stop print" + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("从存储卡上打印"); //"Print from SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("无存储卡"); //"No SD card" + PROGMEM Language_Str MSG_DWELL = _UxGT("休眠中 ..."); //"Sleep..." + PROGMEM Language_Str MSG_USERWAIT = _UxGT("点击继续 ..."); //"Click to resume..." + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("暫停打印"); // "Print paused" + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("已取消打印"); //"Print aborted" + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("无移动"); //"No move." + PROGMEM Language_Str MSG_KILLED = _UxGT("已杀掉"); //"KILLED. " + PROGMEM Language_Str MSG_STOPPED = _UxGT("已停止"); //"STOPPED. " + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); //"Retract mm" retract_length, retract length (positive mm) + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自动抽回"); //"AutoRetr." autoretract_enabled, + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("更换丝料"); //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("更换丝料 ") LCD_STR_E0; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("更换丝料 ") LCD_STR_E1; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("更换丝料 ") LCD_STR_E2; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("更换丝料 ") LCD_STR_E3; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("更换丝料 ") LCD_STR_E4; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("更换丝料 ") LCD_STR_E5; //"Change filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("装载丝料 ") LCD_STR_E0; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("装载丝料 ") LCD_STR_E1; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("装载丝料 ") LCD_STR_E2; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("装载丝料 ") LCD_STR_E3; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("装载丝料 ") LCD_STR_E4; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("装载丝料 ") LCD_STR_E5; // "Load filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("卸载丝料 ") LCD_STR_E0; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("卸载丝料 ") LCD_STR_E1; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("卸载丝料 ") LCD_STR_E2; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("卸载丝料 ") LCD_STR_E3; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("卸载丝料 ") LCD_STR_E4; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("卸载丝料 ") LCD_STR_E5; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All" + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("初始化存储卡"); //"Init. SD card" + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); //"Change SD card" + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); //"Z probe out. bed" Z probe is not within the physical limits + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("偏斜因数"); // "Skew Factor" + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自检"); // "BLTouch Self-Test" + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("装载BLTouch"); // "Stow BLTouch" + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("归位 %s%s%s 先"); //"Home ... first" + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z偏移"); //"Z Offset" + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量调整X轴"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); //"Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); //"Babystep Z" + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("挡块终止"); //"Endstop abort" + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); //"Heating failed" + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:REDUNDANT TEMP"); //"Err: REDUNDANT TEMP" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); //"THERMAL RUNAWAY" + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); //"Err: MAXTEMP" + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); //"Err: MINTEMP" + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("错误:最高热床温度"); //"Err: MAXTEMP BED" + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("错误:最低热床温度"); //"Err: MINTEMP BED" + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("归位 XY 先"); // "Home XY First" + PROGMEM Language_Str MSG_HALTED = _UxGT("打印停机"); //"PRINTER HALTED" + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("请重置"); //"Please reset" + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("时"); //"h" // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("分"); //"m" // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("加热中 ..."); //"Heating..." + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("加热热床中 ..."); //"Bed Heating..." + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); //"Delta Calibration" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); //"Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); //"Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); //"Calibrate Z" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校准中心"); //"Calibrate Center" + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("⊿设置"); // "Delta Settings" + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自动校准"); // "Auto Calibration" + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("设置⊿高度"); // "Set Delta Height" + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("关于打印机"); //"About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); //"Printer Info" + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling" + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling" + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("打印机统计"); //"Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板信息"); //"Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); //"Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("挤出机"); //"Extruders" + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("波特率"); //"Baud" + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("协议"); //"Protocol" + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("外壳灯"); // "Case light" + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("灯亮度"); // "Light BRIGHTNESS" -#define MSG_EXPECTED_PRINTER _UxGT("打印机不正确") // "The printer is incorrect" + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("打印机不正确"); // "The printer is incorrect" -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("打印计数") //"Print Count" - #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成了") //"Completed" - #define MSG_INFO_PRINT_TIME _UxGT("总打印时间") //"Total print time" - #define MSG_INFO_PRINT_LONGEST _UxGT("最长工作时间") //"Longest job time" - #define MSG_INFO_PRINT_FILAMENT _UxGT("总计挤出") //"Extruded total" -#else - #define MSG_INFO_PRINT_COUNT _UxGT("打印数") //"Prints" - #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" - #define MSG_INFO_PRINT_TIME _UxGT("总共") //"Total" - #define MSG_INFO_PRINT_LONGEST _UxGT("最长") //"Longest" - #define MSG_INFO_PRINT_FILAMENT _UxGT("已挤出") //"Extruded" -#endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("打印计数"); //"Print Count" + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成了"); //"Completed" + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("总打印时间"); //"Total print time" + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最长工作时间"); //"Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); //"Extruded total" + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("打印数"); //"Prints" + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); //"Completed" + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("总共"); //"Total" + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最长"); //"Longest" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("已挤出"); //"Extruded" + #endif -#define MSG_INFO_MIN_TEMP _UxGT("最低温度") //"Min Temp" -#define MSG_INFO_MAX_TEMP _UxGT("最高温度") //"Max Temp" -#define MSG_INFO_PSU _UxGT("电源供应") //"Power Supply" -#define MSG_DRIVE_STRENGTH _UxGT("驱动力度") // "Drive Strength" -#define MSG_DAC_PERCENT _UxGT("驱动 %") // "Driver %" -#define MSG_DAC_EEPROM_WRITE _UxGT("保存驱动设置") // "DAC EEPROM Write" -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("打印已暂停") // "PRINT PAUSED" -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("装载丝料") // "LOAD FILAMENT" -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("卸载丝料") // "UNLOAD FILAMENT" -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("恢复选项:") // "RESUME OPTIONS:" -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("清除更多") // "Purge more" -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("恢复打印") //"Resume print" -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" 喷嘴: ") // " Nozzle: " -#define MSG_ERR_HOMING_FAILED _UxGT("归原位失败") // "Homing failed" -#define MSG_ERR_PROBING_FAILED _UxGT("探针探测失败") // "Probing failed" -#define MSG_M600_TOO_COLD _UxGT("M600: 太凉") // "M600: Too cold" + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("最低温度"); //"Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高温度"); //"Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("电源供应"); //"Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("驱动 %"); // "Driver %" + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("打印已暂停"); // "PRINT PAUSED" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("装载丝料"); // "LOAD FILAMENT" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸载丝料"); // "UNLOAD FILAMENT" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢复选项:"); // "RESUME OPTIONS:" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢复打印"); //"Resume print" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: " + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("归原位失败"); // "Homing failed" + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed" + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: 太凉"); // "M600: Too cold" -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待开始") //"Wait for start" - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("丝料") //"of the filament" - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("变更") //"change" - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下丝料") //"filament unload" - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入丝料") //"Insert filament" - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("并按键") //"and press button" - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("来继续 ...") //"to continue..." - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按钮来") // "Press button to" - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加热喷嘴.") // "heat nozzle." - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热喷嘴") // "Heating nozzle" - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("请等待 ...") // "Please wait..." - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("进料") //"filament load" - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("丝料清除") // "filament purge" - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待打印") //"Wait for print" - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢复") //"to resume" -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("请等待 ...") //"Please wait..." - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入并单击") //"Insert and Click" - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热中 ...") // "Heating..." - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("装载中 ...") //"Loading..." - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢复中 ...") //"Resuming..." -#endif // LCD_HEIGHT < 4 + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下丝料")); // "Wait for filament unload" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入丝料", "并按键", "来继续 ...")); // "Insert filament and press button to continue..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按钮来", "加热喷嘴.")); // "Press button to heat nozzle." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加热喷嘴", "请等待 ...")); // "Heating nozzle Please wait..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "进料")); // "Wait for filament load" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "丝料清除")); // "Wait for filament purge" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待打印", "恢复")); // "Wait for print to resume" + #else + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); //"Please wait..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入并单击")); //"Insert and Click" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); //"Loading..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); //"Resuming..." + #endif +} diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index ce8cda2692..051e71ccae 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -28,357 +28,464 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ +namespace Language_zh_TW { + using namespace Language_en; // Inherit undefined strings from English -#define CHARSIZE 3 + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("Traditional Chinese"); -#define WELCOME_MSG MACHINE_NAME _UxGT("已就緒.") //" ready." -#define MSG_BACK _UxGT("返回") // ”Back“ -#define MSG_MEDIA_INSERTED _UxGT("記憶卡已插入") //"Card inserted" -#define MSG_MEDIA_REMOVED _UxGT("記憶卡被拔出") //"Card removed" -#define MSG_LCD_ENDSTOPS _UxGT("擋塊") //"Endstops" // Max length 8 characters -#define MSG_MAIN _UxGT("主選單") //"Main" -#define MSG_AUTOSTART _UxGT("自動開始") //"Autostart" -#define MSG_DISABLE_STEPPERS _UxGT("關閉步進馬達") //"Disable steppers" -#define MSG_DEBUG_MENU _UxGT("除錯選單") // "Debug Menu" -#define MSG_PROGRESS_BAR_TEST _UxGT("進度條測試") // "Progress Bar Test" -#define MSG_AUTO_HOME _UxGT("自動回原點") //"Auto home" -#define MSG_AUTO_HOME_X _UxGT("回X原點") //"Home X" -#define MSG_AUTO_HOME_Y _UxGT("回Y原點") //"Home Y" -#define MSG_AUTO_HOME_Z _UxGT("回Z原點") //"Home Z" -#define MSG_LEVEL_BED_HOMING _UxGT("平台調平XYZ歸原點") //"Homing XYZ" -#define MSG_LEVEL_BED_WAITING _UxGT("單擊開始熱床調平") //"Click to Begin" -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("下個熱床調平點") //"Next Point" -#define MSG_LEVEL_BED_DONE _UxGT("完成熱床調平") //"Leveling Done!" -#define MSG_Z_FADE_HEIGHT _UxGT("淡出高度") // "Fade Height" -#define MSG_SET_HOME_OFFSETS _UxGT("設置原點偏移") //"Set home offsets" -#define MSG_HOME_OFFSETS_APPLIED _UxGT("偏移已啟用") //"Offsets applied" -#define MSG_SET_ORIGIN _UxGT("設置原點") //"Set origin" -#define MSG_PREHEAT_1 _UxGT("預熱" PREHEAT_1_LABEL) //"Preheat PREHEAT_1_LABEL" -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") //MSG_PREHEAT_1 " " -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" 全部") //MSG_PREHEAT_1 " All" -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" 熱床") //MSG_PREHEAT_1 " Bed" -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" 設置") //MSG_PREHEAT_1 " conf" -#define MSG_PREHEAT_2 _UxGT("預熱" PREHEAT_2_LABEL) //"Preheat PREHEAT_2_LABEL" -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") //MSG_PREHEAT_2 " " -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" 全部") //MSG_PREHEAT_2 " All" -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" 熱床") //MSG_PREHEAT_2 " Bed" -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" 設置") //MSG_PREHEAT_2 " conf" -#define MSG_COOLDOWN _UxGT("降溫") //"Cooldown" -#define MSG_SWITCH_PS_ON _UxGT("電源打開") //"Switch power on" -#define MSG_SWITCH_PS_OFF _UxGT("電源關閉") //"Switch power off" -#define MSG_EXTRUDE _UxGT("擠出") //"Extrude" -#define MSG_RETRACT _UxGT("回縮") //"Retract" -#define MSG_MOVE_AXIS _UxGT("移動軸") //"Move axis" -#define MSG_BED_LEVELING _UxGT("調平熱床") //"Bed leveling" -#define MSG_LEVEL_BED _UxGT("調平熱床") //"Level bed" -#define MSG_LEVEL_CORNERS _UxGT("調平邊角") // "Level corners" + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); //" ready." + PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // ”Back“ + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); //"Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); //"Card removed" + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("擋塊"); //"Endstops" // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("主選單"); //"Main" + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自動開始"); //"Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); //"Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("自動回原點"); //"Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原點"); //"Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原點"); //"Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原點"); //"Home Z" + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); //"Homing XYZ" + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); //"Click to Begin" + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); //"Next Point" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); //"Leveling Done!" + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); //"Set home offsets" + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); //"Offsets applied" + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("設置原點"); //"Set origin" + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H0 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N0; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H1 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N1; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H2 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N2; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H3 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N3; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H4 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N4; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H5 = _UxGT("預熱 ") PREHEAT_1_LABEL " " LCD_STR_N5; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E0 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N0; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E1 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N1; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E2 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N2; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E3 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N3; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E4 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N4; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E5 = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ") LCD_STR_N5; //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("預熱 ") PREHEAT_2_LABEL; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N0; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H1 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N1; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H2 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N2; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H3 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N3; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H4 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N4; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_H5 = _UxGT("預熱 ") PREHEAT_2_LABEL " " LCD_STR_N5; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E0 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N0; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E1 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N1; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E2 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N2; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E3 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N3; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E4 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N4; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_END_E5 = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ") LCD_STR_N5; //MSG_PREHEAT_2 " " + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 全部"); //MSG_PREHEAT_2 " All" + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_2 " Bed" + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("預熱 ") PREHEAT_2_LABEL _UxGT(" 設置"); //MSG_PREHEAT_2 " conf" + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("降溫"); //"Cooldown" + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("電源打開"); //"Switch power on" + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); //"Switch power off" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("擠出"); //"Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("回縮"); //"Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移動軸"); //"Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("調平熱床"); //"Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("調平熱床"); //"Level bed" + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("調平邊角"); // "Level corners" -#define MSG_NEXT_CORNER _UxGT("下个邊角") // "Next corner" -#define MSG_EDIT_MESH _UxGT("編輯網格") // "Edit Mesh" -#define MSG_EDITING_STOPPED _UxGT("網格編輯已停止") // "Mesh Editing Stopped" -#define MSG_USER_MENU _UxGT("客制命令") // "Custom Commands" + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner" + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh" + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped" + PROGMEM Language_Str MSG_USER_MENU = _UxGT("客制命令"); // "Custom Commands" -#define MSG_UBL_DOING_G29 _UxGT("执行G29") // "Doing G29" -#define MSG_UBL_TOOLS _UxGT("UBL工具") // "UBL Tools" -#define MSG_UBL_LEVEL_BED _UxGT("統一熱床調平(UBL)") // "Unified Bed Leveling" -#define MSG_UBL_MANUAL_MESH _UxGT("手工建网") // "Manually Build Mesh" -#define MSG_UBL_BC_INSERT _UxGT("放置墊片並測量") // "Place shim & measure" -#define MSG_UBL_BC_INSERT2 _UxGT("測量") // "Measure" -#define MSG_UBL_BC_REMOVE _UxGT("移除並測量熱床") // "Remove & measure bed" -#define MSG_UBL_MOVING_TO_NEXT _UxGT("移動到下一個") // "Moving to next" -#define MSG_UBL_ACTIVATE_MESH _UxGT("激活UBL") // "Activate UBL" -#define MSG_UBL_DEACTIVATE_MESH _UxGT("關閉UBL") // "Deactivate UBL" -#define MSG_UBL_SET_TEMP_BED _UxGT("設置熱床溫度") // "Bed Temp" -#define MSG_UBL_SET_TEMP_HOTEND _UxGT("熱端溫度") // "Hotend Temp" -#define MSG_UBL_MESH_EDIT _UxGT("網格編輯") // "Mesh Edit" -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("編輯客戶網格") // "Edit Custom Mesh" -#define MSG_UBL_FINE_TUNE_MESH _UxGT("細調網格") // "Fine Tuning Mesh" -#define MSG_UBL_DONE_EDITING_MESH _UxGT("完成編輯網格") // "Done Editing Mesh" -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("創設客戶網格") // "Build Custom Mesh" -#define MSG_UBL_BUILD_MESH_MENU _UxGT("創設網格") // "Build Mesh" -#define MSG_UBL_BUILD_MESH_M1 _UxGT("創設" PREHEAT_1_LABEL "網格") // "Build PREHEAT_1_LABEL Mesh" -#define MSG_UBL_BUILD_MESH_M2 _UxGT("創設" PREHEAT_2_LABEL "網格") // "Build PREHEAT_2_LABEL Mesh" -#define MSG_UBL_BUILD_COLD_MESH _UxGT("創設冷網格") // "Build Cold Mesh" -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("調整網格高度") // "Adjust Mesh Height" -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("高度合計") // "Height Amount" -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("批准網格") // "Validate Mesh" -#define MSG_UBL_VALIDATE_MESH_M1 _UxGT("批准" PREHEAT_1_LABEL "網格") // "Validate PREHEAT_1_LABEL Mesh" -#define MSG_UBL_VALIDATE_MESH_M2 _UxGT("批准" PREHEAT_2_LABEL "網格") // "Validate PREHEAT_2_LABEL Mesh" -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("批准客戶網格") // "Validate Custom Mesh" -#define MSG_UBL_CONTINUE_MESH _UxGT("繼續熱床網格") // "Continue Bed Mesh" -#define MSG_UBL_MESH_LEVELING _UxGT("網格調平") // "Mesh Leveling" -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("三點調平") // "3-Point Leveling" -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("格子網格調平") // "Grid Mesh Leveling" -#define MSG_UBL_MESH_LEVEL _UxGT("調平網格") // "Level Mesh" -#define MSG_UBL_SIDE_POINTS _UxGT("邊點") // "Side Points" -#define MSG_UBL_MAP_TYPE _UxGT("圖類型") // "Map Type" -#define MSG_UBL_OUTPUT_MAP _UxGT("輸出網格圖") // "Output Mesh Map" -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("輸出到主機") // "Output for Host" -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("輸出到CSV") // "Output for CSV" -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("輸出到備份") // "Off Printer Backup" -#define MSG_UBL_INFO_UBL _UxGT("輸出UBL信息") // "Output UBL Info" -#define MSG_UBL_FILLIN_AMOUNT _UxGT("填充合計") // "Fill-in Amount" -#define MSG_UBL_MANUAL_FILLIN _UxGT("手工填充") // "Manual Fill-in" -#define MSG_UBL_SMART_FILLIN _UxGT("聰明填充") // "Smart Fill-in" -#define MSG_UBL_FILLIN_MESH _UxGT("填充網格") // "Fill-in Mesh" -#define MSG_UBL_INVALIDATE_ALL _UxGT("作廢所有的") // "Invalidate All" -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("作廢最近的") // "Invalidate Closest" -#define MSG_UBL_FINE_TUNE_ALL _UxGT("細調所有的") // "Fine Tune All" -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("細調最近的") // "Fine Tune Closest" -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("網格存儲") // "Mesh Storage" -#define MSG_UBL_STORAGE_SLOT _UxGT("存儲槽") // "Memory Slot" -#define MSG_UBL_LOAD_MESH _UxGT("裝載熱床網格") // "Load Bed Mesh" -#define MSG_UBL_SAVE_MESH _UxGT("保存熱床網格") // "Save Bed Mesh" -#define MSG_MESH_LOADED _UxGT("網格 %i 已裝載") // "Mesh %i loaded" -#define MSG_MESH_SAVED _UxGT("網格 %i 已保存") // "Mesh %i saved" -#define MSG_UBL_NO_STORAGE _UxGT("沒有存儲") // "No storage" -#define MSG_UBL_SAVE_ERROR _UxGT("錯誤: UBL保存") // "Err: UBL Save" -#define MSG_UBL_RESTORE_ERROR _UxGT("錯誤: UBL還原") // "Err: UBL Restore" -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z偏移已停止") // "Z-Offset Stopped" -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("執行G29"); // "Doing G29" + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("手工建網"); // "Manually Build Mesh" + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("放置墊片並測量"); // "Place shim & measure" + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("測量"); // "Measure" + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("移除並測量熱床"); // "Remove & measure bed" + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("移動到下一個"); // "Moving to next" + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("啟動UBL"); // "Activate UBL" + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "Deactivate UBL" + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("設置熱床溫度"); // "Bed Temp" + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("熱端溫度"); // "Hotend Temp" + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("網格編輯"); // "Mesh Edit" + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("編輯客戶網格"); // "Edit Custom Mesh" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("細調網格"); // "Fine Tuning Mesh" + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("創設 ") PREHEAT_1_LABEL _UxGT(" 網格"); // "Build PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("創設 ") PREHEAT_2_LABEL _UxGT(" 網格"); // "Build PREHEAT_2_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh" + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height" + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合計"); // "Height Amount" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("批准 ") PREHEAT_1_LABEL _UxGT(" 網格"); // "Validate PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("批准 ") PREHEAT_2_LABEL _UxGT(" 網格"); // "Validate PREHEAT_2_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh" + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("繼續熱床網格"); // "Continue Bed Mesh" + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子網格調平"); // "Grid Mesh Leveling" + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("調平網格"); // "Level Mesh" + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("邊點"); // "Side Points" + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("圖類型"); // "Map Type" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("輸出網格圖"); // "Output Mesh Map" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("輸出到主機"); // "Output for Host" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("輸出到CSV"); // "Output for CSV" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup" + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "Output UBL Info" + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合計"); // "Fill-in Amount" + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("聰明填充"); // "Smart Fill-in" + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("填充網格"); // "Fill-in Mesh" + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("作廢所有的"); // "Invalidate All" + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作廢最近的"); // "Invalidate Closest" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("細調所有的"); // "Fine Tune All" + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("細調最近的"); // "Fine Tune Closest" + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("網格存儲"); // "Mesh Storage" + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("存儲槽"); // "Memory Slot" + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("裝載熱床網格"); // "Load Bed Mesh" + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("保存熱床網格"); // "Save Bed Mesh" + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 網格 %i 已裝載"); // "Mesh %i loaded" + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 網格 %i 已保存"); // "Mesh %i saved" + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage" + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save" + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore" + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 創設冷網格"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聰明填充"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准網格"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 細調所有的"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准網格"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 細調所有的"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存熱床網格"); -#define MSG_LED_CONTROL _UxGT("灯管控制") // "LED Control") -#define MSG_LEDS _UxGT("灯") // "Lights") -#define MSG_LED_PRESETS _UxGT("灯预置") // "Light Presets") -#define MSG_SET_LEDS_RED _UxGT("红") // "Red") -#define MSG_SET_LEDS_ORANGE _UxGT("橙") // "Orange") -#define MSG_SET_LEDS_YELLOW _UxGT("黄") // "Yellow") -#define MSG_SET_LEDS_GREEN _UxGT("绿") // "Green") -#define MSG_SET_LEDS_BLUE _UxGT("蓝") // "Blue") -#define MSG_SET_LEDS_INDIGO _UxGT("青") // "Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("紫") // "Violet") -#define MSG_SET_LEDS_WHITE _UxGT("白") // "White") -#define MSG_SET_LEDS_DEFAULT _UxGT("缺省") // "Default") -#define MSG_CUSTOM_LEDS _UxGT("定制灯") // "Custom Lights") -#define MSG_INTENSITY_R _UxGT("红飽和度") // "Red Intensity") -#define MSG_INTENSITY_G _UxGT("绿飽和度") // "Green Intensity") -#define MSG_INTENSITY_B _UxGT("蓝飽和度") // "Blue Intensity") -#define MSG_INTENSITY_W _UxGT("白飽和度") // "White Intensity") -#define MSG_LED_BRIGHTNESS _UxGT("亮度") // "Brightness") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("燈管控制"); // "LED Control") + PROGMEM Language_Str MSG_LEDS = _UxGT("燈"); // "Lights") + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("燈預置"); // "Light Presets") + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("红"); // "Red") + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange") + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("黃"); // "Yellow") + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("綠"); // "Green") + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("藍"); // "Blue") + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo") + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet") + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("白"); // "White") + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default") + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("定制燈"); // "Custom Lights") + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("紅飽和度"); // "Red Intensity") + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("綠飽和度"); // "Green Intensity") + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("藍飽和度"); // "Blue Intensity") + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("白飽和度"); // "White Intensity") + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness") -#define MSG_MOVING _UxGT("移动 ...") // "Moving...") -#define MSG_FREE_XY _UxGT("释放 XY") // "Free XY") -#define MSG_MOVE_X _UxGT("移動X") //"Move X" -#define MSG_MOVE_Y _UxGT("移動Y") //"Move Y" -#define MSG_MOVE_Z _UxGT("移動Z") //"Move Z" -#define MSG_MOVE_E _UxGT("擠出機") //"Extruder" -#define MSG_MOVE_Z_DIST _UxGT("移動 %s mm") //"Move 0.025mm" -#define MSG_MOVE_01MM _UxGT("移動 0.1 mm") //"Move 0.1mm" -#define MSG_MOVE_1MM _UxGT("移動 1 mm") //"Move 1mm" -#define MSG_MOVE_10MM _UxGT("移動 10 mm") //"Move 10mm" -#define MSG_SPEED _UxGT("速率") //"Speed" -#define MSG_BED_Z _UxGT("熱床Z") //"Bed Z" -#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 噴嘴") //"Nozzle" 噴嘴 -#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 熱床") //"Bed" -#define MSG_FAN_SPEED _UxGT("風扇速率") //"Fan speed" -#define MSG_EXTRA_FAN_SPEED _UxGT("額外風扇速率") // "Extra fan speed" -#define MSG_FLOW _UxGT("擠出速率") //"Flow" -#define MSG_CONTROL _UxGT("控制") //"Control" -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最小") //" " LCD_STR_THERMOMETER " Min" -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最大") //" " LCD_STR_THERMOMETER " Max" -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 系數") //" " LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP _UxGT("自動控溫") //"Autotemp" -#define MSG_LCD_ON _UxGT("開") //"On" -#define MSG_LCD_OFF _UxGT("關") //"Off" -#define MSG_PID_P _UxGT("PID-P") //"PID-P" -#define MSG_PID_I _UxGT("PID-I") //"PID-I" -#define MSG_PID_D _UxGT("PID-D") //"PID-D" -#define MSG_PID_C _UxGT("PID-C") //"PID-C" -#define MSG_SELECT _UxGT("選擇") //"Select" -#define MSG_ACC _UxGT("加速度") //"Accel" acceleration -#define MSG_JERK _UxGT("抖動速率") //"Jerk" -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("A軸抖動速率") //"Va-jerk" - #define MSG_VB_JERK _UxGT("B軸抖動速率") //"Vb-jerk" - #define MSG_VC_JERK _UxGT("C軸抖動速率") //"Vc-jerk" -#else - #define MSG_VA_JERK _UxGT("X軸抖動速率") //"Vx-jerk" - #define MSG_VB_JERK _UxGT("Y軸抖動速率") //"Vy-jerk" - #define MSG_VC_JERK _UxGT("Z軸抖動速率") //"Vz-jerk" -#endif -#define MSG_VE_JERK _UxGT("擠出機抖動速率") //"Ve-jerk" -#define MSG_VELOCITY _UxGT("速度") // "Velocity" -#define MSG_VMAX _UxGT("最大進料速率") //"Vmax " max_feedrate_mm_s -#define MSG_VMIN _UxGT("最小進料速率") //"Vmin" min_feedrate_mm_s -#define MSG_VTRAV_MIN _UxGT("最小移動速率") //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move -#define MSG_ACCELERATION _UxGT("加速度") // "Acceleration" -#define MSG_AMAX _UxGT("最大列印加速度") //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves -#define MSG_A_RETRACT _UxGT("回縮加速度") //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts -#define MSG_A_TRAVEL _UxGT("非列印移動加速度") //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves -#define MSG_STEPS_PER_MM _UxGT("軸步數/mm") //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A軸步數/mm") //"Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 - #define MSG_BSTEPS _UxGT("B軸步數/mm") //"Bsteps/mm" - #define MSG_CSTEPS _UxGT("C軸步數/mm") //"Csteps/mm" -#else - #define MSG_ASTEPS _UxGT("X軸步數/mm") //"Xsteps/mm" axis_steps_per_mm, axis steps-per-unit G92 - #define MSG_BSTEPS _UxGT("Y軸步數/mm") //"Ysteps/mm" - #define MSG_CSTEPS _UxGT("Z軸步數/mm") //"Zsteps/mm" -#endif -#define MSG_ESTEPS _UxGT("擠出機步數/mm") //"Esteps/mm" -#define MSG_E1STEPS _UxGT("擠出機1步數/mm") //"E1steps/mm" -#define MSG_E2STEPS _UxGT("擠出機2步數/mm") //"E2steps/mm" -#define MSG_E3STEPS _UxGT("擠出機3步數/mm") //"E3steps/mm" -#define MSG_E4STEPS _UxGT("擠出機4步數/mm") //"E4steps/mm" -#define MSG_E5STEPS _UxGT("擠出機5步數/mm") //"E5steps/mm" -#define MSG_E6STEPS _UxGT("擠出機6步數/mm") //"E6steps/mm" -#define MSG_TEMPERATURE _UxGT("溫度") //"Temperature" -#define MSG_MOTION _UxGT("運作") //"Motion" -#define MSG_FILAMENT _UxGT("絲料測容") //"Filament" menu_control_volumetric -#define MSG_VOLUMETRIC_ENABLED _UxGT("測容積mm³") //"E in mm3" volumetric_enabled -#define MSG_FILAMENT_DIAM _UxGT("絲料直徑") //"Fil. Dia." -#define MSG_FILAMENT_UNLOAD _UxGT("卸載 mm") // "Unload mm" -#define MSG_FILAMENT_LOAD _UxGT("装載 mm") // "Load mm" -#define MSG_ADVANCE_K _UxGT("Advance K") // "Advance K" -#define MSG_CONTRAST _UxGT("LCD對比度") //"LCD contrast" -#define MSG_STORE_EEPROM _UxGT("保存設置") //"Store memory" -#define MSG_LOAD_EEPROM _UxGT("載入設置") //"Load memory" -#define MSG_RESTORE_FAILSAFE _UxGT("恢復安全值") //"Restore failsafe" -#define MSG_INIT_EEPROM _UxGT("初始化設置") // "Initialize EEPROM" -#define MSG_REFRESH _UxGT("刷新") //"Refresh" -#define MSG_WATCH _UxGT("資訊界面") //"Info screen" -#define MSG_PREPARE _UxGT("準備") //"Prepare" -#define MSG_TUNE _UxGT("調整") //"Tune" -#define MSG_PAUSE_PRINT _UxGT("暫停列印") //"Pause print" -#define MSG_RESUME_PRINT _UxGT("恢復列印") //"Resume print" -#define MSG_STOP_PRINT _UxGT("停止列印") //"Stop print" -#define MSG_MEDIA_MENU _UxGT("從記憶卡上列印") //"Print from SD" -#define MSG_NO_MEDIA _UxGT("無記憶卡") //"No SD card" -#define MSG_DWELL _UxGT("休眠 ...") //"Sleep..." -#define MSG_USERWAIT _UxGT("點擊繼續 ...") //"Click to resume..." -#define MSG_PRINT_PAUSED _UxGT("列印已暫停") // "Print paused" -#define MSG_PRINT_ABORTED _UxGT("已取消列印") //"Print aborted" -#define MSG_NO_MOVE _UxGT("無移動") //"No move." -#define MSG_KILLED _UxGT("已砍掉") //"KILLED. " -#define MSG_STOPPED _UxGT("已停止") //"STOPPED. " -#define MSG_CONTROL_RETRACT _UxGT("回縮長度mm") //"Retract mm" retract_length, retract length (positive mm) -#define MSG_CONTROL_RETRACT_SWAP _UxGT("換手回抽長度mm") //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change -#define MSG_CONTROL_RETRACTF _UxGT("回縮速率mm/s") //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) -#define MSG_CONTROL_RETRACT_ZHOP _UxGT("Hop mm") //"Hop mm" retract_zraise, retract Z-lift -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("回縮恢復長度mm") //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("換手回縮恢復長度mm") //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("回縮恢復後進料速率mm/s") //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") // "S UnRet V" -#define MSG_AUTORETRACT _UxGT("自動回縮") //"AutoRetr." autoretract_enabled, -#define MSG_FILAMENTCHANGE _UxGT("更換絲料") //"Change filament" -#define MSG_FILAMENTLOAD _UxGT("裝載絲料") // "Load filament" -#define MSG_FILAMENTUNLOAD _UxGT("卸載絲料") // "Unload filament" -#define MSG_FILAMENTUNLOAD_ALL _UxGT("卸載全部") // "Unload All" -#define MSG_INIT_MEDIA _UxGT("初始化記憶卡") //"Init. SD card" -#define MSG_CHANGE_MEDIA _UxGT("更換記憶卡") //"Change SD card" -#define MSG_ZPROBE_OUT _UxGT("Z探針在熱床之外") //"Z probe out. bed" Z probe is not within the physical limits -#define MSG_SKEW_FACTOR _UxGT("偏斜因數") // "Skew Factor" -#define MSG_BLTOUCH _UxGT("BLTouch") // "BLTouch" -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch 自檢") // "BLTouch Self-Test" -#define MSG_BLTOUCH_RESET _UxGT("重置BLTouch") // "Reset BLTouch" -#define MSG_BLTOUCH_DEPLOY _UxGT("部署BLTouch") // "Deploy BLTouch" -#define MSG_BLTOUCH_STOW _UxGT("裝載BLTouch") // "Stow BLTouch" -#define MSG_HOME_FIRST _UxGT("歸位 %s%s%s 先") //"Home ... first" -#define MSG_ZPROBE_ZOFFSET _UxGT("Z偏移") //"Z Offset" -#define MSG_BABYSTEP_X _UxGT("微量調整X軸") //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts -#define MSG_BABYSTEP_Y _UxGT("微量調整Y軸") //"Babystep Y" -#define MSG_BABYSTEP_Z _UxGT("微量調整Z軸") //"Babystep Z" -#define MSG_ENDSTOP_ABORT _UxGT("擋塊終止") //"Endstop abort" -#define MSG_HEATING_FAILED_LCD _UxGT("加熱失敗") //"Heating failed" -#define MSG_ERR_REDUNDANT_TEMP _UxGT("錯誤:REDUNDANT TEMP") //"Err: REDUNDANT TEMP" -#define MSG_THERMAL_RUNAWAY _UxGT("溫控失控") //"THERMAL RUNAWAY" -#define MSG_ERR_MAXTEMP _UxGT("錯誤:最高溫度") //"Err: MAXTEMP" -#define MSG_ERR_MINTEMP _UxGT("錯誤:最低溫度") //"Err: MINTEMP" -#define MSG_ERR_MAXTEMP_BED _UxGT("錯誤:最高熱床溫度") //"Err: MAXTEMP BED" -#define MSG_ERR_MINTEMP_BED _UxGT("錯誤:最低熱床溫度") //"Err: MINTEMP BED" -#define MSG_ERR_Z_HOMING _UxGT("歸位 XY 先") //"Home XY First" -#define MSG_HALTED _UxGT("印表機停機") //"PRINTER HALTED" -#define MSG_PLEASE_RESET _UxGT("請重置") //"Please reset" -#define MSG_SHORT_DAY _UxGT("天") //"d" // One character only -#define MSG_SHORT_HOUR _UxGT("時") //"h" // One character only -#define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only -#define MSG_HEATING _UxGT("加熱中 ...") //"Heating..." -#define MSG_BED_HEATING _UxGT("加熱熱床中 ...") //"Bed Heating..." -#define MSG_DELTA_CALIBRATE _UxGT("⊿校準") //"Delta Calibration" -#define MSG_DELTA_CALIBRATE_X _UxGT("⊿校準X") //"Calibrate X" -#define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校準Y") //"Calibrate Y" -#define MSG_DELTA_CALIBRATE_Z _UxGT("⊿校準Z") //"Calibrate Z" -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("⊿校準中心") //"Calibrate Center" -#define MSG_DELTA_SETTINGS _UxGT("⊿設置") // "Delta Settings" -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("⊿自動校準") // "Auto Calibration" -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("設置⊿高度") // "Set Delta Height" -#define MSG_DELTA_DIAG_ROD _UxGT("⊿斜柱") // "Diag Rod" -#define MSG_DELTA_HEIGHT _UxGT("⊿高度") // "Height" -#define MSG_DELTA_RADIUS _UxGT("⊿半徑") // "Radius" -#define MSG_INFO_MENU _UxGT("關於印表機") //"About Printer" -#define MSG_INFO_PRINTER_MENU _UxGT("印表機訊息") //"Printer Info" -#define MSG_3POINT_LEVELING _UxGT("三點調平") // "3-Point Leveling" -#define MSG_LINEAR_LEVELING _UxGT("線性調平") // "Linear Leveling" -#define MSG_BILINEAR_LEVELING _UxGT("雙線性調平") // "Bilinear Leveling" -#define MSG_UBL_LEVELING _UxGT("統一熱床調平(UBL)") // "Unified Bed Leveling" -#define MSG_MESH_LEVELING _UxGT("網格調平") // "Mesh Leveling" -#define MSG_INFO_STATS_MENU _UxGT("印表機統計") //"Printer Stats" -#define MSG_INFO_BOARD_MENU _UxGT("主板訊息") //"Board Info" -#define MSG_INFO_THERMISTOR_MENU _UxGT("溫度計") //"Thermistors" -#define MSG_INFO_EXTRUDERS _UxGT("擠出機") //"Extruders" -#define MSG_INFO_BAUDRATE _UxGT("傳輸率") //"Baud" -#define MSG_INFO_PROTOCOL _UxGT("協議") //"Protocol" -#define MSG_CASE_LIGHT _UxGT("外殼燈") // "Case light" -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("燈亮度") // "Light BRIGHTNESS" + PROGMEM Language_Str MSG_MOVING = _UxGT("移動 ..."); // "Moving...") + PROGMEM Language_Str MSG_FREE_XY = _UxGT("釋放 XY"); // "Free XY") + PROGMEM Language_Str MSG_MOVE_X = _UxGT("移動X"); //"Move X" + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移動Y"); //"Move Y" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移動Z"); //"Move Z" + PROGMEM Language_Str MSG_MOVE_E = _UxGT("擠出機"); //"Extruder" + PROGMEM Language_Str MSG_MOVE_E0 = _UxGT("擠出機 ") LCD_STR_E0; + PROGMEM Language_Str MSG_MOVE_E1 = _UxGT("擠出機 ") LCD_STR_E1; + PROGMEM Language_Str MSG_MOVE_E2 = _UxGT("擠出機 ") LCD_STR_E2; + PROGMEM Language_Str MSG_MOVE_E3 = _UxGT("擠出機 ") LCD_STR_E3; + PROGMEM Language_Str MSG_MOVE_E4 = _UxGT("擠出機 ") LCD_STR_E4; + PROGMEM Language_Str MSG_MOVE_E5 = _UxGT("擠出機 ") LCD_STR_E5; + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移動 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); //"Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移動 1 mm"); //"Move 1mm" + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移動 10 mm"); //"Move 10mm" + PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed" + PROGMEM Language_Str MSG_BED_Z = _UxGT("熱床Z"); //"Bed Z" + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_0 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N0; + PROGMEM Language_Str MSG_NOZZLE_1 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N1; + PROGMEM Language_Str MSG_NOZZLE_2 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N2; + PROGMEM Language_Str MSG_NOZZLE_3 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N3; + PROGMEM Language_Str MSG_NOZZLE_4 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N4; + PROGMEM Language_Str MSG_NOZZLE_5 = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ") LCD_STR_N5; + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 熱床"); //"Bed" + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("風扇速率"); //"Fan speed" + PROGMEM Language_Str MSG_FAN_SPEED_1 = _UxGT("風扇速率 1"); + PROGMEM Language_Str MSG_FAN_SPEED_2 = _UxGT("風扇速率 2"); + PROGMEM Language_Str MSG_FAN_SPEED_3 = _UxGT("風扇速率 3"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("額外風扇速率"); // "Extra fan speed" + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_1 = _UxGT("額外風扇速率 1"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_2 = _UxGT("額外風扇速率 2"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_3 = _UxGT("額外風扇速率 3"); + PROGMEM Language_Str MSG_FLOW = _UxGT("擠出速率"); + PROGMEM Language_Str MSG_FLOW_0 = _UxGT("擠出速率 ") LCD_STR_N0; //"Flow" + PROGMEM Language_Str MSG_FLOW_1 = _UxGT("擠出速率 ") LCD_STR_N1; //"Flow" + PROGMEM Language_Str MSG_FLOW_2 = _UxGT("擠出速率 ") LCD_STR_N2; //"Flow" + PROGMEM Language_Str MSG_FLOW_3 = _UxGT("擠出速率 ") LCD_STR_N3; //"Flow" + PROGMEM Language_Str MSG_FLOW_4 = _UxGT("擠出速率 ") LCD_STR_N4; //"Flow" + PROGMEM Language_Str MSG_FLOW_5 = _UxGT("擠出速率 ") LCD_STR_N5; //"Flow" + PROGMEM Language_Str MSG_CONTROL = _UxGT("控制"); //"Control" + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); //" " LCD_STR_THERMOMETER " Min" + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); //" " LCD_STR_THERMOMETER " Fact" + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("自動控溫"); //"Autotemp" + PROGMEM Language_Str MSG_LCD_ON = _UxGT("開"); //"On" + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("關"); //"Off" + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); //"PID-P" + PROGMEM Language_Str MSG_PID_P_E0 = _UxGT("PID-P ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_P_E1 = _UxGT("PID-P ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_P_E2 = _UxGT("PID-P ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_P_E3 = _UxGT("PID-P ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_P_E4 = _UxGT("PID-P ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_P_E5 = _UxGT("PID-P ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); //"PID-I" + PROGMEM Language_Str MSG_PID_I_E0 = _UxGT("PID-I ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_I_E1 = _UxGT("PID-I ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_I_E2 = _UxGT("PID-I ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_I_E3 = _UxGT("PID-I ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_I_E4 = _UxGT("PID-I ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_I_E5 = _UxGT("PID-I ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); //"PID-D" + PROGMEM Language_Str MSG_PID_D_E0 = _UxGT("PID-D ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_D_E1 = _UxGT("PID-D ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_D_E2 = _UxGT("PID-D ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_D_E3 = _UxGT("PID-D ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_D_E4 = _UxGT("PID-D ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_D_E5 = _UxGT("PID-D ") LCD_STR_E5; + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); //"PID-C" + PROGMEM Language_Str MSG_PID_C_E0 = _UxGT("PID-C ") LCD_STR_E0; + PROGMEM Language_Str MSG_PID_C_E1 = _UxGT("PID-C ") LCD_STR_E1; + PROGMEM Language_Str MSG_PID_C_E2 = _UxGT("PID-C ") LCD_STR_E2; + PROGMEM Language_Str MSG_PID_C_E3 = _UxGT("PID-C ") LCD_STR_E3; + PROGMEM Language_Str MSG_PID_C_E4 = _UxGT("PID-C ") LCD_STR_E4; + PROGMEM Language_Str MSG_PID_C_E5 = _UxGT("PID-C ") LCD_STR_E5; + PROGMEM Language_Str MSG_SELECT = _UxGT("選擇"); //"Select" + PROGMEM Language_Str MSG_SELECT_E0 = _UxGT("選擇 ") LCD_STR_E0; + PROGMEM Language_Str MSG_SELECT_E1 = _UxGT("選擇 ") LCD_STR_E1; + PROGMEM Language_Str MSG_SELECT_E2 = _UxGT("選擇 ") LCD_STR_E2; + PROGMEM Language_Str MSG_SELECT_E3 = _UxGT("選擇 ") LCD_STR_E3; + PROGMEM Language_Str MSG_SELECT_E4 = _UxGT("選擇 ") LCD_STR_E4; + PROGMEM Language_Str MSG_SELECT_E5 = _UxGT("選擇 ") LCD_STR_E5; + PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration + PROGMEM Language_Str MSG_JERK = _UxGT("抖動速率"); //"Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("軸抖動速率") LCD_STR_A; //"Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("軸抖動速率") LCD_STR_B; //"Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("軸抖動速率") LCD_STR_C; //"Vc-jerk" + PROGMEM Language_Str MSG_VE_JERK = _UxGT("擠出機抖動速率"); //"Ve-jerk" + PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大進料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_B = _UxGT("最大進料速率") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("最大進料速率") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("最大進料速率") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_E0 = _UxGT("最大進料速率 ") LCD_STR_E0; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E1 = _UxGT("最大進料速率 ") LCD_STR_E1; + PROGMEM Language_Str MSG_VMAX_E2 = _UxGT("最大進料速率 ") LCD_STR_E2; + PROGMEM Language_Str MSG_VMAX_E3 = _UxGT("最大進料速率 ") LCD_STR_E3; + PROGMEM Language_Str MSG_VMAX_E4 = _UxGT("最大進料速率 ") LCD_STR_E4; + PROGMEM Language_Str MSG_VMAX_E5 = _UxGT("最大進料速率 ") LCD_STR_E5; + PROGMEM Language_Str MSG_VMIN = _UxGT("最小進料速率"); //"Vmin" min_feedrate_mm_s + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移動速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大列印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_B = _UxGT("最大列印加速度") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("最大列印加速度") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("最大列印加速度") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_E0 = _UxGT("最大列印加速度 ") LCD_STR_E0; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E1 = _UxGT("最大列印加速度 ") LCD_STR_E1; + PROGMEM Language_Str MSG_AMAX_E2 = _UxGT("最大列印加速度 ") LCD_STR_E2; + PROGMEM Language_Str MSG_AMAX_E3 = _UxGT("最大列印加速度 ") LCD_STR_E3; + PROGMEM Language_Str MSG_AMAX_E4 = _UxGT("最大列印加速度 ") LCD_STR_E4; + PROGMEM Language_Str MSG_AMAX_E5 = _UxGT("最大列印加速度 ") LCD_STR_E5; + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("回縮加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非列印移動加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("軸步數/mm"); //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("軸步數/mm"); //"Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("軸步數/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("軸步數/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("擠出機步數/mm"); //"Esteps/mm" + PROGMEM Language_Str MSG_E0_STEPS = _UxGT("擠出機") LCD_STR_N0 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_E1_STEPS = _UxGT("擠出機") LCD_STR_N1 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_E2_STEPS = _UxGT("擠出機") LCD_STR_N2 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_E3_STEPS = _UxGT("擠出機") LCD_STR_N3 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_E4_STEPS = _UxGT("擠出機") LCD_STR_N4 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_E5_STEPS = _UxGT("擠出機") LCD_STR_N5 _UxGT("步數/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("溫度"); //"Temperature" + PROGMEM Language_Str MSG_MOTION = _UxGT("運作"); //"Motion" + PROGMEM Language_Str MSG_FILAMENT = _UxGT("絲料測容"); //"Filament" menu_control_volumetric + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); //"Fil. Dia." + PROGMEM Language_Str MSG_FILAMENT_DIAM_E0 = _UxGT("絲料直徑 ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E1 = _UxGT("絲料直徑 ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E2 = _UxGT("絲料直徑 ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E3 = _UxGT("絲料直徑 ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E4 = _UxGT("絲料直徑 ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENT_DIAM_E5 = _UxGT("絲料直徑 ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("卸載 mm"); // "Unload mm" + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "Load mm" + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD對比度"); //"LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存設置"); //"Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("載入設置"); //"Load memory" + PROGMEM Language_Str MSG_RESTORE_FAILSAFE = _UxGT("恢復安全值"); //"Restore failsafe" + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM" + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新"); //"Refresh" + PROGMEM Language_Str MSG_WATCH = _UxGT("資訊界面"); //"Info screen" + PROGMEM Language_Str MSG_PREPARE = _UxGT("準備"); //"Prepare" + PROGMEM Language_Str MSG_TUNE = _UxGT("調整"); //"Tune" + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("暫停列印"); //"Pause print" + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("恢復列印"); //"Resume print" + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("停止列印"); //"Stop print" + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("從記憶卡上列印"); //"Print from SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("無記憶卡"); //"No SD card" + PROGMEM Language_Str MSG_DWELL = _UxGT("休眠 ..."); //"Sleep..." + PROGMEM Language_Str MSG_USERWAIT = _UxGT("點擊繼續 ..."); //"Click to resume..." + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("列印已暫停"); // "Print paused" + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("已取消列印"); //"Print aborted" + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("無移動"); //"No move." + PROGMEM Language_Str MSG_KILLED = _UxGT("已砍掉"); //"KILLED. " + PROGMEM Language_Str MSG_STOPPED = _UxGT("已停止"); //"STOPPED. " + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); //"Retract mm" retract_length, retract length (positive mm) + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自動回縮"); //"AutoRetr." autoretract_enabled, + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("更換絲料"); //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E0 = _UxGT("更換絲料 ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E1 = _UxGT("更換絲料 ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E2 = _UxGT("更換絲料 ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E3 = _UxGT("更換絲料 ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E4 = _UxGT("更換絲料 ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTCHANGE_E5 = _UxGT("更換絲料 ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E0 = _UxGT("裝載絲料 ") LCD_STR_E0; + PROGMEM Language_Str MSG_FILAMENTLOAD_E1 = _UxGT("裝載絲料 ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTLOAD_E2 = _UxGT("裝載絲料 ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTLOAD_E3 = _UxGT("裝載絲料 ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTLOAD_E4 = _UxGT("裝載絲料 ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTLOAD_E5 = _UxGT("裝載絲料 ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E0 = _UxGT("卸載絲料 ") LCD_STR_E0; // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E1 = _UxGT("卸載絲料 ") LCD_STR_E1; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E2 = _UxGT("卸載絲料 ") LCD_STR_E2; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E3 = _UxGT("卸載絲料 ") LCD_STR_E3; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E4 = _UxGT("卸載絲料 ") LCD_STR_E4; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E5 = _UxGT("卸載絲料 ") LCD_STR_E5; + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All" + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); //"Init. SD card" + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); //"Change SD card" + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z探針在熱床之外"); //"Z probe out. bed" Z probe is not within the physical limits + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("偏斜因數"); // "Skew Factor" + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test" + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch" + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("歸位 %s%s%s 先"); //"Home ... first" + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z偏移"); //"Z Offset" + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量調整X軸"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); //"Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); //"Babystep Z" + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); //"Endstop abort" + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); //"Heating failed" + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:REDUNDANT TEMP"); //"Err: REDUNDANT TEMP" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("溫控失控"); //"THERMAL RUNAWAY" + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); //"Err: MAXTEMP" + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); //"Err: MINTEMP" + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("錯誤:最高熱床溫度"); //"Err: MAXTEMP BED" + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("錯誤:最低熱床溫度"); //"Err: MINTEMP BED" + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("歸位 XY 先"); //"Home XY First" + PROGMEM Language_Str MSG_HALTED = _UxGT("印表機停機"); //"PRINTER HALTED" + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("請重置"); //"Please reset" + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("時"); //"h" // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("分"); //"m" // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("加熱中 ..."); //"Heating..." + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("加熱熱床中 ..."); //"Bed Heating..." + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("⊿校準"); //"Delta Calibration" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("⊿校準X"); //"Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); //"Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); //"Calibrate Z" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校準中心"); //"Calibrate Center" + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("⊿設置"); // "Delta Settings" + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自動校準"); // "Auto Calibration" + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("設置⊿高度"); // "Set Delta Height" + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("關於印表機"); //"About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); //"Printer Info" + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling" + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("雙線性調平"); // "Bilinear Leveling" + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("印表機統計"); //"Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); //"Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); //"Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("擠出機"); //"Extruders" + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("傳輸率"); //"Baud" + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("協議"); //"Protocol" + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("外殼燈"); // "Case light" + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS" -#define MSG_EXPECTED_PRINTER _UxGT("打印機不正確") // "The printer is incorrect" + PROGMEM Language_Str MSG_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect" -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("列印計數") //"Print Count" - #define MSG_INFO_COMPLETED_PRINTS _UxGT("已完成") //"Completed" - #define MSG_INFO_PRINT_TIME _UxGT("總列印時間") //"Total print time" - #define MSG_INFO_PRINT_LONGEST _UxGT("最長工作時間") //"Longest job time" - #define MSG_INFO_PRINT_FILAMENT _UxGT("總計擠出") //"Extruded total" -#else - #define MSG_INFO_PRINT_COUNT _UxGT("列印數") //"Prints" - #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" - #define MSG_INFO_PRINT_TIME _UxGT("總共") //"Total" - #define MSG_INFO_PRINT_LONGEST _UxGT("最長") //"Longest" - #define MSG_INFO_PRINT_FILAMENT _UxGT("已擠出") //"Extruded" -#endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("列印計數"); //"Print Count" + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("已完成"); //"Completed" + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("總列印時間"); //"Total print time" + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最長工作時間"); //"Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); //"Extruded total" + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("列印數"); //"Prints" + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); //"Completed" + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("總共"); //"Total" + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最長"); //"Longest" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("已擠出"); //"Extruded" + #endif -#define MSG_INFO_MIN_TEMP _UxGT("最低溫度") //"Min Temp" -#define MSG_INFO_MAX_TEMP _UxGT("最高溫度") //"Max Temp" -#define MSG_INFO_PSU _UxGT("電源供應") //"Power Supply" -#define MSG_DRIVE_STRENGTH _UxGT("驅動力度") // "Drive Strength" -#define MSG_DAC_PERCENT _UxGT("驅動 %") // "Driver %" -#define MSG_DAC_EEPROM_WRITE _UxGT("保存驅動設置") // "DAC EEPROM Write" -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("列印已暫停") // "PRINT PAUSED" -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("裝載絲料") // "LOAD FILAMENT" -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("卸載絲料") // "UNLOAD FILAMENT" -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("恢複選項:") // "RESUME OPTIONS:" -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("清除更多") // "Purge more" -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("恢復列印") //"Resume print" -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" 噴嘴: ") // " Nozzle: " -#define MSG_ERR_HOMING_FAILED _UxGT("歸原位失敗") // "Homing failed" -#define MSG_ERR_PROBING_FAILED _UxGT("探針探測失敗") // "Probing failed" -#define MSG_M600_TOO_COLD _UxGT("M600: 太涼") // "M600: Too cold" + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("最低溫度"); //"Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); //"Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("電源供應"); //"Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("驅動 %"); // "Driver %" + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("保存驅動設置"); // "DAC EEPROM Write" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("列印已暫停"); // "PRINT PAUSED" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("裝載絲料"); // "LOAD FILAMENT" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸載絲料"); // "UNLOAD FILAMENT" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢複選項:"); // "RESUME OPTIONS:" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢復列印"); //"Resume print" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 噴嘴: "); // " Nozzle: " + PROGMEM Language_Str MSG_LCD_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed" + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed" + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: 太冷"); // "M600: Too cold" -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待開始") //"Wait for start" - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("絲料") //"of the filament" - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("變更") //"change" - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下絲料") //"filament unload" - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入絲料") //"Insert filament" - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("並按鍵") //"and press button" - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("繼續 ...") //"to continue..." - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按鈕來") // "Press button to" - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加熱噴嘴.") // "heat nozzle." - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱噴嘴") // "Heating nozzle" - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("請等待 ...") // "Please wait..." - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("進料") //"filament load" - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("絲料清除") // "filament purge" - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待列印") //"Wait for print" - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢復") //"to resume" -#else // LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("請等待 ...") //"Please wait..." - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入並點擊") //"Insert and Click" - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱中 ...") // "Heating..." - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("載入中 ...") //"Loading..." - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢復中 ...") //"Resuming..." -#endif // LCD_HEIGHT < 4 + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); //"Wait for start of the filament change" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); //"Wait for filament unload" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入絲料", "並按鍵", "繼續 ...")); //"Insert filament and press button to continue..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按鈕來", "加熱噴嘴.")); // "Press button to heat nozzle." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "進料")); //"Wait for filament load" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "絲料清除")); // "Wait for filament purge" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); //"Wait for print to resume" + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); //"Please wait..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入並點擊")); //"Insert and Click" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); // "Heating..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); //"Loading..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); //"Resuming..." + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 012b3b5847..a953318bfa 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -30,7 +30,7 @@ #include "../../module/motion.h" #include "../../module/printcounter.h" #include "../../gcode/queue.h" -#include "../../sd/cardreader.h" + #if HAS_BUZZER #include "../../libs/buzzer.h" #endif @@ -68,11 +68,12 @@ uint8_t screen_history_depth = 0; bool screen_changed; // Value Editing -PGM_P MenuItemBase::editLabel; -void* MenuItemBase::editValue; -int32_t MenuItemBase::minEditValue, MenuItemBase::maxEditValue; -screenFunc_t MenuItemBase::callbackFunc; -bool MenuItemBase::liveEdit; +chimera_t editable; +PGM_P MenuEditItemBase::editLabel; +void* MenuEditItemBase::editValue; +int32_t MenuEditItemBase::minEditValue, MenuEditItemBase::maxEditValue; +screenFunc_t MenuEditItemBase::callbackFunc; +bool MenuEditItemBase::liveEdit; // Prevent recursion into screen handlers bool no_reentry = false; @@ -112,7 +113,7 @@ void MarlinUI::goto_previous_screen( /////////// Common Menu Actions //////////// //////////////////////////////////////////// -void MenuItem_gcode::action(PGM_P const pgcode) { queue.inject_P(pgcode); } +void MenuItem_gcode::action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } //////////////////////////////////////////// /////////// Menu Editing Actions /////////// @@ -131,18 +132,19 @@ void MenuItem_gcode::action(PGM_P const pgcode) { queue.inject_P(pgcode); } * * bool MenuItem_int3::_edit(); * void MenuItem_int3::edit(); // edit int16_t (interactively) - * void MenuItem_int3::action_edit(PGM_P const pstr, int16_t * const ptr, const int16_t minValue, const int16_t maxValue, const screenFunc_t callback = null, const bool live = false); + * void MenuItem_int3::action(PGM_P const pstr, int16_t * const ptr, const int16_t minValue, const int16_t maxValue, const screenFunc_t callback = null, const bool live = false); * * You can then use one of the menu macros to present the edit interface: - * MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) * * This expands into a more primitive menu item: - * MENU_ITEM_VARIANT(int3, _edit, MSG_SPEED, PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * _MENU_ITEM_P(int3, false, GET_TEXT(MSG_SPEED), &feedrate_percentage, 10, 999) * * ...which calls: - * MenuItem_int3::action_edit(PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) + * draw_menu_item_int3(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) */ -void MenuItemBase::edit(strfunc_t strfunc, loadfunc_t loadfunc) { +void MenuEditItemBase::edit(strfunc_t strfunc, loadfunc_t loadfunc) { #if ENABLED(TOUCH_BUTTONS) ui.repeat_delay = BUTTON_DELAY_EDIT; #endif @@ -157,7 +159,7 @@ void MenuItemBase::edit(strfunc_t strfunc, loadfunc_t loadfunc) { } } -void MenuItemBase::init(PGM_P const el, void * const ev, const int32_t minv, const int32_t maxv, const uint16_t ep, const screenFunc_t cs, const screenFunc_t cb, const bool le) { +void MenuEditItemBase::init(PGM_P const el, void * const ev, const int32_t minv, const int32_t maxv, const uint16_t ep, const screenFunc_t cs, const screenFunc_t cb, const bool le) { ui.save_previous_screen(); ui.refresh(); editLabel = el; @@ -170,7 +172,7 @@ void MenuItemBase::init(PGM_P const el, void * const ev, const int32_t minv, con liveEdit = le; } -#define DEFINE_MENU_EDIT_ITEM(NAME) template class TMenuItem +#define DEFINE_MENU_EDIT_ITEM(NAME) template class TMenuEditItem DEFINE_MENU_EDIT_ITEM(percent); // 100% right-justified DEFINE_MENU_EDIT_ITEM(int3); // 123, -12 right-justified @@ -191,7 +193,7 @@ DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 DEFINE_MENU_EDIT_ITEM(long5); // 12345 right-justified DEFINE_MENU_EDIT_ITEM(long5_25); // 12345 right-justified (25 increment) -void MenuItem_bool::action_edit(PGM_P pstr, bool *ptr, screenFunc_t callback) { +void MenuItem_bool::action(PGM_P pstr, bool *ptr, screenFunc_t callback) { UNUSED(pstr); *ptr ^= true; ui.refresh(); if (callback) (*callback)(); } @@ -200,13 +202,10 @@ void MenuItem_bool::action_edit(PGM_P pstr, bool *ptr, screenFunc_t callback) { ///////////////// Menu Tree //////////////// //////////////////////////////////////////// -#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - float lcd_z_fade_height; - void _lcd_set_z_fade_height() { set_z_fade_height(lcd_z_fade_height); } -#endif +#include "../../Marlin.h" bool printer_busy() { - return planner.movesplanned() || IS_SD_PRINTING() || print_job_timer.isRunning(); + return planner.movesplanned() || printingIsActive(); } /** @@ -219,11 +218,6 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co repeat_delay = BUTTON_DELAY_MENU; #endif - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - // Shadow for editing the fade height - lcd_z_fade_height = planner.z_fade_height; - #endif - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) progress_reset(); #endif @@ -330,8 +324,7 @@ void MarlinUI::_synchronize() { // Display the synchronize screen with a custom message // ** This blocks the command queue! ** void MarlinUI::synchronize(PGM_P const msg/*=nullptr*/) { - static const char moving[] PROGMEM = MSG_MOVING; - sync_message = msg ? msg : moving; + sync_message = msg ?: GET_TEXT(MSG_MOVING); _synchronize(); } @@ -379,8 +372,8 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { #if HAS_LINE_TO_Z void line_to_z(const float &z) { - current_position[Z_AXIS] = z; - planner.buffer_line(current_position, MMM_TO_MMS(manual_feedrate_mm_m[Z_AXIS]), active_extruder); + current_position.z = z; + line_to_current_position(MMM_TO_MMS(manual_feedrate_mm_m.z)); } #endif @@ -402,10 +395,10 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { ui.encoderPosition = 0; const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment, - new_probe_offset = probe_offset[Z_AXIS] + diff, + new_probe_offset = probe_offset.z + diff, new_offs = #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - do_probe ? new_probe_offset : hotend_offset[Z_AXIS][active_extruder] - diff + do_probe ? new_probe_offset : hotend_offset[active_extruder].z - diff #else new_probe_offset #endif @@ -414,9 +407,9 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { babystep.add_steps(Z_AXIS, babystep_increment); - if (do_probe) probe_offset[Z_AXIS] = new_offs; + if (do_probe) probe_offset.z = new_offs; #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - else hotend_offset[Z_AXIS][active_extruder] = new_offs; + else hotend_offset[active_extruder].z = new_offs; #endif ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); @@ -425,13 +418,13 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { if (ui.should_draw()) { #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) if (!do_probe) - draw_edit_screen(PSTR(MSG_Z_OFFSET), ftostr43sign(hotend_offset[Z_AXIS][active_extruder])); + draw_edit_screen(GET_TEXT(MSG_Z_OFFSET), ftostr43sign(hotend_offset[active_extruder].z)); else #endif - draw_edit_screen(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(probe_offset[Z_AXIS])); + draw_edit_screen(GET_TEXT(MSG_ZPROBE_ZOFFSET), ftostr43sign(probe_offset.z)); #if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) - if (do_probe) _lcd_zoffset_overlay_gfx(probe_offset[Z_AXIS]); + if (do_probe) _lcd_zoffset_overlay_gfx(probe_offset.z); #endif } } @@ -473,7 +466,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { void _lcd_draw_homing() { constexpr uint8_t line = (LCD_HEIGHT - 1) / 2; - if (ui.should_draw()) draw_menu_item_static(line, PSTR(MSG_LEVEL_BED_HOMING)); + if (ui.should_draw()) draw_menu_item_static(line, GET_TEXT(MSG_LEVEL_BED_HOMING)); ui.refresh(LCDVIEW_CALL_NO_REDRAW); } diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 0b638bc47a..175e8a8435 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -31,7 +31,7 @@ extern int8_t encoderLine, encoderTopLine, screen_items; extern bool screen_changed; #if HOTENDS - constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); + constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP); #endif void scroll_screen(const uint8_t limit, const bool is_menu); @@ -42,10 +42,10 @@ bool printer_busy(); //////////////////////////////////////////// #define DECLARE_MENU_EDIT_TYPE(TYPE, NAME, STRFUNC, SCALE) \ - struct MenuItemInfo_##NAME { \ + struct MenuEditItemInfo_##NAME { \ typedef TYPE type_t; \ static constexpr float scale = SCALE; \ - static inline char* strfunc(const float value) { return STRFUNC((TYPE) value); } \ + static inline const char* strfunc(const float value) { return STRFUNC((TYPE) value); } \ }; DECLARE_MENU_EDIT_TYPE(uint8_t, percent, ui8tostr4pct, 100.0/255); // 100% right-justified @@ -75,16 +75,17 @@ typedef void (*selectFunc_t)(); void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff); void do_select_screen(PGM_P const yes, PGM_P const no, selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); inline void do_select_screen_yn(selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr) { - do_select_screen(PSTR(MSG_YES), PSTR(MSG_NO), yesFunc, noFunc, pref, string, suff); + do_select_screen(GET_TEXT(MSG_YES), GET_TEXT(MSG_NO), yesFunc, noFunc, pref, string, suff); } -#define SS_LEFT 0x00 -#define SS_CENTER 0x01 -#define SS_INVERT 0x02 +#define SS_LEFT 0x00 +#define SS_CENTER 0x01 +#define SS_INVERT 0x02 +#define SS_DEFAULT SS_CENTER void draw_edit_screen(PGM_P const pstr, const char* const value=nullptr); void draw_menu_item(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char); -void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_CENTER, const char * const valstr=nullptr); +void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const valstr=nullptr); void _draw_menu_item_edit(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm); FORCE_INLINE void draw_menu_item_back(const bool sel, const uint8_t row, PGM_P const pstr) { draw_menu_item(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); } FORCE_INLINE void draw_menu_item_edit(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data) { _draw_menu_item_edit(sel, row, pstr, data, false); } @@ -93,7 +94,7 @@ FORCE_INLINE void draw_menu_item_edit_P(const bool sel, const uint8_t row, PGM_P #define draw_menu_item_gcode(sel, row, pstr, gcode) draw_menu_item(sel, row, pstr, '>', ' ') #define draw_menu_item_function(sel, row, pstr, data) draw_menu_item(sel, row, pstr, '>', ' ') #define DRAW_MENU_ITEM_SETTING_EDIT_GENERIC(VAL) draw_menu_item_edit(sel, row, pstr, VAL) -#define DRAW_BOOL_SETTING(sel, row, pstr, data) draw_menu_item_edit_P(sel, row, pstr, (*(data))?PSTR(MSG_LCD_ON):PSTR(MSG_LCD_OFF)) +#define DRAW_BOOL_SETTING(sel, row, pstr, data) draw_menu_item_edit_P(sel, row, pstr, (*(data))?GET_TEXT(MSG_LCD_ON):GET_TEXT(MSG_LCD_OFF)) #if ENABLED(SDSUPPORT) class CardReader; @@ -111,16 +112,14 @@ FORCE_INLINE void draw_menu_item_edit_P(const bool sel, const uint8_t row, PGM_P //////////////////////////////////////////// #define _DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(TYPE, NAME, STRFUNC) \ - FORCE_INLINE void draw_menu_item_edit_##NAME (const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const pstr2, TYPE * const data, ...) { \ - UNUSED(pstr2); \ + FORCE_INLINE void draw_menu_item_##NAME (const bool sel, const uint8_t row, PGM_P const pstr, TYPE * const data, ...) { \ DRAW_MENU_ITEM_SETTING_EDIT_GENERIC(STRFUNC(*(data))); \ } \ - FORCE_INLINE void draw_menu_item_edit_accessor_##NAME (const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const pstr2, TYPE (*pget)(), void (*pset)(TYPE), ...) { \ - UNUSED(pstr2); UNUSED(pset); \ + FORCE_INLINE void draw_menu_item_accessor_##NAME (const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, TYPE (*pget)(), void (*)(TYPE), ...) { \ DRAW_MENU_ITEM_SETTING_EDIT_GENERIC(STRFUNC(pget())); \ } \ typedef void NAME##_void -#define DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(NAME) _DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(MenuItemInfo_##NAME::type_t, NAME, MenuItemInfo_##NAME::strfunc) +#define DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(NAME) _DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(MenuEditItemInfo_##NAME::type_t, NAME, MenuEditItemInfo_##NAME::strfunc) DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(percent); // 100% right-justified DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(int3); // 123, -12 right-justified @@ -141,8 +140,8 @@ DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float52sign); // +123.45 DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(long5); // 12345 right-justified DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(long5_25); // 12345 right-justified (25 increment) -#define draw_menu_item_edit_bool(sel, row, pstr, pstr2, data, ...) DRAW_BOOL_SETTING(sel, row, pstr, data) -#define draw_menu_item_edit_accessor_bool(sel, row, pstr, pstr2, pget, pset) DRAW_BOOL_SETTING(sel, row, pstr, data) +#define draw_menu_item_bool(sel, row, pstr, data, ...) DRAW_BOOL_SETTING(sel, row, pstr, data) +#define draw_menu_item_accessor_bool(sel, row, pstr, pget, pset) DRAW_BOOL_SETTING(sel, row, pstr, data) //////////////////////////////////////////// /////////////// Menu Actions /////////////// @@ -150,7 +149,7 @@ DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(long5_25); // 12345 right-justif class MenuItem_back { public: - static inline void action() { + static inline void action(PGM_P const=nullptr) { ui.goto_previous_screen( #if ENABLED(TURBO_BACK_MENU_ITEM) true @@ -161,56 +160,82 @@ class MenuItem_back { class MenuItem_submenu { public: - static inline void action(const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } + static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } }; class MenuItem_gcode { public: - static void action(const char * const pgcode); + static void action(PGM_P const, const char * const pgcode); }; class MenuItem_function { public: - static inline void action(const menuAction_t func) { (*func)(); }; + static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; }; //////////////////////////////////////////// /////////// Menu Editing Actions /////////// //////////////////////////////////////////// -class MenuItemBase { +// +// The Menu Edit shadow value +// Only one edit value is needed at a time +// + +typedef union { + bool state; + float decimal; + int8_t int8; + int16_t int16; + int32_t int32; + uint8_t uint8; + uint16_t uint16; + uint32_t uint32; +} chimera_t; + +extern chimera_t editable; + +// Edit items use long integer encoder units +class MenuEditItemBase { private: static PGM_P editLabel; static void *editValue; - static int32_t minEditValue, maxEditValue; + static int32_t minEditValue, maxEditValue; // Encoder value range static screenFunc_t callbackFunc; static bool liveEdit; protected: - typedef char* (*strfunc_t)(const int32_t); + typedef const char* (*strfunc_t)(const int32_t); typedef void (*loadfunc_t)(void *, const int32_t); static void init(PGM_P const el, void * const ev, const int32_t minv, const int32_t maxv, const uint16_t ep, const screenFunc_t cs, const screenFunc_t cb, const bool le); static void edit(strfunc_t, loadfunc_t); }; template -class TMenuItem : MenuItemBase { +class TMenuEditItem : MenuEditItemBase { private: typedef typename NAME::type_t type_t; static inline float unscale(const float value) { return value * (1.0f / NAME::scale); } static inline float scale(const float value) { return value * NAME::scale; } static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } - static char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } + static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } public: - static void action_edit(PGM_P const pstr, type_t * const ptr, const type_t minValue, const type_t maxValue, const screenFunc_t callback=nullptr, const bool live=false) { - // Make sure minv and maxv fit within int16_t - const int32_t minv = _MAX(scale(minValue), INT16_MIN), - maxv = _MIN(scale(maxValue), INT16_MAX); + static void action( + PGM_P const pstr, // Edit label + type_t * const ptr, // Value pointer + const type_t minValue, // Value range + const type_t maxValue, + const screenFunc_t callback=nullptr, // Value update callback + const bool live=false // Callback during editing + ) { + // Make sure minv and maxv fit within int32_t + const int32_t minv = _MAX(scale(minValue), INT32_MIN), + maxv = _MIN(scale(maxValue), INT32_MAX); init(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, edit, callback, live); } - static void edit() { MenuItemBase::edit(to_string, load); } + static void edit() { MenuEditItemBase::edit(to_string, load); } }; -#define DECLARE_MENU_EDIT_ITEM(NAME) typedef TMenuItem MenuItem_##NAME; +#define DECLARE_MENU_EDIT_ITEM(NAME) typedef TMenuEditItem MenuItem_##NAME; DECLARE_MENU_EDIT_ITEM(percent); DECLARE_MENU_EDIT_ITEM(int3); @@ -233,7 +258,7 @@ DECLARE_MENU_EDIT_ITEM(long5_25); class MenuItem_bool { public: - static void action_edit(PGM_P const pstr, bool* ptr, const screenFunc_t callbackFunc=nullptr); + static void action(PGM_P const pstr, bool* ptr, const screenFunc_t callbackFunc=nullptr); }; //////////////////////////////////////////// @@ -291,51 +316,53 @@ class MenuItem_bool { /** * MENU_ITEM generates draw & handler code for a menu item, potentially calling: * - * draw_menu_item_[_variant](sel, row, label, arg3...) - * MenuItem_::action[_variant](arg3...) + * draw_menu_item_(sel, row, label, arg3...) + * MenuItem_::action(arg3...) * * Examples: - * MENU_ITEM(back, MSG_WATCH, 0 [dummy parameter] ) - * or - * MENU_BACK(MSG_WATCH) - * draw_menu_item_back(sel, row, PSTR(MSG_WATCH)) + * BACK_ITEM(MSG_WATCH) + * MENU_ITEM(back, MSG_WATCH) + * draw_menu_item_back(sel, row, GET_TEXT(MSG_WATCH)) * MenuItem_back::action() * + * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) * MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause) - * draw_menu_item_function(sel, row, PSTR(MSG_PAUSE_PRINT), lcd_sdcard_pause) + * draw_menu_item_function(sel, row, GET_TEXT(MSG_PAUSE_PRINT), lcd_sdcard_pause) * MenuItem_function::action(lcd_sdcard_pause) * - * MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999) - * draw_menu_item_edit_int3(sel, row, PSTR(MSG_SPEED), PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) - * MenuItem_int3::action_edit(PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * draw_menu_item_int3(sel, row, GET_TEXT(MSG_SPEED), &feedrate_percentage, 10, 999) + * MenuItem_int3::action(GET_TEXT(MSG_SPEED), &feedrate_percentage, 10, 999) * */ -#define _MENU_ITEM_VARIANT_P(TYPE, VARIANT, USE_MULTIPLIER, PLABEL, V...) do { \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) { \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ - MenuItem_##TYPE ::action ## VARIANT(V); \ - if (screen_changed) return; \ - } \ - if (ui.should_draw()) \ - draw_menu_item ## VARIANT ## _ ## TYPE(encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ - } \ - ++_thisItemNr; \ +#define _MENU_ITEM_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ + _skipStatic = false; \ + if (_menuLineNr == _thisItemNr) { \ + PGM_P const plabel = PLABEL; \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ + MenuItem_##TYPE ::action(plabel, ##V); \ + if (screen_changed) return; \ + } \ + if (ui.should_draw()) \ + draw_menu_item_ ## TYPE \ + (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ + } \ + ++_thisItemNr; \ }while(0) // Used to print static text with no visible cursor. // Parameters: label [, bool center [, bool invert [, char *value] ] ] -#define STATIC_ITEM_P(PLABEL, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ - if (ui.should_draw()) \ - draw_menu_item_static(_lcdLineNr, PLABEL, ##V); \ - } \ - ++_thisItemNr; \ +#define STATIC_ITEM_P(PLABEL, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + if (_skipStatic && encoderLine <= _thisItemNr) { \ + ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + if (ui.should_draw()) \ + draw_menu_item_static(_lcdLineNr, PLABEL, ##V); \ + } \ + ++_thisItemNr; \ } while(0) #define MENU_ITEM_ADDON_START(X) do{ \ @@ -344,16 +371,28 @@ class MenuItem_bool { #define MENU_ITEM_ADDON_END() } }while(0) -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(PSTR(LABEL), ##V) +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define MENU_BACK(LABEL) MENU_ITEM(back, LABEL) -#define MENU_ITEM_DUMMY() do { _thisItemNr++; }while(0) -#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, , false, PLABEL, ##V) -#define MENU_ITEM(TYPE, LABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, , false, PSTR(LABEL), ##V) -#define MENU_ITEM_EDIT(TYPE, LABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, _edit, false, PSTR(LABEL), PSTR(LABEL), ##V) -#define MENU_ITEM_EDIT_CALLBACK(TYPE, LABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, _edit, false, PSTR(LABEL), PSTR(LABEL), ##V) -#define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, _edit, true, PSTR(LABEL), PSTR(LABEL), ##V) -#define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, V...) _MENU_ITEM_VARIANT_P(TYPE, _edit, true, PSTR(LABEL), PSTR(LABEL), ##V) +#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) +#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) +#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) +#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) + +#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) +#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) + +#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) +#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) + +#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) +#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) + +#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) +#define SKIP_ITEM() (_thisItemNr++) //////////////////////////////////////////// /////////////// Menu Screens /////////////// @@ -397,11 +436,6 @@ void _lcd_draw_homing(); void _lcd_level_bed_corners(); #endif -#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - extern float lcd_z_fade_height; - void _lcd_set_z_fade_height(); -#endif - #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) void _lcd_toggle_bed_leveling(); #endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 9e27469202..3a8a76d98c 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -55,20 +55,17 @@ void menu_backlash(); #include "../../feature/dac/stepper_dac.h" - uint8_t driverPercent[XYZE]; - inline void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); } - static void dac_driver_commit() { dac_current_set_percents(driverPercent); } - void menu_dac() { - dac_driver_getValues(); + static xyze_uint8_t driverPercent; + LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); - #define EDIT_DAC_PERCENT(N) MENU_ITEM_EDIT_CALLBACK(uint8, MSG_##N " " MSG_DAC_PERCENT, &driverPercent[_AXIS(N)], 0, 100, dac_driver_commit) + BACK_ITEM(MSG_ADVANCED_SETTINGS); + #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_##A " " MSG_DAC_PERCENT, &driverPercent[_AXIS(A)], 0, 100, [](){ dac_current_set_percents(driverPercent); }) EDIT_DAC_PERCENT(X); EDIT_DAC_PERCENT(Y); EDIT_DAC_PERCENT(Z); EDIT_DAC_PERCENT(E); - MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_commit_eeprom); + ACTION_ITEM(MSG_DAC_EEPROM_WRITE, dac_commit_eeprom); END_MENU(); } @@ -80,8 +77,8 @@ void menu_backlash(); void menu_pwm() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); - #define EDIT_CURRENT_PWM(LABEL,I) MENU_ITEM_EDIT_CALLBACK(long5, LABEL, &stepper.motor_current_setting[I], 100, 2000, stepper.refresh_motor_power) + BACK_ITEM(MSG_ADVANCED_SETTINGS); + #define EDIT_CURRENT_PWM(LABEL,I) EDIT_ITEM_P(long5, PSTR(LABEL), &stepper.motor_current_setting[I], 100, 2000, stepper.refresh_motor_power) #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) EDIT_CURRENT_PWM(MSG_X MSG_Y, 0); #endif @@ -96,16 +93,6 @@ void menu_backlash(); #endif -#if HAS_M206_COMMAND - // - // Set the home offset based on the current_position - // - void _lcd_set_home_offsets() { - queue.inject_P(PSTR("M428")); - ui.return_to_status(); - } -#endif - #if ENABLED(SD_FIRMWARE_UPDATE) #include "../../module/configuration_store.h" #endif @@ -116,23 +103,23 @@ void menu_backlash(); // void menu_advanced_filament() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); #if ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 - MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); #elif EXTRUDERS > 1 - #define EDIT_ADVANCE_K(N) MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E##N, &planner.extruder_advance_K[N-1], 0, 999) + #define EDIT_ADVANCE_K(N) EDIT_ITEM(float52, MSG_ADVANCE_K_E##N, &planner.extruder_advance_K[N], 0, 999) + EDIT_ADVANCE_K(0); EDIT_ADVANCE_K(1); - EDIT_ADVANCE_K(2); #if EXTRUDERS > 2 - EDIT_ADVANCE_K(3); + EDIT_ADVANCE_K(2); #if EXTRUDERS > 3 - EDIT_ADVANCE_K(4); + EDIT_ADVANCE_K(3); #if EXTRUDERS > 4 - EDIT_ADVANCE_K(5); + EDIT_ADVANCE_K(4); #if EXTRUDERS > 5 - EDIT_ADVANCE_K(6); + EDIT_ADVANCE_K(5); #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -141,24 +128,24 @@ void menu_backlash(); #endif #if DISABLED(NO_VOLUMETRICS) - MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); + EDIT_ITEM(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); if (parser.volumetric_enabled) { #if EXTRUDERS == 1 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[0], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[0], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); #else // EXTRUDERS > 1 - #define EDIT_FIL_DIAM(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E##N, &planner.filament_size[N-1], 1.5f, 3.25f, planner.calculate_volumetric_multipliers) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #define EDIT_FIL_DIAM(N) EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM_E##N, &planner.filament_size[N], 1.5f, 3.25f, planner.calculate_volumetric_multipliers) + EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + EDIT_FIL_DIAM(0); EDIT_FIL_DIAM(1); - EDIT_FIL_DIAM(2); #if EXTRUDERS > 2 - EDIT_FIL_DIAM(3); + EDIT_FIL_DIAM(2); #if EXTRUDERS > 3 - EDIT_FIL_DIAM(4); + EDIT_FIL_DIAM(3); #if EXTRUDERS > 4 - EDIT_FIL_DIAM(5); + EDIT_FIL_DIAM(4); #if EXTRUDERS > 5 - EDIT_FIL_DIAM(6); + EDIT_FIL_DIAM(5); #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -177,20 +164,20 @@ void menu_backlash(); ; #if EXTRUDERS == 1 - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[0].unload_length, 0, extrude_maxlength); + EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[0].unload_length, 0, extrude_maxlength); #elif EXTRUDERS > 1 - #define EDIT_FIL_UNLOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E##N, &fc_settings[N-1].unload_length, 0, extrude_maxlength) - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); + #define EDIT_FIL_UNLOAD(N) EDIT_ITEM_FAST(float3, MSG_FILAMENTUNLOAD_E##N, &fc_settings[N].unload_length, 0, extrude_maxlength) + EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); + EDIT_FIL_UNLOAD(0); EDIT_FIL_UNLOAD(1); - EDIT_FIL_UNLOAD(2); #if EXTRUDERS > 2 - EDIT_FIL_UNLOAD(3); + EDIT_FIL_UNLOAD(2); #if EXTRUDERS > 3 - EDIT_FIL_UNLOAD(4); + EDIT_FIL_UNLOAD(3); #if EXTRUDERS > 4 - EDIT_FIL_UNLOAD(5); + EDIT_FIL_UNLOAD(4); #if EXTRUDERS > 5 - EDIT_FIL_UNLOAD(6); + EDIT_FIL_UNLOAD(5); #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -198,20 +185,20 @@ void menu_backlash(); #endif // EXTRUDERS > 1 #if EXTRUDERS == 1 - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[0].load_length, 0, extrude_maxlength); + EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[0].load_length, 0, extrude_maxlength); #elif EXTRUDERS > 1 - #define EDIT_FIL_LOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E##N, &fc_settings[N-1].load_length, 0, extrude_maxlength) - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); + #define EDIT_FIL_LOAD(N) EDIT_ITEM_FAST(float3, MSG_FILAMENTLOAD_E##N, &fc_settings[N].load_length, 0, extrude_maxlength) + EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); + EDIT_FIL_LOAD(0); EDIT_FIL_LOAD(1); - EDIT_FIL_LOAD(2); #if EXTRUDERS > 2 - EDIT_FIL_LOAD(3); + EDIT_FIL_LOAD(2); #if EXTRUDERS > 3 - EDIT_FIL_LOAD(4); + EDIT_FIL_LOAD(3); #if EXTRUDERS > 4 - EDIT_FIL_LOAD(5); + EDIT_FIL_LOAD(4); #if EXTRUDERS > 5 - EDIT_FIL_LOAD(6); + EDIT_FIL_LOAD(5); #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -220,7 +207,7 @@ void menu_backlash(); #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && FILAMENT_RUNOUT_DISTANCE_MM - MENU_ITEM_EDIT_CALLBACK(float3, MSG_RUNOUT_DISTANCE_MM, &lcd_runout_distance_mm, 1, 30, []{ + EDIT_ITEM(float3, MSG_RUNOUT_DISTANCE_MM, &lcd_runout_distance_mm, 1, 30, []{ runout.set_runout_distance(lcd_runout_distance_mm); }); #endif @@ -280,9 +267,10 @@ void menu_backlash(); PID_PARAM(Kd, e) = scalePID_d(raw_Kd); thermalManager.updatePID(); } + #define _DEFINE_PIDTEMP_BASE_FUNCS(N) \ - void copy_and_scalePID_i_E ## N() { copy_and_scalePID_i(N); } \ - void copy_and_scalePID_d_E ## N() { copy_and_scalePID_d(N); } + void copy_and_scalePID_i_E##N() { copy_and_scalePID_i(N); } \ + void copy_and_scalePID_d_E##N() { copy_and_scalePID_d(N); } #else @@ -293,30 +281,28 @@ void menu_backlash(); #if ENABLED(PID_AUTOTUNE_MENU) #define DEFINE_PIDTEMP_FUNCS(N) \ _DEFINE_PIDTEMP_BASE_FUNCS(N); \ - void lcd_autotune_callback_E ## N() { _lcd_autotune(N); } // + void lcd_autotune_callback_E##N() { _lcd_autotune(N); } // #else #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N); // #endif #if HOTENDS DEFINE_PIDTEMP_FUNCS(0); - #if ENABLED(PID_PARAMS_PER_HOTEND) - #if HOTENDS > 1 - DEFINE_PIDTEMP_FUNCS(1); - #if HOTENDS > 2 - DEFINE_PIDTEMP_FUNCS(2); - #if HOTENDS > 3 - DEFINE_PIDTEMP_FUNCS(3); - #if HOTENDS > 4 - DEFINE_PIDTEMP_FUNCS(4); - #if HOTENDS > 5 - DEFINE_PIDTEMP_FUNCS(5); - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HOTENDS > 1 - #endif // PID_PARAMS_PER_HOTEND + #if HOTENDS > 1 && ENABLED(PID_PARAMS_PER_HOTEND) + DEFINE_PIDTEMP_FUNCS(1); + #if HOTENDS > 2 + DEFINE_PIDTEMP_FUNCS(2); + #if HOTENDS > 3 + DEFINE_PIDTEMP_FUNCS(3); + #if HOTENDS > 4 + DEFINE_PIDTEMP_FUNCS(4); + #if HOTENDS > 5 + DEFINE_PIDTEMP_FUNCS(5); + #endif // HOTENDS > 5 + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 && PID_PARAMS_PER_HOTEND #endif // HOTENDS #define SHOW_MENU_ADVANCED_TEMPERATURE ((ENABLED(AUTOTEMP) && HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) @@ -328,15 +314,15 @@ void menu_backlash(); void menu_advanced_temperature() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); // // Autotemp, Min, Max, Fact // #if ENABLED(AUTOTEMP) && HAS_TEMP_HOTEND - MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); - MENU_ITEM_EDIT(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - 15); - MENU_ITEM_EDIT(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - 15); - MENU_ITEM_EDIT(float52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); + EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); + EDIT_ITEM(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - 15); + EDIT_ITEM(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - 15); + EDIT_ITEM(float52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); #endif // @@ -347,55 +333,61 @@ void menu_backlash(); // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4 // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5 // - #if ENABLED(PID_EDIT_MENU) - #define _PID_BASE_MENU_ITEMS(ELABEL, eindex) \ - raw_Ki = unscalePID_i(PID_PARAM(Ki, eindex)); \ - raw_Kd = unscalePID_d(PID_PARAM(Kd, eindex)); \ - MENU_ITEM_EDIT(float52sign, MSG_PID_P ELABEL, &PID_PARAM(Kp, eindex), 1, 9990); \ - MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_PID_I ELABEL, &raw_Ki, 0.01f, 9990, copy_and_scalePID_i_E ## eindex); \ - MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_PID_D ELABEL, &raw_Kd, 1, 9990, copy_and_scalePID_d_E ## eindex) + #if EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #if HOTENDS > 1 && ENABLED(PID_PARAMS_PER_HOTEND) + #define PID_LABEL(MSG,N) MSG##_E##N + #else + #define PID_LABEL(MSG,N) MSG + #endif + #endif + + #if ENABLED(PID_EDIT_MENU) + #define _PID_BASE_MENU_ITEMS(N) \ + raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \ + raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \ + EDIT_ITEM(float52sign, PID_LABEL(MSG_PID_P,N), &PID_PARAM(Kp, N), 1, 9990); \ + EDIT_ITEM(float52sign, PID_LABEL(MSG_PID_I,N), &raw_Ki, 0.01f, 9990, [](){ copy_and_scalePID_i(N); }); \ + EDIT_ITEM(float52sign, PID_LABEL(MSG_PID_D,N), &raw_Kd, 1, 9990, [](){ copy_and_scalePID_d(N); }) #if ENABLED(PID_EXTRUSION_SCALING) - #define _PID_EDIT_MENU_ITEMS(ELABEL, eindex) \ - _PID_BASE_MENU_ITEMS(ELABEL, eindex); \ - MENU_ITEM_EDIT(float3, MSG_PID_C ELABEL, &PID_PARAM(Kc, eindex), 1, 9990) + #define _PID_EDIT_MENU_ITEMS(N) \ + _PID_BASE_MENU_ITEMS(N); \ + EDIT_ITEM(float3, PID_LABEL(MSG_PID_C,N), &PID_PARAM(Kc, N), 1, 9990) #else - #define _PID_EDIT_MENU_ITEMS(ELABEL, eindex) _PID_BASE_MENU_ITEMS(ELABEL, eindex) + #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) #endif #else - #define _PID_EDIT_MENU_ITEMS(ELABEL, eindex) NOOP + #define _PID_EDIT_MENU_ITEMS(N) NOOP #endif #if ENABLED(PID_AUTOTUNE_MENU) - #define PID_EDIT_MENU_ITEMS(ELABEL, eindex) \ - _PID_EDIT_MENU_ITEMS(ELABEL, eindex); \ - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PID_AUTOTUNE ELABEL, &autotune_temp[eindex], 150, heater_maxtemp[eindex] - 15, lcd_autotune_callback_E ## eindex) + #define PID_EDIT_MENU_ITEMS(N) \ + _PID_EDIT_MENU_ITEMS(N); \ + EDIT_ITEM_FAST(int3, PID_LABEL(MSG_AUTOTUNE_PID,N), &autotune_temp[N], 150, heater_maxtemp[N] - 15, [](){ _lcd_autotune(N); }) #else - #define PID_EDIT_MENU_ITEMS(ELABEL, eindex) _PID_EDIT_MENU_ITEMS(ELABEL, eindex) + #define PID_EDIT_MENU_ITEMS(N) _PID_EDIT_MENU_ITEMS(N) #endif - #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1 - PID_EDIT_MENU_ITEMS(" " MSG_E1, 0); - PID_EDIT_MENU_ITEMS(" " MSG_E2, 1); + PID_EDIT_MENU_ITEMS(0); + #if HOTENDS > 1 && ENABLED(PID_PARAMS_PER_HOTEND) + PID_EDIT_MENU_ITEMS(1); #if HOTENDS > 2 - PID_EDIT_MENU_ITEMS(" " MSG_E3, 2); + PID_EDIT_MENU_ITEMS(2); #if HOTENDS > 3 - PID_EDIT_MENU_ITEMS(" " MSG_E4, 3); + PID_EDIT_MENU_ITEMS(3); #if HOTENDS > 4 - PID_EDIT_MENU_ITEMS(" " MSG_E5, 4); + PID_EDIT_MENU_ITEMS(4); #if HOTENDS > 5 - PID_EDIT_MENU_ITEMS(" " MSG_E6, 5); + PID_EDIT_MENU_ITEMS(5); #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 - #else // !PID_PARAMS_PER_HOTEND || HOTENDS == 1 - PID_EDIT_MENU_ITEMS("", 0); - #endif // !PID_PARAMS_PER_HOTEND || HOTENDS == 1 + #endif // HOTENDS > 1 && PID_PARAMS_PER_HOTEND END_MENU(); } @@ -404,86 +396,67 @@ void menu_backlash(); #if DISABLED(SLIM_LCD_MENUS) - void _reset_acceleration_rates() { planner.reset_acceleration_rates(); } #if ENABLED(DISTINCT_E_FACTORS) - void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) _reset_acceleration_rates(); } - void _reset_e0_acceleration_rate() { _reset_e_acceleration_rate(0); } - void _reset_e1_acceleration_rate() { _reset_e_acceleration_rate(1); } - #if E_STEPPERS > 2 - void _reset_e2_acceleration_rate() { _reset_e_acceleration_rate(2); } - #if E_STEPPERS > 3 - void _reset_e3_acceleration_rate() { _reset_e_acceleration_rate(3); } - #if E_STEPPERS > 4 - void _reset_e4_acceleration_rate() { _reset_e_acceleration_rate(4); } - #if E_STEPPERS > 5 - void _reset_e5_acceleration_rate() { _reset_e_acceleration_rate(5); } - #endif // E_STEPPERS > 5 - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif - - void _planner_refresh_positioning() { planner.refresh_positioning(); } - #if ENABLED(DISTINCT_E_FACTORS) - void _planner_refresh_e_positioning(const uint8_t e) { + inline void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) planner.reset_acceleration_rates(); } + inline void _planner_refresh_e_positioning(const uint8_t e) { if (e == active_extruder) - _planner_refresh_positioning(); + planner.refresh_positioning(); else planner.steps_to_mm[E_AXIS_N(e)] = 1.0f / planner.settings.axis_steps_per_mm[E_AXIS_N(e)]; } - void _planner_refresh_e0_positioning() { _planner_refresh_e_positioning(0); } - void _planner_refresh_e1_positioning() { _planner_refresh_e_positioning(1); } - #if E_STEPPERS > 2 - void _planner_refresh_e2_positioning() { _planner_refresh_e_positioning(2); } - #if E_STEPPERS > 3 - void _planner_refresh_e3_positioning() { _planner_refresh_e_positioning(3); } - #if E_STEPPERS > 4 - void _planner_refresh_e4_positioning() { _planner_refresh_e_positioning(4); } - #if E_STEPPERS > 5 - void _planner_refresh_e5_positioning() { _planner_refresh_e_positioning(5); } - #endif // E_STEPPERS > 5 - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 #endif // M203 / M205 Velocity options void menu_advanced_velocity() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); // M203 Max Feedrate - #define EDIT_VMAX(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, 999) + constexpr xyze_feedrate_t max_fr_edit = + #ifdef MAX_FEEDRATE_EDIT_VALUES + MAX_FEEDRATE_EDIT_VALUES + #elif ENABLED(LIMITED_MAX_FR_EDITING) + DEFAULT_MAX_FEEDRATE + #else + { 999, 999, 999, 999 } + #endif + ; + #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES) + const xyze_feedrate_t max_fr_edit_scaled = max_fr_edit * 2; + #else + const xyze_feedrate_t &max_fr_edit_scaled = max_fr_edit; + #endif + #define EDIT_VMAX(N) EDIT_ITEM_FAST(float3, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]) EDIT_VMAX(A); EDIT_VMAX(B); EDIT_VMAX(C); #if ENABLED(DISTINCT_E_FACTORS) - #define EDIT_VMAX_E(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E##N, &planner.settings.max_feedrate_mm_s[E_AXIS_N(N-1)], 1, 999) - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, 999); + #define EDIT_VMAX_E(N) EDIT_ITEM_FAST(float3, MSG_VMAX_E##N, &planner.settings.max_feedrate_mm_s[E_AXIS_N(N)], 1, max_fr_edit_scaled.e) + EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); + EDIT_VMAX_E(0); EDIT_VMAX_E(1); - EDIT_VMAX_E(2); #if E_STEPPERS > 2 - EDIT_VMAX_E(3); + EDIT_VMAX_E(2); #if E_STEPPERS > 3 - EDIT_VMAX_E(4); + EDIT_VMAX_E(3); #if E_STEPPERS > 4 - EDIT_VMAX_E(5); + EDIT_VMAX_E(4); #if E_STEPPERS > 5 - EDIT_VMAX_E(6); + EDIT_VMAX_E(5); #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 #elif E_STEPPERS - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.settings.max_feedrate_mm_s[E_AXIS], 1, 999); + EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS], 1, max_fr_edit_scaled.e); #endif // M205 S Min Feedrate - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999); + EDIT_ITEM_FAST(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999); // M205 T Min Travel Feedrate - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999); + EDIT_ITEM_FAST(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999); END_MENU(); } @@ -491,43 +464,59 @@ void menu_backlash(); // M201 / M204 Accelerations void menu_advanced_acceleration() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + static float max_accel = _MAX(planner.settings.max_acceleration_mm_per_s2[A_AXIS], planner.settings.max_acceleration_mm_per_s2[B_AXIS], planner.settings.max_acceleration_mm_per_s2[C_AXIS]); // M204 P Acceleration - MENU_MULTIPLIER_ITEM_EDIT(float5_25, MSG_ACC, &planner.settings.acceleration, 25, 99000); + EDIT_ITEM_FAST(float5_25, MSG_ACC, &planner.settings.acceleration, 25, max_accel); // M204 R Retract Acceleration - MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, 99000); + EDIT_ITEM_FAST(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, max_accel); // M204 T Travel Acceleration - MENU_MULTIPLIER_ITEM_EDIT(float5_25, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 25, 99000); + EDIT_ITEM_FAST(float5_25, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 25, max_accel); // M201 settings - #define EDIT_AMAX(Q,L) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5_25, MSG_AMAX MSG_##Q, &planner.settings.max_acceleration_mm_per_s2[_AXIS(Q)], L, 99000, _reset_acceleration_rates) + constexpr xyze_ulong_t max_accel_edit = + #ifdef MAX_ACCEL_EDIT_VALUES + MAX_ACCEL_EDIT_VALUES + #elif ENABLED(LIMITED_MAX_ACCEL_EDITING) + DEFAULT_MAX_ACCELERATION + #else + { 99000, 99000, 99000, 99000 } + #endif + ; + #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES) + const xyze_ulong_t max_accel_edit_scaled = max_accel_edit * 2; + #else + const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit; + #endif + + #define EDIT_AMAX(Q,L) EDIT_ITEM_FAST(long5_25, MSG_AMAX_##Q, &planner.settings.max_acceleration_mm_per_s2[_AXIS(Q)], L, max_accel_edit_scaled[_AXIS(Q)], [](){ planner.reset_acceleration_rates(); }) EDIT_AMAX(A,100); EDIT_AMAX(B,100); EDIT_AMAX(C, 10); #if ENABLED(DISTINCT_E_FACTORS) - #define EDIT_AMAX_E(N,E) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E##N, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(E)], 100, 99000, _reset_e##E##_acceleration_rate) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, 99000, _reset_acceleration_rates); - EDIT_AMAX_E(1,0); - EDIT_AMAX_E(2,1); + #define EDIT_AMAX_E(N) EDIT_ITEM_FAST(long5_25, MSG_AMAX_E##N, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(N)], 100, max_accel_edit_scaled.e, [](){ _reset_e_acceleration_rate(N); }) + EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, [](){ planner.reset_acceleration_rates(); }); + EDIT_AMAX_E(0); + EDIT_AMAX_E(1); #if E_STEPPERS > 2 - EDIT_AMAX_E(3,2); + EDIT_AMAX_E(2); #if E_STEPPERS > 3 - EDIT_AMAX_E(4,3); + EDIT_AMAX_E(3); #if E_STEPPERS > 4 - EDIT_AMAX_E(5,4); + EDIT_AMAX_E(4); #if E_STEPPERS > 5 - EDIT_AMAX_E(6,5); + EDIT_AMAX_E(5); #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 #elif E_STEPPERS - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates); + EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, [](){ planner.reset_acceleration_rates(); }); #endif END_MENU(); @@ -536,26 +525,35 @@ void menu_backlash(); // M205 Jerk void menu_advanced_jerk() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) #if ENABLED(LIN_ADVANCE) - MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f, planner.recalculate_max_e_jerk); + EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f, planner.recalculate_max_e_jerk); #else - MENU_ITEM_EDIT(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f); + EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.5f); #endif #endif #if HAS_CLASSIC_JERK - #define EDIT_JERK(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, 990) + constexpr xyze_float_t max_jerk_edit = + #ifdef MAX_ACCEL_EDIT_VALUES + MAX_JERK_EDIT_VALUES + #elif ENABLED(LIMITED_JERK_EDITING) + { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } + #else + { 990, 990, 990, 990 } + #endif + ; + #define EDIT_JERK(N) EDIT_ITEM_FAST(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, max_jerk_edit[_AXIS(N)]) EDIT_JERK(A); EDIT_JERK(B); #if ENABLED(DELTA) EDIT_JERK(C); #else - MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1f, 990); + EDIT_ITEM_FAST(float52sign, MSG_VC_JERK, &planner.max_jerk.c, 0.1f, max_jerk_edit.c); #endif - #if !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - EDIT_JERK(E); + #if HAS_CLASSIC_E_JERK + EDIT_ITEM_FAST(float52sign, MSG_VE_JERK, &planner.max_jerk.e, 0.1f, max_jerk_edit.e); #endif #endif @@ -565,32 +563,32 @@ void menu_backlash(); // M92 Steps-per-mm void menu_advanced_steps_per_mm() { START_MENU(); - MENU_BACK(MSG_ADVANCED_SETTINGS); + BACK_ITEM(MSG_ADVANCED_SETTINGS); - #define EDIT_QSTEPS(Q) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_##Q##STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, _planner_refresh_positioning) + #define EDIT_QSTEPS(Q) EDIT_ITEM_FAST(float51, MSG_##Q##_STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, [](){ planner.refresh_positioning(); }) EDIT_QSTEPS(A); EDIT_QSTEPS(B); EDIT_QSTEPS(C); #if ENABLED(DISTINCT_E_FACTORS) - #define EDIT_ESTEPS(N,E) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_E##N##STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(E)], 5, 9999, _planner_refresh_e##E##_positioning) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, _planner_refresh_positioning); - EDIT_ESTEPS(1,0); - EDIT_ESTEPS(2,1); + #define EDIT_ESTEPS(N) EDIT_ITEM_FAST(float51, MSG_E##N##_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(N)], 5, 9999, [](){ _planner_refresh_e_positioning(N); }) + EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, [](){ planner.refresh_positioning(); }); + EDIT_ESTEPS(0); + EDIT_ESTEPS(1); #if E_STEPPERS > 2 - EDIT_ESTEPS(3,2); + EDIT_ESTEPS(2); #if E_STEPPERS > 3 - EDIT_ESTEPS(4,3); + EDIT_ESTEPS(3); #if E_STEPPERS > 4 - EDIT_ESTEPS(5,4); + EDIT_ESTEPS(4); #if E_STEPPERS > 5 - EDIT_ESTEPS(6,5); + EDIT_ESTEPS(5); #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 #elif E_STEPPERS - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning); + EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, [](){ planner.refresh_positioning(); }); #endif END_MENU(); @@ -602,7 +600,7 @@ void menu_backlash(); static void lcd_init_eeprom_confirm() { do_select_screen( - PSTR(MSG_BUTTON_INIT), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_INIT), GET_TEXT(MSG_BUTTON_CANCEL), []{ const bool inited = settings.init_eeprom(); #if HAS_BUZZER @@ -611,7 +609,7 @@ void menu_backlash(); UNUSED(inited); }, ui.goto_previous_screen, - PSTR(MSG_INIT_EEPROM), nullptr, PSTR("?") + GET_TEXT(MSG_INIT_EEPROM), nullptr, PSTR("?") ); } @@ -624,7 +622,7 @@ void menu_advanced_settings() { lcd_runout_distance_mm = runout.runout_distance(); #endif START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); #if DISABLED(SLIM_LCD_MENUS) @@ -632,60 +630,60 @@ void menu_advanced_settings() { // // Set Home Offsets // - MENU_ITEM(function, MSG_SET_HOME_OFFSETS, _lcd_set_home_offsets); + ACTION_ITEM(MSG_SET_HOME_OFFSETS, [](){ queue.inject_P(PSTR("M428")); ui.return_to_status(); }); #endif // M203 / M205 - Feedrate items - MENU_ITEM(submenu, MSG_VELOCITY, menu_advanced_velocity); + SUBMENU(MSG_VELOCITY, menu_advanced_velocity); // M201 - Acceleration items - MENU_ITEM(submenu, MSG_ACCELERATION, menu_advanced_acceleration); + SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); // M205 - Max Jerk - MENU_ITEM(submenu, MSG_JERK, menu_advanced_jerk); + SUBMENU(MSG_JERK, menu_advanced_jerk); if (!printer_busy()) { // M92 - Steps Per mm - MENU_ITEM(submenu, MSG_STEPS_PER_MM, menu_advanced_steps_per_mm); + SUBMENU(MSG_STEPS_PER_MM, menu_advanced_steps_per_mm); } #endif // !SLIM_LCD_MENUS #if ENABLED(BACKLASH_GCODE) - MENU_ITEM(submenu, MSG_BACKLASH, menu_backlash); + SUBMENU(MSG_BACKLASH, menu_backlash); #endif #if ENABLED(DAC_STEPPER_CURRENT) - MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_dac); + SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); #endif #if HAS_MOTOR_CURRENT_PWM - MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_pwm); + SUBMENU(MSG_DRIVE_STRENGTH, menu_pwm); #endif #if HAS_TRINAMIC - MENU_ITEM(submenu, MSG_TMC_DRIVERS, menu_tmc); + SUBMENU(MSG_TMC_DRIVERS, menu_tmc); #endif #if SHOW_MENU_ADVANCED_TEMPERATURE - MENU_ITEM(submenu, MSG_TEMPERATURE, menu_advanced_temperature); + SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature); #endif #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) - MENU_ITEM(submenu, MSG_FILAMENT, menu_advanced_filament); + SUBMENU(MSG_FILAMENT, menu_advanced_filament); #elif ENABLED(LIN_ADVANCE) #if EXTRUDERS == 1 - MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); #elif EXTRUDERS > 1 - #define EDIT_ADVANCE_K(N) MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E##N, &planner.extruder_advance_K[N-1], 0, 999) + #define EDIT_ADVANCE_K(N) EDIT_ITEM(float52, MSG_ADVANCE_K_E##N, &planner.extruder_advance_K[N], 0, 999) + EDIT_ADVANCE_K(0); EDIT_ADVANCE_K(1); - EDIT_ADVANCE_K(2); #if EXTRUDERS > 2 - EDIT_ADVANCE_K(3); + EDIT_ADVANCE_K(2); #if EXTRUDERS > 3 - EDIT_ADVANCE_K(4); + EDIT_ADVANCE_K(3); #if EXTRUDERS > 4 - EDIT_ADVANCE_K(5); + EDIT_ADVANCE_K(4); #if EXTRUDERS > 5 - EDIT_ADVANCE_K(6); + EDIT_ADVANCE_K(5); #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -695,12 +693,12 @@ void menu_advanced_settings() { // M540 S - Abort on endstop hit when SD printing #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) - MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); + EDIT_ITEM(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); #endif #if ENABLED(SD_FIRMWARE_UPDATE) bool sd_update_state = settings.sd_update_status(); - MENU_ITEM_EDIT_CALLBACK(bool, MSG_MEDIA_UPDATE, &sd_update_state, []{ + EDIT_ITEM(bool, MSG_MEDIA_UPDATE, &sd_update_state, []{ // // Toggle the SD Firmware Update state in EEPROM // @@ -715,7 +713,7 @@ void menu_advanced_settings() { #endif #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) - MENU_ITEM(submenu, MSG_INIT_EEPROM, lcd_init_eeprom_confirm); + SUBMENU(MSG_INIT_EEPROM, lcd_init_eeprom_confirm); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 147c593901..cc0b3a2c99 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -34,17 +34,17 @@ void menu_backlash() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); - MENU_MULTIPLIER_ITEM_EDIT(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on); + EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on); - #define EDIT_BACKLASH_DISTANCE(N) MENU_MULTIPLIER_ITEM_EDIT(float43, MSG_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f); + #define EDIT_BACKLASH_DISTANCE(N) EDIT_ITEM_FAST(float43, MSG_BACKLASH_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f); EDIT_BACKLASH_DISTANCE(A); EDIT_BACKLASH_DISTANCE(B); EDIT_BACKLASH_DISTANCE(C); #ifdef BACKLASH_SMOOTHING_MM - MENU_MULTIPLIER_ITEM_EDIT(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f); + EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 07629b7179..ac2a68fb36 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -58,26 +58,24 @@ static inline void _lcd_goto_next_corner() { line_to_z(LEVEL_CORNERS_Z_HOP); switch (bed_corner) { case 0: - current_position[X_AXIS] = X_MIN_BED + LEVEL_CORNERS_INSET; - current_position[Y_AXIS] = Y_MIN_BED + LEVEL_CORNERS_INSET; + current_position.set(X_MIN_BED + LEVEL_CORNERS_INSET, Y_MIN_BED + LEVEL_CORNERS_INSET); break; case 1: - current_position[X_AXIS] = X_MAX_BED - (LEVEL_CORNERS_INSET); + current_position.x = X_MAX_BED - (LEVEL_CORNERS_INSET); break; case 2: - current_position[Y_AXIS] = Y_MAX_BED - (LEVEL_CORNERS_INSET); + current_position.y = Y_MAX_BED - (LEVEL_CORNERS_INSET); break; case 3: - current_position[X_AXIS] = X_MIN_BED + LEVEL_CORNERS_INSET; + current_position.x = X_MIN_BED + LEVEL_CORNERS_INSET; break; #if ENABLED(LEVEL_CENTER_TOO) case 4: - current_position[X_AXIS] = X_CENTER; - current_position[Y_AXIS] = Y_CENTER; + current_position.set(X_CENTER, Y_CENTER); break; #endif } - planner.buffer_line(current_position, MMM_TO_MMS(manual_feedrate_mm_m[X_AXIS]), active_extruder); + line_to_current_position(MMM_TO_MMS(manual_feedrate_mm_m.x)); line_to_z(LEVEL_CORNERS_HEIGHT); if (++bed_corner > 3 #if ENABLED(LEVEL_CENTER_TOO) @@ -88,7 +86,7 @@ static inline void _lcd_goto_next_corner() { static inline void menu_level_bed_corners() { do_select_screen( - PSTR(MSG_BUTTON_NEXT), PSTR(MSG_BUTTON_DONE), + GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE), _lcd_goto_next_corner, []{ #if HAS_LEVELING @@ -96,7 +94,7 @@ static inline void menu_level_bed_corners() { #endif ui.goto_previous_screen_no_defer(); }, - PSTR( + GET_TEXT( #if ENABLED(LEVEL_CENTER_TOO) MSG_LEVEL_BED_NEXT_POINT #else diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index bb4eaa8456..1318e2307e 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -74,14 +74,14 @@ #if MANUAL_PROBE_HEIGHT > 0 && DISABLED(MESH_BED_LEVELING) // Display "Done" screen and wait for moves to complete line_to_z(MANUAL_PROBE_HEIGHT); - ui.synchronize(PSTR(MSG_LEVEL_BED_DONE)); + ui.synchronize(GET_TEXT(MSG_LEVEL_BED_DONE)); #endif ui.goto_previous_screen_no_defer(); #if HAS_BUZZER ui.completion_feedback(); #endif } - if (ui.should_draw()) draw_menu_item_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_LEVEL_BED_DONE)); + if (ui.should_draw()) draw_menu_item_static(LCD_HEIGHT >= 4 ? 1 : 0, GET_TEXT(MSG_LEVEL_BED_DONE)); ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); } @@ -121,7 +121,7 @@ // Encoder knob or keypad buttons adjust the Z position // if (ui.encoderPosition) { - const float z = current_position[Z_AXIS] + float(int16_t(ui.encoderPosition)) * (MESH_EDIT_Z_STEP); + const float z = current_position.z + float(int16_t(ui.encoderPosition)) * (MESH_EDIT_Z_STEP); line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5f, (LCD_PROBE_Z_RANGE) * 0.5f)); ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); ui.encoderPosition = 0; @@ -131,8 +131,8 @@ // Draw on first display, then only on Z change // if (ui.should_draw()) { - const float v = current_position[Z_AXIS]; - draw_edit_screen(PSTR(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+')); + const float v = current_position.z; + draw_edit_screen(GET_TEXT(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+')); } } @@ -143,7 +143,7 @@ if (ui.should_draw()) { char msg[10]; sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), total_probe_points); - draw_edit_screen(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg); + draw_edit_screen(GET_TEXT(MSG_LEVEL_BED_NEXT_POINT), msg); } ui.refresh(LCDVIEW_CALL_NO_REDRAW); if (!ui.wait_for_bl_move) ui.goto_screen(_lcd_level_bed_get_z); @@ -169,7 +169,7 @@ // Move to the first probe position // void _lcd_level_bed_homing_done() { - if (ui.should_draw()) draw_edit_screen(PSTR(MSG_LEVEL_BED_WAITING)); + if (ui.should_draw()) draw_edit_screen(GET_TEXT(MSG_LEVEL_BED_WAITING)); if (ui.use_click()) { manual_probe_index = 0; _lcd_level_goto_next_point(); @@ -210,10 +210,10 @@ void menu_edit_mesh() { static uint8_t xind, yind; // =0 START_MENU(); - MENU_BACK(MSG_BED_LEVELING); - MENU_ITEM_EDIT(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); - MENU_ITEM_EDIT(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); + BACK_ITEM(MSG_BED_LEVELING); + EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); + EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); + EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); END_MENU(); } @@ -235,60 +235,62 @@ */ void menu_bed_leveling() { START_MENU(); - MENU_BACK(MSG_MOTION); + BACK_ITEM(MSG_MOTION); const bool is_homed = all_axes_known(); // Auto Home if not using manual probing #if NONE(PROBE_MANUALLY, MESH_BED_LEVELING) - if (!is_homed) MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28")); #endif // Level Bed #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) // Manual leveling uses a guided procedure - MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue); + SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue); #else // Automatic leveling can just run the G-code - MENU_ITEM(gcode, MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); + GCODES_ITEM(MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); #endif #if ENABLED(MESH_EDIT_MENU) if (leveling_is_valid()) - MENU_ITEM(submenu, MSG_EDIT_MESH, menu_edit_mesh); + SUBMENU(MSG_EDIT_MESH, menu_edit_mesh); #endif // Homed and leveling is valid? Then leveling can be toggled. if (is_homed && leveling_is_valid()) { - bool new_level_state = planner.leveling_active; - MENU_ITEM_EDIT_CALLBACK(bool, MSG_BED_LEVELING, &new_level_state, _lcd_toggle_bed_leveling); + bool show_state = planner.leveling_active; + EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); } // Z Fade Height #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &lcd_z_fade_height, 0, 100, _lcd_set_z_fade_height); + // Shadow for editing the fade height + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, [](){ set_z_fade_height(editable.decimal); }); #endif // // Mesh Bed Leveling Z-Offset // #if ENABLED(MESH_BED_LEVELING) - MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); #endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); #elif HAS_BED_PROBE - MENU_ITEM_EDIT(float52, MSG_ZPROBE_ZOFFSET, &probe_offset[Z_AXIS], Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + EDIT_ITEM(float52, MSG_ZPROBE_ZOFFSET, &probe_offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #endif #if ENABLED(LEVEL_BED_CORNERS) - MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); - MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + ACTION_ITEM(MSG_LOAD_EEPROM, lcd_load_settings); + ACTION_ITEM(MSG_STORE_EEPROM, lcd_store_settings); #endif END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 8708c7d96f..62f6f45ce5 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -54,13 +54,6 @@ void menu_advanced_settings(); void menu_delta_calibrate(); #endif -static void lcd_factory_settings() { - settings.reset(); - #if HAS_BUZZER - ui.completion_feedback(); - #endif -} - #if ENABLED(LCD_PROGRESS_BAR_TEST) #include "../lcdprint.h" @@ -75,7 +68,7 @@ static void lcd_factory_settings() { bar_percent += (int8_t)ui.encoderPosition; LIMIT(bar_percent, 0, 100); ui.encoderPosition = 0; - draw_menu_item_static(0, PSTR(MSG_PROGRESS_BAR_TEST), SS_CENTER|SS_INVERT); + draw_menu_item_static(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_CENTER|SS_INVERT); lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_wchar('%'); lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent); } @@ -92,10 +85,10 @@ static void lcd_factory_settings() { void menu_debug() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); #if ENABLED(LCD_PROGRESS_BAR_TEST) - MENU_ITEM(submenu, MSG_PROGRESS_BAR_TEST, _progress_bar_test); + SUBMENU(MSG_PROGRESS_BAR_TEST, _progress_bar_test); #endif END_MENU(); @@ -109,7 +102,7 @@ static void lcd_factory_settings() { void menu_tool_change() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) static constexpr float max_extrude = #if ENABLED(PREVENT_LENGTHY_EXTRUDE) @@ -118,12 +111,12 @@ static void lcd_factory_settings() { 500 #endif ; - MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude); - MENU_ITEM_EDIT(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude); - MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &toolchange_settings.retract_speed, 10, 5400); - MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &toolchange_settings.prime_speed, 10, 5400); + EDIT_ITEM(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude); + EDIT_ITEM(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &toolchange_settings.retract_speed, 10, 5400); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_PRIME_SPD, &toolchange_settings.prime_speed, 10, 5400); #endif - MENU_ITEM_EDIT(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10); + EDIT_ITEM(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10); END_MENU(); } @@ -143,16 +136,16 @@ static void lcd_factory_settings() { }; START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); #if ENABLED(DUAL_X_CARRIAGE) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_X_OFFSET, &hotend_offset[X_AXIS][1], float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets); + EDIT_ITEM_FAST(float51, MSG_X_OFFSET, &hotend_offset[1].x, float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets); #else - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52sign, MSG_X_OFFSET, &hotend_offset[X_AXIS][1], -99.0, 99.0, _recalc_offsets); + EDIT_ITEM_FAST(float52sign, MSG_X_OFFSET, &hotend_offset[1].x, -99.0, 99.0, _recalc_offsets); #endif - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52sign, MSG_Y_OFFSET, &hotend_offset[Y_AXIS][1], -99.0, 99.0, _recalc_offsets); - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52sign, MSG_Z_OFFSET, &hotend_offset[Z_AXIS][1], Z_PROBE_LOW_POINT, 10.0, _recalc_offsets); + EDIT_ITEM_FAST(float52sign, MSG_Y_OFFSET, &hotend_offset[1].y, -99.0, 99.0, _recalc_offsets); + EDIT_ITEM_FAST(float52sign, MSG_Z_OFFSET, &hotend_offset[1].z, Z_PROBE_LOW_POINT, 10.0, _recalc_offsets); #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + ACTION_ITEM(MSG_STORE_EEPROM, lcd_store_settings); #endif END_MENU(); } @@ -162,19 +155,19 @@ static void lcd_factory_settings() { void menu_idex() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); - MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); + GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS)); - MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, need_g28 + GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28 ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100") ); - MENU_ITEM(gcode, MSG_IDEX_MODE_MIRRORED_COPY, need_g28 + GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28 ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") // If Y or Z is not homed, do a full G28 first : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") ); - MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); + GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); END_MENU(); } @@ -202,27 +195,27 @@ static void lcd_factory_settings() { void menu_bltouch() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); - MENU_ITEM(function, MSG_BLTOUCH_RESET, bltouch._reset); - MENU_ITEM(function, MSG_BLTOUCH_SELFTEST, bltouch._selftest); - MENU_ITEM(function, MSG_BLTOUCH_DEPLOY, bltouch._deploy); - MENU_ITEM(function, MSG_BLTOUCH_STOW, bltouch._stow); - MENU_ITEM(function, MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode); + BACK_ITEM(MSG_CONFIGURATION); + ACTION_ITEM(MSG_BLTOUCH_RESET, bltouch._reset); + ACTION_ITEM(MSG_BLTOUCH_SELFTEST, bltouch._selftest); + ACTION_ITEM(MSG_BLTOUCH_DEPLOY, bltouch._deploy); + ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow); + ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode); #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) - MENU_ITEM(submenu, MSG_BLTOUCH_5V_MODE, []{ - do_select_screen(PSTR(MSG_BLTOUCH_5V_MODE), PSTR(MSG_BUTTON_CANCEL), bltouch._set_5V_mode, ui.goto_previous_screen, PSTR(MSG_BLTOUCH_MODE_CHANGE)); + SUBMENU(MSG_BLTOUCH_5V_MODE, []{ + do_select_screen(GET_TEXT(MSG_BLTOUCH_5V_MODE), GET_TEXT(MSG_BUTTON_CANCEL), bltouch._set_5V_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); }); - MENU_ITEM(submenu, MSG_BLTOUCH_OD_MODE, []{ - do_select_screen(PSTR(MSG_BLTOUCH_OD_MODE), PSTR(MSG_BUTTON_CANCEL), bltouch._set_OD_mode, ui.goto_previous_screen, PSTR(MSG_BLTOUCH_MODE_CHANGE)); + SUBMENU(MSG_BLTOUCH_OD_MODE, []{ + do_select_screen(GET_TEXT(MSG_BLTOUCH_OD_MODE), GET_TEXT(MSG_BUTTON_CANCEL), bltouch._set_OD_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); }); - MENU_ITEM(function, MSG_BLTOUCH_MODE_STORE, bltouch._mode_store); - MENU_ITEM(submenu, MSG_BLTOUCH_MODE_STORE_5V, []{ - do_select_screen(PSTR(MSG_BLTOUCH_MODE_STORE_5V), PSTR(MSG_BUTTON_CANCEL), bltouch.mode_conv_5V, ui.goto_previous_screen, PSTR(MSG_BLTOUCH_MODE_CHANGE)); + ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store); + SUBMENU(MSG_BLTOUCH_MODE_STORE_5V, []{ + do_select_screen(GET_TEXT(MSG_BLTOUCH_MODE_STORE_5V), GET_TEXT(MSG_BUTTON_CANCEL), bltouch.mode_conv_5V, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); }); - MENU_ITEM(submenu, MSG_BLTOUCH_MODE_STORE_OD, []{ - do_select_screen(PSTR(MSG_BLTOUCH_MODE_STORE_OD), PSTR(MSG_BUTTON_CANCEL), bltouch.mode_conv_OD, ui.goto_previous_screen, PSTR(MSG_BLTOUCH_MODE_CHANGE)); + SUBMENU(MSG_BLTOUCH_MODE_STORE_OD, []{ + do_select_screen(GET_TEXT(MSG_BLTOUCH_MODE_STORE_OD), GET_TEXT(MSG_BUTTON_CANCEL), bltouch.mode_conv_OD, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); }); - MENU_ITEM(function, MSG_BLTOUCH_MODE_ECHO, bltouch_report); + ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report); #endif END_MENU(); } @@ -233,11 +226,11 @@ static void lcd_factory_settings() { void menu_touchmi() { START_MENU(); ui.defer_status_screen(); - MENU_BACK(MSG_CONFIGURATION); - MENU_ITEM(gcode, MSG_TOUCHMI_INIT, PSTR("M851 Z0\nG28\nG1 F200 Z0")); - MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); - MENU_ITEM(gcode, MSG_TOUCHMI_SAVE, PSTR("M500\nG1 F200 Z10")); - MENU_ITEM(gcode, MSG_TOUCHMI_ZTEST, PSTR("G28\nG1 F200 Z0")); + BACK_ITEM(MSG_CONFIGURATION); + GCODES_ITEM(MSG_TOUCHMI_INIT, PSTR("M851 Z0\nG28\nG1 F200 Z0")); + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + GCODES_ITEM(MSG_TOUCHMI_SAVE, PSTR("M500\nG1 F200 Z10")); + GCODES_ITEM(MSG_TOUCHMI_ZTEST, PSTR("G28\nG1 F200 Z0")); END_MENU(); } #endif @@ -250,9 +243,9 @@ static void lcd_factory_settings() { void menu_case_light() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); - MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + BACK_ITEM(MSG_CONFIGURATION); + EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); END_MENU(); } @@ -266,23 +259,23 @@ static void lcd_factory_settings() { void menu_config_retract() { START_MENU(); - MENU_BACK(MSG_CONFIGURATION); + BACK_ITEM(MSG_CONFIGURATION); #if ENABLED(FWRETRACT_AUTORETRACT) - MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); + EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); #endif - MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100); #if EXTRUDERS > 1 - MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100); #endif - MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999); - MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999); - MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100); + EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100); #if EXTRUDERS > 1 - MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100); #endif - MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999); + EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999); #if EXTRUDERS > 1 - MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999); + EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999); #endif END_MENU(); } @@ -292,36 +285,19 @@ static void lcd_factory_settings() { #if DISABLED(SLIM_LCD_MENUS) void _menu_configuration_preheat_settings(const uint8_t material) { - #if HOTENDS > 5 - #define MINTEMP_ALL _MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP) - #define MAXTEMP_ALL _MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP) - #elif HOTENDS > 4 - #define MINTEMP_ALL _MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP) - #define MAXTEMP_ALL _MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP) - #elif HOTENDS > 3 - #define MINTEMP_ALL _MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP) - #define MAXTEMP_ALL _MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP) - #elif HOTENDS > 2 - #define MINTEMP_ALL _MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP) - #define MAXTEMP_ALL _MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP) - #elif HOTENDS > 1 - #define MINTEMP_ALL _MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP) - #define MAXTEMP_ALL _MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP) - #else - #define MINTEMP_ALL HEATER_0_MINTEMP - #define MAXTEMP_ALL HEATER_0_MAXTEMP - #endif + #define MINTEMP_ALL _MIN(LIST_N(HOTENDS, HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP), 999) + #define MAXTEMP_ALL _MAX(LIST_N(HOTENDS, HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP), 0) START_MENU(); - MENU_BACK(MSG_CONFIGURATION); - MENU_ITEM_EDIT(percent, MSG_FAN_SPEED, &ui.preheat_fan_speed[material], 0, 255); + BACK_ITEM(MSG_CONFIGURATION); + EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.preheat_fan_speed[material], 0, 255); #if HAS_TEMP_HOTEND - MENU_ITEM_EDIT(int3, MSG_NOZZLE, &ui.preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15); + EDIT_ITEM(int3, MSG_NOZZLE, &ui.preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15); #endif #if HAS_HEATED_BED - MENU_ITEM_EDIT(int3, MSG_BED, &ui.preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 10); + EDIT_ITEM(int3, MSG_BED, &ui.preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 10); #endif #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + ACTION_ITEM(MSG_STORE_EEPROM, lcd_store_settings); #endif END_MENU(); } @@ -333,21 +309,21 @@ static void lcd_factory_settings() { void menu_configuration() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); // // Debug Menu when certain options are enabled // #if HAS_DEBUG_MENU - MENU_ITEM(submenu, MSG_DEBUG_MENU, menu_debug); + SUBMENU(MSG_DEBUG_MENU, menu_debug); #endif - MENU_ITEM(submenu, MSG_ADVANCED_SETTINGS, menu_advanced_settings); + SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); #elif HAS_BED_PROBE - MENU_ITEM_EDIT(float52, MSG_ZPROBE_ZOFFSET, &probe_offset[Z_AXIS], Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + EDIT_ITEM(float52, MSG_ZPROBE_ZOFFSET, &probe_offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #endif const bool busy = printer_busy(); @@ -356,23 +332,23 @@ void menu_configuration() { // Delta Calibration // #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) - MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, menu_delta_calibrate); + SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate); #endif #if HAS_HOTEND_OFFSET - MENU_ITEM(submenu, MSG_OFFSETS_MENU, menu_tool_offsets); + SUBMENU(MSG_OFFSETS_MENU, menu_tool_offsets); #endif #if ENABLED(DUAL_X_CARRIAGE) - MENU_ITEM(submenu, MSG_IDEX_MENU, menu_idex); + SUBMENU(MSG_IDEX_MENU, menu_idex); #endif #if ENABLED(BLTOUCH) - MENU_ITEM(submenu, MSG_BLTOUCH, menu_bltouch); + SUBMENU(MSG_BLTOUCH, menu_bltouch); #endif #if ENABLED(TOUCH_MI_PROBE) - MENU_ITEM(submenu, MSG_TOUCHMI_PROBE, menu_touchmi); + SUBMENU(MSG_TOUCHMI_PROBE, menu_touchmi); #endif } @@ -380,7 +356,7 @@ void menu_configuration() { // Set single nozzle filament retract and prime length // #if EXTRUDERS > 1 - MENU_ITEM(submenu, MSG_TOOL_CHANGE, menu_tool_change); + SUBMENU(MSG_TOOL_CHANGE, menu_tool_change); #endif // @@ -389,41 +365,46 @@ void menu_configuration() { #if ENABLED(CASE_LIGHT_MENU) #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) if (PWM_PIN(CASE_LIGHT_PIN)) - MENU_ITEM(submenu, MSG_CASE_LIGHT, menu_case_light); + SUBMENU(MSG_CASE_LIGHT, menu_case_light); else #endif - MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); #endif #if HAS_LCD_CONTRAST - MENU_ITEM_EDIT_CALLBACK(int3, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true); + EDIT_ITEM(int3, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true); #endif #if ENABLED(FWRETRACT) - MENU_ITEM(submenu, MSG_RETRACT, menu_config_retract); + SUBMENU(MSG_RETRACT, menu_config_retract); #endif #if HAS_FILAMENT_SENSOR - MENU_ITEM_EDIT_CALLBACK(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); + EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); #endif #if ENABLED(POWER_LOSS_RECOVERY) - MENU_ITEM_EDIT_CALLBACK(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed); + EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed); #endif #if DISABLED(SLIM_LCD_MENUS) // Preheat configurations - MENU_ITEM(submenu, MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings); - MENU_ITEM(submenu, MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings); + SUBMENU(MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings); + SUBMENU(MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings); #endif #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + ACTION_ITEM(MSG_STORE_EEPROM, lcd_store_settings); if (!busy) - MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); + ACTION_ITEM(MSG_LOAD_EEPROM, lcd_load_settings); #endif if (!busy) - MENU_ITEM(function, MSG_RESTORE_FAILSAFE, lcd_factory_settings); + ACTION_ITEM(MSG_RESTORE_FAILSAFE, [](){ + settings.reset(); + #if HAS_BUZZER + ui.completion_feedback(); + #endif + }); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index ad346e71df..81b324114a 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -47,39 +47,23 @@ void _lcd_user_gcode(PGM_P const cmd) { #endif } -#if defined(USER_DESC_1) && defined(USER_GCODE_1) - void lcd_user_gcode_1() { _lcd_user_gcode(PSTR(USER_GCODE_1 _DONE_SCRIPT)); } -#endif -#if defined(USER_DESC_2) && defined(USER_GCODE_2) - void lcd_user_gcode_2() { _lcd_user_gcode(PSTR(USER_GCODE_2 _DONE_SCRIPT)); } -#endif -#if defined(USER_DESC_3) && defined(USER_GCODE_3) - void lcd_user_gcode_3() { _lcd_user_gcode(PSTR(USER_GCODE_3 _DONE_SCRIPT)); } -#endif -#if defined(USER_DESC_4) && defined(USER_GCODE_4) - void lcd_user_gcode_4() { _lcd_user_gcode(PSTR(USER_GCODE_4 _DONE_SCRIPT)); } -#endif -#if defined(USER_DESC_5) && defined(USER_GCODE_5) - void lcd_user_gcode_5() { _lcd_user_gcode(PSTR(USER_GCODE_5 _DONE_SCRIPT)); } -#endif - void menu_user() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); #if defined(USER_DESC_1) && defined(USER_GCODE_1) - MENU_ITEM(function, USER_DESC_1, lcd_user_gcode_1); + ACTION_ITEM_P(PSTR(USER_DESC_1), [](){ _lcd_user_gcode(PSTR(USER_GCODE_1 _DONE_SCRIPT)); }); #endif #if defined(USER_DESC_2) && defined(USER_GCODE_2) - MENU_ITEM(function, USER_DESC_2, lcd_user_gcode_2); + ACTION_ITEM_P(PSTR(USER_DESC_2), [](){ _lcd_user_gcode(PSTR(USER_GCODE_2 _DONE_SCRIPT)); }); #endif #if defined(USER_DESC_3) && defined(USER_GCODE_3) - MENU_ITEM(function, USER_DESC_3, lcd_user_gcode_3); + ACTION_ITEM_P(PSTR(USER_DESC_3), [](){ _lcd_user_gcode(PSTR(USER_GCODE_3 _DONE_SCRIPT)); }); #endif #if defined(USER_DESC_4) && defined(USER_GCODE_4) - MENU_ITEM(function, USER_DESC_4, lcd_user_gcode_4); + ACTION_ITEM_P(PSTR(USER_DESC_4), [](){ _lcd_user_gcode(PSTR(USER_GCODE_4 _DONE_SCRIPT)); }); #endif #if defined(USER_DESC_5) && defined(USER_GCODE_5) - MENU_ITEM(function, USER_DESC_5, lcd_user_gcode_5); + ACTION_ITEM_P(PSTR(USER_DESC_5), [](){ _lcd_user_gcode(PSTR(USER_GCODE_5 _DONE_SCRIPT)); }); #endif END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index b8232ba388..38e94c0908 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -40,8 +40,8 @@ #include "../../lcd/extensible_ui/ui_api.h" #endif -void _man_probe_pt(const float &rx, const float &ry) { - do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES); +void _man_probe_pt(const xy_pos_t &xy) { + do_blocking_move_to_xy_z(xy, Z_CLEARANCE_BETWEEN_PROBES); ui.synchronize(); move_menu_scale = _MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); ui.goto_screen(lcd_move_z); @@ -51,8 +51,8 @@ void _man_probe_pt(const float &rx, const float &ry) { #include "../../gcode/gcode.h" - float lcd_probe_pt(const float &rx, const float &ry) { - _man_probe_pt(rx, ry); + float lcd_probe_pt(const xy_pos_t &xy) { + _man_probe_pt(xy); KEEPALIVE_STATE(PAUSED_FOR_USER); ui.defer_status_screen(); wait_for_user = true; @@ -60,11 +60,11 @@ void _man_probe_pt(const float &rx, const float &ry) { host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Delta Calibration in progress"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("Delta Calibration in progress")); + ExtUI::onUserConfirmRequired_P(PSTR("Delta Calibration in progress")); #endif while (wait_for_user) idle(); ui.goto_previous_screen_no_defer(); - return current_position[Z_AXIS]; + return current_position.z; } #endif @@ -83,58 +83,61 @@ void _man_probe_pt(const float &rx, const float &ry) { ui.goto_screen(_lcd_calibrate_homing); } - void _goto_tower_x() { _man_probe_pt(cos(RADIANS(210)) * delta_calibration_radius, sin(RADIANS(210)) * delta_calibration_radius); } - void _goto_tower_y() { _man_probe_pt(cos(RADIANS(330)) * delta_calibration_radius, sin(RADIANS(330)) * delta_calibration_radius); } - void _goto_tower_z() { _man_probe_pt(cos(RADIANS( 90)) * delta_calibration_radius, sin(RADIANS( 90)) * delta_calibration_radius); } - void _goto_center() { _man_probe_pt(0,0); } + void _goto_tower_a(const float &a) { + xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) }; + _man_probe_pt(tower_vec * delta_calibration_radius); + } + void _goto_tower_x() { _goto_tower_a(210); } + void _goto_tower_y() { _goto_tower_a(330); } + void _goto_tower_z() { _goto_tower_a( 90); } + void _goto_center() { xy_pos_t ctr{0}; _man_probe_pt(ctr); } #endif -void _recalc_delta_settings() { - #if HAS_LEVELING - reset_bed_level(); // After changing kinematics bed-level data is no longer valid - #endif - recalc_delta_settings(); -} - void lcd_delta_settings() { + auto _recalc_delta_settings = []() { + #if HAS_LEVELING + reset_bed_level(); // After changing kinematics bed-level data is no longer valid + #endif + recalc_delta_settings(); + }; START_MENU(); - MENU_BACK(MSG_DELTA_CALIBRATE); - MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings); - #define EDIT_ENDSTOP_ADJ(LABEL,N) MENU_ITEM_EDIT_CALLBACK(float43, LABEL, &delta_endstop_adj[_AXIS(N)], -5, 5, _recalc_delta_settings) - EDIT_ENDSTOP_ADJ("Ex",A); - EDIT_ENDSTOP_ADJ("Ey",B); - EDIT_ENDSTOP_ADJ("Ez",C); - MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings); - #define EDIT_ANGLE_TRIM(LABEL,N) MENU_ITEM_EDIT_CALLBACK(float43, LABEL, &delta_tower_angle_trim[_AXIS(N)], -5, 5, _recalc_delta_settings) - EDIT_ANGLE_TRIM("Tx",A); - EDIT_ANGLE_TRIM("Ty",B); - EDIT_ANGLE_TRIM("Tz",C); - MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings); + BACK_ITEM(MSG_DELTA_CALIBRATE); + EDIT_ITEM(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings); + #define EDIT_ENDSTOP_ADJ(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_endstop_adj.N, -5, 5, _recalc_delta_settings) + EDIT_ENDSTOP_ADJ("Ex",a); + EDIT_ENDSTOP_ADJ("Ey",b); + EDIT_ENDSTOP_ADJ("Ez",c); + EDIT_ITEM(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings); + #define EDIT_ANGLE_TRIM(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_tower_angle_trim.N, -5, 5, _recalc_delta_settings) + EDIT_ANGLE_TRIM("Tx",a); + EDIT_ANGLE_TRIM("Ty",b); + EDIT_ANGLE_TRIM("Tz",c); + EDIT_ITEM(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings); END_MENU(); } void menu_delta_calibrate() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); #if ENABLED(DELTA_AUTO_CALIBRATION) - MENU_ITEM(gcode, MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); + GCODES_ITEM(MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); - MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); + ACTION_ITEM(MSG_STORE_EEPROM, lcd_store_settings); + ACTION_ITEM(MSG_LOAD_EEPROM, lcd_load_settings); #endif #endif - MENU_ITEM(submenu, MSG_DELTA_SETTINGS, lcd_delta_settings); + SUBMENU(MSG_DELTA_SETTINGS, lcd_delta_settings); #if ENABLED(DELTA_CALIBRATION_MENU) - MENU_ITEM(submenu, MSG_AUTO_HOME, _lcd_delta_calibrate_home); + SUBMENU(MSG_AUTO_HOME, _lcd_delta_calibrate_home); if (all_axes_homed()) { - MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_X, _goto_tower_x); - MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Y, _goto_tower_y); - MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Z, _goto_tower_z); - MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_CENTER, _goto_center); + SUBMENU(MSG_DELTA_CALIBRATE_X, _goto_tower_x); + SUBMENU(MSG_DELTA_CALIBRATE_Y, _goto_tower_y); + SUBMENU(MSG_DELTA_CALIBRATE_Z, _goto_tower_z); + SUBMENU(MSG_DELTA_CALIBRATE_CENTER, _goto_center); } #endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 474e326667..e32e93d23c 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -47,32 +47,35 @@ inline PGM_P _change_filament_temp_command() { return PSTR("M701 T%d"); case PAUSE_MODE_UNLOAD_FILAMENT: return _change_filament_temp_extruder >= 0 ? PSTR("M702 T%d") : PSTR("M702 ;%d"); + case PAUSE_MODE_CHANGE_FILAMENT: case PAUSE_MODE_PAUSE_PRINT: default: return PSTR("M600 B0 T%d"); } - return PSTR(MSG_FILAMENTCHANGE); + return GET_TEXT(MSG_FILAMENTCHANGE); } +// Initiate Filament Load/Unload/Change at the specified temperature static void _change_filament_temp(const uint16_t temperature) { char cmd[11]; sprintf_P(cmd, _change_filament_temp_command(), _change_filament_temp_extruder); thermalManager.setTargetHotend(temperature, _change_filament_temp_extruder); lcd_enqueue_one_now(cmd); } -inline void _lcd_change_filament_temp_1_func() { _change_filament_temp(ui.preheat_hotend_temp[0]); } -inline void _lcd_change_filament_temp_2_func() { _change_filament_temp(ui.preheat_hotend_temp[1]); } -inline void _lcd_change_filament_temp_custom_cb() { _change_filament_temp(thermalManager.temp_hotend[_change_filament_temp_extruder].target); } -static PGM_P change_filament_header(const PauseMode mode) { +// +// Menu to choose the temperature and start Filament Change +// + +inline PGM_P change_filament_header(const PauseMode mode) { switch (mode) { case PAUSE_MODE_LOAD_FILAMENT: - return PSTR(MSG_FILAMENTLOAD); + return GET_TEXT(MSG_FILAMENTLOAD); case PAUSE_MODE_UNLOAD_FILAMENT: - return PSTR(MSG_FILAMENTUNLOAD); + return GET_TEXT(MSG_FILAMENTUNLOAD); default: break; } - return PSTR(MSG_FILAMENTCHANGE); + return GET_TEXT(MSG_FILAMENTCHANGE); } void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { @@ -80,59 +83,14 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { _change_filament_temp_extruder = extruder; START_MENU(); if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT); - MENU_BACK(MSG_BACK); - MENU_ITEM(function, MSG_PREHEAT_1, _lcd_change_filament_temp_1_func); - MENU_ITEM(function, MSG_PREHEAT_2, _lcd_change_filament_temp_2_func); - uint16_t max_temp; - switch (extruder) { - default: max_temp = HEATER_0_MAXTEMP; - #if HOTENDS > 1 - case 1: max_temp = HEATER_1_MAXTEMP; break; - #if HOTENDS > 2 - case 2: max_temp = HEATER_2_MAXTEMP; break; - #if HOTENDS > 3 - case 3: max_temp = HEATER_3_MAXTEMP; break; - #if HOTENDS > 4 - case 4: max_temp = HEATER_4_MAXTEMP; break; - #if HOTENDS > 5 - case 5: max_temp = HEATER_5_MAXTEMP; break; - #endif - #endif - #endif - #endif - #endif - } - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[_change_filament_temp_extruder].target, EXTRUDE_MINTEMP, max_temp - 15, _lcd_change_filament_temp_custom_cb); + BACK_ITEM(MSG_BACK); + ACTION_ITEM(MSG_PREHEAT_1, [](){ _change_filament_temp(ui.preheat_hotend_temp[0]); }); + ACTION_ITEM(MSG_PREHEAT_2, [](){ _change_filament_temp(ui.preheat_hotend_temp[1]); }); + EDIT_ITEM_FAST(int3, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[_change_filament_temp_extruder].target, EXTRUDE_MINTEMP, heater_maxtemp[extruder] - 15, [](){ + _change_filament_temp(thermalManager.temp_hotend[_change_filament_temp_extruder].target); + }); END_MENU(); } -#if E_STEPPERS - void menu_temp_e0_filament_change() { _menu_temp_filament_op(PAUSE_MODE_PAUSE_PRINT, 0); } - void menu_temp_e0_filament_load() { _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); } - void menu_temp_e0_filament_unload() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); } - #if E_STEPPERS > 1 - void menu_temp_e1_filament_change() { _menu_temp_filament_op(PAUSE_MODE_PAUSE_PRINT, 1); } - void menu_temp_e1_filament_load() { _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 1); } - void menu_temp_e1_filament_unload() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 1); } - #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - void menu_unload_filament_all_temp() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, -1); } - #endif - #if E_STEPPERS > 2 - void menu_temp_e2_filament_change() { _menu_temp_filament_op(PAUSE_MODE_PAUSE_PRINT, 2); } - void menu_temp_e2_filament_load() { _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 2); } - void menu_temp_e2_filament_unload() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 2); } - #if E_STEPPERS > 3 - void menu_temp_e3_filament_change() { _menu_temp_filament_op(PAUSE_MODE_PAUSE_PRINT, 3); } - void menu_temp_e3_filament_load() { _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 3); } - void menu_temp_e3_filament_unload() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 3); } - #if E_STEPPERS > 4 - void menu_temp_e4_filament_change() { _menu_temp_filament_op(PAUSE_MODE_PAUSE_PRINT, 4); } - void menu_temp_e4_filament_load() { _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 4); } - void menu_temp_e4_filament_unload() { _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 4); } - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 -#endif // E_STEPPERS /** * @@ -142,48 +100,51 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) void menu_change_filament() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); + + // Say "filament change" when no print is active + editable.int8 = printingIsPaused() ? PAUSE_MODE_PAUSE_PRINT : PAUSE_MODE_CHANGE_FILAMENT; // Change filament #if E_STEPPERS == 1 - PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE); + PGM_P const msg0 = GET_TEXT(MSG_FILAMENTCHANGE); if (thermalManager.targetTooColdToExtrude(active_extruder)) - MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change); + MENU_ITEM_P(submenu, msg0, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 0); }); else MENU_ITEM_P(gcode, msg0, PSTR("M600 B0")); #else - PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE " " MSG_E1); - PGM_P msg1 = PSTR(MSG_FILAMENTCHANGE " " MSG_E2); + PGM_P const msg0 = GET_TEXT(MSG_FILAMENTCHANGE_E0); + PGM_P const msg1 = GET_TEXT(MSG_FILAMENTCHANGE_E1); if (thermalManager.targetTooColdToExtrude(0)) - MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change); + MENU_ITEM_P(submenu, msg0, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 0); }); else MENU_ITEM_P(gcode, msg0, PSTR("M600 B0 T0")); if (thermalManager.targetTooColdToExtrude(1)) - MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_change); + MENU_ITEM_P(submenu, msg1, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 1); }); else MENU_ITEM_P(gcode, msg1, PSTR("M600 B0 T1")); #if E_STEPPERS > 2 - PGM_P msg2 = PSTR(MSG_FILAMENTCHANGE " " MSG_E3); + PGM_P const msg2 = GET_TEXT(MSG_FILAMENTCHANGE_E2); if (thermalManager.targetTooColdToExtrude(2)) - MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_change); + MENU_ITEM_P(submenu, msg2, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 2); }); else MENU_ITEM_P(gcode, msg2, PSTR("M600 B0 T2")); #if E_STEPPERS > 3 - PGM_P msg3 = PSTR(MSG_FILAMENTCHANGE " " MSG_E4); + PGM_P const msg3 = GET_TEXT(MSG_FILAMENTCHANGE_E3); if (thermalManager.targetTooColdToExtrude(3)) - MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_change); + MENU_ITEM_P(submenu, msg3, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 3); }); else MENU_ITEM_P(gcode, msg3, PSTR("M600 B0 T3")); #if E_STEPPERS > 4 - PGM_P msg4 = PSTR(MSG_FILAMENTCHANGE " " MSG_E5); + PGM_P const msg4 = GET_TEXT(MSG_FILAMENTCHANGE_E4); if (thermalManager.targetTooColdToExtrude(4)) - MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_change); + MENU_ITEM_P(submenu, msg4, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 4); }); else MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4")); #if E_STEPPERS > 5 - PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6); + PGM_P const msg5 = GET_TEXT(MSG_FILAMENTCHANGE_E5); if (thermalManager.targetTooColdToExtrude(5)) - MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_change); + MENU_ITEM_P(submenu, msg5, [](){ _menu_temp_filament_op(PauseMode(editable.int8), 5); }); else MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5")); #endif // E_STEPPERS > 5 @@ -196,44 +157,44 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { if (!printer_busy()) { // Load filament #if E_STEPPERS == 1 - PGM_P msg0 = PSTR(MSG_FILAMENTLOAD); + PGM_P const msg0 = GET_TEXT(MSG_FILAMENTLOAD); if (thermalManager.targetTooColdToExtrude(active_extruder)) - MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load); + MENU_ITEM_P(submenu, msg0, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); }); else MENU_ITEM_P(gcode, msg0, PSTR("M701")); #else - PGM_P msg0 = PSTR(MSG_FILAMENTLOAD " " MSG_E1); - PGM_P msg1 = PSTR(MSG_FILAMENTLOAD " " MSG_E2); + PGM_P const msg0 = GET_TEXT(MSG_FILAMENTLOAD_E0); + PGM_P const msg1 = GET_TEXT(MSG_FILAMENTLOAD_E1); if (thermalManager.targetTooColdToExtrude(0)) - MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load); + MENU_ITEM_P(submenu, msg0, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); }); else MENU_ITEM_P(gcode, msg0, PSTR("M701 T0")); if (thermalManager.targetTooColdToExtrude(1)) - MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_load); + MENU_ITEM_P(submenu, msg1, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 1); }); else MENU_ITEM_P(gcode, msg1, PSTR("M701 T1")); #if E_STEPPERS > 2 - PGM_P msg2 = PSTR(MSG_FILAMENTLOAD " " MSG_E3); + PGM_P const msg2 = GET_TEXT(MSG_FILAMENTLOAD_E2); if (thermalManager.targetTooColdToExtrude(2)) - MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_load); + MENU_ITEM_P(submenu, msg2, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 2); }); else MENU_ITEM_P(gcode, msg2, PSTR("M701 T2")); #if E_STEPPERS > 3 - PGM_P msg3 = PSTR(MSG_FILAMENTLOAD " " MSG_E4); + PGM_P const msg3 = GET_TEXT(MSG_FILAMENTLOAD_E3); if (thermalManager.targetTooColdToExtrude(3)) - MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_load); + MENU_ITEM_P(submenu, msg3, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 3); }); else MENU_ITEM_P(gcode, msg3, PSTR("M701 T3")); #if E_STEPPERS > 4 - PGM_P msg4 = PSTR(MSG_FILAMENTLOAD " " MSG_E5); + PGM_P const msg4 = GET_TEXT(MSG_FILAMENTLOAD_E4); if (thermalManager.targetTooColdToExtrude(4)) - MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_load); + MENU_ITEM_P(submenu, msg4, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 4); }); else MENU_ITEM_P(gcode, msg4, PSTR("M701 T4")); #if E_STEPPERS > 5 - PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6); + PGM_P const msg5 = GET_TEXT(MSG_FILAMENTLOAD_E5); if (thermalManager.targetTooColdToExtrude(5)) - MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_load); + MENU_ITEM_P(submenu, msg5, [](){ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 5); }); else MENU_ITEM_P(gcode, msg5, PSTR("M701 T5")); #endif // E_STEPPERS > 5 @@ -245,60 +206,50 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { // Unload filament #if E_STEPPERS == 1 if (thermalManager.targetHotEnoughToExtrude(active_extruder)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD, PSTR("M702")); + GCODES_ITEM(MSG_FILAMENTUNLOAD, PSTR("M702")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD, menu_temp_e0_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); }); #else #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - if (thermalManager.targetHotEnoughToExtrude(0) - #if E_STEPPERS > 1 - && thermalManager.targetHotEnoughToExtrude(1) - #if E_STEPPERS > 2 - && thermalManager.targetHotEnoughToExtrude(2) - #if E_STEPPERS > 3 - && thermalManager.targetHotEnoughToExtrude(3) - #if E_STEPPERS > 4 - && thermalManager.targetHotEnoughToExtrude(4) - #if E_STEPPERS > 5 - && thermalManager.targetHotEnoughToExtrude(5) - #endif // E_STEPPERS > 5 - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - ) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD_ALL, PSTR("M702")); + if (JOIN_N(E_STEPPERS, &&, + thermalManager.targetHotEnoughToExtrude(0), + thermalManager.targetHotEnoughToExtrude(1), + thermalManager.targetHotEnoughToExtrude(2), + thermalManager.targetHotEnoughToExtrude(3), + thermalManager.targetHotEnoughToExtrude(4), + thermalManager.targetHotEnoughToExtrude(5)) + ) GCODES_ITEM(MSG_FILAMENTUNLOAD_ALL, PSTR("M702")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD_ALL, menu_unload_filament_all_temp); + SUBMENU(MSG_FILAMENTUNLOAD_ALL, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, -1); }); #endif if (thermalManager.targetHotEnoughToExtrude(0)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E1, PSTR("M702 T0")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E0, PSTR("M702 T0")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E1, menu_temp_e0_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E0, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); }); if (thermalManager.targetHotEnoughToExtrude(1)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E2, PSTR("M702 T1")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E1, PSTR("M702 T1")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E2, menu_temp_e1_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E1, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 1); }); #if E_STEPPERS > 2 if (thermalManager.targetHotEnoughToExtrude(2)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E3, PSTR("M702 T2")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E2, PSTR("M702 T2")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E3, menu_temp_e2_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E2, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 2); }); #if E_STEPPERS > 3 if (thermalManager.targetHotEnoughToExtrude(3)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E4, PSTR("M702 T3")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E3, PSTR("M702 T3")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E4, menu_temp_e3_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E3, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 3); }); #if E_STEPPERS > 4 if (thermalManager.targetHotEnoughToExtrude(4)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E4, PSTR("M702 T4")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, menu_temp_e4_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E4, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 4); }); #if E_STEPPERS > 5 if (thermalManager.targetHotEnoughToExtrude(5)) - MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5")); + GCODES_ITEM(MSG_FILAMENTUNLOAD_E5, PSTR("M702 T5")); else - MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, menu_temp_e5_filament_unload); + SUBMENU(MSG_FILAMENTUNLOAD_E5, [](){ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 5); }); #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 @@ -315,20 +266,22 @@ static uint8_t hotend_status_extruder = 0; static PGM_P pause_header() { switch (pause_mode) { + case PAUSE_MODE_CHANGE_FILAMENT: + return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER); case PAUSE_MODE_LOAD_FILAMENT: - return PSTR(MSG_FILAMENT_CHANGE_HEADER_LOAD); + return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_LOAD); case PAUSE_MODE_UNLOAD_FILAMENT: - return PSTR(MSG_FILAMENT_CHANGE_HEADER_UNLOAD); + return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_UNLOAD); default: break; } - return PSTR(MSG_FILAMENT_CHANGE_HEADER_PAUSE); + return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_PAUSE); } // Portions from STATIC_ITEM... #define HOTEND_STATUS_ITEM() do { \ if (_menuLineNr == _thisItemNr) { \ if (ui.should_draw()) { \ - draw_menu_item_static(_lcdLineNr, PSTR(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT); \ + draw_menu_item_static(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ if (_skipStatic && encoderLine <= _thisItemNr) { \ @@ -340,163 +293,60 @@ static PGM_P pause_header() { ++_thisItemNr; \ }while(0) -void lcd_pause_resume_print() { - pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; -} - -void lcd_pause_extrude_more() { - pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; -} - void menu_pause_option() { START_MENU(); #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER); #endif - MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_PURGE, lcd_pause_extrude_more); + ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_PURGE, [](){ pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; }); #if HAS_FILAMENT_SENSOR if (runout.filament_ran_out) - MENU_ITEM_EDIT_CALLBACK(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); + EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); else #endif - MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_RESUME, lcd_pause_resume_print); + ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_RESUME, [](){ pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; }); END_MENU(); } // // ADVANCED_PAUSE_FEATURE message screens // +// Warning: msg must have three null bytes to delimit lines! +// +void _lcd_pause_message(PGM_P const msg) { + PGM_P const msg1 = msg; + PGM_P const msg2 = msg1 + strlen_P(msg1) + 1; + PGM_P const msg3 = msg2 + strlen_P(msg2) + 1; + const bool has2 = msg2[0], has3 = msg3[0], + skip1 = !has2 && (LCD_HEIGHT) >= 5; -void _lcd_pause_message(PGM_P const msg1, PGM_P const msg2=nullptr, PGM_P const msg3=nullptr) { START_SCREEN(); - STATIC_ITEM_P(pause_header(), SS_CENTER|SS_INVERT); - STATIC_ITEM_P(msg1); - if (msg2) STATIC_ITEM_P(msg2); - if (msg3 && (LCD_HEIGHT) >= 5) STATIC_ITEM_P(msg3); - if ((!!msg2) + (!!msg3) + 2 < (LCD_HEIGHT) - 1) STATIC_ITEM(" "); - HOTEND_STATUS_ITEM(); + STATIC_ITEM_P(pause_header(), SS_CENTER|SS_INVERT); // 1: Header + if (skip1) SKIP_ITEM(); // Move a single-line message down + STATIC_ITEM_P(msg1); // 2: Message Line 1 + if (has2) STATIC_ITEM_P(msg2); // 3: Message Line 2 + if (has3 && (LCD_HEIGHT) >= 5) STATIC_ITEM_P(msg3); // 4: Message Line 3 (if LCD has 5 lines) + if (skip1 + 1 + has2 + has3 < (LCD_HEIGHT) - 2) SKIP_ITEM(); // Push Hotend Status down, if needed + HOTEND_STATUS_ITEM(); // 5: Hotend Status END_SCREEN(); } -void lcd_pause_pausing_message() { - _lcd_pause_message(PSTR(MSG_PAUSE_PRINT_INIT_1) - #ifdef MSG_PAUSE_PRINT_INIT_2 - , PSTR(MSG_PAUSE_PRINT_INIT_2) - #ifdef MSG_PAUSE_PRINT_INIT_3 - , PSTR(MSG_PAUSE_PRINT_INIT_3) - #endif - #endif - ); -} - -void lcd_pause_changing_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_INIT_1) - #ifdef MSG_FILAMENT_CHANGE_INIT_2 - , PSTR(MSG_FILAMENT_CHANGE_INIT_2) - #ifdef MSG_FILAMENT_CHANGE_INIT_3 - , PSTR(MSG_FILAMENT_CHANGE_INIT_3) - #endif - #endif - ); -} - -void lcd_pause_unload_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_UNLOAD_1) - #ifdef MSG_FILAMENT_CHANGE_UNLOAD_2 - , PSTR(MSG_FILAMENT_CHANGE_UNLOAD_2) - #ifdef MSG_FILAMENT_CHANGE_UNLOAD_3 - , PSTR(MSG_FILAMENT_CHANGE_UNLOAD_3) - #endif - #endif - ); -} - -void lcd_pause_heating_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_HEATING_1) - #ifdef MSG_FILAMENT_CHANGE_HEATING_2 - , PSTR(MSG_FILAMENT_CHANGE_HEATING_2) - #ifdef MSG_FILAMENT_CHANGE_HEATING_3 - , PSTR(MSG_FILAMENT_CHANGE_HEATING_3) - #endif - #endif - ); -} - -void lcd_pause_heat_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_HEAT_1) - #ifdef MSG_FILAMENT_CHANGE_HEAT_2 - , PSTR(MSG_FILAMENT_CHANGE_HEAT_2) - #ifdef MSG_FILAMENT_CHANGE_HEAT_3 - , PSTR(MSG_FILAMENT_CHANGE_HEAT_3) - #endif - #endif - ); -} - -void lcd_pause_insert_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_INSERT_1) - #ifdef MSG_FILAMENT_CHANGE_INSERT_2 - , PSTR(MSG_FILAMENT_CHANGE_INSERT_2) - #ifdef MSG_FILAMENT_CHANGE_INSERT_3 - , PSTR(MSG_FILAMENT_CHANGE_INSERT_3) - #endif - #endif - ); -} - -void lcd_pause_load_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_LOAD_1) - #ifdef MSG_FILAMENT_CHANGE_LOAD_2 - , PSTR(MSG_FILAMENT_CHANGE_LOAD_2) - #ifdef MSG_FILAMENT_CHANGE_LOAD_3 - , PSTR(MSG_FILAMENT_CHANGE_LOAD_3) - #endif - #endif - ); -} - -void lcd_pause_waiting_message() { - _lcd_pause_message(PSTR(MSG_ADVANCED_PAUSE_WAITING_1) - #ifdef MSG_ADVANCED_PAUSE_WAITING_2 - , PSTR(MSG_ADVANCED_PAUSE_WAITING_2) - #ifdef MSG_ADVANCED_PAUSE_WAITING_3 - , PSTR(MSG_ADVANCED_PAUSE_WAITING_3) - #endif - #endif - ); -} - -void lcd_pause_resume_message() { - _lcd_pause_message(PSTR(MSG_FILAMENT_CHANGE_RESUME_1) - #ifdef MSG_FILAMENT_CHANGE_RESUME_2 - , PSTR(MSG_FILAMENT_CHANGE_RESUME_2) - #ifdef MSG_FILAMENT_CHANGE_RESUME_3 - , PSTR(MSG_FILAMENT_CHANGE_RESUME_3) - #endif - #endif - ); -} +void lcd_pause_pausing_message() { _lcd_pause_message(GET_TEXT(MSG_PAUSE_PRINT_INIT)); } +void lcd_pause_changing_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INIT)); } +void lcd_pause_unload_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_UNLOAD)); } +void lcd_pause_heating_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEATING)); } +void lcd_pause_heat_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEAT)); } +void lcd_pause_insert_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INSERT)); } +void lcd_pause_load_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_LOAD)); } +void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT(MSG_ADVANCED_PAUSE_WAITING)); } +void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_RESUME)); } void lcd_pause_purge_message() { - _lcd_pause_message( - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - PSTR(MSG_FILAMENT_CHANGE_CONT_PURGE_1) - #ifdef MSG_FILAMENT_CHANGE_CONT_PURGE_2 - , PSTR(MSG_FILAMENT_CHANGE_CONT_PURGE_2) - #ifdef MSG_FILAMENT_CHANGE_CONT_PURGE_3 - , PSTR(MSG_FILAMENT_CHANGE_CONT_PURGE_3) - #endif - #endif - #else - PSTR(MSG_FILAMENT_CHANGE_PURGE_1) - #ifdef MSG_FILAMENT_CHANGE_PURGE_2 - , PSTR(MSG_FILAMENT_CHANGE_PURGE_2) - #ifdef MSG_FILAMENT_CHANGE_PURGE_3 - , PSTR(MSG_FILAMENT_CHANGE_PURGE_3) - #endif - #endif - #endif - ); + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_CONT_PURGE)); + #else + _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_PURGE)); + #endif } FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp index 36b7f18314..4f9748dc12 100644 --- a/Marlin/src/lcd/menu/menu_game.cpp +++ b/Marlin/src/lcd/menu/menu_game.cpp @@ -29,18 +29,18 @@ void menu_game() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); #if ENABLED(MARLIN_BRICKOUT) - MENU_ITEM(submenu, MSG_BRICKOUT, brickout.enter_game); + SUBMENU(MSG_BRICKOUT, brickout.enter_game); #endif #if ENABLED(MARLIN_INVADERS) - MENU_ITEM(submenu, MSG_INVADERS, invaders.enter_game); + SUBMENU(MSG_INVADERS, invaders.enter_game); #endif #if ENABLED(MARLIN_SNAKE) - MENU_ITEM(submenu, MSG_SNAKE, snake.enter_game); + SUBMENU(MSG_SNAKE, snake.enter_game); #endif #if ENABLED(MARLIN_MAZE) - MENU_ITEM(submenu, MSG_MAZE, maze.enter_game); + SUBMENU(MSG_MAZE, maze.enter_game); #endif END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 7732bd7eb6..5ef6bbfc46 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -34,8 +34,8 @@ #include "game/game.h" #endif -#define STATIC_PAIR(MSG, VALUE, STYL) do{ strcpy_P(buffer, PSTR(": ")); strcpy(buffer + 2, VALUE); STATIC_ITEM(MSG, STYL, buffer); }while(0) -#define STATIC_PAIR_P(MSG, PVALUE, STYL) do{ strcpy_P(buffer, PSTR(": ")); strcpy_P(buffer + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, buffer); }while(0) +#define VALUE_ITEM(MSG, VALUE, STYL) do{ strcpy_P(buffer, PSTR(": ")); strcpy(buffer + 2, VALUE); STATIC_ITEM(MSG, STYL, buffer); }while(0) +#define VALUE_ITEM_P(MSG, PVALUE, STYL) do{ strcpy_P(buffer, PSTR(": ")); strcpy_P(buffer + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, buffer); }while(0) #if ENABLED(PRINTCOUNTER) @@ -51,37 +51,41 @@ #endif ); - char buffer[21]; // for STATIC_PAIR_P + char buffer[21]; // For macro usage printStatistics stats = print_job_timer.getStats(); START_SCREEN(); // 12345678901234567890 - STATIC_PAIR(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 - STATIC_PAIR(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 + VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 + VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 - STATIC_PAIR_P(MSG_INFO_PRINT_TIME, "", SS_LEFT); // Total print Time: - STATIC_ITEM("> ", SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time: + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s - STATIC_PAIR_P(MSG_INFO_PRINT_LONGEST, "", SS_LEFT); // Longest job time: - STATIC_ITEM("> ", SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM(MSG_INFO_PRINT_LONGEST, SS_LEFT); // Longest job time: + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s - STATIC_PAIR_P(MSG_INFO_PRINT_FILAMENT, "", SS_LEFT); // Extruded total: + STATIC_ITEM(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total: sprintf_P(buffer, PSTR("%ld.%im"), long(stats.filamentUsed / 1000), int16_t(stats.filamentUsed / 100) % 10); - STATIC_ITEM("> ", SS_LEFT, buffer); // > 125m + STATIC_ITEM_P(PSTR("> "), SS_LEFT, buffer); // > 125m + + #if SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0 + strcpy_P(buffer, GET_TEXT(MSG_SERVICE_IN)); + #endif #if SERVICE_INTERVAL_1 > 0 - STATIC_ITEM(SERVICE_NAME_1 MSG_SERVICE_IN, SS_LEFT); // Service X in: - STATIC_ITEM("> ", SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s + STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s #endif #if SERVICE_INTERVAL_2 > 0 - STATIC_ITEM(SERVICE_NAME_2 MSG_SERVICE_IN, SS_LEFT); - STATIC_ITEM("> ", SS_LEFT, duration_t(stats.nextService2).toString(buffer)); + STATIC_ITEM_P(PSTR(SERVICE_NAME_2 " "), SS_LEFT, buffer); + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService2).toString(buffer)); #endif #if SERVICE_INTERVAL_3 > 0 - STATIC_ITEM(SERVICE_NAME_3 MSG_SERVICE_IN, SS_LEFT); - STATIC_ITEM("> ", SS_LEFT, duration_t(stats.nextService3).toString(buffer)); + STATIC_ITEM_P(PSTR(SERVICE_NAME_3 " "), SS_LEFT, buffer); + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService3).toString(buffer)); #endif END_SCREEN(); @@ -99,70 +103,114 @@ void menu_info_thermistors() { #endif ); - char buffer[21]; // for STATIC_PAIR_P + char buffer[21]; // For macro usage START_SCREEN(); + #if EXTRUDERS #define THERMISTOR_ID TEMP_SENSOR_0 #include "../thermistornames.h" - STATIC_ITEM("T0: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E0 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_1 != 0 #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_1 #include "../thermistornames.h" - STATIC_ITEM("T1: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E1 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_2 != 0 #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_2 #include "../thermistornames.h" - STATIC_ITEM("T2: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E2 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_3 != 0 #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_3 #include "../thermistornames.h" - STATIC_ITEM("T3: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E3 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_4 != 0 #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_4 #include "../thermistornames.h" - STATIC_ITEM("T4: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E4 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_5 != 0 #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_5 #include "../thermistornames.h" - STATIC_ITEM("T5: " THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR(LCD_STR_E5 ": " THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); + #endif + + #if EXTRUDERS + { + STATIC_ITEM( + #if WATCH_HOTENDS + MSG_INFO_RUNAWAY_ON + #else + MSG_INFO_RUNAWAY_OFF + #endif + , SS_LEFT + ); + } #endif #if HAS_HEATED_BED + { #undef THERMISTOR_ID #define THERMISTOR_ID TEMP_SENSOR_BED #include "../thermistornames.h" - STATIC_ITEM("TBed:" THERMISTOR_NAME, SS_INVERT); - STATIC_PAIR_P(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); - STATIC_PAIR_P(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); + STATIC_ITEM_P(PSTR("BED:" THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); + STATIC_ITEM( + #if WATCH_BED + MSG_INFO_RUNAWAY_ON + #else + MSG_INFO_RUNAWAY_OFF + #endif + , SS_LEFT + ); + } #endif + + #if HAS_HEATED_CHAMBER + { + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_CHAMBER + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR("CHAM:" THERMISTOR_NAME), SS_INVERT); + VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); + VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); + STATIC_ITEM( + #if WATCH_CHAMBER + MSG_INFO_RUNAWAY_ON + #else + MSG_INFO_RUNAWAY_OFF + #endif + , SS_LEFT + ); + } + #endif + END_SCREEN(); } @@ -176,16 +224,16 @@ void menu_info_board() { #endif ); - char buffer[21]; // for STATIC_PAIR_P + char buffer[21]; // For macro usage START_SCREEN(); - STATIC_ITEM(BOARD_INFO_NAME, SS_CENTER|SS_INVERT); // MyPrinterController + STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_CENTER|SS_INVERT); // MyPrinterController #ifdef BOARD_WEBSITE_URL - STATIC_ITEM(BOARD_WEBSITE_URL, SS_LEFT); // www.my3dprinter.com + STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com #endif - STATIC_PAIR_P(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 - STATIC_PAIR_P(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 - STATIC_PAIR_P(MSG_INFO_PSU, PSU_NAME, SS_CENTER); + VALUE_ITEM_P(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 + VALUE_ITEM_P(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 + VALUE_ITEM_P(MSG_INFO_PSU, PSU_NAME, SS_CENTER); END_SCREEN(); } @@ -215,12 +263,13 @@ void menu_info_board() { #endif ); START_SCREEN(); - STATIC_ITEM(MSG_MARLIN, SS_CENTER|SS_INVERT); // Marlin - STATIC_ITEM(SHORT_BUILD_VERSION); // x.x.x-Branch - STATIC_ITEM(STRING_DISTRIBUTION_DATE); // YYYY-MM-DD HH:MM - STATIC_ITEM(MACHINE_NAME); // My3DPrinter - STATIC_ITEM(WEBSITE_URL); // www.my3dprinter.com - STATIC_ITEM(MSG_INFO_EXTRUDERS ": " STRINGIFY(EXTRUDERS)); // Extruders: 2 + STATIC_ITEM_P(PSTR(MSG_MARLIN), SS_CENTER|SS_INVERT); // Marlin + STATIC_ITEM_P(PSTR(SHORT_BUILD_VERSION)); // x.x.x-Branch + STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM + STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter + STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com + char buffer[21]; + VALUE_ITEM_P(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 #if ENABLED(AUTO_BED_LEVELING_3POINT) STATIC_ITEM(MSG_3POINT_LEVELING); // 3-Point Leveling #elif ENABLED(AUTO_BED_LEVELING_LINEAR) @@ -242,9 +291,9 @@ void menu_info_board() { // void menu_info() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); #if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN) - MENU_ITEM(submenu, MSG_INFO_PRINTER_MENU, ( + SUBMENU(MSG_INFO_PRINTER_MENU, ( #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) menu_show_custom_bootscreen #else @@ -252,24 +301,24 @@ void menu_info() { #endif )); #else - MENU_ITEM(submenu, MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info > - MENU_ITEM(submenu, MSG_INFO_BOARD_MENU, menu_info_board); // Board Info > + SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info > + SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info > #if EXTRUDERS - MENU_ITEM(submenu, MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors > + SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors > #endif #endif #if ENABLED(PRINTCOUNTER) - MENU_ITEM(submenu, MSG_INFO_STATS_MENU, menu_info_stats); // Printer Stats > + SUBMENU(MSG_INFO_STATS_MENU, menu_info_stats); // Printer Stats > #endif #if HAS_GAMES #if ENABLED(GAMES_EASTER_EGG) - MENU_ITEM_DUMMY(); - MENU_ITEM_DUMMY(); - MENU_ITEM_DUMMY(); + SKIP_ITEM(); + SKIP_ITEM(); + SKIP_ITEM(); #endif - MENU_ITEM(submenu, MSG_GAMES, ( + SUBMENU(MSG_GAMES, ( #if HAS_GAME_MENU menu_game #elif ENABLED(MARLIN_BRICKOUT) diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index 449251d9b2..0b0b040921 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -50,8 +50,8 @@ void menu_job_recovery() { ui.defer_status_screen(); START_MENU(); STATIC_ITEM(MSG_OUTAGE_RECOVERY); - MENU_ITEM(function, MSG_RESUME_PRINT, lcd_power_loss_recovery_resume); - MENU_ITEM(function, MSG_STOP_PRINT, lcd_power_loss_recovery_cancel); + ACTION_ITEM(MSG_RESUME_PRINT, lcd_power_loss_recovery_resume); + ACTION_ITEM(MSG_STOP_PRINT, lcd_power_loss_recovery_cancel); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 5ccac8a0ee..e6644c6852 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -38,15 +38,15 @@ #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_LED_PRESETS, SS_CENTER|SS_INVERT); #endif - MENU_BACK(MSG_LED_CONTROL); - MENU_ITEM(function, MSG_SET_LEDS_WHITE, leds.set_white); - MENU_ITEM(function, MSG_SET_LEDS_RED, leds.set_red); - MENU_ITEM(function, MSG_SET_LEDS_ORANGE, leds.set_orange); - MENU_ITEM(function, MSG_SET_LEDS_YELLOW,leds.set_yellow); - MENU_ITEM(function, MSG_SET_LEDS_GREEN, leds.set_green); - MENU_ITEM(function, MSG_SET_LEDS_BLUE, leds.set_blue); - MENU_ITEM(function, MSG_SET_LEDS_INDIGO, leds.set_indigo); - MENU_ITEM(function, MSG_SET_LEDS_VIOLET, leds.set_violet); + BACK_ITEM(MSG_LED_CONTROL); + ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); + ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); + ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds.set_orange); + ACTION_ITEM(MSG_SET_LEDS_YELLOW,leds.set_yellow); + ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); + ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); + ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds.set_indigo); + ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet); END_MENU(); } @@ -54,14 +54,14 @@ void menu_led_custom() { START_MENU(); - MENU_BACK(MSG_LED_CONTROL); - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); + BACK_ITEM(MSG_LED_CONTROL); + EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); #if EITHER(RGBW_LED, NEOPIXEL_LED) - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); #if ENABLED(NEOPIXEL_LED) - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); + EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); #endif #endif END_MENU(); @@ -69,14 +69,14 @@ void menu_led_custom() { void menu_led() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); bool led_on = leds.lights_on; - MENU_ITEM_EDIT_CALLBACK(bool, MSG_LEDS, &led_on, leds.toggle); - MENU_ITEM(function, MSG_SET_LEDS_DEFAULT, leds.set_default); + EDIT_ITEM(bool, MSG_LEDS, &led_on, leds.toggle); + ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); #if ENABLED(LED_COLOR_PRESETS) - MENU_ITEM(submenu, MSG_LED_PRESETS, menu_led_presets); + SUBMENU(MSG_LED_PRESETS, menu_led_presets); #endif - MENU_ITEM(submenu, MSG_CUSTOM_LEDS, menu_led_custom); + SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index df43a09c72..86d64bf8bb 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -44,7 +44,7 @@ #if MACHINE_CAN_STOP void menu_abort_confirm() { - do_select_screen(PSTR(MSG_BUTTON_STOP), PSTR(MSG_BACK), ui.abort_print, ui.goto_previous_screen, PSTR(MSG_STOP_PRINT), nullptr, PSTR("?")); + do_select_screen(GET_TEXT(MSG_BUTTON_STOP), GET_TEXT(MSG_BACK), ui.abort_print, ui.goto_previous_screen, GET_TEXT(MSG_STOP_PRINT), nullptr, PSTR("?")); } #endif // MACHINE_CAN_STOP @@ -62,7 +62,7 @@ void menu_configuration(); #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) - void menu_temp_e0_filament_change(); + void _menu_temp_filament_op(const PauseMode, const int8_t); void menu_change_filament(); #endif @@ -97,9 +97,9 @@ void menu_configuration(); void menu_main() { START_MENU(); - MENU_BACK(MSG_WATCH); + BACK_ITEM(MSG_WATCH); - const bool busy = IS_SD_PRINTING() || print_job_timer.isRunning() + const bool busy = printingIsActive() #if ENABLED(SDSUPPORT) , card_detected = card.isMounted() , card_open = card_detected && card.isFileOpen() @@ -108,12 +108,12 @@ void menu_main() { if (busy) { #if MACHINE_CAN_PAUSE - MENU_ITEM(function, MSG_PAUSE_PRINT, ui.pause_print); + ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); #endif #if MACHINE_CAN_STOP - MENU_ITEM(submenu, MSG_STOP_PRINT, menu_abort_confirm); + SUBMENU(MSG_STOP_PRINT, menu_abort_confirm); #endif - MENU_ITEM(submenu, MSG_TUNE, menu_tune); + SUBMENU(MSG_TUNE, menu_tune); } else { #if !HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT) @@ -121,12 +121,12 @@ void menu_main() { // Autostart // #if ENABLED(MENU_ADDAUTOSTART) - if (!busy) MENU_ITEM(function, MSG_AUTOSTART, card.beginautostart); + if (!busy) ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); #endif if (card_detected) { if (!card_open) { - MENU_ITEM(submenu, MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, menu_media); MENU_ITEM(gcode, #if PIN_EXISTS(SD_DETECT) MSG_CHANGE_MEDIA, PSTR("M21") @@ -138,63 +138,62 @@ void menu_main() { } else { #if PIN_EXISTS(SD_DETECT) - MENU_ITEM(function, MSG_NO_MEDIA, nullptr); + ACTION_ITEM(MSG_NO_MEDIA, nullptr); #else - MENU_ITEM(gcode, MSG_INIT_MEDIA, PSTR("M21")); - MENU_ITEM(function, MSG_MEDIA_RELEASED, nullptr); + GCODES_ITEM(MSG_INIT_MEDIA, PSTR("M21")); + ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr); #endif } #endif // !HAS_ENCODER_WHEEL && SDSUPPORT #if MACHINE_CAN_PAUSE - const bool paused = (print_job_timer.isPaused() - #if ENABLED(SDSUPPORT) - || card.isPaused() - #endif - ); - if (paused) MENU_ITEM(function, MSG_RESUME_PRINT, ui.resume_print); + if (printingIsPaused()) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); #endif - MENU_ITEM(submenu, MSG_MOTION, menu_motion); + SUBMENU(MSG_MOTION, menu_motion); } #if HAS_CUTTER - MENU_ITEM(submenu, MSG_CUTTER(MENU), menu_spindle_laser); + SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser); #endif - MENU_ITEM(submenu, MSG_TEMPERATURE, menu_temperature); + SUBMENU(MSG_TEMPERATURE, menu_temperature); #if ENABLED(MIXING_EXTRUDER) - MENU_ITEM(submenu, MSG_MIXER, menu_mixer); + SUBMENU(MSG_MIXER, menu_mixer); #endif #if ENABLED(MMU2_MENUS) - if (!busy) MENU_ITEM(submenu, MSG_MMU2_MENU, menu_mmu2); + if (!busy) SUBMENU(MSG_MMU2_MENU, menu_mmu2); #endif - MENU_ITEM(submenu, MSG_CONFIGURATION, menu_configuration); + SUBMENU(MSG_CONFIGURATION, menu_configuration); #if ENABLED(CUSTOM_USER_MENUS) - MENU_ITEM(submenu, MSG_USER_MENU, menu_user); + #ifdef CUSTOM_USER_MENU_TITLE + SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #else + SUBMENU(MSG_USER_MENU, menu_user); + #endif #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) if (thermalManager.targetHotEnoughToExtrude(active_extruder)) - MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600 B0")); + GCODES_ITEM(MSG_FILAMENTCHANGE, PSTR("M600 B0")); else - MENU_ITEM(submenu, MSG_FILAMENTCHANGE, menu_temp_e0_filament_change); + SUBMENU(MSG_FILAMENTCHANGE, [](){ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); }); #else - MENU_ITEM(submenu, MSG_FILAMENTCHANGE, menu_change_filament); + SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); #endif #endif #if ENABLED(LCD_INFO_MENU) - MENU_ITEM(submenu, MSG_INFO_MENU, menu_info); + SUBMENU(MSG_INFO_MENU, menu_info); #endif #if ENABLED(LED_CONTROL_MENU) - MENU_ITEM(submenu, MSG_LED_CONTROL, menu_led); + SUBMENU(MSG_LED_CONTROL, menu_led); #endif // @@ -202,9 +201,9 @@ void menu_main() { // #if HAS_POWER_SWITCH if (powersupply_on) - MENU_ITEM(gcode, MSG_SWITCH_PS_OFF, PSTR("M81")); + GCODES_ITEM(MSG_SWITCH_PS_OFF, PSTR("M81")); else - MENU_ITEM(gcode, MSG_SWITCH_PS_ON, PSTR("M80")); + GCODES_ITEM(MSG_SWITCH_PS_ON, PSTR("M80")); #endif #if HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT) @@ -212,7 +211,7 @@ void menu_main() { // Autostart // #if ENABLED(MENU_ADDAUTOSTART) - if (!busy) MENU_ITEM(function, MSG_AUTOSTART, card.beginautostart); + if (!busy) ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); #endif if (card_detected) { @@ -224,37 +223,37 @@ void menu_main() { MSG_RELEASE_MEDIA, PSTR("M22") #endif ); - MENU_ITEM(submenu, MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, menu_media); } } else { #if PIN_EXISTS(SD_DETECT) - MENU_ITEM(function, MSG_NO_MEDIA, nullptr); + ACTION_ITEM(MSG_NO_MEDIA, nullptr); #else - MENU_ITEM(gcode, MSG_INIT_MEDIA, PSTR("M21")); - MENU_ITEM(function, MSG_MEDIA_RELEASED, nullptr); + GCODES_ITEM(MSG_INIT_MEDIA, PSTR("M21")); + ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr); #endif } #endif // HAS_ENCODER_WHEEL && SDSUPPORT #if HAS_SERVICE_INTERVALS #if SERVICE_INTERVAL_1 > 0 - MENU_ITEM(submenu, SERVICE_NAME_1, menu_service1); + SUBMENU_P(PSTR(SERVICE_NAME_1), menu_service1); #endif #if SERVICE_INTERVAL_2 > 0 - MENU_ITEM(submenu, SERVICE_NAME_2, menu_service2); + SUBMENU_P(PSTR(SERVICE_NAME_2), menu_service2); #endif #if SERVICE_INTERVAL_3 > 0 - MENU_ITEM(submenu, SERVICE_NAME_3, menu_service3); + SUBMENU_P(PSTR(SERVICE_NAME_3), menu_service3); #endif #endif #if HAS_GAMES && DISABLED(LCD_INFO_MENU) #if ENABLED(GAMES_EASTER_EGG) - MENU_ITEM_DUMMY(); - MENU_ITEM_DUMMY(); + SKIP_ITEM(); + SKIP_ITEM(); #endif - MENU_ITEM(submenu, MSG_GAMES, ( + SUBMENU(MSG_GAMES, ( #if HAS_GAME_MENU menu_game #elif ENABLED(MARLIN_BRICKOUT) diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index b11963b173..11c57da605 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -31,15 +31,8 @@ #include "menu.h" #include "../../sd/cardreader.h" -#if !PIN_EXISTS(SD_DETECT) - void lcd_sd_refresh() { - encoderTopLine = 0; - card.mount(); - } -#endif - void lcd_sd_updir() { - ui.encoderPosition = card.updir() ? ENCODER_STEPS_PER_MENU_ITEM : 0; + ui.encoderPosition = card.cdup() ? ENCODER_STEPS_PER_MENU_ITEM : 0; encoderTopLine = 0; screen_changed = true; ui.refresh(); @@ -87,9 +80,9 @@ inline void sdcard_start_selected_file() { buffer[0] = ' '; strcpy(buffer + 1, longest); do_select_screen( - PSTR(MSG_BUTTON_PRINT), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_PRINT), GET_TEXT(MSG_BUTTON_CANCEL), sdcard_start_selected_file, ui.goto_previous_screen, - PSTR(MSG_START_PRINT), buffer, PSTR("?") + GET_TEXT(MSG_START_PRINT), buffer, PSTR("?") ); } @@ -97,7 +90,7 @@ inline void sdcard_start_selected_file() { class MenuItem_sdfile { public: - static void action(CardReader &) { + static void action(PGM_P const pstr, CardReader &) { #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) // Save menu state for the selected file sd_encoder_position = ui.encoderPosition; @@ -105,17 +98,18 @@ class MenuItem_sdfile { sd_items = screen_items; #endif #if ENABLED(SD_MENU_CONFIRM_START) - MenuItem_submenu::action(menu_sd_confirm); + MenuItem_submenu::action(pstr, menu_sd_confirm); #else sdcard_start_selected_file(); + UNUSED(pstr); #endif } }; class MenuItem_sdfolder { public: - static void action(CardReader &theCard) { - card.chdir(theCard.filename); + static void action(PGM_P const, CardReader &theCard) { + card.cd(theCard.filename); encoderTopLine = 0; ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM); screen_changed = true; @@ -137,14 +131,14 @@ void menu_media() { #endif START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); if (card.flag.workDirIsRoot) { #if !PIN_EXISTS(SD_DETECT) - MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); + ACTION_ITEM(MSG_REFRESH, [](){ encoderTopLine = 0; card.mount(); }); #endif } else if (card.isMounted()) - MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); + ACTION_ITEM_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); if (ui.should_draw()) for (uint16_t i = 0; i < fileCnt; i++) { if (_menuLineNr == _thisItemNr) { @@ -162,7 +156,7 @@ void menu_media() { MENU_ITEM(sdfile, MSG_MEDIA_MENU, card); } else { - MENU_ITEM_DUMMY(); + SKIP_ITEM(); } } END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index cd23282044..ab93c99965 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -50,9 +50,10 @@ } if (ui.should_draw()) { char tmp[21]; - sprintf_P(tmp, PSTR(MSG_START_Z ": %4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); + strcpy_P(tmp, GET_TEXT(MSG_START_Z)); + sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); SETCURSOR(2, (LCD_HEIGHT - 1) / 2); - LCDPRINT(tmp); + lcd_put_u8str(tmp); } if (ui.lcd_clicked) { @@ -75,9 +76,10 @@ if (ui.should_draw()) { char tmp[21]; - sprintf_P(tmp, PSTR(MSG_END_Z ": %4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); + strcpy_P(tmp, GET_TEXT(MSG_END_Z)); + sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); SETCURSOR(2, (LCD_HEIGHT - 1) / 2); - LCDPRINT(tmp); + lcd_put_u8str(tmp); } if (ui.lcd_clicked) { @@ -90,27 +92,27 @@ void lcd_mixer_edit_gradient_menu() { START_MENU(); - MENU_BACK(MSG_MIXER); + BACK_ITEM(MSG_MIXER); - MENU_ITEM_EDIT_CALLBACK(int8, MSG_START_VTOOL, &mixer.gradient.start_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); - MENU_ITEM_EDIT_CALLBACK(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + EDIT_ITEM(int8, MSG_START_VTOOL, &mixer.gradient.start_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + EDIT_ITEM(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #if ENABLED(GRADIENT_VTOOL) - MENU_ITEM_EDIT_CALLBACK(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #endif char tmp[18]; - MENU_ITEM(submenu, MSG_START_Z ":", lcd_mixer_gradient_z_start_edit); + SUBMENU(MSG_START_Z, lcd_mixer_gradient_z_start_edit); MENU_ITEM_ADDON_START(9); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); - LCDPRINT(tmp); + lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); - MENU_ITEM(submenu, MSG_END_Z ":", lcd_mixer_gradient_z_end_edit); + SUBMENU(MSG_END_Z, lcd_mixer_gradient_z_end_edit); MENU_ITEM_ADDON_START(9); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); - LCDPRINT(tmp); + lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); END_MENU(); @@ -122,10 +124,12 @@ static uint8_t v_index; #if DUAL_MIXING_EXTRUDER void _lcd_draw_mix(const uint8_t y) { - char tmp[21]; - sprintf_P(tmp, PSTR(MSG_MIX ": %3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); + char tmp[10]; // "100%_100%" SETCURSOR(2, y); - LCDPRINT(tmp); + lcd_put_u8str_P(GET_TEXT(MSG_MIX)); + SETCURSOR(LCD_WIDTH - 9, y); + sprintf_P(tmp, PSTR("%3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); + lcd_put_u8str(tmp); } #endif @@ -158,10 +162,10 @@ void lcd_mixer_mix_edit() { #if CHANNEL_MIX_EDITING - #define EDIT_COLOR(N) MENU_MULTIPLIER_ITEM_EDIT(float52, MSG_MIX_COMPONENT " " STRINGIFY(N), &mixer.collector[N-1], 0, 10); + #define EDIT_COLOR(N) EDIT_ITEM_FAST(float52, MSG_MIX_COMPONENT_##N, &mixer.collector[N-1], 0, 10); START_MENU(); - MENU_BACK(MSG_MIXER); + BACK_ITEM(MSG_MIXER); EDIT_COLOR(1); EDIT_COLOR(2); #if MIXING_STEPPERS > 2 @@ -176,8 +180,8 @@ void lcd_mixer_mix_edit() { #endif #endif #endif - MENU_ITEM(function, MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); - MENU_ITEM(function, MSG_COMMIT_VTOOL, _lcd_mixer_commit_vtool); + ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); + ACTION_ITEM(MSG_COMMIT_VTOOL, _lcd_mixer_commit_vtool); END_MENU(); #elif DUAL_MIXING_EXTRUDER @@ -199,7 +203,7 @@ void lcd_mixer_mix_edit() { #else START_MENU(); - MENU_BACK(MSG_MIXER); + BACK_ITEM(MSG_MIXER); END_MENU(); #endif @@ -250,23 +254,23 @@ void lcd_mixer_mix_edit() { // void menu_mixer_vtools_reset_confirm() { do_select_screen( - PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_CANCEL), []{ mixer.reset_vtools(); LCD_MESSAGEPGM(MSG_VTOOLS_RESET); ui.return_to_status(); }, ui.goto_previous_screen, - PSTR(MSG_RESET_VTOOLS), nullptr, PSTR("?") + GET_TEXT(MSG_RESET_VTOOLS), nullptr, PSTR("?") ); } void menu_mixer() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); v_index = mixer.get_current_vtool(); - MENU_ITEM_EDIT_CALLBACK(uint8, MSG_ACTIVE_VTOOL, &v_index, 0, MIXING_VIRTUAL_TOOLS - 1, _lcd_mixer_select_vtool + EDIT_ITEM(uint8, MSG_ACTIVE_VTOOL, &v_index, 0, MIXING_VIRTUAL_TOOLS - 1, _lcd_mixer_select_vtool #if DUAL_MIXING_EXTRUDER , true #endif @@ -275,29 +279,29 @@ void menu_mixer() { #if DUAL_MIXING_EXTRUDER { char tmp[10]; - MENU_ITEM(submenu, MSG_MIX, lcd_mixer_mix_edit); + SUBMENU(MSG_MIX, lcd_mixer_mix_edit); MENU_ITEM_ADDON_START(10); mixer.update_mix_from_vtool(); sprintf_P(tmp, PSTR("%3d;%3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); - LCDPRINT(tmp); + lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); - MENU_ITEM(function, MSG_TOGGLE_MIX, _lcd_mixer_toggle_mix); + ACTION_ITEM(MSG_TOGGLE_MIX, _lcd_mixer_toggle_mix); } #else - MENU_ITEM(submenu, MSG_MIX, _lcd_goto_mix_edit); + SUBMENU(MSG_MIX, _lcd_goto_mix_edit); #endif - MENU_ITEM(submenu, MSG_RESET_VTOOLS, menu_mixer_vtools_reset_confirm); + SUBMENU(MSG_RESET_VTOOLS, menu_mixer_vtools_reset_confirm); #if ENABLED(GRADIENT_MIX) { char tmp[13]; - MENU_ITEM(submenu, MSG_GRADIENT, lcd_mixer_edit_gradient_menu); + SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu); MENU_ITEM_ADDON_START(10); sprintf_P(tmp, PSTR("T%i->T%i"), mixer.gradient.start_vtool, mixer.gradient.end_vtool); - LCDPRINT(tmp); + lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); - MENU_ITEM(function, MSG_REVERSE_GRADIENT, _lcd_mixer_reverse_gradient); + ACTION_ITEM(MSG_REVERSE_GRADIENT, _lcd_mixer_reverse_gradient); } #endif diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 9a0908961e..aa6eb27ea1 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -38,23 +38,18 @@ bool mmuMenuWait; void _mmu2_load_filamentToNozzle(uint8_t index) { ui.reset_status(); ui.return_to_status(); - ui.status_printf_P(0, PSTR(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); if (mmu2.load_filament_to_nozzle(index)) ui.reset_status(); } -inline void action_mmu2_load_filament_to_nozzl_e(const uint8_t tool) { +inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { _mmu2_load_filamentToNozzle(tool); ui.return_to_status(); } -inline void action_mmu2_load_filament_to_nozzle_0() { action_mmu2_load_filament_to_nozzl_e(0); } -inline void action_mmu2_load_filament_to_nozzle_1() { action_mmu2_load_filament_to_nozzl_e(1); } -inline void action_mmu2_load_filament_to_nozzle_2() { action_mmu2_load_filament_to_nozzl_e(2); } -inline void action_mmu2_load_filament_to_nozzle_3() { action_mmu2_load_filament_to_nozzl_e(3); } -inline void action_mmu2_load_filament_to_nozzle_4() { action_mmu2_load_filament_to_nozzl_e(4); } void _mmu2_load_filament(uint8_t index) { ui.return_to_status(); - ui.status_printf_P(0, PSTR(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); mmu2.load_filament(index); ui.reset_status(); } @@ -63,32 +58,27 @@ void action_mmu2_load_all() { _mmu2_load_filament(i); ui.return_to_status(); } -inline void action_mmu2_load_filament_0() { _mmu2_load_filament(0); } -inline void action_mmu2_load_filament_1() { _mmu2_load_filament(1); } -inline void action_mmu2_load_filament_2() { _mmu2_load_filament(2); } -inline void action_mmu2_load_filament_3() { _mmu2_load_filament(3); } -inline void action_mmu2_load_filament_4() { _mmu2_load_filament(4); } void menu_mmu2_load_filament() { START_MENU(); - MENU_BACK(MSG_MMU2_MENU); - MENU_ITEM(function, MSG_MMU2_ALL, action_mmu2_load_all); - MENU_ITEM(function, MSG_MMU2_FILAMENT0, action_mmu2_load_filament_0); - MENU_ITEM(function, MSG_MMU2_FILAMENT1, action_mmu2_load_filament_1); - MENU_ITEM(function, MSG_MMU2_FILAMENT2, action_mmu2_load_filament_2); - MENU_ITEM(function, MSG_MMU2_FILAMENT3, action_mmu2_load_filament_3); - MENU_ITEM(function, MSG_MMU2_FILAMENT4, action_mmu2_load_filament_4); + BACK_ITEM(MSG_MMU2_MENU); + ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all); + ACTION_ITEM(MSG_MMU2_FILAMENT0, [](){ _mmu2_load_filament(0); }); + ACTION_ITEM(MSG_MMU2_FILAMENT1, [](){ _mmu2_load_filament(1); }); + ACTION_ITEM(MSG_MMU2_FILAMENT2, [](){ _mmu2_load_filament(2); }); + ACTION_ITEM(MSG_MMU2_FILAMENT3, [](){ _mmu2_load_filament(3); }); + ACTION_ITEM(MSG_MMU2_FILAMENT4, [](){ _mmu2_load_filament(4); }); END_MENU(); } void menu_mmu2_load_to_nozzle() { START_MENU(); - MENU_BACK(MSG_MMU2_MENU); - MENU_ITEM(function, MSG_MMU2_FILAMENT0, action_mmu2_load_filament_to_nozzle_0); - MENU_ITEM(function, MSG_MMU2_FILAMENT1, action_mmu2_load_filament_to_nozzle_1); - MENU_ITEM(function, MSG_MMU2_FILAMENT2, action_mmu2_load_filament_to_nozzle_2); - MENU_ITEM(function, MSG_MMU2_FILAMENT3, action_mmu2_load_filament_to_nozzle_3); - MENU_ITEM(function, MSG_MMU2_FILAMENT4, action_mmu2_load_filament_to_nozzle_4); + BACK_ITEM(MSG_MMU2_MENU); + ACTION_ITEM(MSG_MMU2_FILAMENT0, [](){ action_mmu2_load_filament_to_nozzle(0); }); + ACTION_ITEM(MSG_MMU2_FILAMENT1, [](){ action_mmu2_load_filament_to_nozzle(1); }); + ACTION_ITEM(MSG_MMU2_FILAMENT2, [](){ action_mmu2_load_filament_to_nozzle(2); }); + ACTION_ITEM(MSG_MMU2_FILAMENT3, [](){ action_mmu2_load_filament_to_nozzle(3); }); + ACTION_ITEM(MSG_MMU2_FILAMENT4, [](){ action_mmu2_load_filament_to_nozzle(4); }); END_MENU(); } @@ -99,14 +89,9 @@ void menu_mmu2_load_to_nozzle() { void _mmu2_eject_filament(uint8_t index) { ui.reset_status(); ui.return_to_status(); - ui.status_printf_P(0, PSTR(MSG_MMU2_EJECTING_FILAMENT), int(index + 1)); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_EJECTING_FILAMENT), int(index + 1)); if (mmu2.eject_filament(index, true)) ui.reset_status(); } -inline void action_mmu2_eject_filament_0() { _mmu2_eject_filament(0); } -inline void action_mmu2_eject_filament_1() { _mmu2_eject_filament(1); } -inline void action_mmu2_eject_filament_2() { _mmu2_eject_filament(2); } -inline void action_mmu2_eject_filament_3() { _mmu2_eject_filament(3); } -inline void action_mmu2_eject_filament_4() { _mmu2_eject_filament(4); } void action_mmu2_unload_filament() { ui.reset_status(); @@ -118,12 +103,12 @@ void action_mmu2_unload_filament() { void menu_mmu2_eject_filament() { START_MENU(); - MENU_BACK(MSG_MMU2_MENU); - MENU_ITEM(function, MSG_MMU2_FILAMENT0, action_mmu2_eject_filament_0); - MENU_ITEM(function, MSG_MMU2_FILAMENT1, action_mmu2_eject_filament_1); - MENU_ITEM(function, MSG_MMU2_FILAMENT2, action_mmu2_eject_filament_2); - MENU_ITEM(function, MSG_MMU2_FILAMENT3, action_mmu2_eject_filament_3); - MENU_ITEM(function, MSG_MMU2_FILAMENT4, action_mmu2_eject_filament_4); + BACK_ITEM(MSG_MMU2_MENU); + ACTION_ITEM(MSG_MMU2_FILAMENT0, [](){ _mmu2_eject_filament(0); }); + ACTION_ITEM(MSG_MMU2_FILAMENT1, [](){ _mmu2_eject_filament(1); }); + ACTION_ITEM(MSG_MMU2_FILAMENT2, [](){ _mmu2_eject_filament(2); }); + ACTION_ITEM(MSG_MMU2_FILAMENT3, [](){ _mmu2_eject_filament(3); }); + ACTION_ITEM(MSG_MMU2_FILAMENT4, [](){ _mmu2_eject_filament(4); }); END_MENU(); } @@ -138,12 +123,12 @@ void action_mmu2_reset() { void menu_mmu2() { START_MENU(); - MENU_BACK(MSG_MAIN); - MENU_ITEM(submenu, MSG_MMU2_LOAD_FILAMENT, menu_mmu2_load_filament); - MENU_ITEM(submenu, MSG_MMU2_LOAD_TO_NOZZLE, menu_mmu2_load_to_nozzle); - MENU_ITEM(submenu, MSG_MMU2_EJECT_FILAMENT, menu_mmu2_eject_filament); - MENU_ITEM(function, MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_unload_filament); - MENU_ITEM(function, MSG_MMU2_RESET, action_mmu2_reset); + BACK_ITEM(MSG_MAIN); + SUBMENU(MSG_MMU2_LOAD_FILAMENT, menu_mmu2_load_filament); + SUBMENU(MSG_MMU2_LOAD_TO_NOZZLE, menu_mmu2_load_to_nozzle); + SUBMENU(MSG_MMU2_EJECT_FILAMENT, menu_mmu2_eject_filament); + ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_unload_filament); + ACTION_ITEM(MSG_MMU2_RESET, action_mmu2_reset); END_MENU(); } @@ -155,22 +140,17 @@ inline void action_mmu2_choose(const uint8_t tool) { currentTool = tool; mmuMenuWait = false; } -inline void action_mmu2_choose0() { action_mmu2_choose(0); } -inline void action_mmu2_choose1() { action_mmu2_choose(1); } -inline void action_mmu2_choose2() { action_mmu2_choose(2); } -inline void action_mmu2_choose3() { action_mmu2_choose(3); } -inline void action_mmu2_choose4() { action_mmu2_choose(4); } void menu_mmu2_choose_filament() { START_MENU(); #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_CENTER|SS_INVERT); #endif - MENU_ITEM(function, MSG_MMU2_FILAMENT0, action_mmu2_choose0); - MENU_ITEM(function, MSG_MMU2_FILAMENT1, action_mmu2_choose1); - MENU_ITEM(function, MSG_MMU2_FILAMENT2, action_mmu2_choose2); - MENU_ITEM(function, MSG_MMU2_FILAMENT3, action_mmu2_choose3); - MENU_ITEM(function, MSG_MMU2_FILAMENT4, action_mmu2_choose4); + ACTION_ITEM(MSG_MMU2_FILAMENT0, [](){ action_mmu2_choose(0); }); + ACTION_ITEM(MSG_MMU2_FILAMENT1, [](){ action_mmu2_choose(1); }); + ACTION_ITEM(MSG_MMU2_FILAMENT2, [](){ action_mmu2_choose(2); }); + ACTION_ITEM(MSG_MMU2_FILAMENT3, [](){ action_mmu2_choose(3); }); + ACTION_ITEM(MSG_MMU2_FILAMENT4, [](){ action_mmu2_choose(4); }); END_MENU(); } @@ -178,21 +158,16 @@ void menu_mmu2_choose_filament() { // MMU2 Filament Runout // -inline void action_mmu2_M600_load_current_filament() { mmu2.load_filament(currentTool); } -inline void action_mmu2_M600_load_current_filament_to_nozzle() { mmu2.load_filament_to_nozzle(currentTool); } -inline void action_mmu2_M600_unload_filament() { mmu2.unload(); } -inline void action_mmu2_M600_resume() { mmuMenuWait = false; } - void menu_mmu2_pause() { currentTool = mmu2.get_current_tool(); START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_MMU2_FILAMENT_CHANGE_HEADER, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_CENTER|SS_INVERT); #endif - MENU_ITEM(function, MSG_MMU2_RESUME, action_mmu2_M600_resume); - MENU_ITEM(function, MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_M600_unload_filament); - MENU_ITEM(function, MSG_MMU2_LOAD_FILAMENT, action_mmu2_M600_load_current_filament); - MENU_ITEM(function, MSG_MMU2_LOAD_TO_NOZZLE, action_mmu2_M600_load_current_filament_to_nozzle); + ACTION_ITEM(MSG_MMU2_RESUME, [](){ mmuMenuWait = false; }); + ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, [](){ mmu2.unload(); }); + ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, [](){ mmu2.load_filament(currentTool); }); + ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, [](){ mmu2.load_filament_to_nozzle(currentTool); }); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 2a75c2693d..99342dd2d6 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -92,26 +92,26 @@ static void _lcd_move_xyz(PGM_P name, AxisEnum axis) { if (soft_endstops_enabled) switch (axis) { case X_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) - min = soft_endstop[X_AXIS].min; + min = soft_endstop.min.x; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) - max = soft_endstop[X_AXIS].max; + max = soft_endstop.max.x; #endif break; case Y_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) - min = soft_endstop[Y_AXIS].min; + min = soft_endstop.min.y; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) - max = soft_endstop[Y_AXIS].max; + max = soft_endstop.max.y; #endif break; case Z_AXIS: #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) - min = soft_endstop[Z_AXIS].min; + min = soft_endstop.min.z; #endif #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) - max = soft_endstop[Z_AXIS].max; + max = soft_endstop.max.z; #endif default: break; } @@ -155,13 +155,13 @@ static void _lcd_move_xyz(PGM_P name, AxisEnum axis) { draw_edit_screen(name, move_menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); } } -void lcd_move_x() { _lcd_move_xyz(PSTR(MSG_MOVE_X), X_AXIS); } -void lcd_move_y() { _lcd_move_xyz(PSTR(MSG_MOVE_Y), Y_AXIS); } -void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } +void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } +void lcd_move_y() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Y), Y_AXIS); } +void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } #if E_MANUAL - static void _lcd_move_e( + static void lcd_move_e( #if E_MANUAL > 1 const int8_t eindex=-1 #endif @@ -173,7 +173,7 @@ void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } #if IS_KINEMATIC manual_move_offset += diff; #else - current_position[E_AXIS] += diff; + current_position.e += diff; #endif manual_move_to_current(E_AXIS #if E_MANUAL > 1 @@ -185,21 +185,19 @@ void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } ui.encoderPosition = 0; } if (ui.should_draw()) { - PGM_P pos_label; - #if E_MANUAL == 1 - pos_label = PSTR(MSG_MOVE_E); - #else + PGM_P pos_label = GET_TEXT(MSG_MOVE_E); + #if E_MANUAL > 1 switch (eindex) { - default: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E1); break; - case 1: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E2); break; + default: pos_label = GET_TEXT(MSG_MOVE_E0); break; + case 1: pos_label = GET_TEXT(MSG_MOVE_E1); break; #if E_MANUAL > 2 - case 2: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E3); break; + case 2: pos_label = GET_TEXT(MSG_MOVE_E2); break; #if E_MANUAL > 3 - case 3: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E4); break; + case 3: pos_label = GET_TEXT(MSG_MOVE_E3); break; #if E_MANUAL > 4 - case 4: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E5); break; + case 4: pos_label = GET_TEXT(MSG_MOVE_E4); break; #if E_MANUAL > 5 - case 5: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E6); break; + case 5: pos_label = GET_TEXT(MSG_MOVE_E5); break; #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 @@ -207,7 +205,7 @@ void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } } #endif // E_MANUAL > 1 - draw_edit_screen(pos_label, ftostr41sign(current_position[E_AXIS] + draw_edit_screen(pos_label, ftostr41sign(current_position.e #if IS_KINEMATIC + manual_move_offset #endif @@ -218,24 +216,6 @@ void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } } } - inline void lcd_move_e() { _lcd_move_e(); } - #if E_MANUAL > 1 - inline void lcd_move_e0() { _lcd_move_e(0); } - inline void lcd_move_e1() { _lcd_move_e(1); } - #if E_MANUAL > 2 - inline void lcd_move_e2() { _lcd_move_e(2); } - #if E_MANUAL > 3 - inline void lcd_move_e3() { _lcd_move_e(3); } - #if E_MANUAL > 4 - inline void lcd_move_e4() { _lcd_move_e(4); } - #if E_MANUAL > 5 - inline void lcd_move_e5() { _lcd_move_e(5); } - #endif // E_MANUAL > 5 - #endif // E_MANUAL > 4 - #endif // E_MANUAL > 3 - #endif // E_MANUAL > 2 - #endif // E_MANUAL > 1 - #endif // E_MANUAL // @@ -253,9 +233,6 @@ void _goto_manual_move(const float scale) { move_menu_scale = scale; ui.goto_screen(_manual_move_func_ptr); } -void menu_move_10mm() { _goto_manual_move(10); } -void menu_move_1mm() { _goto_manual_move( 1); } -void menu_move_01mm() { _goto_manual_move( 0.1f); } void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int8_t eindex=-1) { _manual_move_func_ptr = func; @@ -267,7 +244,7 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_CENTER|SS_INVERT); break; default: #if ENABLED(MANUAL_E_MOVES_RELATIVE) - manual_move_e_origin = current_position[E_AXIS]; + manual_move_e_origin = current_position.e; #endif STATIC_ITEM(MSG_MOVE_E, SS_CENTER|SS_INVERT); break; @@ -275,65 +252,35 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int } #if ENABLED(PREVENT_COLD_EXTRUSION) if (axis == E_AXIS && thermalManager.tooColdToExtrude(eindex >= 0 ? eindex : active_extruder)) - MENU_BACK(MSG_HOTEND_TOO_COLD); + BACK_ITEM(MSG_HOTEND_TOO_COLD); else #endif { - MENU_BACK(MSG_MOVE_AXIS); - MENU_ITEM(submenu, MSG_MOVE_10MM, menu_move_10mm); - MENU_ITEM(submenu, MSG_MOVE_1MM, menu_move_1mm); - MENU_ITEM(submenu, MSG_MOVE_01MM, menu_move_01mm); + BACK_ITEM(MSG_MOVE_AXIS); + SUBMENU(MSG_MOVE_10MM, [](){ _goto_manual_move(10); }); + SUBMENU(MSG_MOVE_1MM, [](){ _goto_manual_move( 1); }); + SUBMENU(MSG_MOVE_01MM, [](){ _goto_manual_move( 0.1f); }); if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - MENU_ITEM(submenu, "", []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(1); + SUBMENU_P(PSTR(""), []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0); char tmp[20], numstr[10]; // Determine digits needed right of decimal const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, PSTR(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); - LCDPRINT(tmp); + sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); } } END_MENU(); } -void lcd_move_get_x_amount() { _menu_move_distance(X_AXIS, lcd_move_x); } -void lcd_move_get_y_amount() { _menu_move_distance(Y_AXIS, lcd_move_y); } -void lcd_move_get_z_amount() { _menu_move_distance(Z_AXIS, lcd_move_z); } - -#if E_MANUAL - void lcd_move_get_e_amount() { _menu_move_distance(E_AXIS, lcd_move_e, -1); } - #if E_MANUAL > 1 - void lcd_move_get_e0_amount() { _menu_move_distance(E_AXIS, lcd_move_e0, 0); } - void lcd_move_get_e1_amount() { _menu_move_distance(E_AXIS, lcd_move_e1, 1); } - #if E_MANUAL > 2 - void lcd_move_get_e2_amount() { _menu_move_distance(E_AXIS, lcd_move_e2, 2); } - #if E_MANUAL > 3 - void lcd_move_get_e3_amount() { _menu_move_distance(E_AXIS, lcd_move_e3, 3); } - #if E_MANUAL > 4 - void lcd_move_get_e4_amount() { _menu_move_distance(E_AXIS, lcd_move_e4, 4); } - #if E_MANUAL > 5 - void lcd_move_get_e5_amount() { _menu_move_distance(E_AXIS, lcd_move_e5, 5); } - #endif // E_MANUAL > 5 - #endif // E_MANUAL > 4 - #endif // E_MANUAL > 3 - #endif // E_MANUAL > 2 - #endif // E_MANUAL > 1 -#endif // E_MANUAL - -#if ENABLED(DELTA) - void lcd_lower_z_to_clip_height() { - line_to_z(delta_clip_start_height); - ui.synchronize(); - } -#endif void menu_move() { START_MENU(); - MENU_BACK(MSG_MOTION); + BACK_ITEM(MSG_MOTION); #if HAS_SOFTWARE_ENDSTOPS && ENABLED(SOFT_ENDSTOPS_MENU_ITEM) - MENU_ITEM_EDIT(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstops_enabled); + EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstops_enabled); #endif if ( @@ -345,93 +292,90 @@ void menu_move() { ) { if ( #if ENABLED(DELTA) - current_position[Z_AXIS] <= delta_clip_start_height + current_position.z <= delta_clip_start_height #else true #endif ) { - MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_get_x_amount); - MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_get_y_amount); + SUBMENU(MSG_MOVE_X, [](){ _menu_move_distance(X_AXIS, lcd_move_x); }); + SUBMENU(MSG_MOVE_Y, [](){ _menu_move_distance(Y_AXIS, lcd_move_y); }); } #if ENABLED(DELTA) else - MENU_ITEM(function, MSG_FREE_XY, lcd_lower_z_to_clip_height); + ACTION_ITEM(MSG_FREE_XY, [](){ line_to_z(delta_clip_start_height); ui.synchronize(); }); #endif - MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_get_z_amount); + SUBMENU(MSG_MOVE_Z, [](){ _menu_move_distance(Z_AXIS, lcd_move_z); }); } else - MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28")); #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, MAGNETIC_SWITCHING_TOOLHEAD) - #if EXTRUDERS == 6 + #if EXTRUDERS >= 4 switch (active_extruder) { - case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break; - case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break; - case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break; - case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break; - case 4: MENU_ITEM(gcode, MSG_SELECT " " MSG_E6, PSTR("T5")); break; - case 5: MENU_ITEM(gcode, MSG_SELECT " " MSG_E5, PSTR("T4")); break; - } - #elif EXTRUDERS == 5 || EXTRUDERS == 4 - switch (active_extruder) { - case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break; - case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break; - case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break; - case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break; + case 0: GCODES_ITEM(MSG_SELECT_E1, PSTR("T1")); break; + case 1: GCODES_ITEM(MSG_SELECT_E0, PSTR("T0")); break; + case 2: GCODES_ITEM(MSG_SELECT_E3, PSTR("T3")); break; + case 3: GCODES_ITEM(MSG_SELECT_E2, PSTR("T2")); break; + #if EXTRUDERS == 6 + case 4: GCODES_ITEM(MSG_SELECT_E5, PSTR("T5")); break; + case 5: GCODES_ITEM(MSG_SELECT_E4, PSTR("T4")); break; + #endif } #elif EXTRUDERS == 3 if (active_extruder < 2) { if (active_extruder) - MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + GCODES_ITEM(MSG_SELECT_E0, PSTR("T0")); else - MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + GCODES_ITEM(MSG_SELECT_E1, PSTR("T1")); } #else if (active_extruder) - MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + GCODES_ITEM(MSG_SELECT_E0, PSTR("T0")); else - MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + GCODES_ITEM(MSG_SELECT_E1, PSTR("T1")); #endif #elif ENABLED(DUAL_X_CARRIAGE) if (active_extruder) - MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + GCODES_ITEM(MSG_SELECT_E0, PSTR("T0")); else - MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + GCODES_ITEM(MSG_SELECT_E1, PSTR("T1")); #endif #if E_MANUAL + // The current extruder + SUBMENU(MSG_MOVE_E, [](){ _menu_move_distance(E_AXIS, [](){ lcd_move_e(); }, -1); }); + + #define SUBMENU_MOVE_E(N) SUBMENU(MSG_MOVE_E##N, [](){ _menu_move_distance(E_AXIS, [](){ lcd_move_e(N); }, N); }); + #if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) - // Only the current... - MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); // ...and the non-switching #if E_MANUAL == 5 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + SUBMENU_MOVE_E(4); #elif E_MANUAL == 3 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); + SUBMENU_MOVE_E(2); #endif #else // Independent extruders with one E-stepper per hotend - MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); #if E_MANUAL > 1 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E1, lcd_move_get_e0_amount); - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E2, lcd_move_get_e1_amount); + SUBMENU_MOVE_E(0); + SUBMENU_MOVE_E(1); #if E_MANUAL > 2 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); + SUBMENU_MOVE_E(2); #if E_MANUAL > 3 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount); + SUBMENU_MOVE_E(3); #if E_MANUAL > 4 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + SUBMENU_MOVE_E(4); #if E_MANUAL > 5 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E6, lcd_move_get_e5_amount); + SUBMENU_MOVE_E(5); #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 @@ -457,7 +401,7 @@ void menu_motion() { // // ^ Main // - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); // // Move Axis @@ -465,23 +409,23 @@ void menu_motion() { #if ENABLED(DELTA) if (all_axes_homed()) #endif - MENU_ITEM(submenu, MSG_MOVE_AXIS, menu_move); + SUBMENU(MSG_MOVE_AXIS, menu_move); // // Auto Home // - MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28")); #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU) - MENU_ITEM(gcode, MSG_AUTO_HOME_X, PSTR("G28 X")); - MENU_ITEM(gcode, MSG_AUTO_HOME_Y, PSTR("G28 Y")); - MENU_ITEM(gcode, MSG_AUTO_HOME_Z, PSTR("G28 Z")); + GCODES_ITEM(MSG_AUTO_HOME_X, PSTR("G28 X")); + GCODES_ITEM(MSG_AUTO_HOME_Y, PSTR("G28 Y")); + GCODES_ITEM(MSG_AUTO_HOME_Z, PSTR("G28 Z")); #endif // // Auto Z-Align // #if ENABLED(Z_STEPPER_AUTO_ALIGN) - MENU_ITEM(gcode, MSG_AUTO_Z_ALIGN, PSTR("G34")); + GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34")); #endif // @@ -489,39 +433,40 @@ void menu_motion() { // #if ENABLED(AUTO_BED_LEVELING_UBL) - MENU_ITEM(submenu, MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); + SUBMENU(MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); #elif ENABLED(LCD_BED_LEVELING) - if (!g29_in_progress) MENU_ITEM(submenu, MSG_BED_LEVELING, menu_bed_leveling); + if (!g29_in_progress) SUBMENU(MSG_BED_LEVELING, menu_bed_leveling); #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS) #if DISABLED(PROBE_MANUALLY) - MENU_ITEM(gcode, MSG_LEVEL_BED, PSTR("G28\nG29")); + GCODES_ITEM(MSG_LEVEL_BED, PSTR("G28\nG29")); #endif if (all_axes_homed() && leveling_is_valid()) { - bool new_level_state = planner.leveling_active; - MENU_ITEM_EDIT_CALLBACK(bool, MSG_BED_LEVELING, &new_level_state, _lcd_toggle_bed_leveling); + bool show_state = planner.leveling_active; + EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); } #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &lcd_z_fade_height, 0, 100, _lcd_set_z_fade_height); + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, [](){ set_z_fade_height(editable.decimal); }); #endif #endif #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) - MENU_ITEM(function, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + ACTION_ITEM(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - MENU_ITEM(gcode, MSG_M48_TEST, PSTR("G28\nM48 P10")); + GCODES_ITEM(MSG_M48_TEST, PSTR("G28\nM48 P10")); #endif // // Disable Steppers // - MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); + GCODES_ITEM(MSG_DISABLE_STEPPERS, PSTR("M84")); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_service.cpp b/Marlin/src/lcd/menu/menu_service.cpp index fb7f05c905..0d305d0281 100644 --- a/Marlin/src/lcd/menu/menu_service.cpp +++ b/Marlin/src/lcd/menu/menu_service.cpp @@ -45,10 +45,10 @@ inline void _service_reset(const int index) { char sram[30]; strncpy_P(sram, PSTR(SERVICE_NAME_1), 29); do_select_screen( - PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_CANCEL), []{ _service_reset(1); }, ui.goto_previous_screen, - PSTR(MSG_SERVICE_RESET), sram, PSTR("?") + GET_TEXT(MSG_SERVICE_RESET), sram, PSTR("?") ); } #endif @@ -58,10 +58,10 @@ inline void _service_reset(const int index) { char sram[30]; strncpy_P(sram, PSTR(SERVICE_NAME_2), 29); do_select_screen( - PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_CANCEL), []{ _service_reset(2); }, ui.goto_previous_screen, - PSTR(MSG_SERVICE_RESET), sram, PSTR("?") + GET_TEXT(MSG_SERVICE_RESET), sram, PSTR("?") ); } #endif @@ -71,10 +71,10 @@ inline void _service_reset(const int index) { char sram[30]; strncpy_P(sram, PSTR(SERVICE_NAME_3), 29); do_select_screen( - PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL), + GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_CANCEL), []{ _service_reset(3); }, ui.goto_previous_screen, - PSTR(MSG_SERVICE_RESET), sram, PSTR("?") + GET_TEXT(MSG_SERVICE_RESET), sram, PSTR("?") ); } #endif diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index e3fda1dc37..1c480577f1 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -35,17 +35,17 @@ void menu_spindle_laser() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); if (cutter.enabled()) { #if ENABLED(SPINDLE_LASER_PWM) - MENU_ITEM_EDIT_CALLBACK(CUTTER_MENU_TYPE, MSG_CUTTER(POWER), &cutter.power, SPEED_POWER_MIN, SPEED_POWER_MAX, cutter.update_output); + EDIT_ITEM(CUTTER_MENU_TYPE, MSG_CUTTER(POWER), &cutter.power, SPEED_POWER_MIN, SPEED_POWER_MAX); #endif - MENU_ITEM(function, MSG_CUTTER(OFF), cutter.disable); + ACTION_ITEM(MSG_CUTTER(OFF), cutter.disable); } else { - MENU_ITEM(function, MSG_CUTTER(ON), cutter.enable_forward); + ACTION_ITEM(MSG_CUTTER(ON), cutter.enable_forward); #if ENABLED(SPINDLE_CHANGE_DIR) - MENU_ITEM(function, MSG_SPINDLE_REVERSE, cutter.enable_reverse); + ACTION_ITEM(MSG_SPINDLE_REVERSE, cutter.enable_reverse); #endif } END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 24b88e829c..0d9d16bffe 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -68,235 +68,111 @@ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb ui.return_to_status(); } -#if HOTENDS > 1 - - void lcd_preheat_m1_e1_only() { _lcd_preheat(1, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e1_only() { _lcd_preheat(1, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #if HAS_HEATED_BED - void lcd_preheat_m1_e1() { _lcd_preheat(1, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e1() { _lcd_preheat(1, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - #if HOTENDS > 2 - void lcd_preheat_m1_e2_only() { _lcd_preheat(2, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e2_only() { _lcd_preheat(2, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #if HAS_HEATED_BED - void lcd_preheat_m1_e2() { _lcd_preheat(2, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e2() { _lcd_preheat(2, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - #if HOTENDS > 3 - void lcd_preheat_m1_e3_only() { _lcd_preheat(3, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e3_only() { _lcd_preheat(3, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #if HAS_HEATED_BED - void lcd_preheat_m1_e3() { _lcd_preheat(3, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e3() { _lcd_preheat(3, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - #if HOTENDS > 4 - void lcd_preheat_m1_e4_only() { _lcd_preheat(4, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e4_only() { _lcd_preheat(4, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #if HAS_HEATED_BED - void lcd_preheat_m1_e4() { _lcd_preheat(4, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e4() { _lcd_preheat(4, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - #if HOTENDS > 5 - void lcd_preheat_m1_e5_only() { _lcd_preheat(5, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e5_only() { _lcd_preheat(5, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #if HAS_HEATED_BED - void lcd_preheat_m1_e5() { _lcd_preheat(5, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e5() { _lcd_preheat(5, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - - #if HAS_HEATED_BED - void lcd_preheat_m1_e0(); - void lcd_preheat_m2_e0(); - #else - void lcd_preheat_m1_e0_only(); - void lcd_preheat_m2_e0_only(); - #endif - - void lcd_preheat_m1_all() { - #if HOTENDS > 1 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], 1); - #if HOTENDS > 2 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], 2); - #if HOTENDS > 3 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], 3); - #if HOTENDS > 4 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], 4); - #if HOTENDS > 5 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], 5); - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HOTENDS > 1 - #if HAS_HEATED_BED - lcd_preheat_m1_e0(); - #else - lcd_preheat_m1_e0_only(); - #endif +#if HAS_TEMP_HOTEND + inline void _preheat_end(const uint8_t m, const uint8_t e) { + _lcd_preheat(e, ui.preheat_hotend_temp[m], -1, ui.preheat_fan_speed[m]); } - - void lcd_preheat_m2_all() { - #if HOTENDS > 1 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], 1); - #if HOTENDS > 2 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], 2); - #if HOTENDS > 3 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], 3); - #if HOTENDS > 4 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], 4); - #if HOTENDS > 5 - thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], 5); - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HOTENDS > 1 - #if HAS_HEATED_BED - lcd_preheat_m2_e0(); - #else - lcd_preheat_m2_e0_only(); - #endif + #if HAS_HEATED_BED + inline void _preheat_both(const uint8_t m, const uint8_t e) { + _lcd_preheat(e, ui.preheat_hotend_temp[m], ui.preheat_bed_temp[m], ui.preheat_fan_speed[m]); + } + #endif +#endif +#if HAS_HEATED_BED + inline void _preheat_bed(const uint8_t m) { + _lcd_preheat(0, 0, ui.preheat_bed_temp[m], ui.preheat_fan_speed[m]); } - -#endif // HOTENDS > 1 +#endif #if HAS_TEMP_HOTEND || HAS_HEATED_BED - #if HOTENDS - void lcd_preheat_m1_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } - #endif - + #define _PREHEAT_ITEMS(M,N) do{ \ + ACTION_ITEM(MSG_PREHEAT_##M##_H##N, [](){ _preheat_both(M-1, N); }); \ + ACTION_ITEM(MSG_PREHEAT_##M##_END_E##N, [](){ _preheat_end(M-1, N); }); \ + }while(0) #if HAS_HEATED_BED - #if HOTENDS - void lcd_preheat_m1_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } - #endif - void lcd_preheat_m1_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } - void lcd_preheat_m2_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } + #define PREHEAT_ITEMS(M,N) _PREHEAT_ITEMS(M,N) + #else + #define PREHEAT_ITEMS(M,N) \ + ACTION_ITEM(MSG_PREHEAT_##M##_H##N, [](){ _preheat_end(M-1, N); }) #endif void menu_preheat_m1() { START_MENU(); - MENU_BACK(MSG_TEMPERATURE); + BACK_ITEM(MSG_TEMPERATURE); #if HOTENDS == 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0); - MENU_ITEM(function, MSG_PREHEAT_1_END, lcd_preheat_m1_e0_only); + ACTION_ITEM(MSG_PREHEAT_1, [](){ _preheat_both(0, 0); }); + ACTION_ITEM(MSG_PREHEAT_1_END, [](){ _preheat_end(0, 0); }); #else - MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0_only); + ACTION_ITEM(MSG_PREHEAT_1, [](){ _preheat_end(0, 0); }); #endif #elif HOTENDS > 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H1, lcd_preheat_m1_e0); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E1, lcd_preheat_m1_e0_only); - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H2, lcd_preheat_m1_e1); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E2, lcd_preheat_m1_e1_only); - #else - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H1, lcd_preheat_m1_e0_only); - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H2, lcd_preheat_m1_e1_only); + _PREHEAT_ITEMS(1,0); #endif + PREHEAT_ITEMS(1,1); #if HOTENDS > 2 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H3, lcd_preheat_m1_e2); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E3, lcd_preheat_m1_e2_only); - #else - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H3, lcd_preheat_m1_e2_only); - #endif + PREHEAT_ITEMS(1,2); #if HOTENDS > 3 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H4, lcd_preheat_m1_e3); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E4, lcd_preheat_m1_e3_only); - #else - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H4, lcd_preheat_m1_e3_only); - #endif + PREHEAT_ITEMS(1,3); #if HOTENDS > 4 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E5, lcd_preheat_m1_e4_only); - #else - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4_only); - #endif + PREHEAT_ITEMS(1,4); #if HOTENDS > 5 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5); - MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E6, lcd_preheat_m1_e5_only); - #else - MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5_only); - #endif + PREHEAT_ITEMS(1,5); #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 - MENU_ITEM(function, MSG_PREHEAT_1_ALL, lcd_preheat_m1_all); + ACTION_ITEM(MSG_PREHEAT_1_ALL, []() { + #if HAS_HEATED_BED + _preheat_bed(0); + #endif + HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], e); + }); #endif // HOTENDS > 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_1_BEDONLY, lcd_preheat_m1_bedonly); + ACTION_ITEM(MSG_PREHEAT_1_BEDONLY, [](){ _preheat_bed(0); }); #endif END_MENU(); } void menu_preheat_m2() { START_MENU(); - MENU_BACK(MSG_TEMPERATURE); + BACK_ITEM(MSG_TEMPERATURE); #if HOTENDS == 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0); - MENU_ITEM(function, MSG_PREHEAT_2_END, lcd_preheat_m2_e0_only); + ACTION_ITEM(MSG_PREHEAT_2, [](){ _preheat_both(1, 0); }); + ACTION_ITEM(MSG_PREHEAT_2_END, [](){ _preheat_end(1, 0); }); #else - MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0_only); + ACTION_ITEM(MSG_PREHEAT_2, [](){ _preheat_end(1, 0); }); #endif #elif HOTENDS > 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H1, lcd_preheat_m2_e0); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E1, lcd_preheat_m2_e0_only); - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H2, lcd_preheat_m2_e1); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E2, lcd_preheat_m2_e1_only); - #else - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H1, lcd_preheat_m2_e0_only); - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H2, lcd_preheat_m2_e1_only); + _PREHEAT_ITEMS(2,0); #endif + PREHEAT_ITEMS(2,1); #if HOTENDS > 2 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H3, lcd_preheat_m2_e2); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E3, lcd_preheat_m2_e2_only); - #else - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H3, lcd_preheat_m2_e2_only); - #endif + PREHEAT_ITEMS(2,2); #if HOTENDS > 3 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H4, lcd_preheat_m2_e3); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E4, lcd_preheat_m2_e3_only); - #else - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H4, lcd_preheat_m2_e3_only); - #endif + PREHEAT_ITEMS(2,3); #if HOTENDS > 4 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E5, lcd_preheat_m2_e4_only); - #else - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4_only); - #endif + PREHEAT_ITEMS(2,4); #if HOTENDS > 5 - #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5); - MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E6, lcd_preheat_m2_e5_only); - #else - MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5_only); - #endif + PREHEAT_ITEMS(2,5); #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 - MENU_ITEM(function, MSG_PREHEAT_2_ALL, lcd_preheat_m2_all); + ACTION_ITEM(MSG_PREHEAT_2_ALL, []() { + #if HAS_HEATED_BED + _preheat_bed(1); + #endif + HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], e); + }); #endif // HOTENDS > 1 #if HAS_HEATED_BED - MENU_ITEM(function, MSG_PREHEAT_2_BEDONLY, lcd_preheat_m2_bedonly); + ACTION_ITEM(MSG_PREHEAT_2_BEDONLY, [](){ _preheat_bed(1); }); #endif END_MENU(); } @@ -311,16 +187,16 @@ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb void menu_temperature() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); // // Nozzle: // Nozzle [1-5]: // #if HOTENDS == 1 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, [](){ thermalManager.start_watching_hotend(0); }); #elif HOTENDS > 1 - #define EDIT_TARGET(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N) + #define EDIT_TARGET(N) EDIT_ITEM_FAST(int3, MSG_NOZZLE_##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, [](){ thermalManager.start_watching_hotend(N); }) EDIT_TARGET(0); EDIT_TARGET(1); #if HOTENDS > 2 @@ -338,21 +214,21 @@ void menu_temperature() { #endif // HOTENDS > 1 #if ENABLED(SINGLENOZZLE) - MENU_MULTIPLIER_ITEM_EDIT(uint16_3, MSG_NOZZLE_STANDBY, &singlenozzle_temp[active_extruder ? 0 : 1], 0, HEATER_0_MAXTEMP - 15); + EDIT_ITEM_FAST(uint16_3, MSG_NOZZLE_STANDBY, &singlenozzle_temp[active_extruder ? 0 : 1], 0, HEATER_0_MAXTEMP - 15); #endif // // Bed: // #if HAS_HEATED_BED - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); #endif // // Chamber: // #if HAS_HEATED_CHAMBER - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 5, thermalManager.start_watching_chamber); + EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 5, thermalManager.start_watching_chamber); #endif // @@ -360,21 +236,24 @@ void menu_temperature() { // #if FAN_COUNT > 0 #if HAS_FAN0 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(percent, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &thermalManager.lcd_tmpfan_speed[0], 0, 255, thermalManager.lcd_setFanSpeed0); + editable.uint8 = thermalManager.fan_speed[0]; + EDIT_ITEM_FAST(percent, MSG_FAN_SPEED_1, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(0, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(percent, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &thermalManager.new_fan_speed[0], 3, 255); + EDIT_ITEM_FAST(percent, MSG_EXTRA_FAN_SPEED_1, &thermalManager.new_fan_speed[0], 3, 255); #endif #endif #if HAS_FAN1 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 1) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(percent, MSG_FAN_SPEED " 2", &thermalManager.lcd_tmpfan_speed[1], 0, 255, thermalManager.lcd_setFanSpeed1); + editable.uint8 = thermalManager.fan_speed[1]; + EDIT_ITEM_FAST(percent, MSG_FAN_SPEED_2, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(1, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(percent, MSG_EXTRA_FAN_SPEED " 2", &thermalManager.new_fan_speed[1], 3, 255); + EDIT_ITEM_FAST(percent, MSG_EXTRA_FAN_SPEED_2, &thermalManager.new_fan_speed[1], 3, 255); #endif #endif #if HAS_FAN2 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 2) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(percent, MSG_FAN_SPEED " 3", &thermalManager.lcd_tmpfan_speed[2], 0, 255, thermalManager.lcd_setFanSpeed2); + editable.uint8 = thermalManager.fan_speed[2]; + EDIT_ITEM_FAST(percent, MSG_FAN_SPEED_3, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(2, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(percent, MSG_EXTRA_FAN_SPEED " 3", &thermalManager.new_fan_speed[2], 3, 255); + EDIT_ITEM_FAST(percent, MSG_EXTRA_FAN_SPEED_3, &thermalManager.new_fan_speed[2], 3, 255); #endif #endif #endif // FAN_COUNT > 0 @@ -385,11 +264,11 @@ void menu_temperature() { // Preheat for Material 1 and 2 // #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || TEMP_SENSOR_5 != 0 || HAS_HEATED_BED - MENU_ITEM(submenu, MSG_PREHEAT_1, menu_preheat_m1); - MENU_ITEM(submenu, MSG_PREHEAT_2, menu_preheat_m2); + SUBMENU(MSG_PREHEAT_1, menu_preheat_m1); + SUBMENU(MSG_PREHEAT_2, menu_preheat_m2); #else - MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0_only); - MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0_only); + ACTION_ITEM(MSG_PREHEAT_1, [](){ _preheat_end(0, 0); }); + ACTION_ITEM(MSG_PREHEAT_2, [](){ _preheat_end(1, 0); }); #endif // @@ -400,7 +279,7 @@ void menu_temperature() { #if HAS_TEMP_BED if (thermalManager.temp_bed.target) has_heat = true; #endif - if (has_heat) MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); + if (has_heat) ACTION_ITEM(MSG_COOLDOWN, lcd_cooldown); #endif // HAS_TEMP_HOTEND diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index 917b39ebfa..ee74b95171 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -32,51 +32,11 @@ #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" -#define TMC_EDIT_STORED_I_RMS(ST,MSG) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST) - -#if AXIS_IS_TMC(X) - void refresh_stepper_current_X() { stepperX.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(Y) - void refresh_stepper_current_Y() { stepperY.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(Z) - void refresh_stepper_current_Z() { stepperZ.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(X2) - void refresh_stepper_current_X2() { stepperX2.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(Y2) - void refresh_stepper_current_Y2() { stepperY2.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(Z2) - void refresh_stepper_current_Z2() { stepperZ2.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(Z3) - void refresh_stepper_current_Z3() { stepperZ3.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E0) - void refresh_stepper_current_E0() { stepperE0.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E1) - void refresh_stepper_current_E1() { stepperE1.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E2) - void refresh_stepper_current_E2() { stepperE2.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E3) - void refresh_stepper_current_E3() { stepperE3.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E4) - void refresh_stepper_current_E4() { stepperE4.refresh_stepper_current(); } -#endif -#if AXIS_IS_TMC(E5) - void refresh_stepper_current_E5() { stepperE5.refresh_stepper_current(); } -#endif +#define TMC_EDIT_STORED_I_RMS(ST,MSG) EDIT_ITEM_P(uint16_4, PSTR(MSG), &stepper##ST.val_mA, 100, 3000, [](){ stepper##ST.refresh_stepper_current(); }) void menu_tmc_current() { START_MENU(); - MENU_BACK(MSG_TMC_DRIVERS); + BACK_ITEM(MSG_TMC_DRIVERS); #if AXIS_IS_TMC(X) TMC_EDIT_STORED_I_RMS(X, MSG_X); #endif @@ -99,73 +59,33 @@ void menu_tmc_current() { TMC_EDIT_STORED_I_RMS(Z3, MSG_Z3); #endif #if AXIS_IS_TMC(E0) - TMC_EDIT_STORED_I_RMS(E0, MSG_E1); + TMC_EDIT_STORED_I_RMS(E0, LCD_STR_E0); #endif #if AXIS_IS_TMC(E1) - TMC_EDIT_STORED_I_RMS(E1, MSG_E2); + TMC_EDIT_STORED_I_RMS(E1, LCD_STR_E1); #endif #if AXIS_IS_TMC(E2) - TMC_EDIT_STORED_I_RMS(E2, MSG_E3); + TMC_EDIT_STORED_I_RMS(E2, LCD_STR_E2); #endif #if AXIS_IS_TMC(E3) - TMC_EDIT_STORED_I_RMS(E3, MSG_E4); + TMC_EDIT_STORED_I_RMS(E3, LCD_STR_E3); #endif #if AXIS_IS_TMC(E4) - TMC_EDIT_STORED_I_RMS(E4, MSG_E5); + TMC_EDIT_STORED_I_RMS(E4, LCD_STR_E4); #endif #if AXIS_IS_TMC(E5) - TMC_EDIT_STORED_I_RMS(E5, MSG_E6); + TMC_EDIT_STORED_I_RMS(E5, LCD_STR_E5); #endif END_MENU(); } #if ENABLED(HYBRID_THRESHOLD) - #define TMC_EDIT_STORED_HYBRID_THRS(ST, MSG) MENU_ITEM_EDIT_CALLBACK(uint8, MSG, &stepper##ST.stored.hybrid_thrs, 0, 255, refresh_hybrid_thrs_##ST); - - #if AXIS_HAS_STEALTHCHOP(X) - void refresh_hybrid_thrs_X() { stepperX.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - void refresh_hybrid_thrs_Y() { stepperY.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - void refresh_hybrid_thrs_Z() { stepperZ.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - void refresh_hybrid_thrs_X2() { stepperX2.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - void refresh_hybrid_thrs_Y2() { stepperY2.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - void refresh_hybrid_thrs_Z2() { stepperZ2.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - void refresh_hybrid_thrs_Z3() { stepperZ3.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - void refresh_hybrid_thrs_E0() { stepperE0.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - void refresh_hybrid_thrs_E1() { stepperE1.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - void refresh_hybrid_thrs_E2() { stepperE2.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - void refresh_hybrid_thrs_E3() { stepperE3.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - void refresh_hybrid_thrs_E4() { stepperE4.refresh_hybrid_thrs(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - void refresh_hybrid_thrs_E5() { stepperE5.refresh_hybrid_thrs(); } - #endif + #define TMC_EDIT_STORED_HYBRID_THRS(ST, MSG) EDIT_ITEM_P(uint8, PSTR(MSG), &stepper##ST.stored.hybrid_thrs, 0, 255, [](){ stepper##ST.refresh_hybrid_thrs(); }); void menu_tmc_hybrid_thrs() { START_MENU(); - MENU_BACK(MSG_TMC_DRIVERS); + BACK_ITEM(MSG_TMC_DRIVERS); #if AXIS_HAS_STEALTHCHOP(X) TMC_EDIT_STORED_HYBRID_THRS(X, MSG_X); #endif @@ -188,22 +108,22 @@ void menu_tmc_current() { TMC_EDIT_STORED_HYBRID_THRS(Z3, MSG_Z3); #endif #if AXIS_HAS_STEALTHCHOP(E0) - TMC_EDIT_STORED_HYBRID_THRS(E0, MSG_E1); + TMC_EDIT_STORED_HYBRID_THRS(E0, LCD_STR_E0); #endif #if AXIS_HAS_STEALTHCHOP(E1) - TMC_EDIT_STORED_HYBRID_THRS(E1, MSG_E2); + TMC_EDIT_STORED_HYBRID_THRS(E1, LCD_STR_E1); #endif #if AXIS_HAS_STEALTHCHOP(E2) - TMC_EDIT_STORED_HYBRID_THRS(E2, MSG_E3); + TMC_EDIT_STORED_HYBRID_THRS(E2, LCD_STR_E2); #endif #if AXIS_HAS_STEALTHCHOP(E3) - TMC_EDIT_STORED_HYBRID_THRS(E3, MSG_E4); + TMC_EDIT_STORED_HYBRID_THRS(E3, LCD_STR_E3); #endif #if AXIS_HAS_STEALTHCHOP(E4) - TMC_EDIT_STORED_HYBRID_THRS(E4, MSG_E5); + TMC_EDIT_STORED_HYBRID_THRS(E4, LCD_STR_E4); #endif #if AXIS_HAS_STEALTHCHOP(E5) - TMC_EDIT_STORED_HYBRID_THRS(E5, MSG_E6); + TMC_EDIT_STORED_HYBRID_THRS(E5, LCD_STR_E5); #endif END_MENU(); } @@ -212,24 +132,11 @@ void menu_tmc_current() { #if ENABLED(SENSORLESS_HOMING) - #define TMC_EDIT_STORED_SGT(ST) MENU_ITEM_EDIT_CALLBACK(int4, MSG_##ST, &stepper##ST.stored.homing_thrs, stepper##ST.sgt_min, stepper##ST.sgt_max, refresh_homing_thrs_##ST); - - #if X_SENSORLESS - void refresh_homing_thrs_X() { stepperX.refresh_homing_thrs(); } - #endif - #if X2_SENSORLESS - void refresh_homing_thrs_X2() { stepperX2.refresh_homing_thrs(); } - #endif - #if Y_SENSORLESS - void refresh_homing_thrs_Y() { stepperY.refresh_homing_thrs(); } - #endif - #if Z_SENSORLESS - void refresh_homing_thrs_Z() { stepperZ.refresh_homing_thrs(); } - #endif + #define TMC_EDIT_STORED_SGT(ST) EDIT_ITEM_P(int4, PSTR(MSG_##ST), &stepper##ST.stored.homing_thrs, stepper##ST.sgt_min, stepper##ST.sgt_max, [](){ stepper##ST.refresh_homing_thrs(); }); void menu_tmc_homing_thrs() { START_MENU(); - MENU_BACK(MSG_TMC_DRIVERS); + BACK_ITEM(MSG_TMC_DRIVERS); #if X_SENSORLESS TMC_EDIT_STORED_SGT(X); #endif @@ -249,52 +156,12 @@ void menu_tmc_current() { #if HAS_STEALTHCHOP - #define TMC_EDIT_STEP_MODE(ST, MSG) MENU_ITEM_EDIT_CALLBACK(bool, MSG, &stepper##ST.stored.stealthChop_enabled, refresh_stepping_mode_##ST) - - #if AXIS_HAS_STEALTHCHOP(X) - void refresh_stepping_mode_X() { stepperX.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - void refresh_stepping_mode_Y() { stepperY.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - void refresh_stepping_mode_Z() { stepperZ.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - void refresh_stepping_mode_X2() { stepperX2.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - void refresh_stepping_mode_Y2() { stepperY2.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - void refresh_stepping_mode_Z2() { stepperZ2.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - void refresh_stepping_mode_Z3() { stepperZ3.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - void refresh_stepping_mode_E0() { stepperE0.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - void refresh_stepping_mode_E1() { stepperE1.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - void refresh_stepping_mode_E2() { stepperE2.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - void refresh_stepping_mode_E3() { stepperE3.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - void refresh_stepping_mode_E4() { stepperE4.refresh_stepping_mode(); } - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - void refresh_stepping_mode_E5() { stepperE5.refresh_stepping_mode(); } - #endif + #define TMC_EDIT_STEP_MODE(ST, MSG) EDIT_ITEM_P(bool, PSTR(MSG), &stepper##ST.stored.stealthChop_enabled, [](){ stepper##ST.refresh_stepping_mode(); }) void menu_tmc_step_mode() { START_MENU(); STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); - MENU_BACK(MSG_TMC_DRIVERS); + BACK_ITEM(MSG_TMC_DRIVERS); #if AXIS_HAS_STEALTHCHOP(X) TMC_EDIT_STEP_MODE(X, MSG_X); #endif @@ -317,22 +184,22 @@ void menu_tmc_current() { TMC_EDIT_STEP_MODE(Z3, MSG_Z3); #endif #if AXIS_HAS_STEALTHCHOP(E0) - TMC_EDIT_STEP_MODE(E0, MSG_E1); + TMC_EDIT_STEP_MODE(E0, LCD_STR_E0); #endif #if AXIS_HAS_STEALTHCHOP(E1) - TMC_EDIT_STEP_MODE(E1, MSG_E2); + TMC_EDIT_STEP_MODE(E1, LCD_STR_E1); #endif #if AXIS_HAS_STEALTHCHOP(E2) - TMC_EDIT_STEP_MODE(E2, MSG_E3); + TMC_EDIT_STEP_MODE(E2, LCD_STR_E2); #endif #if AXIS_HAS_STEALTHCHOP(E3) - TMC_EDIT_STEP_MODE(E3, MSG_E4); + TMC_EDIT_STEP_MODE(E3, LCD_STR_E3); #endif #if AXIS_HAS_STEALTHCHOP(E4) - TMC_EDIT_STEP_MODE(E4, MSG_E5); + TMC_EDIT_STEP_MODE(E4, LCD_STR_E4); #endif #if AXIS_HAS_STEALTHCHOP(E5) - TMC_EDIT_STEP_MODE(E5, MSG_E6); + TMC_EDIT_STEP_MODE(E5, LCD_STR_E5); #endif END_MENU(); } @@ -341,16 +208,16 @@ void menu_tmc_current() { void menu_tmc() { START_MENU(); - MENU_BACK(MSG_CONTROL); - MENU_ITEM(submenu, MSG_TMC_CURRENT, menu_tmc_current); + BACK_ITEM(MSG_CONTROL); + SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); #if ENABLED(HYBRID_THRESHOLD) - MENU_ITEM(submenu, MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs); + SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs); #endif #if ENABLED(SENSORLESS_HOMING) - MENU_ITEM(submenu, MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs); + SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs); #endif #if HAS_STEALTHCHOP - MENU_ITEM(submenu, MSG_TMC_STEPPING_MODE, menu_tmc_step_mode); + SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode); #endif END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 3198e6a1b1..e89d18995c 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -42,27 +42,6 @@ #include "../../module/tool_change.h" #endif -// Refresh the E factor after changing flow -#if EXTRUDERS - void _lcd_refresh_e_factor_0() { planner.refresh_e_factor(0); } - #if EXTRUDERS > 1 - void _lcd_refresh_e_factor() { planner.refresh_e_factor(active_extruder); } - void _lcd_refresh_e_factor_1() { planner.refresh_e_factor(1); } - #if EXTRUDERS > 2 - void _lcd_refresh_e_factor_2() { planner.refresh_e_factor(2); } - #if EXTRUDERS > 3 - void _lcd_refresh_e_factor_3() { planner.refresh_e_factor(3); } - #if EXTRUDERS > 4 - void _lcd_refresh_e_factor_4() { planner.refresh_e_factor(4); } - #if EXTRUDERS > 5 - void _lcd_refresh_e_factor_5() { planner.refresh_e_factor(5); } - #endif // EXTRUDERS > 5 - #endif // EXTRUDERS > 4 - #endif // EXTRUDERS > 3 - #endif // EXTRUDERS > 2 - #endif // EXTRUDERS > 1 -#endif // EXTRUDERS - #if ENABLED(BABYSTEPPING) #include "../../feature/babystep.h" @@ -95,7 +74,8 @@ #else lcd_moveto(0, LCD_HEIGHT - 1); #endif - lcd_put_u8str_P(PSTR(MSG_BABYSTEP_TOTAL ":")); + lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); + lcd_put_wchar(':'); lcd_put_u8str(ftostr54sign(spm * babystep.axis_total[BS_TOTAL_AXIS(axis)])); } #endif @@ -109,33 +89,31 @@ } #if ENABLED(BABYSTEP_XY) - void _lcd_babystep_x() { _lcd_babystep(X_AXIS, PSTR(MSG_BABYSTEP_X)); } - void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, PSTR(MSG_BABYSTEP_Y)); } - void lcd_babystep_x() { _lcd_babystep_go(_lcd_babystep_x); } - void lcd_babystep_y() { _lcd_babystep_go(_lcd_babystep_y); } + void _lcd_babystep_x() { _lcd_babystep(X_AXIS, GET_TEXT(MSG_BABYSTEP_X)); } + void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, GET_TEXT(MSG_BABYSTEP_Y)); } #endif #if DISABLED(BABYSTEP_ZPROBE_OFFSET) - void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, PSTR(MSG_BABYSTEP_Z)); } - void lcd_babystep_z() { _lcd_babystep_go(_lcd_babystep_z); } + void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, GET_TEXT(MSG_BABYSTEP_Z)); } + void lcd_babystep_z() { _lcd_babystep_go(_lcd_babystep_z); } #endif #endif // BABYSTEPPING void menu_tune() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); // // Speed: // - MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999); + EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999); // // Manual bed leveling, Bed Z: // #if BOTH(MESH_BED_LEVELING, LCD_BED_LEVELING) - MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); #endif // @@ -143,9 +121,9 @@ void menu_tune() { // Nozzle [1-4]: // #if HOTENDS == 1 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, [](){ thermalManager.start_watching_hotend(0); }); #elif HOTENDS > 1 - #define EDIT_NOZZLE(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N) + #define EDIT_NOZZLE(N) EDIT_ITEM_FAST(int3, MSG_NOZZLE_##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, [](){ thermalManager.start_watching_hotend(N); }) EDIT_NOZZLE(0); EDIT_NOZZLE(1); #if HOTENDS > 2 @@ -163,14 +141,14 @@ void menu_tune() { #endif // HOTENDS > 1 #if ENABLED(SINGLENOZZLE) - MENU_MULTIPLIER_ITEM_EDIT(uint16_3, MSG_NOZZLE_STANDBY, &singlenozzle_temp[active_extruder ? 0 : 1], 0, HEATER_0_MAXTEMP - 15); + EDIT_ITEM_FAST(uint16_3, MSG_NOZZLE_STANDBY, &singlenozzle_temp[active_extruder ? 0 : 1], 0, HEATER_0_MAXTEMP - 15); #endif // // Bed: // #if HAS_HEATED_BED - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); #endif // @@ -178,21 +156,31 @@ void menu_tune() { // #if FAN_COUNT > 0 #if HAS_FAN0 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(uint8, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &thermalManager.lcd_tmpfan_speed[0], 0, 255, thermalManager.lcd_setFanSpeed0); + #if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED + #else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_1 + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_1 + #endif + editable.uint8 = thermalManager.fan_speed[0]; + EDIT_ITEM_FAST(percent, MSG_FIRST_FAN_SPEED, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(0, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(uint8, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &thermalManager.new_fan_speed[0], 3, 255); + EDIT_ITEM_FAST(percent, MSG_FIRST_EXTRA_FAN_SPEED, &thermalManager.new_fan_speed[0], 3, 255); #endif #endif #if HAS_FAN1 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 1) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(uint8, MSG_FAN_SPEED " 2", &thermalManager.lcd_tmpfan_speed[1], 0, 255, thermalManager.lcd_setFanSpeed1); + editable.uint8 = thermalManager.fan_speed[1]; + EDIT_ITEM_FAST(percent, MSG_FAN_SPEED_2, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(1, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(uint8, MSG_EXTRA_FAN_SPEED " 2", &thermalManager.new_fan_speed[1], 3, 255); + EDIT_ITEM_FAST(percent, MSG_EXTRA_FAN_SPEED_2, &thermalManager.new_fan_speed[1], 3, 255); #endif #endif #if HAS_FAN2 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 2) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(uint8, MSG_FAN_SPEED " 3", &thermalManager.lcd_tmpfan_speed[2], 0, 255, thermalManager.lcd_setFanSpeed2); + editable.uint8 = thermalManager.fan_speed[2]; + EDIT_ITEM_FAST(percent, MSG_FAN_SPEED_3, &editable.uint8, 0, 255, [](){ thermalManager.set_fan_speed(2, editable.uint8); }); #if ENABLED(EXTRA_FAN_SPEED) - MENU_MULTIPLIER_ITEM_EDIT(uint8, MSG_EXTRA_FAN_SPEED " 3", &thermalManager.new_fan_speed[2], 3, 255); + EDIT_ITEM_FAST(percent, MSG_EXTRA_FAN_SPEED_3, &thermalManager.new_fan_speed[2], 3, 255); #endif #endif #endif // FAN_COUNT > 0 @@ -202,10 +190,10 @@ void menu_tune() { // Flow [1-5]: // #if EXTRUDERS == 1 - MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW, &planner.flow_percentage[0], 10, 999, _lcd_refresh_e_factor_0); + EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[0], 10, 999, [](){ planner.refresh_e_factor(0); }); #elif EXTRUDERS - MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, _lcd_refresh_e_factor); - #define EDIT_FLOW(N) MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_LCD_N##N, &planner.flow_percentage[N], 10, 999, _lcd_refresh_e_factor_##N) + EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, [](){ planner.refresh_e_factor(active_extruder); }); + #define EDIT_FLOW(N) EDIT_ITEM(int3, MSG_FLOW_##N, &planner.flow_percentage[N], 10, 999, [](){ planner.refresh_e_factor(N); }) EDIT_FLOW(0); EDIT_FLOW(1); #if EXTRUDERS > 2 @@ -229,13 +217,13 @@ void menu_tune() { // #if ENABLED(BABYSTEPPING) #if ENABLED(BABYSTEP_XY) - MENU_ITEM(submenu, MSG_BABYSTEP_X, lcd_babystep_x); - MENU_ITEM(submenu, MSG_BABYSTEP_Y, lcd_babystep_y); + SUBMENU(MSG_BABYSTEP_X, [](){ _lcd_babystep_go(_lcd_babystep_x); }); + SUBMENU(MSG_BABYSTEP_Y, [](){ _lcd_babystep_go(_lcd_babystep_y); }); #endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); #else - MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z); + SUBMENU(MSG_BABYSTEP_Z, lcd_babystep_z); #endif #endif diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 2364a818ae..74a51f0b7b 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -79,7 +79,7 @@ void _lcd_mesh_edit_NOP() { float lcd_mesh_edit() { ui.goto_screen(_lcd_mesh_edit_NOP); ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - _lcd_mesh_fine_tune(PSTR(MSG_MESH_EDITOR)); + _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDITOR)); return mesh_edit_value; } @@ -89,7 +89,7 @@ void lcd_mesh_edit_setup(const float &initial) { } void _lcd_z_offset_edit() { - _lcd_mesh_fine_tune(PSTR(MSG_UBL_Z_OFFSET)); + _lcd_mesh_fine_tune(GET_TEXT(MSG_UBL_Z_OFFSET)); } float lcd_z_offset_edit() { @@ -127,12 +127,12 @@ void _lcd_ubl_build_custom_mesh() { */ void _lcd_ubl_custom_mesh() { START_MENU(); - MENU_BACK(MSG_UBL_BUILD_MESH_MENU); - MENU_ITEM_EDIT(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP - 10)); + BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); + EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP - 10)); #if HAS_HEATED_BED - MENU_ITEM_EDIT(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, (BED_MAXTEMP - 10)); + EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, (BED_MAXTEMP - 10)); #endif - MENU_ITEM(function, MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh); + ACTION_ITEM(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh); END_MENU(); } @@ -157,9 +157,9 @@ void _lcd_ubl_adjust_height_cmd() { */ void _menu_ubl_height_adjust() { START_MENU(); - MENU_BACK(MSG_EDIT_MESH); - MENU_ITEM_EDIT_CALLBACK(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + BACK_ITEM(MSG_EDIT_MESH); + EDIT_ITEM(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } @@ -174,11 +174,11 @@ void _menu_ubl_height_adjust() { */ void _lcd_ubl_edit_mesh() { START_MENU(); - MENU_BACK(MSG_UBL_TOOLS); - MENU_ITEM(gcode, MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - MENU_ITEM(gcode, MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); - MENU_ITEM(submenu, MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + BACK_ITEM(MSG_UBL_TOOLS); + GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); + SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } @@ -210,28 +210,19 @@ void _lcd_ubl_validate_custom_mesh() { */ void _lcd_ubl_validate_mesh() { START_MENU(); - MENU_BACK(MSG_UBL_TOOLS); + BACK_ITEM(MSG_UBL_TOOLS); #if HAS_HEATED_BED - MENU_ITEM(gcode, MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - MENU_ITEM(gcode, MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); #else - MENU_ITEM(gcode, MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - MENU_ITEM(gcode, MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); #endif - MENU_ITEM(function, MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } -/** - * UBL Grid Leveling Command - */ -void _lcd_ubl_grid_level_cmd() { - char ubl_lcd_gcode[12]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 J%i"), side_points); - lcd_enqueue_one_now(ubl_lcd_gcode); -} - /** * UBL Grid Leveling submenu * @@ -241,9 +232,13 @@ void _lcd_ubl_grid_level_cmd() { */ void _lcd_ubl_grid_level() { START_MENU(); - MENU_BACK(MSG_UBL_TOOLS); - MENU_ITEM_EDIT(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); - MENU_ITEM(function, MSG_UBL_MESH_LEVEL, _lcd_ubl_grid_level_cmd); + BACK_ITEM(MSG_UBL_TOOLS); + EDIT_ITEM(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); + ACTION_ITEM(MSG_UBL_MESH_LEVEL, [](){ + char ubl_lcd_gcode[12]; + sprintf_P(ubl_lcd_gcode, PSTR("G29 J%i"), side_points); + lcd_enqueue_one_now(ubl_lcd_gcode); + }); END_MENU(); } @@ -257,10 +252,10 @@ void _lcd_ubl_grid_level() { */ void _lcd_ubl_mesh_leveling() { START_MENU(); - MENU_BACK(MSG_UBL_TOOLS); - MENU_ITEM(gcode, MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); - MENU_ITEM(submenu, MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + BACK_ITEM(MSG_UBL_TOOLS); + GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); + SUBMENU(MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } @@ -285,11 +280,11 @@ void _lcd_ubl_fillin_amount_cmd() { */ void _menu_ubl_fillin() { START_MENU(); - MENU_BACK(MSG_UBL_BUILD_MESH_MENU); - MENU_ITEM_EDIT_CALLBACK(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); - MENU_ITEM(gcode, MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); - MENU_ITEM(gcode, MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); + EDIT_ITEM(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); + GCODES_ITEM(MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); + GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } @@ -314,9 +309,9 @@ void _lcd_ubl_invalidate() { */ void _lcd_ubl_build_mesh() { START_MENU(); - MENU_BACK(MSG_UBL_TOOLS); + BACK_ITEM(MSG_UBL_TOOLS); #if HAS_HEATED_BED - MENU_ITEM(gcode, MSG_UBL_BUILD_MESH_M1, PSTR( + GCODES_ITEM(MSG_UBL_BUILD_MESH_M1, PSTR( "G28\n" "M190 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\n" "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" @@ -324,7 +319,7 @@ void _lcd_ubl_build_mesh() { "M104 S0\n" "M140 S0" )); - MENU_ITEM(gcode, MSG_UBL_BUILD_MESH_M2, PSTR( + GCODES_ITEM(MSG_UBL_BUILD_MESH_M2, PSTR( "G28\n" "M190 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\n" "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" @@ -333,26 +328,26 @@ void _lcd_ubl_build_mesh() { "M140 S0" )); #else - MENU_ITEM(gcode, MSG_UBL_BUILD_MESH_M1, PSTR( + GCODES_ITEM(MSG_UBL_BUILD_MESH_M1, PSTR( "G28\n" "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" "G29 P1\n" "M104 S0" )); - MENU_ITEM(gcode, MSG_UBL_BUILD_MESH_M2, PSTR( + GCODES_ITEM(MSG_UBL_BUILD_MESH_M2, PSTR( "G28\n" "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" "G29 P1\n" "M104 S0" )); #endif - MENU_ITEM(submenu, MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); - MENU_ITEM(gcode, MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - MENU_ITEM(submenu, MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); - MENU_ITEM(gcode, MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); - MENU_ITEM(function, MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); - MENU_ITEM(gcode, MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); - MENU_ITEM(function, MSG_WATCH, ui.return_to_status); + SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); + GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); + GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); + ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); + GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); + ACTION_ITEM(MSG_WATCH, ui.return_to_status); END_MENU(); } @@ -363,7 +358,7 @@ void _lcd_ubl_load_mesh_cmd() { char ubl_lcd_gcode[25]; sprintf_P(ubl_lcd_gcode, PSTR("G29 L%i"), ubl_storage_slot); lcd_enqueue_one_now(ubl_lcd_gcode); - sprintf_P(ubl_lcd_gcode, PSTR("M117 " MSG_MESH_LOADED), ubl_storage_slot); + sprintf_P(ubl_lcd_gcode, GET_TEXT(MSG_MESH_LOADED), ubl_storage_slot); lcd_enqueue_one_now(ubl_lcd_gcode); } @@ -374,7 +369,7 @@ void _lcd_ubl_save_mesh_cmd() { char ubl_lcd_gcode[25]; sprintf_P(ubl_lcd_gcode, PSTR("G29 S%i"), ubl_storage_slot); lcd_enqueue_one_now(ubl_lcd_gcode); - sprintf_P(ubl_lcd_gcode, PSTR("M117 " MSG_MESH_SAVED), ubl_storage_slot); + sprintf_P(ubl_lcd_gcode, GET_TEXT(MSG_MESH_SAVED), ubl_storage_slot); lcd_enqueue_one_now(ubl_lcd_gcode); } @@ -389,14 +384,14 @@ void _lcd_ubl_save_mesh_cmd() { void _lcd_ubl_storage_mesh() { int16_t a = settings.calc_num_meshes(); START_MENU(); - MENU_BACK(MSG_UBL_LEVEL_BED); + BACK_ITEM(MSG_UBL_LEVEL_BED); if (!WITHIN(ubl_storage_slot, 0, a - 1)) { STATIC_ITEM(MSG_UBL_NO_STORAGE); } else { - MENU_ITEM_EDIT(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1); - MENU_ITEM(function, MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd); - MENU_ITEM(function, MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + EDIT_ITEM(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1); + ACTION_ITEM(MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd); + ACTION_ITEM(MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); } END_MENU(); } @@ -432,18 +427,16 @@ void _lcd_ubl_map_lcd_edit_cmd() { void ubl_map_move_to_xy() { const feedRate_t fr_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); - set_destination_from_current(); // sync destination at the start + destination = current_position; // sync destination at the start #if ENABLED(DELTA) - if (current_position[Z_AXIS] > delta_clip_start_height) { - destination[Z_AXIS] = delta_clip_start_height; + if (current_position.z > delta_clip_start_height) { + destination.z = delta_clip_start_height; prepare_internal_move_to_destination(fr_mm_s); } #endif - destination[X_AXIS] = pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]); - destination[Y_AXIS] = pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]); - + destination.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); prepare_internal_move_to_destination(fr_mm_s); } @@ -491,9 +484,8 @@ void _lcd_ubl_output_map_lcd() { if (y_plot < 0) y_plot = GRID_MAX_POINTS_Y - 1; #if IS_KINEMATIC - const float x = pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]), - y = pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]); - if (position_is_reachable(x, y)) break; // Found a valid point + const xy_pos_t xy = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }; + if (position_is_reachable(xy)) break; // Found a valid point x_plot += (step_scaler < 0) ? -1 : 1; #endif @@ -543,11 +535,11 @@ void _lcd_ubl_output_map_lcd_cmd() { */ void _lcd_ubl_output_map() { START_MENU(); - MENU_BACK(MSG_UBL_LEVEL_BED); - MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); - MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); - MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); - MENU_ITEM(function, MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map_lcd_cmd); + BACK_ITEM(MSG_UBL_LEVEL_BED); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); + ACTION_ITEM(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map_lcd_cmd); END_MENU(); } @@ -562,12 +554,12 @@ void _lcd_ubl_output_map() { */ void _menu_ubl_tools() { START_MENU(); - MENU_BACK(MSG_UBL_LEVEL_BED); - MENU_ITEM(submenu, MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); - MENU_ITEM(gcode, MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); - MENU_ITEM(submenu, MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - MENU_ITEM(submenu, MSG_EDIT_MESH, _lcd_ubl_edit_mesh); - MENU_ITEM(submenu, MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling); + BACK_ITEM(MSG_UBL_LEVEL_BED); + SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); + GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); + SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + SUBMENU(MSG_EDIT_MESH, _lcd_ubl_edit_mesh); + SUBMENU(MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling); END_MENU(); } @@ -585,14 +577,14 @@ void _menu_ubl_tools() { */ void _lcd_ubl_step_by_step() { START_MENU(); - MENU_BACK(MSG_UBL_LEVEL_BED); - MENU_ITEM(gcode, "1 " MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - MENU_ITEM(gcode, "2 " MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); - MENU_ITEM(submenu, "3 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - MENU_ITEM(gcode, "4 " MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - MENU_ITEM(submenu, "5 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - MENU_ITEM(gcode, "6 " MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - MENU_ITEM(function, "7 " MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + BACK_ITEM(MSG_UBL_LEVEL_BED); + GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0")); + SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd); END_MENU(); } @@ -612,19 +604,20 @@ void _lcd_ubl_step_by_step() { void _lcd_ubl_level_bed() { START_MENU(); - MENU_BACK(MSG_MOTION); + BACK_ITEM(MSG_MOTION); if (planner.leveling_active) - MENU_ITEM(gcode, MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); + GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); else - MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); - MENU_ITEM(submenu, MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); - MENU_ITEM(function, MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd); - MENU_ITEM(submenu, MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); - MENU_ITEM(submenu, MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); - MENU_ITEM(submenu, MSG_UBL_TOOLS, _menu_ubl_tools); - MENU_ITEM(gcode, MSG_UBL_INFO_UBL, PSTR("G29 W")); + GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); + SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); + ACTION_ITEM(MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd); + SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); + SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); + SUBMENU(MSG_UBL_TOOLS, _menu_ubl_tools); + GCODES_ITEM(MSG_UBL_INFO_UBL, PSTR("G29 W")); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &lcd_z_fade_height, 0, 100, _lcd_set_z_fade_height); + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, [](){ set_z_fade_height(editable.decimal); }); #endif END_MENU(); } diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 389a58f2dc..229b79f1dd 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -28,6 +28,7 @@ // All displays share the MarlinUI class #if HAS_DISPLAY + #include "../gcode/queue.h" #include "ultralcd.h" #include "fontutils.h" MarlinUI ui; @@ -43,25 +44,21 @@ #if HAS_SPI_LCD #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 - #if LONG_FILENAME_LENGTH > CHARSIZE * 2 * (LCD_WIDTH) - #define MAX_MESSAGE_LENGTH LONG_FILENAME_LENGTH - #else - #define MAX_MESSAGE_LENGTH CHARSIZE * 2 * (LCD_WIDTH) - #endif + constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); #else - #define MAX_MESSAGE_LENGTH CHARSIZE * (LCD_WIDTH) + constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); #endif #elif ENABLED(EXTENSIBLE_UI) - #define MAX_MESSAGE_LENGTH 63 + constexpr uint8_t MAX_MESSAGE_LENGTH = 63; #endif -#ifdef MAX_MESSAGE_LENGTH +#if HAS_SPI_LCD || ENABLED(EXTENSIBLE_UI) uint8_t MarlinUI::alert_level; // = 0 char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; #endif #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - uint8_t MarlinUI::progress_bar_percent; // = 0 + MarlinUI::progress_t MarlinUI::progress_override; // = 0 #endif #if HAS_BUZZER @@ -93,7 +90,6 @@ #include "../module/planner.h" #include "../module/printcounter.h" #include "../module/motion.h" -#include "../gcode/queue.h" #include "../Marlin.h" @@ -519,7 +515,7 @@ void MarlinUI::status_screen() { if (expire_status_ms > 0) { // Expire the message if a job is active and the bar has ticks - if (get_progress() > 2 && !print_job_timer.isPaused()) { + if (get_progress_percent() > 2 && !print_job_timer.isPaused()) { if (ELAPSED(ms, expire_status_ms)) { status_message[0] = '\0'; expire_status_ms = 0; @@ -590,9 +586,12 @@ void MarlinUI::status_screen() { draw_status_screen(); } -void MarlinUI::kill_screen(PGM_P lcd_msg) { +void MarlinUI::kill_screen(PGM_P lcd_error, PGM_P lcd_component) { init(); - set_alert_status_P(lcd_msg); + status_printf_P(1, PSTR(S_FMT ": " S_FMT), lcd_error, lcd_component); + #if HAS_LCD_MENU + return_to_status(); + #endif // RED ALERT. RED ALERT. #ifdef LED_BACKLIGHT_TIMEOUT @@ -671,7 +670,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #endif // Set movement on a single axis - set_destination_from_current(); + destination = current_position; destination[manual_move_axis] += manual_move_offset; // Reset for the next move @@ -843,13 +842,13 @@ void MarlinUI::update() { if (old_sd_status == 2) card.beginautostart(); // Initial boot else - set_status_P(PSTR(MSG_MEDIA_INSERTED)); + set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); } #if PIN_EXISTS(SD_DETECT) else { card.release(); if (old_sd_status != 2) { - set_status_P(PSTR(MSG_MEDIA_REMOVED)); + set_status_P(GET_TEXT(MSG_MEDIA_REMOVED)); #if HAS_LCD_MENU return_to_status(); #endif @@ -1349,8 +1348,6 @@ void MarlinUI::update() { #if ENABLED(EXTENSIBLE_UI) ExtUI::onStatusChanged(status_message); #endif - - refresh(); } bool MarlinUI::has_status() { return (status_message[0] != '\0'); } @@ -1425,15 +1422,17 @@ void MarlinUI::update() { #endif } + #include "../Marlin.h" #include "../module/printcounter.h" + PGM_P print_paused = GET_TEXT(MSG_PRINT_PAUSED); + /** * Reset the status message */ void MarlinUI::reset_status() { - static const char paused[] PROGMEM = MSG_PRINT_PAUSED; - static const char printing[] PROGMEM = MSG_PRINTING; - static const char welcome[] PROGMEM = WELCOME_MSG; + PGM_P printing = GET_TEXT(MSG_PRINTING); + PGM_P welcome = GET_TEXT(WELCOME_MSG); #if SERVICE_INTERVAL_1 > 0 static const char service1[] PROGMEM = { "> " SERVICE_NAME_1 "!" }; #endif @@ -1444,8 +1443,8 @@ void MarlinUI::update() { static const char service3[] PROGMEM = { "> " SERVICE_NAME_3 "!" }; #endif PGM_P msg; - if (!IS_SD_PRINTING() && print_job_timer.isPaused()) - msg = paused; + if (printingIsPaused()) + msg = print_paused; #if ENABLED(SDSUPPORT) else if (IS_SD_PRINTING()) return set_status(card.longest_filename(), true); @@ -1485,7 +1484,7 @@ void MarlinUI::update() { host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), PSTR("Dismiss")); #endif print_job_timer.stop(); - set_status_P(PSTR(MSG_PRINT_ABORTED)); + set_status_P(GET_TEXT(MSG_PRINT_ABORTED)); #if HAS_LCD_MENU return_to_status(); #endif @@ -1497,7 +1496,7 @@ void MarlinUI::update() { void MarlinUI::pause_print() { #if HAS_LCD_MENU - synchronize(PSTR(MSG_PAUSE_PRINT)); + synchronize(GET_TEXT(MSG_PAUSE_PRINT)); #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -1508,7 +1507,7 @@ void MarlinUI::update() { host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume")); #endif - set_status_P(PSTR(MSG_PRINT_PAUSED)); + set_status_P(print_paused); #if ENABLED(PARK_HEAD_ON_PAUSE) #if HAS_SPI_LCD @@ -1527,9 +1526,7 @@ void MarlinUI::update() { #if ENABLED(PARK_HEAD_ON_PAUSE) wait_for_heatup = wait_for_user = false; #endif - #if ENABLED(SDSUPPORT) - if (card.isPaused()) queue.inject_P(PSTR("M24")); - #endif + if (IS_SD_PAUSED()) queue.inject_P(PSTR("M24")); #ifdef ACTION_ON_RESUME host_action_resume(); #endif @@ -1537,19 +1534,24 @@ void MarlinUI::update() { } #if HAS_PRINT_PROGRESS - uint8_t MarlinUI::get_progress() { + + MarlinUI::progress_t MarlinUI::_get_progress() { #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - uint8_t &progress = progress_bar_percent; - #define _PLIMIT(P) ((P) & 0x7F) + const progress_t p = progress_override & PROGRESS_MASK; #else - #define _PLIMIT(P) P - uint8_t progress = 0; + constexpr progress_t p = 0; #endif - #if ENABLED(SDSUPPORT) - if (IS_SD_PRINTING()) progress = card.percentDone(); - #endif - return _PLIMIT(progress); + return (p + #if ENABLED(SDSUPPORT) + #if HAS_PRINT_PROGRESS_PERMYRIAD + ?: card.permyriadDone() + #else + ?: card.percentDone() + #endif + #endif + ); } + #endif #endif // HAS_DISPLAY diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index f3dcb3a381..31a94a124d 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -67,13 +67,9 @@ #if HAS_GRAPHICAL_LCD #define SETCURSOR(col, row) lcd_moveto(col * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) - #define LCDPRINT(p) u8g.print(p) - #define LCDWRITE(c) u8g.print(c) #else #define SETCURSOR(col, row) lcd_moveto(col, row) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_WIDTH - (len), row) - #define LCDPRINT(p) lcd_put_u8str(p) - #define LCDWRITE(c) lcd_put_wchar(c) #endif #include "lcdprint.h" @@ -90,7 +86,6 @@ typedef void (*menuAction_t)(); // Manual Movement - constexpr feedRate_t manual_feedrate_mm_m[XYZE] = MANUAL_FEEDRATE; extern float move_menu_scale; #if ENABLED(ADVANCED_PAUSE_FEATURE) @@ -274,7 +269,7 @@ public: static void init(); static void update(); - static void set_alert_status_P(PGM_P message); + static void set_alert_status_P(PGM_P const message); static char status_message[]; static bool has_status(); @@ -293,15 +288,28 @@ public: static void resume_print(); #if HAS_PRINT_PROGRESS - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - static uint8_t progress_bar_percent; - static void set_progress(const uint8_t progress) { progress_bar_percent = _MIN(progress, 100); } - static void set_progress_done() { set_progress(0x80 + 100); } - static void progress_reset() { if (progress_bar_percent & 0x80) set_progress(0); } + #if HAS_PRINT_PROGRESS_PERMYRIAD + typedef uint16_t progress_t; + #define PROGRESS_SCALE 100U + #define PROGRESS_MASK 0x7FFF + #else + typedef uint8_t progress_t; + #define PROGRESS_SCALE 1U + #define PROGRESS_MASK 0x7F #endif - static uint8_t get_progress(); + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + static progress_t progress_override; + static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } + static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } + static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } + #endif + static progress_t _get_progress(); + #if HAS_PRINT_PROGRESS_PERMYRIAD + static uint16_t get_progress_permyriad() { return _get_progress(); } + #endif + static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); } #else - static constexpr uint8_t get_progress() { return 0; } + static constexpr uint8_t get_progress_percent() { return 0; } #endif #if HAS_SPI_LCD @@ -381,7 +389,7 @@ public: #endif static bool get_blink(); - static void kill_screen(PGM_P const lcd_msg); + static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); static void draw_kill_screen(); static void set_status(const char* const message, const bool persist=false); static void set_status_P(PGM_P const message, const int8_t level=0); @@ -394,10 +402,10 @@ public: static inline void update() {} static inline void refresh() {} static inline void return_to_status() {} - static inline void set_alert_status_P(PGM_P message) { UNUSED(message); } - static inline void set_status(const char* const message, const bool persist=false) { UNUSED(message); UNUSED(persist); } - static inline void set_status_P(PGM_P const message, const int8_t level=0) { UNUSED(message); UNUSED(level); } - static inline void status_printf_P(const uint8_t level, PGM_P const fmt, ...) { UNUSED(level); UNUSED(fmt); } + static inline void set_alert_status_P(PGM_P const) {} + static inline void set_status(const char* const, const bool=false) {} + static inline void set_status_P(PGM_P const, const int8_t=0) {} + static inline void status_printf_P(const uint8_t, PGM_P const, ...) {} static inline void reset_status() {} static inline void reset_alert_level() {} static constexpr bool has_status() { return false; } @@ -599,5 +607,8 @@ private: extern MarlinUI ui; -#define LCD_MESSAGEPGM(x) ui.set_status_P(PSTR(x)) -#define LCD_ALERTMESSAGEPGM(x) ui.set_alert_status_P(PSTR(x)) +#define LCD_MESSAGEPGM_P(x) ui.set_status_P(x) +#define LCD_ALERTMESSAGEPGM_P(x) ui.set_alert_status_P(x) + +#define LCD_MESSAGEPGM(x) LCD_MESSAGEPGM_P(GET_TEXT(x)) +#define LCD_ALERTMESSAGEPGM(x) LCD_ALERTMESSAGEPGM_P(GET_TEXT(x)) diff --git a/Marlin/src/libs/L6470/L6470_Marlin.cpp b/Marlin/src/libs/L6470/L6470_Marlin.cpp index d8b0fb833d..549ba3c364 100644 --- a/Marlin/src/libs/L6470/L6470_Marlin.cpp +++ b/Marlin/src/libs/L6470/L6470_Marlin.cpp @@ -339,19 +339,19 @@ bool L6470_Marlin::get_user_input(uint8_t &driver_count, uint8_t axis_index[3], // Position calcs & checks // - const float center[] = { - LOGICAL_X_POSITION(current_position[X_AXIS]), - LOGICAL_Y_POSITION(current_position[Y_AXIS]), - LOGICAL_Z_POSITION(current_position[Z_AXIS]), - current_position[E_AXIS] + const xyze_pos_t center = { + LOGICAL_X_POSITION(current_position.x), + LOGICAL_Y_POSITION(current_position.y), + LOGICAL_Z_POSITION(current_position.z), + current_position.e }; switch (axis_mon[0][0]) { default: position_max = position_min = 0; break; case 'X': { - position_min = center[X_AXIS] - displacement; - position_max = center[X_AXIS] + displacement; + position_min = center.x - displacement; + position_max = center.x + displacement; echo_min_max('X', position_min, position_max); if (false #ifdef X_MIN_POS @@ -367,8 +367,8 @@ bool L6470_Marlin::get_user_input(uint8_t &driver_count, uint8_t axis_index[3], } break; case 'Y': { - position_min = center[Y_AXIS] - displacement; - position_max = center[Y_AXIS] + displacement; + position_min = center.y - displacement; + position_max = center.y + displacement; echo_min_max('Y', position_min, position_max); if (false #ifdef Y_MIN_POS @@ -384,8 +384,8 @@ bool L6470_Marlin::get_user_input(uint8_t &driver_count, uint8_t axis_index[3], } break; case 'Z': { - position_min = center[Z_AXIS] - displacement; - position_max = center[Z_AXIS] + displacement; + position_min = center.z - displacement; + position_max = center.z + displacement; echo_min_max('Z', position_min, position_max); if (false #ifdef Z_MIN_POS @@ -401,8 +401,8 @@ bool L6470_Marlin::get_user_input(uint8_t &driver_count, uint8_t axis_index[3], } break; case 'E': { - position_min = center[E_AXIS] - displacement; - position_max = center[E_AXIS] + displacement; + position_min = center.e - displacement; + position_max = center.e + displacement; echo_min_max('E', position_min, position_max); } break; } diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 2015c17436..0df3659b1b 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -151,15 +151,15 @@ struct duration_t { m = uint16_t(this->minute() % 60UL); if (with_days) { uint16_t d = this->day(); - sprintf_P(buffer, PSTR("%ud %02u:%02u"), d, h % 24, m); + sprintf_P(buffer, PSTR("%hud %02hu:%02hu"), d, h % 24, m); return d >= 10 ? 9 : 8; } else if (h < 100) { - sprintf_P(buffer, PSTR("%02u:%02u"), h, m); + sprintf_P(buffer, PSTR("%02hu:%02hu"), h, m); return 5; } else { - sprintf_P(buffer, PSTR("%u:%02u"), h, m); + sprintf_P(buffer, PSTR("%hu:%02hu"), h, m); return 6; } } diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index e7ef436146..1353296794 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -34,7 +34,7 @@ #include "../inc/MarlinConfig.h" -#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR) +#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) #include "least_squares_fit.h" diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index bfef8b14ad..acb29402c5 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -65,6 +65,9 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->max_absx = _MAX(ABS(wx), lsf->max_absx); lsf->max_absy = _MAX(ABS(wy), lsf->max_absy); } +inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z, const float &w) { + incremental_WLSF(lsf, pos.x, pos.y, z, w); +} inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { lsf->xbar += x; @@ -80,5 +83,8 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->max_absy = _MAX(ABS(y), lsf->max_absy); lsf->N += 1.0; } +inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z) { + incremental_LSF(lsf, pos.x, pos.y, z); +} int finish_incremental_LSF(struct linear_fit_data *); diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 829d46e1da..b95a7c8afc 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -30,7 +30,6 @@ Nozzle nozzle; #include "../Marlin.h" #include "../module/motion.h" -#include "point_t.h" #if ENABLED(NOZZLE_CLEAN_FEATURE) @@ -38,30 +37,30 @@ Nozzle nozzle; * @brief Stroke clean pattern * @details Wipes the nozzle back and forth in a linear movement * - * @param start point_t defining the starting point - * @param end point_t defining the ending point + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute */ - void Nozzle::stroke(const point_t &start, const point_t &end, const uint8_t &strokes) { + void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { #if ENABLED(NOZZLE_CLEAN_GOBACK) - const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; + const xyz_pos_t oldpos = current_position; #endif // Move to the starting point #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start.x, start.y); + do_blocking_move_to_xy(start); #else - do_blocking_move_to(start.x, start.y, start.z); + do_blocking_move_to(start); #endif // Start the stroke pattern for (uint8_t i = 0; i < (strokes >> 1); i++) { - do_blocking_move_to_xy(end.x, end.y); - do_blocking_move_to_xy(start.x, start.y); + do_blocking_move_to_xy(end); + do_blocking_move_to_xy(start); } #if ENABLED(NOZZLE_CLEAN_GOBACK) - do_blocking_move_to(ix, iy, iz); + do_blocking_move_to(oldpos); #endif } @@ -69,29 +68,29 @@ Nozzle nozzle; * @brief Zig-zag clean pattern * @details Apply a zig-zag cleaning pattern * - * @param start point_t defining the starting point - * @param end point_t defining the ending point + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute * @param objects number of triangles to do */ - void Nozzle::zigzag(const point_t &start, const point_t &end, const uint8_t &strokes, const uint8_t &objects) { - const float diffx = end.x - start.x, diffy = end.y - start.y; - if (!diffx || !diffy) return; + void Nozzle::zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) { + const xy_pos_t diff = end - start; + if (!diff.x || !diff.y) return; #if ENABLED(NOZZLE_CLEAN_GOBACK) - const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; + const xyz_pos_t back = current_position; #endif #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start.x, start.y); + do_blocking_move_to_xy(start); #else - do_blocking_move_to(start.x, start.y, start.z); + do_blocking_move_to(start); #endif const uint8_t zigs = objects << 1; - const bool horiz = ABS(diffx) >= ABS(diffy); // Do a horizontal wipe? - const float P = (horiz ? diffx : diffy) / zigs; // Period of each zig / zag - const point_t *side; + const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe? + const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag + const xyz_pos_t *side; for (uint8_t j = 0; j < strokes; j++) { for (int8_t i = 0; i < zigs; i++) { side = (i & 1) ? &end : &start; @@ -110,7 +109,7 @@ Nozzle nozzle; } #if ENABLED(NOZZLE_CLEAN_GOBACK) - do_blocking_move_to(ix, iy, iz); + do_blocking_move_to(back); #endif } @@ -118,21 +117,21 @@ Nozzle nozzle; * @brief Circular clean pattern * @details Apply a circular cleaning pattern * - * @param start point_t defining the middle of circle + * @param start xyz_pos_t defining the middle of circle * @param strokes number of strokes to execute * @param radius radius of circle */ - void Nozzle::circle(const point_t &start, const point_t &middle, const uint8_t &strokes, const float &radius) { + void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { if (strokes == 0) return; #if ENABLED(NOZZLE_CLEAN_GOBACK) - const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; + const xyz_pos_t back = current_position; #endif #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start.x, start.y); + do_blocking_move_to_xy(start); #else - do_blocking_move_to(start.x, start.y, start.z); + do_blocking_move_to(start); #endif for (uint8_t s = 0; s < strokes; s++) @@ -143,10 +142,10 @@ Nozzle nozzle; ); // Let's be safe - do_blocking_move_to_xy(start.x, start.y); + do_blocking_move_to_xy(start); #if ENABLED(NOZZLE_CLEAN_GOBACK) - do_blocking_move_to(ix, iy, iz); + do_blocking_move_to(back); #endif } @@ -158,21 +157,21 @@ Nozzle nozzle; * @param argument depends on the cleaning pattern */ void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) { - point_t start = NOZZLE_CLEAN_START_POINT; - point_t end = NOZZLE_CLEAN_END_POINT; + xyz_pos_t start = NOZZLE_CLEAN_START_POINT, end = NOZZLE_CLEAN_END_POINT; if (pattern == 2) { if (!(cleans & (_BV(X_AXIS) | _BV(Y_AXIS)))) { SERIAL_ECHOLNPGM("Warning : Clean Circle requires XY"); return; } - end = NOZZLE_CLEAN_CIRCLE_MIDDLE; + constexpr xyz_pos_t middle NOZZLE_CLEAN_CIRCLE_MIDDLE; + end = middle; } else { - if (!TEST(cleans, X_AXIS)) start.x = end.x = current_position[X_AXIS]; - if (!TEST(cleans, Y_AXIS)) start.y = end.y = current_position[Y_AXIS]; + if (!TEST(cleans, X_AXIS)) start.x = end.x = current_position.x; + if (!TEST(cleans, Y_AXIS)) start.y = end.y = current_position.y; } - if (!TEST(cleans, Z_AXIS)) start.z = end.z = current_position[Z_AXIS]; + if (!TEST(cleans, Z_AXIS)) start.z = end.z = current_position.z; switch (pattern) { case 1: zigzag(start, end, strokes, objects); break; @@ -185,7 +184,7 @@ Nozzle nozzle; #if ENABLED(NOZZLE_PARK_FEATURE) - void Nozzle::park(const uint8_t z_action, const point_t &park/*=NOZZLE_PARK_POINT*/) { + void Nozzle::park(const uint8_t z_action, const xyz_pos_t &park/*=NOZZLE_PARK_POINT*/) { constexpr feedRate_t fr_xy = NOZZLE_PARK_XY_FEEDRATE, fr_z = NOZZLE_PARK_Z_FEEDRATE; switch (z_action) { @@ -194,14 +193,14 @@ Nozzle nozzle; break; case 2: // Raise by Z-park height - do_blocking_move_to_z(_MIN(current_position[Z_AXIS] + park.z, Z_MAX_POS), fr_z); + do_blocking_move_to_z(_MIN(current_position.z + park.z, Z_MAX_POS), fr_z); break; default: // Raise to at least the Z-park height - do_blocking_move_to_z(_MAX(park.z, current_position[Z_AXIS]), fr_z); + do_blocking_move_to_z(_MAX(park.z, current_position.z), fr_z); } - do_blocking_move_to_xy(park.x, park.y, fr_xy); + do_blocking_move_to_xy(park, fr_xy); report_current_position(); } diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index d20b41de93..280f8b1a38 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -22,7 +22,6 @@ #pragma once #include "../inc/MarlinConfig.h" -#include "point_t.h" /** * @brief Nozzle class @@ -38,32 +37,32 @@ class Nozzle { * @brief Stroke clean pattern * @details Wipes the nozzle back and forth in a linear movement * - * @param start point_t defining the starting point - * @param end point_t defining the ending point + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute */ - static void stroke(const point_t &start, const point_t &end, const uint8_t &strokes) _Os; + static void stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) _Os; /** * @brief Zig-zag clean pattern * @details Apply a zig-zag cleaning pattern * - * @param start point_t defining the starting point - * @param end point_t defining the ending point + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute * @param objects number of objects to create */ - static void zigzag(const point_t &start, const point_t &end, const uint8_t &strokes, const uint8_t &objects) _Os; + static void zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) _Os; /** * @brief Circular clean pattern * @details Apply a circular cleaning pattern * - * @param start point_t defining the middle of circle + * @param start xyz_pos_t defining the middle of circle * @param strokes number of strokes to execute * @param radius radius of circle */ - static void circle(const point_t &start, const point_t &middle, const uint8_t &strokes, const float &radius) _Os; + static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) _Os; #endif // NOZZLE_CLEAN_FEATURE @@ -84,7 +83,7 @@ class Nozzle { #if ENABLED(NOZZLE_PARK_FEATURE) - static void park(const uint8_t z_action, const point_t &park=NOZZLE_PARK_POINT) _Os; + static void park(const uint8_t z_action, const xyz_pos_t &park=NOZZLE_PARK_POINT) _Os; #endif }; diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 6be9da7afb..6054f877e5 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -33,7 +33,7 @@ char conv[8] = { 0 }; #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) // Convert a full-range unsigned 8bit int to a percentage -char* ui8tostr4pct(const uint8_t i) { +const char* ui8tostr4pct(const uint8_t i) { const uint8_t n = ui8_to_percent(i); conv[3] = RJDIGIT(n, 100); conv[4] = RJDIGIT(n, 10); @@ -43,7 +43,7 @@ char* ui8tostr4pct(const uint8_t i) { } // Convert unsigned 8bit int to string 123 format -char* ui8tostr3(const uint8_t i) { +const char* ui8tostr3(const uint8_t i) { conv[4] = RJDIGIT(i, 100); conv[5] = RJDIGIT(i, 10); conv[6] = DIGIMOD(i, 1); @@ -51,7 +51,7 @@ char* ui8tostr3(const uint8_t i) { } // Convert signed 8bit int to rj string with 123 or -12 format -char* i8tostr3(const int8_t x) { +const char* i8tostr3(const int8_t x) { int xx = x; conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); conv[5] = RJDIGIT(xx, 10); @@ -59,8 +59,36 @@ char* i8tostr3(const int8_t x) { return &conv[4]; } +#if HAS_PRINT_PROGRESS_PERMYRIAD + // Convert unsigned 16-bit permyriad to percent with 100 / 23 / 23.4 / 3.45 format + const char* permyriadtostr4(const uint16_t xx) { + if (xx >= 10000) + return "100"; + else if (xx >= 1000) { + conv[3] = DIGIMOD(xx, 1000); + conv[4] = DIGIMOD(xx, 100); + conv[5] = '.'; + conv[6] = DIGIMOD(xx, 10); + return &conv[3]; + } + else if (xx % 100 == 0) { + conv[4] = ' '; + conv[5] = RJDIGIT(xx, 1000); + conv[6] = DIGIMOD(xx, 100); + return &conv[4]; + } + else { + conv[3] = DIGIMOD(xx, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(xx, 10); + conv[6] = RJDIGIT(xx, 1); + return &conv[3]; + } + } +#endif + // Convert unsigned 16bit int to string 12345 format -char* ui16tostr5(const uint16_t xx) { +const char* ui16tostr5(const uint16_t xx) { conv[2] = RJDIGIT(xx, 10000); conv[3] = RJDIGIT(xx, 1000); conv[4] = RJDIGIT(xx, 100); @@ -70,7 +98,7 @@ char* ui16tostr5(const uint16_t xx) { } // Convert unsigned 16bit int to string 1234 format -char* ui16tostr4(const uint16_t xx) { +const char* ui16tostr4(const uint16_t xx) { conv[3] = RJDIGIT(xx, 1000); conv[4] = RJDIGIT(xx, 100); conv[5] = RJDIGIT(xx, 10); @@ -79,7 +107,7 @@ char* ui16tostr4(const uint16_t xx) { } // Convert unsigned 16bit int to string 123 format -char* ui16tostr3(const uint16_t xx) { +const char* ui16tostr3(const uint16_t xx) { conv[4] = RJDIGIT(xx, 100); conv[5] = RJDIGIT(xx, 10); conv[6] = DIGIMOD(xx, 1); @@ -87,7 +115,7 @@ char* ui16tostr3(const uint16_t xx) { } // Convert signed 16bit int to rj string with 123 or -12 format -char* i16tostr3(const int16_t x) { +const char* i16tostr3(const int16_t x) { int xx = x; conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); conv[5] = RJDIGIT(xx, 10); @@ -96,7 +124,7 @@ char* i16tostr3(const int16_t x) { } // Convert unsigned 16bit int to lj string with 123 format -char* i16tostr3left(const int16_t i) { +const char* i16tostr3left(const int16_t i) { char *str = &conv[6]; *str = DIGIMOD(i, 1); if (i >= 10) { @@ -108,7 +136,7 @@ char* i16tostr3left(const int16_t i) { } // Convert signed 16bit int to rj string with 1234, _123, -123, _-12, or __-1 format -char* i16tostr4sign(const int16_t i) { +const char* i16tostr4sign(const int16_t i) { const bool neg = i < 0; const int ii = neg ? -i : i; if (i >= 1000) { @@ -137,7 +165,7 @@ char* i16tostr4sign(const int16_t i) { } // Convert unsigned float to string with 1.23 format -char* ftostr12ns(const float &f) { +const char* ftostr12ns(const float &f) { const long i = ((f < 0 ? -f : f) * 1000 + 5) / 10; conv[3] = DIGIMOD(i, 100); conv[4] = '.'; @@ -147,7 +175,7 @@ char* ftostr12ns(const float &f) { } // Convert signed float to fixed-length string with 12.34 / -2.34 format or 123.45 / -23.45 format -char* ftostr42_52(const float &f) { +const char* ftostr42_52(const float &f) { if (f <= -10 || f >= 100) return ftostr52(f); // need more digits long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); @@ -159,7 +187,7 @@ char* ftostr42_52(const float &f) { } // Convert signed float to fixed-length string with 023.45 / -23.45 format -char* ftostr52(const float &f) { +const char* ftostr52(const float &f) { long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); conv[2] = DIGIMOD(i, 1000); @@ -173,7 +201,7 @@ char* ftostr52(const float &f) { #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format - char* ftostr4sign(const float &f) { + const char* ftostr4sign(const float &f) { const int i = (f * 100 + (f < 0 ? -5: 5)) / 10; if (!WITHIN(i, -99, 999)) return i16tostr4sign((int)f); const bool neg = i < 0; @@ -188,7 +216,7 @@ char* ftostr52(const float &f) { #endif // Convert float to fixed-length string with +123.4 / -123.4 format -char* ftostr41sign(const float &f) { +const char* ftostr41sign(const float &f) { int i = (f * 100 + (f < 0 ? -5: 5)) / 10; conv[1] = MINUSOR(i, '+'); conv[2] = DIGIMOD(i, 1000); @@ -200,7 +228,7 @@ char* ftostr41sign(const float &f) { } // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -char* ftostr43sign(const float &f, char plus/*=' '*/) { +const char* ftostr43sign(const float &f, char plus/*=' '*/) { long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; conv[1] = i ? MINUSOR(i, plus) : ' '; conv[2] = DIGIMOD(i, 1000); @@ -212,7 +240,7 @@ char* ftostr43sign(const float &f, char plus/*=' '*/) { } // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -char* ftostr54sign(const float &f, char plus/*=' '*/) { +const char* ftostr54sign(const float &f, char plus/*=' '*/) { long i = (f * 100000 + (f < 0 ? -5: 5)) / 10; conv[0] = i ? MINUSOR(i, plus) : ' '; conv[1] = DIGIMOD(i, 10000); @@ -225,13 +253,13 @@ char* ftostr54sign(const float &f, char plus/*=' '*/) { } // Convert unsigned float to rj string with 12345 format -char* ftostr5rj(const float &f) { +const char* ftostr5rj(const float &f) { const long i = ((f < 0 ? -f : f) * 10 + 5) / 10; return ui16tostr5(i); } // Convert signed float to string with +1234.5 format -char* ftostr51sign(const float &f) { +const char* ftostr51sign(const float &f) { long i = (f * 100 + (f < 0 ? -5: 5)) / 10; conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -244,7 +272,7 @@ char* ftostr51sign(const float &f) { } // Convert signed float to string with +123.45 format -char* ftostr52sign(const float &f) { +const char* ftostr52sign(const float &f) { long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -257,7 +285,7 @@ char* ftostr52sign(const float &f) { } // Convert unsigned float to string with 1234.5 format omitting trailing zeros -char* ftostr51rj(const float &f) { +const char* ftostr51rj(const float &f) { const long i = ((f < 0 ? -f : f) * 100 + 5) / 10; conv[0] = ' '; conv[1] = RJDIGIT(i, 10000); @@ -270,7 +298,7 @@ char* ftostr51rj(const float &f) { } // Convert signed float to space-padded string with -_23.4_ format -char* ftostr52sp(const float &f) { +const char* ftostr52sp(const float &f) { long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; uint8_t dig; conv[0] = MINUSOR(i, ' '); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 6af2ac4869..f18df094a3 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -24,76 +24,81 @@ #include // Convert a full-range unsigned 8bit int to a percentage -char* ui8tostr4pct(const uint8_t i); +const char* ui8tostr4pct(const uint8_t i); // Convert uint8_t to string with 123 format -char* ui8tostr3(const uint8_t i); +const char* ui8tostr3(const uint8_t i); // Convert int8_t to string with 123 format -char* i8tostr3(const int8_t x); +const char* i8tostr3(const int8_t x); + +#if HAS_PRINT_PROGRESS_PERMYRIAD + // Convert 16-bit unsigned permyriad value to percent: 100 / 23 / 23.4 / 3.45 + const char* permyriadtostr4(const uint16_t xx); +#endif // Convert uint16_t to string with 12345 format -char* ui16tostr5(const uint16_t x); +const char* ui16tostr5(const uint16_t x); // Convert uint16_t to string with 1234 format -char* ui16tostr4(const uint16_t x); +const char* ui16tostr4(const uint16_t x); // Convert uint16_t to string with 123 format -char* ui16tostr3(const uint16_t x); +const char* ui16tostr3(const uint16_t x); // Convert int16_t to string with 123 format -char* i16tostr3(const int16_t x); +const char* i16tostr3(const int16_t x); // Convert unsigned int to lj string with 123 format -char* i16tostr3left(const int16_t xx); +const char* i16tostr3left(const int16_t xx); // Convert signed int to rj string with _123, -123, _-12, or __-1 format -char* i16tostr4sign(const int16_t x); +const char* i16tostr4sign(const int16_t x); // Convert unsigned float to string with 1.23 format -char* ftostr12ns(const float &x); +const char* ftostr12ns(const float &x); // Convert signed float to fixed-length string with 12.34 / -2.34 or 023.45 / -23.45 format -char* ftostr42_52(const float &x); +const char* ftostr42_52(const float &x); // Convert signed float to fixed-length string with 023.45 / -23.45 format -char* ftostr52(const float &x); +const char* ftostr52(const float &x); // Convert float to fixed-length string with +123.4 / -123.4 format -char* ftostr41sign(const float &x); +const char* ftostr41sign(const float &x); // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -char* ftostr43sign(const float &x, char plus=' '); +const char* ftostr43sign(const float &x, char plus=' '); // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -char* ftostr54sign(const float &x, char plus=' '); +const char* ftostr54sign(const float &x, char plus=' '); // Convert unsigned float to rj string with 12345 format -char* ftostr5rj(const float &x); +const char* ftostr5rj(const float &x); // Convert signed float to string with +1234.5 format -char* ftostr51sign(const float &x); +const char* ftostr51sign(const float &x); // Convert signed float to space-padded string with -_23.4_ format -char* ftostr52sp(const float &x); +const char* ftostr52sp(const float &x); // Convert signed float to string with +123.45 format -char* ftostr52sign(const float &x); +const char* ftostr52sign(const float &x); // Convert unsigned float to string with 1234.5 format omitting trailing zeros -char* ftostr51rj(const float &x); +const char* ftostr51rj(const float &x); #include "../core/macros.h" // Convert float to rj string with 123 or -12 format -FORCE_INLINE char* ftostr3(const float &x) { return i16tostr3(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } +FORCE_INLINE const char* ftostr3(const float &x) { return i16tostr3(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #include "../inc/MarlinConfigPre.h" #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format - char* ftostr4sign(const float &fx); + const char* ftostr4sign(const float &fx); #else // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format - FORCE_INLINE char* ftostr4sign(const float &x) { return i16tostr4sign(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } + FORCE_INLINE const char* ftostr4sign(const float &x) { return i16tostr4sign(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #endif diff --git a/Marlin/src/libs/point_t.h b/Marlin/src/libs/point_t.h deleted file mode 100644 index 5c7d8feac6..0000000000 --- a/Marlin/src/libs/point_t.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -/** - * @brief Cartesian Point - * @details Represents a three dimensional point on Cartesian coordinate system, - * using an additional fourth dimension for the extrusion length. - * - * @param x The x-coordinate of the point. - * @param y The y-coordinate of the point. - * @param z The z-coordinate of the point. - */ -struct point_t { - float x, y, z; - - /** - * @brief Three dimensional point constructor - * - * @param x The x-coordinate of the point. - * @param y The y-coordinate of the point. - * @param z The z-coordinate of the point. - */ - point_t(const float x, const float y, const float z) : x(x), y(y), z(z) {} - - /** - * @brief Two dimensional point constructor - * - * @param x The x-coordinate of the point. - * @param y The y-coordinate of the point. - */ - point_t(const float x, const float y) : point_t(x, y, NAN) {} - -}; diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index e733cce3a5..0363318e53 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -47,81 +47,74 @@ #include -vector_3::vector_3() : x(0), y(0), z(0) { } - -vector_3::vector_3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) { } +/** + * vector_3 + */ vector_3 vector_3::cross(const vector_3 &left, const vector_3 &right) { - return vector_3(left.y * right.z - left.z * right.y, - left.z * right.x - left.x * right.z, - left.x * right.y - left.y * right.x); + const xyz_float_t &lv = left, &rv = right; + return vector_3(lv.y * rv.z - lv.z * rv.y, // YZ cross + lv.z * rv.x - lv.x * rv.z, // ZX cross + lv.x * rv.y - lv.y * rv.x); // XY cross } -vector_3 vector_3::operator+(const vector_3 &v) { return vector_3(x + v.x, y + v.y, z + v.z); } -vector_3 vector_3::operator-(const vector_3 &v) { return vector_3(x - v.x, y - v.y, z - v.z); } - -vector_3 vector_3::operator* (const float &v) { return vector_3(x * v, y * v, z * v); } -vector_3& vector_3::operator*=(const float &v) { x *= v; y *= v; z *= v; return *this; } - vector_3 vector_3::get_normal() const { - vector_3 normalized = vector_3(x, y, z); + vector_3 normalized = *this; normalized.normalize(); return normalized; } -float vector_3::get_length() const { return SQRT(sq(x) + sq(y) + sq(z)); } - void vector_3::normalize() { - const float inv_length = RSQRT(sq(x) + sq(y) + sq(z)); - x *= inv_length; - y *= inv_length; - z *= inv_length; + *this *= RSQRT(sq(x) + sq(y) + sq(z)); } +// Apply a rotation to the matrix void vector_3::apply_rotation(const matrix_3x3 &matrix) { - const float _x = x, _y = y; - x = _x * matrix.matrix[3 * 0 + 0] + _y * matrix.matrix[3 * 1 + 0] + z * matrix.matrix[3 * 2 + 0]; - y = _x * matrix.matrix[3 * 0 + 1] + _y * matrix.matrix[3 * 1 + 1] + z * matrix.matrix[3 * 2 + 1]; - z = _x * matrix.matrix[3 * 0 + 2] + _y * matrix.matrix[3 * 1 + 2] + z * matrix.matrix[3 * 2 + 2]; + const float _x = x, _y = y, _z = z; + *this = matrix.vectors[0] * _x + matrix.vectors[1] * _y + matrix.vectors[2] * _z; } void vector_3::debug(PGM_P const title) { serialprintPGM(title); - SERIAL_ECHOPAIR_F(" x: ", x, 6); - SERIAL_ECHOPAIR_F(" y: ", y, 6); - SERIAL_ECHOLNPAIR_F(" z: ", z, 6); + SERIAL_ECHOPAIR_F(" X", x, 6); + SERIAL_ECHOPAIR_F(" Y", y, 6); + SERIAL_ECHOLNPAIR_F(" Z", z, 6); } -void apply_rotation_xyz(const matrix_3x3 &matrix, float &x, float &y, float &z) { - vector_3 vector = vector_3(x, y, z); - vector.apply_rotation(matrix); - x = vector.x; - y = vector.y; - z = vector.z; +/** + * matrix_3x3 + */ + +void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_z) { + vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(matrix); + _x = vec.x; _y = vec.y; _z = vec.z; } +// Reset to identity. No rotate or translate. +void matrix_3x3::set_to_identity() { + for (uint8_t i = 0; i < 3; i++) + for (uint8_t j = 0; j < 3; j++) + vectors[i][j] = float(i == j); +} + +// Create a matrix from 3 vector_3 inputs matrix_3x3 matrix_3x3::create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2) { //row_0.debug(PSTR("row_0")); //row_1.debug(PSTR("row_1")); //row_2.debug(PSTR("row_2")); matrix_3x3 new_matrix; - new_matrix.matrix[0] = row_0.x; new_matrix.matrix[1] = row_0.y; new_matrix.matrix[2] = row_0.z; - new_matrix.matrix[3] = row_1.x; new_matrix.matrix[4] = row_1.y; new_matrix.matrix[5] = row_1.z; - new_matrix.matrix[6] = row_2.x; new_matrix.matrix[7] = row_2.y; new_matrix.matrix[8] = row_2.z; + new_matrix.vectors[0] = row_0; + new_matrix.vectors[1] = row_1; + new_matrix.vectors[2] = row_2; //new_matrix.debug(PSTR("new_matrix")); return new_matrix; } -void matrix_3x3::set_to_identity() { - matrix[0] = 1; matrix[1] = 0; matrix[2] = 0; - matrix[3] = 0; matrix[4] = 1; matrix[5] = 0; - matrix[6] = 0; matrix[7] = 0; matrix[8] = 1; -} - +// Create a matrix rotated to point towards a target matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { - vector_3 z_row = target.get_normal(), - x_row = vector_3(1, 0, -target.x / target.z).get_normal(), - y_row = vector_3::cross(z_row, x_row).get_normal(); + const vector_3 z_row = target.get_normal(), + x_row = vector_3(1, 0, -target.x / target.z).get_normal(), + y_row = vector_3::cross(z_row, x_row).get_normal(); // x_row.debug(PSTR("x_row")); // y_row.debug(PSTR("y_row")); @@ -134,11 +127,12 @@ matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { return rot; } +// Get a transposed copy of the matrix matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { matrix_3x3 new_matrix; - new_matrix.matrix[0] = original.matrix[0]; new_matrix.matrix[1] = original.matrix[3]; new_matrix.matrix[2] = original.matrix[6]; - new_matrix.matrix[3] = original.matrix[1]; new_matrix.matrix[4] = original.matrix[4]; new_matrix.matrix[5] = original.matrix[7]; - new_matrix.matrix[6] = original.matrix[2]; new_matrix.matrix[7] = original.matrix[5]; new_matrix.matrix[8] = original.matrix[8]; + for (uint8_t i = 0; i < 3; i++) + for (uint8_t j = 0; j < 3; j++) + new_matrix.vectors[i][j] = original.vectors[j][i]; return new_matrix; } @@ -147,13 +141,11 @@ void matrix_3x3::debug(PGM_P const title) { serialprintPGM(title); SERIAL_EOL(); } - uint8_t count = 0; for (uint8_t i = 0; i < 3; i++) { for (uint8_t j = 0; j < 3; j++) { - if (matrix[count] >= 0.0) SERIAL_CHAR('+'); - SERIAL_ECHO_F(matrix[count], 6); + if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); + SERIAL_ECHO_F(vectors[i][j], 6); SERIAL_CHAR(' '); - count++; } SERIAL_EOL(); } diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 6f9153817a..fe95cfa85f 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -40,33 +40,40 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "../core/types.h" + class matrix_3x3; -struct vector_3 { - float x, y, z; +struct vector_3 : xyz_float_t { - vector_3(); - vector_3(float x, float y, float z); + vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } + vector_3(const xy_float_t &in) { set(in.x, in.y); } + vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } + vector_3(const xyze_float_t &in) { set(in.x, in.y, in.z); } + // Factory method static vector_3 cross(const vector_3 &a, const vector_3 &b); - vector_3 operator+(const vector_3 &v); - vector_3 operator-(const vector_3 &v); - - vector_3 operator* (const float &v); - vector_3& operator*=(const float &v); - + // Modifiers void normalize(); + void apply_rotation(const matrix_3x3 &matrix); + + // Accessors float get_length() const; vector_3 get_normal() const; + // Operators + FORCE_INLINE vector_3 operator+(const vector_3 &v) const { vector_3 o = *this; o += v; return o; } + FORCE_INLINE vector_3 operator-(const vector_3 &v) const { vector_3 o = *this; o -= v; return o; } + FORCE_INLINE vector_3 operator*(const float &v) const { vector_3 o = *this; o *= v; return o; } + void debug(PGM_P const title); - void apply_rotation(const matrix_3x3 &matrix); }; struct matrix_3x3 { - float matrix[9]; + abc_float_t vectors[3]; + // Factory methods static matrix_3x3 create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2); static matrix_3x3 create_look_at(const vector_3 &target); static matrix_3x3 transpose(const matrix_3x3 &original); @@ -76,5 +83,7 @@ struct matrix_3x3 { void debug(PGM_P const title); }; - void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, float &x, float &y, float &z); +FORCE_INLINE void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, xyz_pos_t &pos) { + apply_rotation_xyz(rotationMatrix, pos.x, pos.y, pos.z); +} diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 3d723909b0..3d2d78875b 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -52,7 +52,7 @@ #include "temperature.h" #include "../lcd/ultralcd.h" #include "../core/language.h" -#include "../libs/vector_3.h" +#include "../libs/vector_3.h" // for matrix_3x3 #include "../gcode/gcode.h" #include "../Marlin.h" @@ -146,13 +146,13 @@ typedef struct SettingsDataStruct { planner_settings_t planner_settings; - float planner_max_jerk[XYZE], // M205 XYZE planner.max_jerk[XYZE] - planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm + xyze_float_t planner_max_jerk; // M205 XYZE planner.max_jerk + float planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm - float home_offset[XYZ]; // M206 XYZ / M665 TPZ + xyz_pos_t home_offset; // M206 XYZ / M665 TPZ #if HAS_HOTEND_OFFSET - float hotend_offset[XYZ][HOTENDS - 1]; // M218 XYZ + xyz_pos_t hotend_offset[HOTENDS - 1]; // M218 XYZ #endif // @@ -181,7 +181,7 @@ typedef struct SettingsDataStruct { // HAS_BED_PROBE // - float probe_offset[XYZ]; + xyz_pos_t probe_offset; // // ABL_PLANAR @@ -192,10 +192,9 @@ typedef struct SettingsDataStruct { // AUTO_BED_LEVELING_BILINEAR // uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - int bilinear_grid_spacing[2], - bilinear_start[2]; // G29 L F + xy_int_t bilinear_grid_spacing, bilinear_start; // G29 L F #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // G29 + bed_mesh_t z_values; // G29 #else float z_values[3][3]; #endif @@ -220,13 +219,13 @@ typedef struct SettingsDataStruct { // DELTA / [XYZ]_DUAL_ENDSTOPS // #if ENABLED(DELTA) - float delta_height, // M666 H - delta_endstop_adj[ABC], // M666 XYZ - delta_radius, // M665 R + float delta_height; // M666 H + abc_float_t delta_endstop_adj; // M666 XYZ + float delta_radius, // M665 R delta_diagonal_rod, // M665 L delta_segments_per_second, // M665 S - delta_calibration_radius, // M665 B - delta_tower_angle_trim[ABC]; // M665 XYZ + delta_calibration_radius; // M665 B + abc_float_t delta_tower_angle_trim; // M665 XYZ #elif EITHER(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS float x2_endstop_adj, // M666 X y2_endstop_adj, // M666 Y @@ -302,7 +301,7 @@ typedef struct SettingsDataStruct { // // CNC_COORDINATE_SYSTEMS // - float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; // G54-G59.3 + xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; // G54-G59.3 // // SKEW_CORRECTION @@ -326,7 +325,7 @@ typedef struct SettingsDataStruct { // // BACKLASH_COMPENSATION // - float backlash_distance_mm[XYZ]; // M425 X Y Z + xyz_float_t backlash_distance_mm; // M425 X Y Z uint8_t backlash_correction; // M425 F float backlash_smoothing_mm; // M425 S @@ -355,7 +354,7 @@ uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } #endif void MarlinSettings::postprocess() { - const float oldpos[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }; + xyze_pos_t oldpos = current_position; // steps per s2 needs to be updated to agree with units per s2 planner.reset_acceleration_rates(); @@ -399,7 +398,7 @@ void MarlinSettings::postprocess() { fwretract.refresh_autoretract(); #endif - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK planner.recalculate_max_e_jerk(); #endif @@ -408,7 +407,7 @@ void MarlinSettings::postprocess() { planner.refresh_positioning(); // Various factors can change the current position - if (memcmp(oldpos, current_position, sizeof(oldpos))) + if (oldpos != current_position) report_current_position(); } @@ -517,16 +516,16 @@ void MarlinSettings::postprocess() { #if HAS_CLASSIC_JERK EEPROM_WRITE(planner.max_jerk); - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK dummy = float(DEFAULT_EJERK); EEPROM_WRITE(dummy); #endif #else - const float planner_max_jerk[XYZE] = { float(DEFAULT_EJERK) }; + const xyze_pos_t planner_max_jerk = { 10, 10, 0.4, float(DEFAULT_EJERK) }; EEPROM_WRITE(planner_max_jerk); #endif - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) EEPROM_WRITE(planner.junction_deviation_mm); #else dummy = 0.02f; @@ -544,7 +543,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(scara_home_offset); #else #if !HAS_HOME_OFFSET - const float home_offset[XYZ] = { 0 }; + const xyz_pos_t home_offset{0}; #endif EEPROM_WRITE(home_offset); #endif @@ -552,7 +551,7 @@ void MarlinSettings::postprocess() { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 for (uint8_t e = 1; e < HOTENDS; e++) - LOOP_XYZ(i) EEPROM_WRITE(hotend_offset[i][e]); + EEPROM_WRITE(hotend_offset[e]); #endif } @@ -615,10 +614,10 @@ void MarlinSettings::postprocess() { } // - // Probe Z Offset + // Probe XYZ Offsets // { - _FIELD_TEST(probe_offset[Z_AXIS]); + _FIELD_TEST(probe_offset); EEPROM_WRITE(probe_offset); } @@ -653,7 +652,7 @@ void MarlinSettings::postprocess() { #else // For disabled Bilinear Grid write an empty 3x3 grid const uint8_t grid_max_x = 3, grid_max_y = 3; - const int bilinear_start[2] = { 0 }, bilinear_grid_spacing[2] = { 0 }; + const xy_int_t bilinear_start{0}, bilinear_grid_spacing{0}; dummy = 0; EEPROM_WRITE(grid_max_x); EEPROM_WRITE(grid_max_y); @@ -1033,7 +1032,7 @@ void MarlinSettings::postprocess() { // TMC StallGuard threshold // { - tmc_sgt_t tmc_sgt = { 0 }; + tmc_sgt_t tmc_sgt{0}; #if USE_SENSORLESS #if X_SENSORLESS tmc_sgt.X = stepperX.homing_threshold(); @@ -1138,8 +1137,8 @@ void MarlinSettings::postprocess() { #if HAS_MOTOR_CURRENT_PWM EEPROM_WRITE(stepper.motor_current_setting); #else - const uint32_t dummyui32[XYZ] = { 0 }; - EEPROM_WRITE(dummyui32); + const xyz_ulong_t no_current{0}; + EEPROM_WRITE(no_current); #endif } @@ -1152,7 +1151,7 @@ void MarlinSettings::postprocess() { #if ENABLED(CNC_COORDINATE_SYSTEMS) EEPROM_WRITE(gcode.coordinate_system); #else - const float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ] = { { 0 } }; + const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; EEPROM_WRITE(coordinate_system); #endif @@ -1189,10 +1188,10 @@ void MarlinSettings::postprocess() { // { #if ENABLED(BACKLASH_GCODE) - const float (&backlash_distance_mm)[XYZ] = backlash.distance_mm; + const xyz_float_t &backlash_distance_mm = backlash.distance_mm; const uint8_t &backlash_correction = backlash.correction; #else - const float backlash_distance_mm[XYZ] = { 0 }; + const xyz_float_t backlash_distance_mm{0}; const uint8_t backlash_correction = 0; #endif #if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) @@ -1317,14 +1316,14 @@ void MarlinSettings::postprocess() { #if HAS_CLASSIC_JERK EEPROM_READ(planner.max_jerk); - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK EEPROM_READ(dummy); #endif #else for (uint8_t q = 4; q--;) EEPROM_READ(dummy); #endif - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) EEPROM_READ(planner.junction_deviation_mm); #else EEPROM_READ(dummy); @@ -1341,7 +1340,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(scara_home_offset); #else #if !HAS_HOME_OFFSET - float home_offset[XYZ]; + xyz_pos_t home_offset; #endif EEPROM_READ(home_offset); #endif @@ -1354,7 +1353,7 @@ void MarlinSettings::postprocess() { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 for (uint8_t e = 1; e < HOTENDS; e++) - LOOP_XYZ(i) EEPROM_READ(hotend_offset[i][e]); + EEPROM_READ(hotend_offset[e]); #endif } @@ -1418,12 +1417,11 @@ void MarlinSettings::postprocess() { // Probe Z Offset // { - _FIELD_TEST(probe_offset[Z_AXIS]); - + _FIELD_TEST(probe_offset); #if HAS_BED_PROBE - float (&zpo)[XYZ] = probe_offset; + xyz_pos_t &zpo = probe_offset; #else - float zpo[XYZ]; + xyz_pos_t zpo; #endif EEPROM_READ(zpo); } @@ -1457,7 +1455,7 @@ void MarlinSettings::postprocess() { #endif // AUTO_BED_LEVELING_BILINEAR { // Skip past disabled (or stale) Bilinear Grid data - int bgs[2], bs[2]; + xy_int_t bgs, bs; EEPROM_READ(bgs); EEPROM_READ(bs); for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_READ(dummy); @@ -1940,7 +1938,7 @@ void MarlinSettings::postprocess() { if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space EEPROM_READ(gcode.coordinate_system); #else - float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; + xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; EEPROM_READ(coordinate_system); #endif } @@ -1989,7 +1987,7 @@ void MarlinSettings::postprocess() { // { #if ENABLED(BACKLASH_GCODE) - float (&backlash_distance_mm)[XYZ] = backlash.distance_mm; + xyz_float_t &backlash_distance_mm = backlash.distance_mm; uint8_t &backlash_correction = backlash.correction; #else float backlash_distance_mm[XYZ]; @@ -2231,22 +2229,20 @@ void MarlinSettings::reset() { #ifndef DEFAULT_ZJERK #define DEFAULT_ZJERK 0 #endif - planner.max_jerk[X_AXIS] = DEFAULT_XJERK; - planner.max_jerk[Y_AXIS] = DEFAULT_YJERK; - planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK; - #if !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + planner.max_jerk.set(DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK); + #if HAS_CLASSIC_E_JERK + planner.max_jerk.e = DEFAULT_EJERK; #endif #endif - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM); #endif #if HAS_SCARA_OFFSET - ZERO(scara_home_offset); + scara_home_offset.reset(); #elif HAS_HOME_OFFSET - ZERO(home_offset); + home_offset.reset(); #endif #if HAS_HOTEND_OFFSET @@ -2277,17 +2273,16 @@ void MarlinSettings::reset() { toolchange_settings.retract_speed = TOOLCHANGE_FIL_SWAP_RETRACT_SPEED; #endif #if ENABLED(TOOLCHANGE_PARK) - toolchange_settings.change_point = TOOLCHANGE_PARK_XY; + constexpr xyz_pos_t tpxy = TOOLCHANGE_PARK_XY; + toolchange_settings.change_point = tpxy; #endif toolchange_settings.z_raise = TOOLCHANGE_ZRAISE; #endif #if ENABLED(BACKLASH_GCODE) backlash.correction = (BACKLASH_CORRECTION) * 255; - constexpr float tmp[XYZ] = BACKLASH_DISTANCE_MM; - backlash.distance_mm[X_AXIS] = tmp[X_AXIS]; - backlash.distance_mm[Y_AXIS] = tmp[Y_AXIS]; - backlash.distance_mm[Z_AXIS] = tmp[Z_AXIS]; + constexpr xyz_float_t tmp = BACKLASH_DISTANCE_MM; + backlash.distance_mm = tmp; #ifdef BACKLASH_SMOOTHING_MM backlash.smoothing_mm = BACKLASH_SMOOTHING_MM; #endif @@ -2346,14 +2341,14 @@ void MarlinSettings::reset() { // #if ENABLED(DELTA) - const float adj[ABC] = DELTA_ENDSTOP_ADJ, dta[ABC] = DELTA_TOWER_ANGLE_TRIM; + const abc_float_t adj = DELTA_ENDSTOP_ADJ, dta = DELTA_TOWER_ANGLE_TRIM; delta_height = DELTA_HEIGHT; - COPY(delta_endstop_adj, adj); + delta_endstop_adj = adj; delta_radius = DELTA_RADIUS; delta_diagonal_rod = DELTA_DIAGONAL_ROD; delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; delta_calibration_radius = DELTA_CALIBRATION_RADIUS; - COPY(delta_tower_angle_trim, dta); + delta_tower_angle_trim = dta; #elif EITHER(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS @@ -2749,12 +2744,12 @@ void MarlinSettings::reset() { if (!forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM("Advanced: B S T"); - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) SERIAL_ECHOPGM(" J"); #endif #if HAS_CLASSIC_JERK SERIAL_ECHOPGM(" X Y Z"); - #if !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_CLASSIC_E_JERK SERIAL_ECHOPGM(" E"); #endif #endif @@ -2765,15 +2760,15 @@ void MarlinSettings::reset() { " M205 B", LINEAR_UNIT(planner.settings.min_segment_time_us) , " S", LINEAR_UNIT(planner.settings.min_feedrate_mm_s) , " T", LINEAR_UNIT(planner.settings.min_travel_feedrate_mm_s) - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) , " J", LINEAR_UNIT(planner.junction_deviation_mm) #endif #if HAS_CLASSIC_JERK - , " X", LINEAR_UNIT(planner.max_jerk[X_AXIS]) - , " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS]) - , " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS]) - #if !BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - , " E", LINEAR_UNIT(planner.max_jerk[E_AXIS]) + , " X", LINEAR_UNIT(planner.max_jerk.x) + , " Y", LINEAR_UNIT(planner.max_jerk.y) + , " Z", LINEAR_UNIT(planner.max_jerk.z) + #if HAS_CLASSIC_E_JERK + , " E", LINEAR_UNIT(planner.max_jerk.e) #endif #endif ); @@ -2783,10 +2778,10 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR(" M206" #if IS_CARTESIAN - " X", LINEAR_UNIT(home_offset[X_AXIS]), - " Y", LINEAR_UNIT(home_offset[Y_AXIS]), + " X", LINEAR_UNIT(home_offset.x), + " Y", LINEAR_UNIT(home_offset.y), #endif - " Z", LINEAR_UNIT(home_offset[Z_AXIS]) + " Z", LINEAR_UNIT(home_offset.z) ); #endif @@ -2796,9 +2791,9 @@ void MarlinSettings::reset() { for (uint8_t e = 1; e < HOTENDS; e++) { SERIAL_ECHOPAIR( " M218 T", (int)e, - " X", LINEAR_UNIT(hotend_offset[X_AXIS][e]), " Y", LINEAR_UNIT(hotend_offset[Y_AXIS][e]) + " X", LINEAR_UNIT(hotend_offset[e].x), " Y", LINEAR_UNIT(hotend_offset[e].y) ); - SERIAL_ECHOLNPAIR_F(" Z", LINEAR_UNIT(hotend_offset[Z_AXIS][e]), 3); + SERIAL_ECHOLNPAIR_F(" Z", LINEAR_UNIT(hotend_offset[e].z), 3); } #endif @@ -2901,9 +2896,9 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR( " M665 S", delta_segments_per_second - , " P", scara_home_offset[A_AXIS] - , " T", scara_home_offset[B_AXIS] - , " Z", LINEAR_UNIT(scara_home_offset[Z_AXIS]) + , " P", scara_home_offset.a + , " T", scara_home_offset.b + , " Z", LINEAR_UNIT(scara_home_offset.z) ); #elif ENABLED(DELTA) @@ -2911,9 +2906,9 @@ void MarlinSettings::reset() { CONFIG_ECHO_HEADING("Endstop adjustment:"); CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR( - " M666 X", LINEAR_UNIT(delta_endstop_adj[A_AXIS]) - , " Y", LINEAR_UNIT(delta_endstop_adj[B_AXIS]) - , " Z", LINEAR_UNIT(delta_endstop_adj[C_AXIS]) + " M666 X", LINEAR_UNIT(delta_endstop_adj.a) + , " Y", LINEAR_UNIT(delta_endstop_adj.b) + , " Z", LINEAR_UNIT(delta_endstop_adj.c) ); CONFIG_ECHO_HEADING("Delta settings: L R H S B XYZ"); @@ -2924,9 +2919,9 @@ void MarlinSettings::reset() { , " H", LINEAR_UNIT(delta_height) , " S", delta_segments_per_second , " B", LINEAR_UNIT(delta_calibration_radius) - , " X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS]) - , " Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS]) - , " Z", LINEAR_UNIT(delta_tower_angle_trim[C_AXIS]) + , " X", LINEAR_UNIT(delta_tower_angle_trim.a) + , " Y", LINEAR_UNIT(delta_tower_angle_trim.b) + , " Z", LINEAR_UNIT(delta_tower_angle_trim.c) ); #elif EITHER(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS @@ -2969,38 +2964,23 @@ void MarlinSettings::reset() { #if HAS_PID_HEATING CONFIG_ECHO_HEADING("PID settings:"); + #if ENABLED(PIDTEMP) - #if HOTENDS > 1 - if (forReplay) { - HOTEND_LOOP() { - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR( - " M301 E", e - , " P", PID_PARAM(Kp, e) - , " I", unscalePID_i(PID_PARAM(Ki, e)) - , " D", unscalePID_d(PID_PARAM(Kd, e)) - ); - #if ENABLED(PID_EXTRUSION_SCALING) - SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e)); - if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); - #endif - SERIAL_EOL(); - } - } - else - #endif // HOTENDS > 1 - // !forReplay || HOTENDS == 1 - { + HOTEND_LOOP() { CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( - " M301 P", PID_PARAM(Kp, 0) // for compatibility with hosts, only echo values for E0 - , " I", unscalePID_i(PID_PARAM(Ki, 0)) - , " D", unscalePID_d(PID_PARAM(Kd, 0)) - #if ENABLED(PID_EXTRUSION_SCALING) - , " C", PID_PARAM(Kc, 0) - , " L", thermalManager.lpq_len + SERIAL_ECHOPAIR(" M301" + #if HOTENDS > 1 && ENABLED(PID_PARAMS_PER_HOTEND) + " E", e, #endif + " P", PID_PARAM(Kp, e) + , " I", unscalePID_i(PID_PARAM(Ki, e)) + , " D", unscalePID_d(PID_PARAM(Kd, e)) ); + #if ENABLED(PID_EXTRUSION_SCALING) + SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e)); + if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); + #endif + SERIAL_EOL(); } #endif // PIDTEMP @@ -3072,9 +3052,9 @@ void MarlinSettings::reset() { say_units(true); } CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M851 X", LINEAR_UNIT(probe_offset[X_AXIS]), - " Y", LINEAR_UNIT(probe_offset[Y_AXIS]), - " Z", LINEAR_UNIT(probe_offset[Z_AXIS])); + SERIAL_ECHOLNPAIR(" M851 X", LINEAR_UNIT(probe_offset.x), + " Y", LINEAR_UNIT(probe_offset.y), + " Z", LINEAR_UNIT(probe_offset.z)); #endif /** @@ -3251,27 +3231,23 @@ void MarlinSettings::reset() { SERIAL_EOL(); #endif - #define HAS_X2_SENSORLESS (defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2)) - #define HAS_Y2_SENSORLESS (defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2)) - #define HAS_Z2_SENSORLESS (defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2)) - #define HAS_Z3_SENSORLESS (defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3)) - #if HAS_X2_SENSORLESS || HAS_Y2_SENSORLESS || HAS_Z2_SENSORLESS + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS CONFIG_ECHO_START(); say_M914(); SERIAL_ECHOPGM(" I1"); - #if HAS_X2_SENSORLESS + #if X2_SENSORLESS SERIAL_ECHOPAIR(" X", stepperX2.homing_threshold()); #endif - #if HAS_Y2_SENSORLESS + #if Y2_SENSORLESS SERIAL_ECHOPAIR(" Y", stepperY2.homing_threshold()); #endif - #if HAS_Z2_SENSORLESS + #if Z2_SENSORLESS SERIAL_ECHOPAIR(" Z", stepperZ2.homing_threshold()); #endif SERIAL_EOL(); #endif - #if HAS_Z3_SENSORLESS + #if Z3_SENSORLESS CONFIG_ECHO_START(); say_M914(); SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.homing_threshold()); @@ -3421,9 +3397,9 @@ void MarlinSettings::reset() { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR( " M425 F", backlash.get_correction(), - " X", LINEAR_UNIT(backlash.distance_mm[X_AXIS]), - " Y", LINEAR_UNIT(backlash.distance_mm[Y_AXIS]), - " Z", LINEAR_UNIT(backlash.distance_mm[Z_AXIS]) + " X", LINEAR_UNIT(backlash.distance_mm.x), + " Y", LINEAR_UNIT(backlash.distance_mm.y), + " Z", LINEAR_UNIT(backlash.distance_mm.z) #ifdef BACKLASH_SMOOTHING_MM , " S", LINEAR_UNIT(backlash.smoothing_mm) #endif diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/configuration_store.h index 9e95e47525..b8a64c5c68 100644 --- a/Marlin/src/module/configuration_store.h +++ b/Marlin/src/module/configuration_store.h @@ -85,7 +85,7 @@ class MarlinSettings { static void report(const bool forReplay=false); #else FORCE_INLINE - static void report(const bool forReplay=false) { UNUSED(forReplay); } + static void report(const bool=false) {} #endif private: diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index b1b943b944..8ef64b09aa 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -50,17 +50,16 @@ #include "../core/debug_out.h" // Initialized by settings.load() -float delta_height, - delta_endstop_adj[ABC] = { 0 }, - delta_radius, +float delta_height; +abc_float_t delta_endstop_adj{0}; +float delta_radius, delta_diagonal_rod, delta_segments_per_second, - delta_calibration_radius, - delta_tower_angle_trim[ABC]; - -float delta_tower[ABC][2], - delta_diagonal_rod_2_tower[ABC], - delta_clip_start_height = Z_MAX_POS; + delta_calibration_radius; +abc_float_t delta_tower_angle_trim; +xy_float_t delta_tower[ABC]; +abc_float_t delta_diagonal_rod_2_tower; +float delta_clip_start_height = Z_MAX_POS; float delta_safe_distance_from_top(); @@ -69,17 +68,17 @@ float delta_safe_distance_from_top(); * settings have been changed (e.g., by M665). */ void recalc_delta_settings() { - const float trt[ABC] = DELTA_RADIUS_TRIM_TOWER, - drt[ABC] = DELTA_DIAGONAL_ROD_TRIM_TOWER; - delta_tower[A_AXIS][X_AXIS] = cos(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); // front left tower - delta_tower[A_AXIS][Y_AXIS] = sin(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); - delta_tower[B_AXIS][X_AXIS] = cos(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); // front right tower - delta_tower[B_AXIS][Y_AXIS] = sin(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); - delta_tower[C_AXIS][X_AXIS] = cos(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); // back middle tower - delta_tower[C_AXIS][Y_AXIS] = sin(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); - delta_diagonal_rod_2_tower[A_AXIS] = sq(delta_diagonal_rod + drt[A_AXIS]); - delta_diagonal_rod_2_tower[B_AXIS] = sq(delta_diagonal_rod + drt[B_AXIS]); - delta_diagonal_rod_2_tower[C_AXIS] = sq(delta_diagonal_rod + drt[C_AXIS]); + constexpr abc_float_t trt = DELTA_RADIUS_TRIM_TOWER, + drt = DELTA_DIAGONAL_ROD_TRIM_TOWER; + delta_tower[A_AXIS].set(cos(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a), // front left tower + sin(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a)); + delta_tower[B_AXIS].set(cos(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b), // front right tower + sin(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b)); + delta_tower[C_AXIS].set(cos(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c), // back middle tower + sin(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c)); + delta_diagonal_rod_2_tower.set(sq(delta_diagonal_rod + drt.a), + sq(delta_diagonal_rod + drt.b), + sq(delta_diagonal_rod + drt.c)); update_software_endstops(Z_AXIS); set_all_unhomed(); } @@ -101,18 +100,16 @@ void recalc_delta_settings() { */ #define DELTA_DEBUG(VAR) do { \ - SERIAL_ECHOLNPAIR("Cartesian X", VAR[X_AXIS], " Y", VAR[Y_AXIS], " Z", VAR[Z_AXIS]); \ - SERIAL_ECHOLNPAIR("Delta A", delta[A_AXIS], " B", delta[B_AXIS], " C", delta[C_AXIS]); \ + SERIAL_ECHOLNPAIR("Cartesian X", VAR.x, " Y", VAR.y, " Z", VAR.z); \ + SERIAL_ECHOLNPAIR("Delta A", delta.a, " B", delta.b, " C", delta.c); \ }while(0) -void inverse_kinematics(const float (&raw)[XYZ]) { +void inverse_kinematics(const xyz_pos_t &raw) { #if HAS_HOTEND_OFFSET // Delta hotend offsets must be applied in Cartesian space with no "spoofing" - const float pos[XYZ] = { - raw[X_AXIS] - hotend_offset[X_AXIS][active_extruder], - raw[Y_AXIS] - hotend_offset[Y_AXIS][active_extruder], - raw[Z_AXIS] - }; + xyz_pos_t pos = { raw.x - hotend_offset[active_extruder].x, + raw.y - hotend_offset[active_extruder].y, + raw.z }; DELTA_IK(pos); //DELTA_DEBUG(pos); #else @@ -126,12 +123,12 @@ void inverse_kinematics(const float (&raw)[XYZ]) { * effector has the full range of XY motion. */ float delta_safe_distance_from_top() { - float cartesian[XYZ] = { 0, 0, 0 }; + xyz_pos_t cartesian{0}; inverse_kinematics(cartesian); - float centered_extent = delta[A_AXIS]; - cartesian[Y_AXIS] = DELTA_PRINTABLE_RADIUS; + const float centered_extent = delta.a; + cartesian.y = DELTA_PRINTABLE_RADIUS; inverse_kinematics(cartesian); - return ABS(centered_extent - delta[A_AXIS]); + return ABS(centered_extent - delta.a); } /** @@ -161,7 +158,7 @@ float delta_safe_distance_from_top() { */ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) { // Create a vector in old coordinates along x axis of new coordinate - const float p12[3] = { delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z2 - z1 }, + const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, // Get the reciprocal of Magnitude of vector. d2 = sq(p12[0]) + sq(p12[1]) + sq(p12[2]), inv_d = RSQRT(d2), @@ -170,7 +167,7 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) ex[3] = { p12[0] * inv_d, p12[1] * inv_d, p12[2] * inv_d }, // Get the vector from the origin of the new system to the third point. - p13[3] = { delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z3 - z1 }, + p13[3] = { delta_tower[C_AXIS].x - delta_tower[A_AXIS].x, delta_tower[C_AXIS].y - delta_tower[A_AXIS].y, z3 - z1 }, // Use the dot product to find the component of this vector on the X axis. i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2], @@ -198,16 +195,16 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) // We now have the d, i and j values defined in Wikipedia. // Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew - Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + d2) * inv_d * 0.5, - Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + sq(i) + j2) * 0.5 - i * Xnew) * inv_j, - Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew)); + Xnew = (delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.b + d2) * inv_d * 0.5, + Ynew = ((delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.c + sq(i) + j2) * 0.5 - i * Xnew) * inv_j, + Znew = SQRT(delta_diagonal_rod_2_tower.a - HYPOT2(Xnew, Ynew)); // Start from the origin of the old coordinates and add vectors in the // old coords that represent the Xnew, Ynew and Znew to find the point // in the old system. - cartes[X_AXIS] = delta_tower[A_AXIS][X_AXIS] + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew; - cartes[Y_AXIS] = delta_tower[A_AXIS][Y_AXIS] + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew; - cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew; + cartes.set(delta_tower[A_AXIS].x + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew, + delta_tower[A_AXIS].y + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew, + z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew); } /** @@ -217,8 +214,8 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) void home_delta() { if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); // Init the current position of all carriages to 0,0,0 - ZERO(current_position); - ZERO(destination); + current_position.reset(); + destination.reset(); sync_plan_position(); // Disable stealthChop if used. Enable diag1 pin on driver. @@ -231,9 +228,9 @@ void home_delta() { #endif // Move all carriages together linearly until an endstop is hit. - current_position[Z_AXIS] = (delta_height + 10 + current_position.z = (delta_height + 10 #if HAS_BED_PROBE - - probe_offset[Z_AXIS] + - probe_offset.z #endif ); line_to_current_position(homing_feedrate(X_AXIS)); diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 24af5daa3a..f2e602fe14 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -25,17 +25,18 @@ * delta.h - Delta-specific functions */ -extern float delta_height, - delta_endstop_adj[ABC], - delta_radius, +#include "../core/types.h" + +extern float delta_height; +extern abc_float_t delta_endstop_adj; +extern float delta_radius, delta_diagonal_rod, delta_segments_per_second, - delta_calibration_radius, - delta_tower_angle_trim[ABC]; - -extern float delta_tower[ABC][2], - delta_diagonal_rod_2_tower[ABC], - delta_clip_start_height; + delta_calibration_radius; +extern abc_float_t delta_tower_angle_trim; +extern xy_float_t delta_tower[ABC]; +extern abc_float_t delta_diagonal_rod_2_tower; +extern float delta_clip_start_height; /** * Recalculate factors used for delta kinematics whenever @@ -63,24 +64,16 @@ void recalc_delta_settings(); */ // Macro to obtain the Z position of an individual tower -#define DELTA_Z(V,T) V[Z_AXIS] + SQRT( \ +#define DELTA_Z(V,T) V.z + SQRT( \ delta_diagonal_rod_2_tower[T] - HYPOT2( \ - delta_tower[T][X_AXIS] - V[X_AXIS], \ - delta_tower[T][Y_AXIS] - V[Y_AXIS] \ + delta_tower[T].x - V.x, \ + delta_tower[T].y - V.y \ ) \ ) -#define DELTA_IK(V) do { \ - delta[A_AXIS] = DELTA_Z(V, A_AXIS); \ - delta[B_AXIS] = DELTA_Z(V, B_AXIS); \ - delta[C_AXIS] = DELTA_Z(V, C_AXIS); \ -}while(0) +#define DELTA_IK(V) delta.set(DELTA_Z(V, A_AXIS), DELTA_Z(V, B_AXIS), DELTA_Z(V, C_AXIS)) -void inverse_kinematics(const float (&raw)[XYZ]); -FORCE_INLINE void inverse_kinematics(const float (&raw)[XYZE]) { - const float raw_xyz[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; - inverse_kinematics(raw_xyz); -} +void inverse_kinematics(const xyz_pos_t &raw); /** * Calculate the highest Z position where the @@ -115,8 +108,8 @@ float delta_safe_distance_from_top(); */ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3); -FORCE_INLINE void forward_kinematics_DELTA(const float (&point)[ABC]) { - forward_kinematics_DELTA(point[A_AXIS], point[B_AXIS], point[C_AXIS]); +FORCE_INLINE void forward_kinematics_DELTA(const abc_float_t &point) { + forward_kinematics_DELTA(point.a, point.b, point.c); } void home_delta(); diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 6970a051b3..24c357e2b7 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -243,7 +243,7 @@ void Endstops::init() { #endif #endif - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); #elif ENABLED(ENDSTOPPULLDOWN_ZMIN_PROBE) @@ -302,7 +302,7 @@ void Endstops::not_homing() { // If the last move failed to trigger an endstop, call kill void Endstops::validate_homing_move() { if (trigger_state()) hit_on_purpose(); - else kill(PSTR(MSG_ERR_HOMING_FAILED)); + else kill(GET_TEXT(MSG_LCD_HOMING_FAILED)); } #endif @@ -366,14 +366,14 @@ void Endstops::event_handler() { ENDSTOP_HIT_TEST_Y(); ENDSTOP_HIT_TEST_Z(); - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN #define P_AXIS Z_AXIS if (TEST(hit_state, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); #endif SERIAL_EOL(); #if HAS_SPI_LCD - ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), PSTR(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP); + ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP); #endif #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) @@ -443,7 +443,7 @@ void _O2 Endstops::M119() { #if HAS_Z3_MAX ES_REPORT(Z3_MAX); #endif - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN print_es_state(READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING, PSTR(MSG_Z_PROBE)); #endif #if HAS_FILAMENT_SENSOR @@ -537,61 +537,53 @@ void Endstops::update() { /** * Check and update endstops */ - #if HAS_X_MIN + #if HAS_X_MIN && !X_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(X, MIN); #if ENABLED(X_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(X, MIN); #if HAS_X2_MIN UPDATE_ENDSTOP_BIT(X2, MIN); #else COPY_LIVE_STATE(X_MIN, X2_MIN); #endif - #else - UPDATE_ENDSTOP_BIT(X, MIN); #endif #endif - #if HAS_X_MAX + #if HAS_X_MAX && !X_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(X, MAX); #if ENABLED(X_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(X, MAX); #if HAS_X2_MAX UPDATE_ENDSTOP_BIT(X2, MAX); #else COPY_LIVE_STATE(X_MAX, X2_MAX); #endif - #else - UPDATE_ENDSTOP_BIT(X, MAX); #endif #endif - #if HAS_Y_MIN + #if HAS_Y_MIN && !Y_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Y, MIN); #if ENABLED(Y_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Y, MIN); #if HAS_Y2_MIN UPDATE_ENDSTOP_BIT(Y2, MIN); #else COPY_LIVE_STATE(Y_MIN, Y2_MIN); #endif - #else - UPDATE_ENDSTOP_BIT(Y, MIN); #endif #endif - #if HAS_Y_MAX + #if HAS_Y_MAX && !Y_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Y, MAX); #if ENABLED(Y_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Y, MAX); #if HAS_Y2_MAX UPDATE_ENDSTOP_BIT(Y2, MAX); #else COPY_LIVE_STATE(Y_MAX, Y2_MAX); #endif - #else - UPDATE_ENDSTOP_BIT(Y, MAX); #endif #endif - #if HAS_Z_MIN + #if HAS_Z_MIN && !Z_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Z, MIN); #if Z_MULTI_ENDSTOPS - UPDATE_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN UPDATE_ENDSTOP_BIT(Z2, MIN); #else @@ -604,19 +596,15 @@ void Endstops::update() { COPY_LIVE_STATE(Z_MIN, Z3_MIN); #endif #endif - #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - UPDATE_ENDSTOP_BIT(Z, MIN); - #elif Z_HOME_DIR < 0 - UPDATE_ENDSTOP_BIT(Z, MIN); #endif #endif // When closing the gap check the enabled probe - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); #endif - #if HAS_Z_MAX + #if HAS_Z_MAX && !Z_SPI_SENSORLESS // Check both Z dual endstops #if Z_MULTI_ENDSTOPS UPDATE_ENDSTOP_BIT(Z, MAX); @@ -632,7 +620,7 @@ void Endstops::update() { COPY_LIVE_STATE(Z_MAX, Z3_MAX); #endif #endif - #elif !USES_Z_MIN_PROBE_ENDSTOP || Z_MAX_PIN != Z_MIN_PROBE_PIN + #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN // If this pin isn't the bed probe it's the Z endstop UPDATE_ENDSTOP_BIT(Z, MAX); #endif @@ -765,7 +753,7 @@ void Endstops::update() { #else #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); - #elif USES_Z_MIN_PROBE_ENDSTOP + #elif HAS_CUSTOM_PROBE_PIN if (!z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); #else PROCESS_ENDSTOP(Z, MIN); @@ -774,7 +762,7 @@ void Endstops::update() { #endif // When closing the gap check the enabled probe - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN_PROBE); #endif } @@ -784,7 +772,7 @@ void Endstops::update() { PROCESS_TRIPLE_ENDSTOP(Z, Z2, Z3, MAX); #elif ENABLED(Z_DUAL_ENDSTOPS) PROCESS_DUAL_ENDSTOP(Z, Z2, MAX); - #elif !USES_Z_MIN_PROBE_ENDSTOP || Z_MAX_PIN != Z_MIN_PROBE_PIN + #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN // If this pin is not hijacked for the bed probe // then it belongs to the Z endstop PROCESS_ENDSTOP(Z, MAX); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 928bb65ac0..8182f23ae0 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -70,7 +70,7 @@ #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" -#define XYZ_CONSTS(type, array, CONFIG) const PROGMEM type array##_P[XYZ] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG } +#define XYZ_CONSTS(T, NAME, OPT) const PROGMEM XYZval NAME##_P = { X_##OPT, Y_##OPT, Z_##OPT } XYZ_CONSTS(float, base_min_pos, MIN_POS); XYZ_CONSTS(float, base_max_pos, MAX_POS); @@ -99,7 +99,7 @@ bool relative_mode; // = false; * Used by 'line_to_current_position' to do a move after changing it. * Used by 'sync_plan_position' to update 'planner.position'. */ -float current_position[XYZE] = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; +xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; /** * Cartesian Destination @@ -107,7 +107,7 @@ float current_position[XYZE] = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; * and expected by functions like 'prepare_move_to_destination'. * G-codes can set destination using 'get_destination_from_command' */ -float destination[XYZE]; // = { 0 } +xyze_pos_t destination; // {0} // The active extruder (tool). Set with T command. #if EXTRUDERS > 1 @@ -116,16 +116,17 @@ float destination[XYZE]; // = { 0 } // Extruder offsets #if HAS_HOTEND_OFFSET - float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load() + xyz_pos_t hotend_offset[HOTENDS]; // Initialized by settings.load() void reset_hotend_offsets() { constexpr float tmp[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z }; static_assert( - tmp[X_AXIS][0] == 0 && tmp[Y_AXIS][0] == 0 && tmp[Z_AXIS][0] == 0, + !tmp[X_AXIS][0] && !tmp[Y_AXIS][0] && !tmp[Z_AXIS][0], "Offsets for the first hotend must be 0.0." ); - LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp[i][e]; + // Transpose from [XYZ][HOTENDS] to [HOTENDS][XYZ] + HOTEND_LOOP() LOOP_XYZ(a) hotend_offset[e][a] = tmp[a][e]; #if ENABLED(DUAL_X_CARRIAGE) - hotend_offset[X_AXIS][1] = _MAX(X2_HOME_POS, X2_MAX_POS); + hotend_offset[1].x = _MAX(X2_HOME_POS, X2_MAX_POS); #endif } #endif @@ -148,14 +149,14 @@ const feedRate_t homing_feedrate_mm_s[XYZ] PROGMEM = { }; // Cartesian conversion result goes here: -float cartes[XYZ]; +xyz_pos_t cartes; #if IS_KINEMATIC - float delta[ABC]; + abc_pos_t delta; #if HAS_SCARA_OFFSET - float scara_home_offset[ABC]; + abc_pos_t scara_home_offset; #endif #if HAS_SOFTWARE_ENDSTOPS @@ -176,16 +177,16 @@ float cartes[XYZ]; */ #if HAS_POSITION_SHIFT // The distance that XYZ has been offset by G92. Reset by G28. - float position_shift[XYZ] = { 0 }; + xyz_pos_t position_shift{0}; #endif #if HAS_HOME_OFFSET // This offset is added to the configured home position. // Set by M206, M428, or menu item. Saved to EEPROM. - float home_offset[XYZ] = { 0 }; + xyz_pos_t home_offset{0}; #endif #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT // The above two are combined to save on computes - float workspace_offset[XYZ] = { 0 }; + xyz_pos_t workspace_offset{0}; #endif #if HAS_ABL_NOT_UBL @@ -196,10 +197,8 @@ float cartes[XYZ]; * Output the current position to serial */ void report_current_position() { - SERIAL_ECHOPAIR("X:", LOGICAL_X_POSITION(current_position[X_AXIS])); - SERIAL_ECHOPAIR(" Y:", LOGICAL_Y_POSITION(current_position[Y_AXIS])); - SERIAL_ECHOPAIR(" Z:", LOGICAL_Z_POSITION(current_position[Z_AXIS])); - SERIAL_ECHOPAIR(" E:", current_position[E_AXIS]); + const xyz_pos_t lpos = current_position.asLogical(); + SERIAL_ECHOPAIR("X:", lpos.x, " Y:", lpos.y, " Z:", lpos.z, " E:", current_position.e); stepper.report_positions(); @@ -216,10 +215,10 @@ void report_current_position() { */ void sync_plan_position() { if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); - planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + planner.set_position_mm(current_position); } -void sync_plan_position_e() { planner.set_e_position_mm(current_position[E_AXIS]); } +void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } /** * Get the stepper positions in the cartes[] array. @@ -244,10 +243,9 @@ void get_cartesian_from_steppers() { planner.get_axis_position_degrees(B_AXIS) ); #else - cartes[X_AXIS] = planner.get_axis_position_mm(X_AXIS); - cartes[Y_AXIS] = planner.get_axis_position_mm(Y_AXIS); + cartes.set(planner.get_axis_position_mm(X_AXIS), planner.get_axis_position_mm(Y_AXIS)); #endif - cartes[Z_AXIS] = planner.get_axis_position_mm(Z_AXIS); + cartes.z = planner.get_axis_position_mm(Z_AXIS); #endif } @@ -266,16 +264,16 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) { get_cartesian_from_steppers(); #if HAS_POSITION_MODIFIERS - float pos[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], current_position[E_AXIS] }; + xyze_pos_t pos = { cartes.x, cartes.y, cartes.z, current_position.e }; planner.unapply_modifiers(pos #if HAS_LEVELING , true #endif ); - const float (&cartes)[XYZE] = pos; + xyze_pos_t &cartes = pos; #endif if (axis == ALL_AXES) - COPY(current_position, cartes); + current_position = cartes; else current_position[axis] = cartes[axis]; } @@ -300,16 +298,12 @@ void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { // UBL segmented line will do Z-only moves in single segment ubl.line_to_destination_segmented(scaled_fr_mm_s); #else - if ( current_position[X_AXIS] == destination[X_AXIS] - && current_position[Y_AXIS] == destination[Y_AXIS] - && current_position[Z_AXIS] == destination[Z_AXIS] - && current_position[E_AXIS] == destination[E_AXIS] - ) return; + if (current_position == destination) return; planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); #endif - set_current_from_destination(); + current_position = destination; } #endif // IS_KINEMATIC @@ -325,8 +319,10 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ const uint16_t old_pct = feedrate_percentage; feedrate_percentage = 100; - const float old_fac = planner.e_factor[active_extruder]; - planner.e_factor[active_extruder] = 1.0f; + #if EXTRUDERS + const float old_fac = planner.e_factor[active_extruder]; + planner.e_factor[active_extruder] = 1.0f; + #endif #if IS_KINEMATIC if (is_fast) @@ -337,7 +333,9 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ feedrate_mm_s = old_feedrate; feedrate_percentage = old_pct; - planner.e_factor[active_extruder] = old_fac; + #if EXTRUDERS + planner.e_factor[active_extruder] = old_fac; + #endif } /** @@ -346,8 +344,8 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s/*=0.0*/) { if (DEBUGGING(LEVELING)) DEBUG_XYZ(">>> do_blocking_move_to", rx, ry, rz); - const feedRate_t z_feedrate = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS), - xy_feedrate = fr_mm_s ? fr_mm_s : feedRate_t(XY_PROBE_FEEDRATE_MM_S); + const feedRate_t z_feedrate = fr_mm_s ?: homing_feedrate(Z_AXIS), + xy_feedrate = fr_mm_s ?: feedRate_t(XY_PROBE_FEEDRATE_MM_S); #if ENABLED(DELTA) @@ -355,39 +353,36 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f REMEMBER(fr, feedrate_mm_s, xy_feedrate); - set_destination_from_current(); // sync destination at the start + destination = current_position; // sync destination at the start - if (DEBUGGING(LEVELING)) DEBUG_POS("set_destination_from_current", destination); + if (DEBUGGING(LEVELING)) DEBUG_POS("destination = current_position", destination); // when in the danger zone - if (current_position[Z_AXIS] > delta_clip_start_height) { - if (rz > delta_clip_start_height) { // staying in the danger zone - destination[X_AXIS] = rx; // move directly (uninterpolated) - destination[Y_AXIS] = ry; - destination[Z_AXIS] = rz; - prepare_internal_fast_move_to_destination(); // set_current_from_destination() + if (current_position.z > delta_clip_start_height) { + if (rz > delta_clip_start_height) { // staying in the danger zone + destination.set(rx, ry, rz); // move directly (uninterpolated) + prepare_internal_fast_move_to_destination(); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); return; } - destination[Z_AXIS] = delta_clip_start_height; - prepare_internal_fast_move_to_destination(); // set_current_from_destination() + destination.z = delta_clip_start_height; + prepare_internal_fast_move_to_destination(); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); } - if (rz > current_position[Z_AXIS]) { // raising? - destination[Z_AXIS] = rz; - prepare_internal_fast_move_to_destination(z_feedrate); // set_current_from_destination() + if (rz > current_position.z) { // raising? + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); } - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; - prepare_internal_move_to_destination(); // set_current_from_destination() + destination.set(rx, ry); + prepare_internal_move_to_destination(); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); - if (rz < current_position[Z_AXIS]) { // lowering? - destination[Z_AXIS] = rz; - prepare_fast_move_to_destination(z_feedrate); // set_current_from_destination() + if (rz < current_position.z) { // lowering? + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); } @@ -395,39 +390,37 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f if (!position_is_reachable(rx, ry)) return; - set_destination_from_current(); + destination = current_position; // If Z needs to raise, do it before moving XY - if (destination[Z_AXIS] < rz) { - destination[Z_AXIS] = rz; + if (destination.z < rz) { + destination.z = rz; prepare_internal_fast_move_to_destination(z_feedrate); } - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; + destination.set(rx, ry); prepare_internal_fast_move_to_destination(xy_feedrate); // If Z needs to lower, do it after moving XY - if (destination[Z_AXIS] > rz) { - destination[Z_AXIS] = rz; + if (destination.z > rz) { + destination.z = rz; prepare_internal_fast_move_to_destination(z_feedrate); } #else // If Z needs to raise, do it before moving XY - if (current_position[Z_AXIS] < rz) { - current_position[Z_AXIS] = rz; + if (current_position.z < rz) { + current_position.z = rz; line_to_current_position(z_feedrate); } - current_position[X_AXIS] = rx; - current_position[Y_AXIS] = ry; + current_position.set(rx, ry); line_to_current_position(xy_feedrate); // If Z needs to lower, do it after moving XY - if (current_position[Z_AXIS] > rz) { - current_position[Z_AXIS] = rz; + if (current_position.z > rz) { + current_position.z = rz; line_to_current_position(z_feedrate); } @@ -437,17 +430,36 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f planner.synchronize(); } + +void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, current_position.z, fr_mm_s); +} +void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); +} +void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); +} + void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, current_position[Y_AXIS], current_position[Z_AXIS], fr_mm_s); + do_blocking_move_to(rx, current_position.y, current_position.z, fr_mm_s); } void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(current_position[X_AXIS], ry, current_position[Z_AXIS], fr_mm_s); + do_blocking_move_to(current_position.x, ry, current_position.z, fr_mm_s); } void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], rz, fr_mm_s); + do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); } + void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, ry, current_position[Z_AXIS], fr_mm_s); + do_blocking_move_to(rx, ry, current_position.z, fr_mm_s); +} +void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); +} + +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } // @@ -474,7 +486,10 @@ void restore_feedrate_and_scaling() { bool soft_endstops_enabled = true; // Software Endstops are based on the configured limits. - axis_limits_t soft_endstop[XYZ] = { { X_MIN_BED, X_MAX_BED }, { Y_MIN_BED, Y_MAX_BED }, { Z_MIN_POS, Z_MAX_POS } }; + axis_limits_t soft_endstop = { + { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, + { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } + }; /** * Software endstops can be used to monitor the open end of @@ -496,33 +511,33 @@ void restore_feedrate_and_scaling() { if (axis == X_AXIS) { // In Dual X mode hotend_offset[X] is T1's home position - const float dual_max_x = _MAX(hotend_offset[X_AXIS][1], X2_MAX_POS); + const float dual_max_x = _MAX(hotend_offset[1].x, X2_MAX_POS); if (new_tool_index != 0) { // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) - soft_endstop[X_AXIS].min = X2_MIN_POS; - soft_endstop[X_AXIS].max = dual_max_x; + soft_endstop.min.x = X2_MIN_POS; + soft_endstop.max.x = dual_max_x; } else if (dxc_is_duplicating()) { // In Duplication Mode, T0 can move as far left as X1_MIN_POS // but not so far to the right that T1 would move past the end - soft_endstop[X_AXIS].min = X1_MIN_POS; - soft_endstop[X_AXIS].max = _MIN(X1_MAX_POS, dual_max_x - duplicate_extruder_x_offset); + soft_endstop.min.x = X1_MIN_POS; + soft_endstop.max.x = _MIN(X1_MAX_POS, dual_max_x - duplicate_extruder_x_offset); } else { // In other modes, T0 can move from X1_MIN_POS to X1_MAX_POS - soft_endstop[X_AXIS].min = X1_MIN_POS; - soft_endstop[X_AXIS].max = X1_MAX_POS; + soft_endstop.min.x = X1_MIN_POS; + soft_endstop.max.x = X1_MAX_POS; } } #elif ENABLED(DELTA) - soft_endstop[axis].min = base_min_pos(axis); - soft_endstop[axis].max = (axis == Z_AXIS ? delta_height + soft_endstop.min[axis] = base_min_pos(axis); + soft_endstop.max[axis] = (axis == Z_AXIS ? delta_height #if HAS_BED_PROBE - - probe_offset[Z_AXIS] + - probe_offset.z #endif : base_max_pos(axis)); @@ -530,11 +545,11 @@ void restore_feedrate_and_scaling() { case X_AXIS: case Y_AXIS: // Get a minimum radius for clamping - delta_max_radius = _MIN(ABS(_MAX(soft_endstop[X_AXIS].min, soft_endstop[Y_AXIS].min)), soft_endstop[X_AXIS].max, soft_endstop[Y_AXIS].max); + delta_max_radius = _MIN(ABS(_MAX(soft_endstop.min.x, soft_endstop.min.y)), soft_endstop.max.x, soft_endstop.max.y); delta_max_radius_2 = sq(delta_max_radius); break; case Z_AXIS: - delta_clip_start_height = soft_endstop[axis].max - delta_safe_distance_from_top(); + delta_clip_start_height = soft_endstop.max[axis] - delta_safe_distance_from_top(); default: break; } @@ -544,25 +559,25 @@ void restore_feedrate_and_scaling() { // the movement limits must be shifted by the tool offset to // retain the same physical limit when other tools are selected. if (old_tool_index != new_tool_index) { - const float offs = hotend_offset[axis][new_tool_index] - hotend_offset[axis][old_tool_index]; - soft_endstop[axis].min += offs; - soft_endstop[axis].max += offs; + const float offs = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis]; + soft_endstop.min[axis] += offs; + soft_endstop.max[axis] += offs; } else { - const float offs = hotend_offset[axis][active_extruder]; - soft_endstop[axis].min = base_min_pos(axis) + offs; - soft_endstop[axis].max = base_max_pos(axis) + offs; + const float offs = hotend_offset[active_extruder][axis]; + soft_endstop.min[axis] = base_min_pos(axis) + offs; + soft_endstop.max[axis] = base_max_pos(axis) + offs; } #else - soft_endstop[axis].min = base_min_pos(axis); - soft_endstop[axis].max = base_max_pos(axis); + soft_endstop.min[axis] = base_min_pos(axis); + soft_endstop.max[axis] = base_max_pos(axis); #endif if (DEBUGGING(LEVELING)) - SERIAL_ECHOLNPAIR("Axis ", axis_codes[axis], " min:", soft_endstop[axis].min, " max:", soft_endstop[axis].max); + SERIAL_ECHOLNPAIR("Axis ", axis_codes[axis], " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); } /** @@ -571,49 +586,46 @@ void restore_feedrate_and_scaling() { * For DELTA/SCARA the XY constraint is based on the smallest * radius within the set software endstops. */ - void apply_motion_limits(float target[XYZ]) { + void apply_motion_limits(xyz_pos_t &target) { - if (!soft_endstops_enabled) return; + if (!soft_endstops_enabled || !all_axes_homed()) return; #if IS_KINEMATIC #if HAS_HOTEND_OFFSET && ENABLED(DELTA) // The effector center position will be the target minus the hotend offset. - const float offx = hotend_offset[X_AXIS][active_extruder], offy = hotend_offset[Y_AXIS][active_extruder]; + const xy_pos_t offs = hotend_offset[active_extruder]; #else // SCARA needs to consider the angle of the arm through the entire move, so for now use no tool offset. - constexpr float offx = 0, offy = 0; + constexpr xy_pos_t offs{0}; #endif - const float dist_2 = HYPOT2(target[X_AXIS] - offx, target[Y_AXIS] - offy); - if (dist_2 > delta_max_radius_2) { - const float ratio = (delta_max_radius) / SQRT(dist_2); // 200 / 300 = 0.66 - target[X_AXIS] *= ratio; - target[Y_AXIS] *= ratio; - } + const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); + if (dist_2 > delta_max_radius_2) + target *= delta_max_radius / SQRT(dist_2); // 200 / 300 = 0.66 #else #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) - NOLESS(target[X_AXIS], soft_endstop[X_AXIS].min); + NOLESS(target.x, soft_endstop.min.x); #endif #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) - NOMORE(target[X_AXIS], soft_endstop[X_AXIS].max); + NOMORE(target.x, soft_endstop.max.x); #endif #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) - NOLESS(target[Y_AXIS], soft_endstop[Y_AXIS].min); + NOLESS(target.y, soft_endstop.min.y); #endif #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y) - NOMORE(target[Y_AXIS], soft_endstop[Y_AXIS].max); + NOMORE(target.y, soft_endstop.max.y); #endif #endif #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) - NOLESS(target[Z_AXIS], soft_endstop[Z_AXIS].min); + NOLESS(target.z, soft_endstop.min.z); #endif #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z) - NOMORE(target[Z_AXIS], soft_endstop[Z_AXIS].max); + NOMORE(target.z, soft_endstop.max.z); #endif } @@ -656,27 +668,22 @@ void restore_feedrate_and_scaling() { // Get the top feedrate of the move in the XY plane const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); - const float xdiff = destination[X_AXIS] - current_position[X_AXIS], - ydiff = destination[Y_AXIS] - current_position[Y_AXIS]; + const xyze_float_t diff = destination - current_position; // If the move is only in Z/E don't split up the move - if (!xdiff && !ydiff) { + if (!diff.x && !diff.y) { planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); return false; // caller will update current_position } // Fail if attempting move outside printable radius - if (!position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) return true; - - // Remaining cartesian distances - const float zdiff = destination[Z_AXIS] - current_position[Z_AXIS], - ediff = destination[E_AXIS] - current_position[E_AXIS]; + if (!position_is_reachable(destination)) return true; // Get the linear distance in XYZ - float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); + float cartesian_mm = diff.magnitude(); // If the move is very short, check the E move distance - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); // No E move either? Game over. if (UNEAR_ZERO(cartesian_mm)) return true; @@ -698,13 +705,8 @@ void restore_feedrate_and_scaling() { // The approximate length of each segment const float inv_segments = 1.0f / float(segments), - segment_distance[XYZE] = { - xdiff * inv_segments, - ydiff * inv_segments, - zdiff * inv_segments, - ediff * inv_segments - }, cartesian_segment_mm = cartesian_mm * inv_segments; + const xyze_float_t segment_distance = diff * inv_segments; #if ENABLED(SCARA_FEEDRATE_SCALING) const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; @@ -719,8 +721,7 @@ void restore_feedrate_and_scaling() { //*/ // Get the current position as starting point - float raw[XYZE]; - COPY(raw, current_position); + xyze_pos_t raw = current_position; // Calculate and execute the segments while (--segments) { @@ -732,7 +733,7 @@ void restore_feedrate_and_scaling() { idle(); } - LOOP_XYZE(i) raw[i] += segment_distance[i]; + raw += segment_distance; if (!planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, cartesian_segment_mm #if ENABLED(SCARA_FEEDRATE_SCALING) @@ -765,24 +766,19 @@ void restore_feedrate_and_scaling() { */ inline void segmented_line_to_destination(const feedRate_t &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { - const float xdiff = destination[X_AXIS] - current_position[X_AXIS], - ydiff = destination[Y_AXIS] - current_position[Y_AXIS]; + const xyze_float_t diff = destination - current_position; // If the move is only in Z/E don't split up the move - if (!xdiff && !ydiff) { + if (!diff.x && !diff.y) { planner.buffer_line(destination, fr_mm_s, active_extruder); return; } - // Remaining cartesian distances - const float zdiff = destination[Z_AXIS] - current_position[Z_AXIS], - ediff = destination[E_AXIS] - current_position[E_AXIS]; - // Get the linear distance in XYZ // If the move is very short, check the E move distance // No E move either? Game over. - float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); + float cartesian_mm = diff.magnitude(); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); if (UNEAR_ZERO(cartesian_mm)) return; // The length divided by the segment size @@ -792,13 +788,8 @@ void restore_feedrate_and_scaling() { // The approximate length of each segment const float inv_segments = 1.0f / float(segments), - cartesian_segment_mm = cartesian_mm * inv_segments, - segment_distance[XYZE] = { - xdiff * inv_segments, - ydiff * inv_segments, - zdiff * inv_segments, - ediff * inv_segments - }; + cartesian_segment_mm = cartesian_mm * inv_segments; + const xyze_float_t segment_distance = diff * inv_segments; #if ENABLED(SCARA_FEEDRATE_SCALING) const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; @@ -809,8 +800,7 @@ void restore_feedrate_and_scaling() { // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); // Get the raw current position as starting point - float raw[XYZE]; - COPY(raw, current_position); + xyze_pos_t raw = current_position; // Calculate and execute the segments while (--segments) { @@ -820,7 +810,7 @@ void restore_feedrate_and_scaling() { next_idle_ms = millis() + 200UL; idle(); } - LOOP_XYZE(i) raw[i] += segment_distance[i]; + raw += segment_distance; if (!planner.buffer_line(raw, fr_mm_s, active_extruder, cartesian_segment_mm #if ENABLED(SCARA_FEEDRATE_SCALING) , inv_duration @@ -846,12 +836,12 @@ void restore_feedrate_and_scaling() { * When a mesh-based leveling system is active, moves are segmented * according to the configuration of the leveling system. * - * Returns true if current_position[] was set to destination[] + * Return true if 'current_position' was set to 'destination' */ inline bool prepare_move_to_destination_cartesian() { const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); #if HAS_MESH - if (planner.leveling_active && planner.leveling_active_at_z(destination[Z_AXIS])) { + if (planner.leveling_active && planner.leveling_active_at_z(destination.z)) { #if ENABLED(AUTO_BED_LEVELING_UBL) ubl.line_to_destination_cartesian(scaled_fr_mm_s, active_extruder); // UBL's motion routine needs to know about return true; // all moves, including Z-only moves. @@ -863,7 +853,7 @@ void restore_feedrate_and_scaling() { * For MBL and ABL-BILINEAR only segment moves when X or Y are involved. * Otherwise fall through to do a direct single move. */ - if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) { + if (xy_pos_t(current_position) != xy_pos_t(destination)) { #if ENABLED(MESH_BED_LEVELING) mbl.line_to_destination(scaled_fr_mm_s); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -894,8 +884,8 @@ void restore_feedrate_and_scaling() { DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; float inactive_extruder_x_pos = X2_MAX_POS, // used in mode 0 & 1 - raised_parked_position[XYZE], // used in mode 1 duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 + xyz_pos_t raised_parked_position; // used in mode 1 bool active_extruder_parked = false; // used in mode 1 & 2 millis_t delayed_move_time = 0; // used in mode 1 int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 @@ -910,7 +900,7 @@ void restore_feedrate_and_scaling() { * This allows soft recalibration of the second extruder home position * without firmware reflash (through the M218 command). */ - return hotend_offset[X_AXIS][1] > 0 ? hotend_offset[X_AXIS][1] : X2_HOME_POS; + return hotend_offset[1].x > 0 ? hotend_offset[1].x : X2_HOME_POS; } /** @@ -924,30 +914,30 @@ void restore_feedrate_and_scaling() { case DXC_FULL_CONTROL_MODE: break; case DXC_AUTO_PARK_MODE: - if (current_position[E_AXIS] == destination[E_AXIS]) { + if (current_position.e == destination.e) { // This is a travel move (with no extrusion) // Skip it, but keep track of the current position // (so it can be used as the start of the next non-travel move) if (delayed_move_time != 0xFFFFFFFFUL) { - set_current_from_destination(); - NOLESS(raised_parked_position[Z_AXIS], destination[Z_AXIS]); + current_position = destination; + NOLESS(raised_parked_position.z, destination.z); delayed_move_time = millis(); return true; } } // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower - #define CUR_X current_position[X_AXIS] - #define CUR_Y current_position[Y_AXIS] - #define CUR_Z current_position[Z_AXIS] - #define CUR_E current_position[E_AXIS] - #define RAISED_X raised_parked_position[X_AXIS] - #define RAISED_Y raised_parked_position[Y_AXIS] - #define RAISED_Z raised_parked_position[Z_AXIS] + #define CUR_X current_position.x + #define CUR_Y current_position.y + #define CUR_Z current_position.z + #define CUR_E current_position.e + #define RAISED_X raised_parked_position.x + #define RAISED_Y raised_parked_position.y + #define RAISED_Z raised_parked_position.z if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder)) if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder)) - planner.buffer_line( CUR_X, CUR_Y, CUR_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder); + line_to_current_position(planner.settings.max_feedrate_mm_s[Z_AXIS]); delayed_move_time = 0; active_extruder_parked = false; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Clear active_extruder_parked"); @@ -955,16 +945,15 @@ void restore_feedrate_and_scaling() { case DXC_MIRRORED_MODE: case DXC_DUPLICATION_MODE: if (active_extruder == 0) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x_pos, " ... Line to X", current_position[X_AXIS] + duplicate_extruder_x_offset); + xyze_pos_t new_pos = current_position; + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) + new_pos.x += duplicate_extruder_x_offset; + else + new_pos.x = inactive_extruder_x_pos; // move duplicate extruder into correct duplication position. - planner.set_position_mm(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - - if (!planner.buffer_line( - dual_x_carriage_mode == DXC_DUPLICATION_MODE ? duplicate_extruder_x_offset + current_position[X_AXIS] : inactive_extruder_x_pos, - current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], - planner.settings.max_feedrate_mm_s[X_AXIS], 1 - ) - ) break; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x_pos, " ... Line to X", new_pos.x); + planner.set_position_mm(inactive_extruder_x_pos, current_position.y, current_position.z, current_position.e); + if (!planner.buffer_line(new_pos, planner.settings.max_feedrate_mm_s[X_AXIS], 1)) break; planner.synchronize(); sync_plan_position(); extruder_duplication_enabled = true; @@ -987,7 +976,7 @@ void restore_feedrate_and_scaling() { * This may result in several calls to planner.buffer_line to * do smaller moves for DELTA, SCARA, mesh moves, etc. * - * Make sure current_position[E] and destination[E] are good + * Make sure current_position.e and destination.e are good * before calling or cold/lengthy extrusion may get missed. * * Before exit, current_position is set to destination. @@ -998,15 +987,15 @@ void prepare_move_to_destination() { #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) if (!DEBUGGING(DRYRUN)) { - if (destination[E_AXIS] != current_position[E_AXIS]) { + if (destination.e != current_position.e) { #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.tooColdToExtrude(active_extruder)) { - current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + current_position.e = destination.e; // Behave as if the move really took place, but ignore E part SERIAL_ECHO_MSG(MSG_ERR_COLD_EXTRUDE_STOP); } #endif // PREVENT_COLD_EXTRUSION #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - const float e_delta = ABS(destination[E_AXIS] - current_position[E_AXIS]) * planner.e_factor[active_extruder]; + const float e_delta = ABS(destination.e - current_position.e) * planner.e_factor[active_extruder]; if (e_delta > (EXTRUDE_MAXLENGTH)) { #if ENABLED(MIXING_EXTRUDER) bool ignore_e = false; @@ -1018,7 +1007,7 @@ void prepare_move_to_destination() { constexpr bool ignore_e = true; #endif if (ignore_e) { - current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + current_position.e = destination.e; // Behave as if the move really took place, but ignore E part SERIAL_ECHO_MSG(MSG_ERR_LONG_EXTRUDE_STOP); } } @@ -1046,7 +1035,7 @@ void prepare_move_to_destination() { #endif ) return; - set_current_from_destination(); + current_position = destination; } uint8_t axes_need_homing(uint8_t axis_bits/*=0x07*/) { @@ -1064,8 +1053,8 @@ uint8_t axes_need_homing(uint8_t axis_bits/*=0x07*/) { bool axis_unhomed_error(uint8_t axis_bits/*=0x07*/) { if ((axis_bits = axes_need_homing(axis_bits))) { - static const char home_first[] PROGMEM = MSG_HOME_FIRST; - char msg[sizeof(home_first)]; + PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); + char msg[strlen_P(home_first)+1]; sprintf_P(msg, home_first, TEST(axis_bits, X_AXIS) ? "X" : "", TEST(axis_bits, Y_AXIS) ? "Y" : "", @@ -1285,7 +1274,7 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t #endif } - const feedRate_t real_fr_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate(axis); + const feedRate_t real_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); #if IS_SCARA // Tell the planner the axis is at 0 current_position[axis] = 0; @@ -1293,18 +1282,18 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t current_position[axis] = distance; line_to_current_position(real_fr_mm_s); #else - float target[ABCE] = { planner.get_axis_position_mm(A_AXIS), planner.get_axis_position_mm(B_AXIS), planner.get_axis_position_mm(C_AXIS), planner.get_axis_position_mm(E_AXIS) }; + abce_pos_t target = { planner.get_axis_position_mm(A_AXIS), planner.get_axis_position_mm(B_AXIS), planner.get_axis_position_mm(C_AXIS), planner.get_axis_position_mm(E_AXIS) }; target[axis] = 0; planner.set_machine_position_mm(target); target[axis] = distance; - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - const float delta_mm_cart[XYZE] = {0, 0, 0, 0}; + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + const xyze_float_t delta_mm_cart{0}; #endif // Set delta/cartesian axes directly planner.buffer_segment(target - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) , delta_mm_cart #endif , real_fr_mm_s, active_extruder @@ -1356,7 +1345,7 @@ void set_axis_is_at_home(const AxisEnum axis) { #if ENABLED(DUAL_X_CARRIAGE) if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { - current_position[X_AXIS] = x_home_pos(active_extruder); + current_position.x = x_home_pos(active_extruder); return; } #endif @@ -1366,7 +1355,7 @@ void set_axis_is_at_home(const AxisEnum axis) { #elif ENABLED(DELTA) current_position[axis] = (axis == Z_AXIS ? delta_height #if HAS_BED_PROBE - - probe_offset[Z_AXIS] + - probe_offset.z #endif : base_home_pos(axis)); #else @@ -1380,9 +1369,9 @@ void set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) { #if HOMING_Z_WITH_PROBE - current_position[Z_AXIS] -= probe_offset[Z_AXIS]; + current_position.z -= probe_offset.z; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***\n> probe_offset[Z_AXIS] = ", probe_offset[Z_AXIS]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***\n> probe_offset.z = ", probe_offset.z); #else @@ -1677,7 +1666,7 @@ void homeaxis(const AxisEnum axis) { #endif #ifdef HOMING_BACKOFF_MM - constexpr float endstop_backoff[XYZ] = HOMING_BACKOFF_MM; + constexpr xyz_float_t endstop_backoff = HOMING_BACKOFF_MM; const float backoff_mm = endstop_backoff[ #if ENABLED(DELTA) Z_AXIS diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 9c465a1d59..8b9775ce98 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -61,15 +61,15 @@ constexpr float slop = 0.0001; extern bool relative_mode; -extern float current_position[XYZE], // High-level current tool position - destination[XYZE]; // Destination for a move +extern xyze_pos_t current_position, // High-level current tool position + destination; // Destination for a move // Scratch space for a cartesian result -extern float cartes[XYZ]; +extern xyz_pos_t cartes; // Until kinematics.cpp is created, declare this here #if IS_KINEMATIC - extern float delta[ABC]; + extern abc_pos_t delta; #endif #if HAS_ABL_NOT_UBL @@ -81,6 +81,10 @@ extern float cartes[XYZ]; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif +#if ENABLED(Z_SAFE_HOMING) + constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; +#endif + /** * Feed rates are often configured with mm/m * but the planner and stepper like mm/s units. @@ -106,10 +110,9 @@ extern int16_t feedrate_percentage; FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float(p); } FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte(p); } -#define XYZ_DEFS(type, array, CONFIG) \ - extern const type array##_P[XYZ]; \ - FORCE_INLINE type array(AxisEnum axis) { return pgm_read_any(&array##_P[axis]); } \ - typedef void __void_##CONFIG##__ +#define XYZ_DEFS(T, NAME, OPT) \ + extern const XYZval NAME##_P; \ + FORCE_INLINE T NAME(AxisEnum axis) { return pgm_read_any(&NAME##_P[axis]); } XYZ_DEFS(float, base_min_pos, MIN_POS); XYZ_DEFS(float, base_max_pos, MAX_POS); @@ -125,19 +128,19 @@ XYZ_DEFS(signed char, home_dir, HOME_DIR); #endif #if HAS_HOTEND_OFFSET - extern float hotend_offset[XYZ][HOTENDS]; + extern xyz_pos_t hotend_offset[HOTENDS]; void reset_hotend_offsets(); -#elif HOTENDS > 0 - constexpr float hotend_offset[XYZ][HOTENDS] = { { 0 }, { 0 }, { 0 } }; +#elif HOTENDS + constexpr xyz_pos_t hotend_offset[HOTENDS] = { { 0 } }; #else - constexpr float hotend_offset[XYZ][1] = { { 0 }, { 0 }, { 0 } }; + constexpr xyz_pos_t hotend_offset[1] = { { 0 } }; #endif -typedef struct { float min, max; } axis_limits_t; +typedef struct { xyz_pos_t min, max; } axis_limits_t; #if HAS_SOFTWARE_ENDSTOPS extern bool soft_endstops_enabled; - extern axis_limits_t soft_endstop[XYZ]; - void apply_motion_limits(float target[XYZ]); + extern axis_limits_t soft_endstop; + void apply_motion_limits(xyz_pos_t &target); void update_software_endstops(const AxisEnum axis #if HAS_HOTEND_OFFSET , const uint8_t old_tool_index=0, const uint8_t new_tool_index=0 @@ -145,16 +148,15 @@ typedef struct { float min, max; } axis_limits_t; ); #else constexpr bool soft_endstops_enabled = false; - //constexpr axis_limits_t soft_endstop[XYZ] = { { X_MIN_POS, X_MAX_POS }, { Y_MIN_POS, Y_MAX_POS }, { Z_MIN_POS, Z_MAX_POS } }; + //constexpr axis_limits_t soft_endstop = { + // { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, + // { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } }; #define apply_motion_limits(V) NOOP #define update_software_endstops(...) NOOP #endif void report_current_position(); -inline void set_current_from_destination() { COPY(current_position, destination); } -inline void set_destination_from_current() { COPY(destination, current_position); } - void get_cartesian_from_steppers(); void set_current_from_steppers_for_axis(const AxisEnum axis); @@ -197,18 +199,22 @@ inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) * Blocking movement and shorthand functions */ void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); + void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s=0.0f); void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s=0.0f); void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s=0.0f); + void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -FORCE_INLINE void do_blocking_move_to(const float (&raw)[XYZ], const feedRate_t &fr_mm_s=0) { - do_blocking_move_to(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], fr_mm_s); -} - -FORCE_INLINE void do_blocking_move_to(const float (&raw)[XYZE], const feedRate_t &fr_mm_s=0) { - do_blocking_move_to(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], fr_mm_s); -} +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); @@ -238,24 +244,36 @@ void homeaxis(const AxisEnum axis); */ #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT #if HAS_HOME_OFFSET - extern float home_offset[XYZ]; + extern xyz_pos_t home_offset; #endif #if HAS_POSITION_SHIFT - extern float position_shift[XYZ]; + extern xyz_pos_t position_shift; #endif #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - extern float workspace_offset[XYZ]; - #define WORKSPACE_OFFSET(AXIS) workspace_offset[AXIS] + extern xyz_pos_t workspace_offset; + #define _WS workspace_offset #elif HAS_HOME_OFFSET - #define WORKSPACE_OFFSET(AXIS) home_offset[AXIS] + #define _WS home_offset #else - #define WORKSPACE_OFFSET(AXIS) position_shift[AXIS] + #define _WS position_shift #endif - #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + WORKSPACE_OFFSET(AXIS)) - #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - WORKSPACE_OFFSET(AXIS)) + #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + _WS[AXIS]) + #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - _WS[AXIS]) + FORCE_INLINE void toLogical(xy_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toLogical(xyz_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toLogical(xyze_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toNative(xy_pos_t &raw) { raw -= _WS; } + FORCE_INLINE void toNative(xyz_pos_t &raw) { raw -= _WS; } + FORCE_INLINE void toNative(xyze_pos_t &raw) { raw -= _WS; } #else #define NATIVE_TO_LOGICAL(POS, AXIS) (POS) #define LOGICAL_TO_NATIVE(POS, AXIS) (POS) + FORCE_INLINE void toLogical(xy_pos_t&) {} + FORCE_INLINE void toLogical(xyz_pos_t&) {} + FORCE_INLINE void toLogical(xyze_pos_t&) {} + FORCE_INLINE void toNative(xy_pos_t&) {} + FORCE_INLINE void toNative(xyz_pos_t&) {} + FORCE_INLINE void toNative(xyze_pos_t&) {} #endif #define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) #define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) @@ -270,7 +288,7 @@ void homeaxis(const AxisEnum axis); #if IS_KINEMATIC // (DELTA or SCARA) #if HAS_SCARA_OFFSET - extern float scara_home_offset[ABC]; // A and B angular offsets, Z mm offset + extern abc_pos_t scara_home_offset; // A and B angular offsets, Z mm offset #endif // Return true if the given point is within the printable area @@ -288,11 +306,15 @@ void homeaxis(const AxisEnum axis); #endif } + inline bool position_is_reachable(const xy_pos_t &pos, const float inset=0) { + return position_is_reachable(pos.x, pos.y, inset); + } + #if HAS_BED_PROBE // Return true if the both nozzle and the probe can reach the given point. // Note: This won't work on SCARA since the probe offset rotates with the arm. inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { - return position_is_reachable(rx - probe_offset[X_AXIS], ry - probe_offset[Y_AXIS]) + return position_is_reachable(rx - probe_offset.x, ry - probe_offset.y) && position_is_reachable(rx, ry, ABS(MIN_PROBE_EDGE)); } #endif @@ -311,6 +333,7 @@ void homeaxis(const AxisEnum axis); return WITHIN(rx, X_MIN_POS - slop, X_MAX_POS + slop); #endif } + inline bool position_is_reachable(const xy_pos_t &pos) { return position_is_reachable(pos.x, pos.y); } #if HAS_BED_PROBE /** @@ -321,7 +344,7 @@ void homeaxis(const AxisEnum axis); * nozzle must be be able to reach +10,-10. */ inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { - return position_is_reachable(rx - probe_offset[X_AXIS], ry - probe_offset[Y_AXIS]) + return position_is_reachable(rx - probe_offset.x, ry - probe_offset.y) && WITHIN(rx, probe_min_x() - slop, probe_max_x() + slop) && WITHIN(ry, probe_min_y() - slop, probe_max_y() + slop); } @@ -332,6 +355,8 @@ void homeaxis(const AxisEnum axis); #if !HAS_BED_PROBE FORCE_INLINE bool position_is_reachable_by_probe(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } #endif +FORCE_INLINE bool position_is_reachable_by_probe(const xy_int_t &pos) { return position_is_reachable_by_probe(pos.x, pos.y); } +FORCE_INLINE bool position_is_reachable_by_probe(const xy_pos_t &pos) { return position_is_reachable_by_probe(pos.x, pos.y); } /** * Duplication mode @@ -358,8 +383,8 @@ void homeaxis(const AxisEnum axis); extern DualXMode dual_x_carriage_mode; extern float inactive_extruder_x_pos, // Used in mode 0 & 1 - raised_parked_position[XYZE], // Used in mode 1 duplicate_extruder_x_offset; // Used in mode 2 & 3 + extern xyz_pos_t raised_parked_position; // Used in mode 1 extern bool active_extruder_parked; // Used in mode 1, 2 & 3 extern millis_t delayed_move_time; // Used in mode 1 extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 2715221f32..3037ae97fc 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -100,6 +100,10 @@ #include "../feature/power_loss_recovery.h" #endif +#if HAS_CUTTER + #include "../feature/spindle_laser.h" +#endif + // Delay for delivery of first block to the stepper ISR, if the queue contains 2 or // fewer movements. The delay is measured in milliseconds, and must be less than 250ms #define BLOCK_DELAY_FOR_1ST_MOVE 100 @@ -125,7 +129,7 @@ uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step -#if ENABLED(JUNCTION_DEVIATION) +#if DISABLED(CLASSIC_JERK) float Planner::junction_deviation_mm; // (mm) M205 J #if ENABLED(LIN_ADVANCE) #if ENABLED(DISTINCT_E_FACTORS) @@ -136,10 +140,10 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step #endif #endif #if HAS_CLASSIC_JERK - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - float Planner::max_jerk[XYZ]; // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. + #if HAS_LINEAR_E_JERK + xyz_pos_t Planner::max_jerk; // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. #else - float Planner::max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. + xyze_pos_t Planner::max_jerk; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. #endif #endif @@ -187,12 +191,12 @@ skew_factor_t Planner::skew_factor; // Initialized by settings.load() // private: -int32_t Planner::position[NUM_AXIS] = { 0 }; +xyze_long_t Planner::position{0}; uint32_t Planner::cutoff_long; -float Planner::previous_speed[NUM_AXIS], - Planner::previous_nominal_speed_sqr; +xyze_float_t Planner::previous_speed; +float Planner::previous_nominal_speed_sqr; #if ENABLED(DISABLE_INACTIVE_EXTRUDER) uint8_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; @@ -202,7 +206,7 @@ float Planner::previous_speed[NUM_AXIS], // Old direction bits. Used for speed calculations unsigned char Planner::old_direction_bits = 0; // Segment times (in µs). Used for speed calculations - uint32_t Planner::axis_segment_time_us[2][3] = { { MAX_FREQ_TIME_US + 1, 0, 0 }, { MAX_FREQ_TIME_US + 1, 0, 0 } }; + xy_ulong_t Planner::axis_segment_time_us[3] = { { MAX_FREQ_TIME_US + 1, MAX_FREQ_TIME_US + 1 } }; #endif #if ENABLED(LIN_ADVANCE) @@ -210,11 +214,11 @@ float Planner::previous_speed[NUM_AXIS], #endif #if HAS_POSITION_FLOAT - float Planner::position_float[XYZE]; // Needed for accurate maths. Steps cannot be used! + xyze_pos_t Planner::position_float; // Needed for accurate maths. Steps cannot be used! #endif #if IS_KINEMATIC - float Planner::position_cart[XYZE]; + xyze_pos_t Planner::position_cart; #endif #if HAS_SPI_LCD @@ -228,14 +232,14 @@ float Planner::previous_speed[NUM_AXIS], Planner::Planner() { init(); } void Planner::init() { - ZERO(position); + position.reset(); #if HAS_POSITION_FLOAT - ZERO(position_float); + position_float.reset(); #endif #if IS_KINEMATIC - ZERO(position_cart); + position_cart.reset(); #endif - ZERO(previous_speed); + previous_speed.reset(); previous_nominal_speed_sqr = 0; #if ABL_PLANAR bed_level_matrix.set_to_identity(); @@ -1155,8 +1159,8 @@ void Planner::recalculate() { float high = 0.0; for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t* block = &block_buffer[b]; - if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) { - const float se = (float)block->steps[E_AXIS] / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; + if (block->steps.x || block->steps.y || block->steps.z) { + const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; NOLESS(high, se); } } @@ -1176,7 +1180,7 @@ void Planner::recalculate() { void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - uint8_t axis_active[NUM_AXIS] = { 0 }; + xyze_bool_t axis_active = { false }; #endif #if FAN_COUNT > 0 @@ -1220,6 +1224,11 @@ void Planner::check_axes_activity() { #endif } else { + + #if HAS_CUTTER + cutter.refresh(); + #endif + #if FAN_COUNT > 0 FANS_LOOP(i) tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); @@ -1235,19 +1244,25 @@ void Planner::check_axes_activity() { #endif } + // + // Disable inactive axes + // #if ENABLED(DISABLE_X) - if (!axis_active[X_AXIS]) disable_X(); + if (!axis_active.x) disable_X(); #endif #if ENABLED(DISABLE_Y) - if (!axis_active[Y_AXIS]) disable_Y(); + if (!axis_active.y) disable_Y(); #endif #if ENABLED(DISABLE_Z) - if (!axis_active[Z_AXIS]) disable_Z(); + if (!axis_active.z) disable_Z(); #endif #if ENABLED(DISABLE_E) - if (!axis_active[E_AXIS]) disable_e_steppers(); + if (!axis_active.e) disable_e_steppers(); #endif + // + // Update Fan speeds + // #if FAN_COUNT > 0 #if FAN_KICKSTART_TIME > 0 @@ -1350,44 +1365,45 @@ void Planner::check_axes_activity() { #endif #if HAS_LEVELING + + constexpr xy_pos_t level_fulcrum = { + #if ENABLED(Z_SAFE_HOMING) + Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT + #else + X_HOME_POS, Y_HOME_POS + #endif + }; + /** * rx, ry, rz - Cartesian positions in mm * Leveled XYZ on completion */ - void Planner::apply_leveling(float &rx, float &ry, float &rz) { + void Planner::apply_leveling(xyz_pos_t &raw) { if (!leveling_active) return; #if ABL_PLANAR - float dx = rx - (X_TILT_FULCRUM), - dy = ry - (Y_TILT_FULCRUM); - - apply_rotation_xyz(bed_level_matrix, dx, dy, rz); - - rx = dx + X_TILT_FULCRUM; - ry = dy + Y_TILT_FULCRUM; + xy_pos_t d = raw - level_fulcrum; + apply_rotation_xyz(bed_level_matrix, d.x, d.y, raw.z); + raw = d + level_fulcrum; #elif HAS_MESH #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = fade_scaling_factor_for_z(rz); + const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); #else constexpr float fade_scaling_factor = 1.0; #endif - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float raw[XYZ] = { rx, ry, 0 }; - #endif - - rz += ( + raw.z += ( #if ENABLED(MESH_BED_LEVELING) - mbl.get_z(rx, ry + mbl.get_z(raw #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , fade_scaling_factor #endif ) #elif ENABLED(AUTO_BED_LEVELING_UBL) - fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(rx, ry) : 0.0 + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 #endif @@ -1396,7 +1412,7 @@ void Planner::check_axes_activity() { #endif } - void Planner::unapply_leveling(float raw[XYZ]) { + void Planner::unapply_leveling(xyz_pos_t &raw) { if (leveling_active) { @@ -1404,31 +1420,27 @@ void Planner::check_axes_activity() { matrix_3x3 inverse = matrix_3x3::transpose(bed_level_matrix); - float dx = raw[X_AXIS] - (X_TILT_FULCRUM), - dy = raw[Y_AXIS] - (Y_TILT_FULCRUM); - - apply_rotation_xyz(inverse, dx, dy, raw[Z_AXIS]); - - raw[X_AXIS] = dx + X_TILT_FULCRUM; - raw[Y_AXIS] = dy + Y_TILT_FULCRUM; + xy_pos_t d = raw - level_fulcrum; + apply_rotation_xyz(inverse, d.x, d.y, raw.z); + raw = d + level_fulcrum; #elif HAS_MESH #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = fade_scaling_factor_for_z(raw[Z_AXIS]); + const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); #else constexpr float fade_scaling_factor = 1.0; #endif - raw[Z_AXIS] -= ( + raw.z -= ( #if ENABLED(MESH_BED_LEVELING) - mbl.get_z(raw[X_AXIS], raw[Y_AXIS] + mbl.get_z(raw #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , fade_scaling_factor #endif ) #elif ENABLED(AUTO_BED_LEVELING_UBL) - fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw[X_AXIS], raw[Y_AXIS]) : 0.0 + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 #endif @@ -1438,7 +1450,7 @@ void Planner::check_axes_activity() { } #if ENABLED(SKEW_CORRECTION) - unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); + unskew(raw); #endif } @@ -1563,12 +1575,12 @@ void Planner::synchronize() { * * Returns true if movement was properly queued, false otherwise */ -bool Planner::_buffer_steps(const int32_t (&target)[XYZE] +bool Planner::_buffer_steps(const xyze_long_t &target #if HAS_POSITION_FLOAT - , const float (&target_float)[ABCE] + , const xyze_pos_t &target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters ) { @@ -1585,7 +1597,7 @@ bool Planner::_buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT , target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) , delta_mm_cart #endif , fr_mm_s, extruder, millimeters @@ -1627,33 +1639,33 @@ bool Planner::_buffer_steps(const int32_t (&target)[XYZE] * Returns true is movement is acceptable, false otherwise */ bool Planner::_populate_block(block_t * const block, bool split_move, - const int32_t (&target)[ABCE] + const abce_long_t &target #if HAS_POSITION_FLOAT - , const float (&target_float)[ABCE] + , const xyze_pos_t &target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ ) { - const int32_t da = target[A_AXIS] - position[A_AXIS], - db = target[B_AXIS] - position[B_AXIS], - dc = target[C_AXIS] - position[C_AXIS]; + const int32_t da = target.a - position.a, + db = target.b - position.b, + dc = target.c - position.c; #if EXTRUDERS - int32_t de = target[E_AXIS] - position[E_AXIS]; + int32_t de = target.e - position.e; #else constexpr int32_t de = 0; #endif /* <-- add a slash to enable SERIAL_ECHOLNPAIR(" _populate_block FR:", fr_mm_s, - " A:", target[A_AXIS], " (", da, " steps)" - " B:", target[B_AXIS], " (", db, " steps)" - " C:", target[C_AXIS], " (", dc, " steps)" + " A:", target.a, " (", da, " steps)" + " B:", target.b, " (", db, " steps)" + " C:", target.c, " (", dc, " steps)" #if EXTRUDERS - " E:", target[E_AXIS], " (", de, " steps)" + " E:", target.e, " (", de, " steps)" #endif ); //*/ @@ -1662,9 +1674,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (de) { #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.tooColdToExtrude(extruder)) { - position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part + position.e = target.e; // Behave as if the move really took place, but ignore E part #if HAS_POSITION_FLOAT - position_float[E_AXIS] = target_float[E_AXIS]; + position_float.e = target_float.e; #endif de = 0; // no difference SERIAL_ECHO_MSG(MSG_ERR_COLD_EXTRUDE_STOP); @@ -1684,9 +1696,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, constexpr bool ignore_e = true; #endif if (ignore_e) { - position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part + position.e = target.e; // Behave as if the move really took place, but ignore E part #if HAS_POSITION_FLOAT - position_float[E_AXIS] = target_float[E_AXIS]; + position_float.e = target_float.e; #endif de = 0; // no difference SERIAL_ECHO_MSG(MSG_ERR_LONG_EXTRUDE_STOP); @@ -1739,26 +1751,16 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Number of steps for each axis // See http://www.corexy.com/theory.html #if CORE_IS_XY - block->steps[A_AXIS] = ABS(da + db); - block->steps[B_AXIS] = ABS(da - db); - block->steps[Z_AXIS] = ABS(dc); + block->steps.set(ABS(da + db), ABS(da - db), ABS(dc)); #elif CORE_IS_XZ - block->steps[A_AXIS] = ABS(da + dc); - block->steps[Y_AXIS] = ABS(db); - block->steps[C_AXIS] = ABS(da - dc); + block->steps.set(ABS(da + dc), ABS(db), ABS(da - dc)); #elif CORE_IS_YZ - block->steps[X_AXIS] = ABS(da); - block->steps[B_AXIS] = ABS(db + dc); - block->steps[C_AXIS] = ABS(db - dc); + block->steps.set(ABS(da), ABS(db + dc), ABS(db - dc)); #elif IS_SCARA - block->steps[A_AXIS] = ABS(da); - block->steps[B_AXIS] = ABS(db); - block->steps[Z_AXIS] = ABS(dc); + block->steps.set(ABS(da), ABS(db), ABS(dc)); #else // default non-h-bot planning - block->steps[A_AXIS] = ABS(da); - block->steps[B_AXIS] = ABS(db); - block->steps[C_AXIS] = ABS(dc); + block->steps.set(ABS(da), ABS(db), ABS(dc)); #endif /** @@ -1769,42 +1771,45 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. */ + struct DeltaMM : abce_float_t { + #if IS_CORE + xyz_pos_t head; + #endif + } delta_mm; #if IS_CORE - float delta_mm[Z_HEAD + 1]; #if CORE_IS_XY - delta_mm[X_HEAD] = da * steps_to_mm[A_AXIS]; - delta_mm[Y_HEAD] = db * steps_to_mm[B_AXIS]; - delta_mm[Z_AXIS] = dc * steps_to_mm[Z_AXIS]; - delta_mm[A_AXIS] = (da + db) * steps_to_mm[A_AXIS]; - delta_mm[B_AXIS] = CORESIGN(da - db) * steps_to_mm[B_AXIS]; + delta_mm.head.x = da * steps_to_mm[A_AXIS]; + delta_mm.head.y = db * steps_to_mm[B_AXIS]; + delta_mm.z = dc * steps_to_mm[Z_AXIS]; + delta_mm.a = (da + db) * steps_to_mm[A_AXIS]; + delta_mm.b = CORESIGN(da - db) * steps_to_mm[B_AXIS]; #elif CORE_IS_XZ - delta_mm[X_HEAD] = da * steps_to_mm[A_AXIS]; - delta_mm[Y_AXIS] = db * steps_to_mm[Y_AXIS]; - delta_mm[Z_HEAD] = dc * steps_to_mm[C_AXIS]; - delta_mm[A_AXIS] = (da + dc) * steps_to_mm[A_AXIS]; - delta_mm[C_AXIS] = CORESIGN(da - dc) * steps_to_mm[C_AXIS]; + delta_mm.head.x = da * steps_to_mm[A_AXIS]; + delta_mm.y = db * steps_to_mm[Y_AXIS]; + delta_mm.head.z = dc * steps_to_mm[C_AXIS]; + delta_mm.a = (da + dc) * steps_to_mm[A_AXIS]; + delta_mm.c = CORESIGN(da - dc) * steps_to_mm[C_AXIS]; #elif CORE_IS_YZ - delta_mm[X_AXIS] = da * steps_to_mm[X_AXIS]; - delta_mm[Y_HEAD] = db * steps_to_mm[B_AXIS]; - delta_mm[Z_HEAD] = dc * steps_to_mm[C_AXIS]; - delta_mm[B_AXIS] = (db + dc) * steps_to_mm[B_AXIS]; - delta_mm[C_AXIS] = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; + delta_mm.x = da * steps_to_mm[X_AXIS]; + delta_mm.head.y = db * steps_to_mm[B_AXIS]; + delta_mm.head.z = dc * steps_to_mm[C_AXIS]; + delta_mm.b = (db + dc) * steps_to_mm[B_AXIS]; + delta_mm.c = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; #endif #else - float delta_mm[ABCE]; - delta_mm[A_AXIS] = da * steps_to_mm[A_AXIS]; - delta_mm[B_AXIS] = db * steps_to_mm[B_AXIS]; - delta_mm[C_AXIS] = dc * steps_to_mm[C_AXIS]; + delta_mm.a = da * steps_to_mm[A_AXIS]; + delta_mm.b = db * steps_to_mm[B_AXIS]; + delta_mm.c = dc * steps_to_mm[C_AXIS]; #endif #if EXTRUDERS - delta_mm[E_AXIS] = esteps_float * steps_to_mm[E_AXIS_N(extruder)]; + delta_mm.e = esteps_float * steps_to_mm[E_AXIS_N(extruder)]; #endif - if (block->steps[A_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[B_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[C_AXIS] < MIN_STEPS_PER_SEGMENT) { + if (block->steps.a < MIN_STEPS_PER_SEGMENT && block->steps.b < MIN_STEPS_PER_SEGMENT && block->steps.c < MIN_STEPS_PER_SEGMENT) { block->millimeters = (0 #if EXTRUDERS - + ABS(delta_mm[E_AXIS]) + + ABS(delta_mm.e) #endif ); } @@ -1814,13 +1819,13 @@ bool Planner::_populate_block(block_t * const block, bool split_move, else block->millimeters = SQRT( #if CORE_IS_XY - sq(delta_mm[X_HEAD]) + sq(delta_mm[Y_HEAD]) + sq(delta_mm[Z_AXIS]) + sq(delta_mm.head.x) + sq(delta_mm.head.y) + sq(delta_mm.z) #elif CORE_IS_XZ - sq(delta_mm[X_HEAD]) + sq(delta_mm[Y_AXIS]) + sq(delta_mm[Z_HEAD]) + sq(delta_mm.head.x) + sq(delta_mm.y) + sq(delta_mm.head.z) #elif CORE_IS_YZ - sq(delta_mm[X_AXIS]) + sq(delta_mm[Y_HEAD]) + sq(delta_mm[Z_HEAD]) + sq(delta_mm.x) + sq(delta_mm.head.y) + sq(delta_mm.head.z) #else - sq(delta_mm[X_AXIS]) + sq(delta_mm[Y_AXIS]) + sq(delta_mm[Z_AXIS]) + sq(delta_mm.x) + sq(delta_mm.y) + sq(delta_mm.z) #endif ); @@ -1839,10 +1844,10 @@ bool Planner::_populate_block(block_t * const block, bool split_move, } #if EXTRUDERS - block->steps[E_AXIS] = esteps; + block->steps.e = esteps; #endif - block->step_event_count = _MAX(block->steps[A_AXIS], block->steps[B_AXIS], block->steps[C_AXIS], esteps); + block->step_event_count = _MAX(block->steps.a, block->steps.b, block->steps.c, esteps); // Bail if this is a zero-length block if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; @@ -1851,6 +1856,10 @@ bool Planner::_populate_block(block_t * const block, bool split_move, MIXER_POPULATE_BLOCK(); #endif + #if HAS_CUTTER + block->cutter_power = cutter.power; + #endif + #if FAN_COUNT > 0 FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; #endif @@ -1865,36 +1874,36 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif #if ENABLED(AUTO_POWER_CONTROL) - if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) + if (block->steps.x || block->steps.y || block->steps.z) powerManager.power_on(); #endif // Enable active axes #if CORE_IS_XY - if (block->steps[A_AXIS] || block->steps[B_AXIS]) { + if (block->steps.a || block->steps.b) { enable_X(); enable_Y(); } #if DISABLED(Z_LATE_ENABLE) - if (block->steps[Z_AXIS]) enable_Z(); + if (block->steps.z) enable_Z(); #endif #elif CORE_IS_XZ - if (block->steps[A_AXIS] || block->steps[C_AXIS]) { + if (block->steps.a || block->steps.c) { enable_X(); enable_Z(); } - if (block->steps[Y_AXIS]) enable_Y(); + if (block->steps.y) enable_Y(); #elif CORE_IS_YZ - if (block->steps[B_AXIS] || block->steps[C_AXIS]) { + if (block->steps.b || block->steps.c) { enable_Y(); enable_Z(); } - if (block->steps[X_AXIS]) enable_X(); + if (block->steps.x) enable_X(); #else - if (block->steps[X_AXIS]) enable_X(); - if (block->steps[Y_AXIS]) enable_Y(); + if (block->steps.x) enable_X(); + if (block->steps.y) enable_Y(); #if DISABLED(Z_LATE_ENABLE) - if (block->steps[Z_AXIS]) enable_Z(); + if (block->steps.z) enable_Z(); #endif #endif @@ -2074,20 +2083,21 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #if ENABLED(FILAMENT_WIDTH_SENSOR) if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM) // Only for extruder with filament sensor - filwidth.advance_e(delta_mm[E_AXIS]); + filwidth.advance_e(delta_mm.e); #endif // Calculate and limit speed in mm/sec for each axis - float current_speed[NUM_AXIS], speed_factor = 1.0f; // factor <1 decreases speed + xyze_float_t current_speed; + float speed_factor = 1.0f; // factor <1 decreases speed LOOP_XYZE(i) { #if BOTH(MIXING_EXTRUDER, RETRACT_SYNC_MIXING) // In worst case, only one extruder running, no change is needed. // In best case, all extruders run the same amount, we can divide by MIXING_STEPPERS float delta_mm_i = 0; if (i == E_AXIS && mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL) - delta_mm_i = delta_mm[i] / MIXING_STEPPERS; + delta_mm_i = delta_mm.e / MIXING_STEPPERS; else - delta_mm_i = delta_mm[i]; + delta_mm_i = delta_mm.e; #else const float delta_mm_i = delta_mm[i]; #endif @@ -2106,26 +2116,26 @@ bool Planner::_populate_block(block_t * const block, bool split_move, old_direction_bits = block->direction_bits; segment_time_us = LROUND((float)segment_time_us / speed_factor); - uint32_t xs0 = axis_segment_time_us[X_AXIS][0], - xs1 = axis_segment_time_us[X_AXIS][1], - xs2 = axis_segment_time_us[X_AXIS][2], - ys0 = axis_segment_time_us[Y_AXIS][0], - ys1 = axis_segment_time_us[Y_AXIS][1], - ys2 = axis_segment_time_us[Y_AXIS][2]; + uint32_t xs0 = axis_segment_time_us[0].x, + xs1 = axis_segment_time_us[1].x, + xs2 = axis_segment_time_us[2].x, + ys0 = axis_segment_time_us[0].y, + ys1 = axis_segment_time_us[1].y, + ys2 = axis_segment_time_us[2].y; if (TEST(direction_change, X_AXIS)) { - xs2 = axis_segment_time_us[X_AXIS][2] = xs1; - xs1 = axis_segment_time_us[X_AXIS][1] = xs0; + xs2 = axis_segment_time_us[2].x = xs1; + xs1 = axis_segment_time_us[1].x = xs0; xs0 = 0; } - xs0 = axis_segment_time_us[X_AXIS][0] = xs0 + segment_time_us; + xs0 = axis_segment_time_us[0].x = xs0 + segment_time_us; if (TEST(direction_change, Y_AXIS)) { - ys2 = axis_segment_time_us[Y_AXIS][2] = axis_segment_time_us[Y_AXIS][1]; - ys1 = axis_segment_time_us[Y_AXIS][1] = axis_segment_time_us[Y_AXIS][0]; + ys2 = axis_segment_time_us[2].y = axis_segment_time_us[1].y; + ys1 = axis_segment_time_us[1].y = axis_segment_time_us[0].y; ys0 = 0; } - ys0 = axis_segment_time_us[Y_AXIS][0] = ys0 + segment_time_us; + ys0 = axis_segment_time_us[0].y = ys0 + segment_time_us; const uint32_t max_x_segment_time = _MAX(xs0, xs1, xs2), max_y_segment_time = _MAX(ys0, ys1, ys2), @@ -2138,7 +2148,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Correct the speed if (speed_factor < 1.0f) { - LOOP_XYZE(i) current_speed[i] *= speed_factor; + current_speed *= speed_factor; block->nominal_rate *= speed_factor; block->nominal_speed_sqr = block->nominal_speed_sqr * sq(speed_factor); } @@ -2146,7 +2156,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Compute and limit the acceleration rate for the trapezoid generator. const float steps_per_mm = block->step_event_count * inverse_millimeters; uint32_t accel; - if (!block->steps[A_AXIS] && !block->steps[B_AXIS] && !block->steps[C_AXIS]) { + if (!block->steps.a && !block->steps.b && !block->steps.c) { // convert to: acceleration steps/sec^2 accel = CEIL(settings.retract_acceleration * steps_per_mm); #if ENABLED(LIN_ADVANCE) @@ -2173,14 +2183,14 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #if ENABLED(LIN_ADVANCE) - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) #if ENABLED(DISTINCT_E_FACTORS) #define MAX_E_JERK max_e_jerk[extruder] #else #define MAX_E_JERK max_e_jerk #endif #else - #define MAX_E_JERK max_jerk[E_AXIS] + #define MAX_E_JERK max_jerk.e #endif /** @@ -2198,13 +2208,13 @@ bool Planner::_populate_block(block_t * const block, bool split_move, && de > 0; if (block->use_advance_lead) { - block->e_D_ratio = (target_float[E_AXIS] - position_float[E_AXIS]) / + block->e_D_ratio = (target_float.e - position_float.e) / #if IS_KINEMATIC block->millimeters #else - SQRT(sq(target_float[X_AXIS] - position_float[X_AXIS]) - + sq(target_float[Y_AXIS] - position_float[Y_AXIS]) - + sq(target_float[Z_AXIS] - position_float[Z_AXIS])) + SQRT(sq(target_float.x - position_float.x) + + sq(target_float.y - position_float.y) + + sq(target_float.z - position_float.z)) #endif ; @@ -2261,7 +2271,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, float vmax_junction_sqr; // Initial limit on the segment entry velocity (mm/s)^2 - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) /** * Compute maximum allowable entry speed at junction by centripetal acceleration approximation. * Let a circle be tangent to both previous and current path line segments, where the junction @@ -2297,25 +2307,18 @@ bool Planner::_populate_block(block_t * const block, bool split_move, already calculated in a different place. */ // Unit vector of previous path line segment - static float previous_unit_vec[XYZE]; + static xyze_float_t prev_unit_vec; - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - float unit_vec[] = { - delta_mm_cart[X_AXIS] * inverse_millimeters, - delta_mm_cart[Y_AXIS] * inverse_millimeters, - delta_mm_cart[Z_AXIS] * inverse_millimeters, - delta_mm_cart[E_AXIS] * inverse_millimeters - }; - #else - float unit_vec[] = { - delta_mm[X_AXIS] * inverse_millimeters, - delta_mm[Y_AXIS] * inverse_millimeters, - delta_mm[Z_AXIS] * inverse_millimeters, - delta_mm[E_AXIS] * inverse_millimeters - }; - #endif + xyze_float_t unit_vec = + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + delta_mm_cart + #else + { delta_mm.x, delta_mm.y, delta_mm.z, delta_mm.e } + #endif + ; + unit_vec *= inverse_millimeters; - #if IS_CORE && ENABLED(JUNCTION_DEVIATION) + #if IS_CORE && DISABLED(CLASSIC_JERK) /** * On CoreXY the length of the vector [A,B] is SQRT(2) times the length of the head movement vector [X,Y]. * So taking Z and E into account, we cannot scale to a unit vector with "inverse_millimeters". @@ -2328,11 +2331,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { // Compute cosine of angle between previous and current path. (prev_unit_vec is negative) // NOTE: Max junction velocity is computed without sin() or acos() by trig half angle identity. - float junction_cos_theta = -previous_unit_vec[X_AXIS] * unit_vec[X_AXIS] - -previous_unit_vec[Y_AXIS] * unit_vec[Y_AXIS] - -previous_unit_vec[Z_AXIS] * unit_vec[Z_AXIS] - -previous_unit_vec[E_AXIS] * unit_vec[E_AXIS] - ; + float junction_cos_theta = (-prev_unit_vec.x * unit_vec.x) + (-prev_unit_vec.y * unit_vec.y) + + (-prev_unit_vec.z * unit_vec.z) + (-prev_unit_vec.e * unit_vec.e); // NOTE: Computed without any expensive trig, sin() or acos(), by trig half angle identity of cos(theta). if (junction_cos_theta > 0.999999f) { @@ -2343,12 +2343,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, NOLESS(junction_cos_theta, -0.999999f); // Check for numerical round-off to avoid divide by zero. // Convert delta vector to unit vector - float junction_unit_vec[XYZE] = { - unit_vec[X_AXIS] - previous_unit_vec[X_AXIS], - unit_vec[Y_AXIS] - previous_unit_vec[Y_AXIS], - unit_vec[Z_AXIS] - previous_unit_vec[Z_AXIS], - unit_vec[E_AXIS] - previous_unit_vec[E_AXIS] - }; + xyze_float_t junction_unit_vec = unit_vec - prev_unit_vec; normalize_junction_vector(junction_unit_vec); const float junction_acceleration = limit_value_by_axis_maximum(block->acceleration, junction_unit_vec), @@ -2374,17 +2369,25 @@ bool Planner::_populate_block(block_t * const block, bool split_move, else // Init entry speed to zero. Assume it starts from rest. Planner will correct this later. vmax_junction_sqr = 0; - COPY(previous_unit_vec, unit_vec); + prev_unit_vec = unit_vec; #endif + #ifdef USE_CACHED_SQRT + #define CACHED_SQRT(N, V) \ + static float saved_V, N; \ + if (V != saved_V) { N = SQRT(V); saved_V = V; } + #else + #define CACHED_SQRT(N, V) const float N = SQRT(V) + #endif + #if HAS_CLASSIC_JERK /** * Adapted from Průša MKS firmware * https://github.com/prusa3d/Prusa-Firmware */ - const float nominal_speed = SQRT(block->nominal_speed_sqr); + CACHED_SQRT(nominal_speed, block->nominal_speed_sqr); // Exit speed limited by a jerk to full halt of a previous last segment static float previous_safe_speed; @@ -2393,7 +2396,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, float safe_speed = nominal_speed; uint8_t limited = 0; - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK LOOP_XYZ(i) #else LOOP_XYZE(i) @@ -2425,12 +2428,13 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - const float previous_nominal_speed = SQRT(previous_nominal_speed_sqr); + CACHED_SQRT(previous_nominal_speed, previous_nominal_speed_sqr); + vmax_junction = _MIN(nominal_speed, previous_nominal_speed); // Now limit the jerk in all axes. const float smaller_speed_factor = vmax_junction / previous_nominal_speed; - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK LOOP_XYZ(axis) #else LOOP_XYZE(axis) @@ -2468,7 +2472,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, previous_safe_speed = safe_speed; - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) vmax_junction_sqr = _MIN(vmax_junction_sqr, sq(vmax_junction)); #else vmax_junction_sqr = sq(vmax_junction); @@ -2497,18 +2501,17 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->flag |= block->nominal_speed_sqr <= v_allowable_sqr ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; // Update previous path unit_vector and nominal speed - COPY(previous_speed, current_speed); + previous_speed = current_speed; previous_nominal_speed_sqr = block->nominal_speed_sqr; // Update the position - static_assert(COUNT(target) > 1, "Parameter to _buffer_steps must be (&target)[XYZE]!"); - COPY(position, target); + position = target; #if HAS_POSITION_FLOAT - COPY(position_float, target_float); + position_float = target_float; #endif #if ENABLED(GRADIENT_MIX) - mixer.gradient_control(target_float[Z_AXIS]); + mixer.gradient_control(target_float.z); #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -2533,10 +2536,7 @@ void Planner::buffer_sync_block() { block->flag = BLOCK_FLAG_SYNC_POSITION; - block->position[A_AXIS] = position[A_AXIS]; - block->position[B_AXIS] = position[B_AXIS]; - block->position[C_AXIS] = position[C_AXIS]; - block->position[E_AXIS] = position[E_AXIS]; + block->position = position; // If this is the first added movement, reload the delay, otherwise, cancel it. if (block_buffer_head == block_buffer_tail) { @@ -2566,8 +2566,8 @@ void Planner::buffer_sync_block() { * millimeters - the length of the movement, if known */ bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ ) { @@ -2578,14 +2578,14 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con // When changing extruders recalculate steps corresponding to the E position #if ENABLED(DISTINCT_E_FACTORS) if (last_extruder != extruder && settings.axis_steps_per_mm[E_AXIS_N(extruder)] != settings.axis_steps_per_mm[E_AXIS_N(last_extruder)]) { - position[E_AXIS] = LROUND(position[E_AXIS] * settings.axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS_N(last_extruder)]); + position.e = LROUND(position.e * settings.axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS_N(last_extruder)]); last_extruder = extruder; } #endif // The target position of the tool in absolute steps // Calculate target position in absolute steps - const int32_t target[ABCE] = { + const abce_long_t target = { int32_t(LROUND(a * settings.axis_steps_per_mm[A_AXIS])), int32_t(LROUND(b * settings.axis_steps_per_mm[B_AXIS])), int32_t(LROUND(c * settings.axis_steps_per_mm[C_AXIS])), @@ -2593,14 +2593,14 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con }; #if HAS_POSITION_FLOAT - const float target_float[XYZE] = { a, b, c, e }; + const xyze_pos_t target_float = { a, b, c, e }; #endif // DRYRUN prevents E moves from taking place if (DEBUGGING(DRYRUN)) { - position[E_AXIS] = target[E_AXIS]; + position.e = target.e; #if HAS_POSITION_FLOAT - position_float[E_AXIS] = e; + position_float.e = e; #endif } @@ -2608,27 +2608,27 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con SERIAL_ECHOPAIR(" buffer_segment FR:", fr_mm_s); #if IS_KINEMATIC SERIAL_ECHOPAIR(" A:", a); - SERIAL_ECHOPAIR(" (", position[A_AXIS]); - SERIAL_ECHOPAIR("->", target[A_AXIS]); + SERIAL_ECHOPAIR(" (", position.a); + SERIAL_ECHOPAIR("->", target.a); SERIAL_ECHOPAIR(") B:", b); #else SERIAL_ECHOPAIR(" X:", a); - SERIAL_ECHOPAIR(" (", position[X_AXIS]); - SERIAL_ECHOPAIR("->", target[X_AXIS]); + SERIAL_ECHOPAIR(" (", position.x); + SERIAL_ECHOPAIR("->", target.x); SERIAL_ECHOPAIR(") Y:", b); #endif - SERIAL_ECHOPAIR(" (", position[Y_AXIS]); - SERIAL_ECHOPAIR("->", target[Y_AXIS]); + SERIAL_ECHOPAIR(" (", position.y); + SERIAL_ECHOPAIR("->", target.y); #if ENABLED(DELTA) SERIAL_ECHOPAIR(") C:", c); #else SERIAL_ECHOPAIR(") Z:", c); #endif - SERIAL_ECHOPAIR(" (", position[Z_AXIS]); - SERIAL_ECHOPAIR("->", target[Z_AXIS]); + SERIAL_ECHOPAIR(" (", position.z); + SERIAL_ECHOPAIR("->", target.z); SERIAL_ECHOPAIR(") E:", e); - SERIAL_ECHOPAIR(" (", position[E_AXIS]); - SERIAL_ECHOPAIR("->", target[E_AXIS]); + SERIAL_ECHOPAIR(" (", position.e); + SERIAL_ECHOPAIR("->", target.e); SERIAL_ECHOLNPGM(")"); //*/ @@ -2638,7 +2638,7 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con #if HAS_POSITION_FLOAT , target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) , delta_mm_cart #endif , fr_mm_s, extruder, millimeters @@ -2665,51 +2665,49 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con , const float &inv_duration #endif ) { - float raw[XYZE] = { rx, ry, rz, e }; + xyze_pos_t machine = { rx, ry, rz, e }; #if HAS_POSITION_MODIFIERS - apply_modifiers(raw); + apply_modifiers(machine); #endif #if IS_KINEMATIC - const float delta_mm_cart[] = { - rx - position_cart[X_AXIS], - ry - position_cart[Y_AXIS], - rz - position_cart[Z_AXIS] - #if ENABLED(JUNCTION_DEVIATION) - , e - position_cart[E_AXIS] - #endif - }; + + #if DISABLED(CLASSIC_JERK) + const xyze_pos_t delta_mm_cart = { + rx - position_cart.x, ry - position_cart.y, + rz - position_cart.z, e - position_cart.e + }; + #else + const xyz_pos_t delta_mm_cart = { rx - position_cart.x, ry - position_cart.y, rz - position_cart.z }; + #endif float mm = millimeters; if (mm == 0.0) - mm = (delta_mm_cart[X_AXIS] != 0.0 || delta_mm_cart[Y_AXIS] != 0.0) ? SQRT(sq(delta_mm_cart[X_AXIS]) + sq(delta_mm_cart[Y_AXIS]) + sq(delta_mm_cart[Z_AXIS])) : ABS(delta_mm_cart[Z_AXIS]); + mm = (delta_mm_cart.x != 0.0 || delta_mm_cart.y != 0.0) ? delta_mm_cart.magnitude() : ABS(delta_mm_cart.z); - inverse_kinematics(raw); + inverse_kinematics(machine); #if ENABLED(SCARA_FEEDRATE_SCALING) // For SCARA scale the feed rate from mm/s to degrees/s // i.e., Complete the angular vector in the given time. - const float duration_recip = inv_duration ? inv_duration : fr_mm_s / mm; - const feedRate_t feedrate = HYPOT(delta[A_AXIS] - position_float[A_AXIS], delta[B_AXIS] - position_float[B_AXIS]) * duration_recip; + const float duration_recip = inv_duration ?: fr_mm_s / mm; + const feedRate_t feedrate = HYPOT(delta.a - position_float.a, delta.b - position_float.b) * duration_recip; #else const feedRate_t feedrate = fr_mm_s; #endif - if (buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS] - #if ENABLED(JUNCTION_DEVIATION) + if (buffer_segment(delta.a, delta.b, delta.c, machine.e + #if DISABLED(CLASSIC_JERK) , delta_mm_cart #endif , feedrate, extruder, mm )) { - position_cart[X_AXIS] = rx; - position_cart[Y_AXIS] = ry; - position_cart[Z_AXIS] = rz; - position_cart[E_AXIS] = e; + position_cart.set(rx, ry, rz, e); return true; } else return false; #else - return buffer_segment(raw, fr_mm_s, extruder, millimeters); + return buffer_segment(machine, fr_mm_s, extruder, millimeters); #endif } // buffer_line() @@ -2724,30 +2722,27 @@ void Planner::set_machine_position_mm(const float &a, const float &b, const floa #if ENABLED(DISTINCT_E_FACTORS) last_extruder = active_extruder; #endif - position[A_AXIS] = LROUND(a * settings.axis_steps_per_mm[A_AXIS]); - position[B_AXIS] = LROUND(b * settings.axis_steps_per_mm[B_AXIS]); - position[C_AXIS] = LROUND(c * settings.axis_steps_per_mm[C_AXIS]); - position[E_AXIS] = LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(active_extruder)]); #if HAS_POSITION_FLOAT - position_float[A_AXIS] = a; - position_float[B_AXIS] = b; - position_float[C_AXIS] = c; - position_float[E_AXIS] = e; + position_float.set(a, b, c, e); #endif + position.set(LROUND(a * settings.axis_steps_per_mm[A_AXIS]), + LROUND(b * settings.axis_steps_per_mm[B_AXIS]), + LROUND(c * settings.axis_steps_per_mm[C_AXIS]), + LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(active_extruder)])); if (has_blocks_queued()) { //previous_nominal_speed_sqr = 0.0; // Reset planner junction speeds. Assume start from rest. - //ZERO(previous_speed); + //previous_speed.reset(); buffer_sync_block(); } else - stepper.set_position(position[A_AXIS], position[B_AXIS], position[C_AXIS], position[E_AXIS]); + stepper.set_position(position); } void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { - float raw[XYZE] = { rx, ry, rz, e }; + xyze_pos_t machine = { rx, ry, rz, e }; #if HAS_POSITION_MODIFIERS { - apply_modifiers(raw + apply_modifiers(machine #if HAS_LEVELING , true #endif @@ -2755,15 +2750,11 @@ void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, } #endif #if IS_KINEMATIC - position_cart[X_AXIS] = rx; - position_cart[Y_AXIS] = ry; - position_cart[Z_AXIS] = rz; - position_cart[E_AXIS] = e; - - inverse_kinematics(raw); - set_machine_position_mm(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS]); + position_cart.set(rx, ry, rz, e); + inverse_kinematics(machine); + set_machine_position_mm(delta.a, delta.b, delta.c, machine.e); #else - set_machine_position_mm(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], raw[E_AXIS]); + set_machine_position_mm(machine); #endif } @@ -2780,17 +2771,17 @@ void Planner::set_e_position_mm(const float &e) { #else const float e_new = e; #endif - position[E_AXIS] = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); + position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); #if HAS_POSITION_FLOAT - position_float[E_AXIS] = e_new; + position_float.e = e_new; #endif #if IS_KINEMATIC - position_cart[E_AXIS] = e; + position_cart.e = e; #endif if (has_blocks_queued()) buffer_sync_block(); else - stepper.set_position(E_AXIS, position[E_AXIS]); + stepper.set_axis_position(E_AXIS, position.e); } // Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 @@ -2806,7 +2797,7 @@ void Planner::reset_acceleration_rates() { if (AXIS_CONDITION) NOLESS(highest_rate, max_acceleration_steps_per_s2[i]); } cutoff_long = 4294967295UL / highest_rate; // 0xFFFFFFFFUL - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK recalculate_max_e_jerk(); #endif } @@ -2818,6 +2809,68 @@ void Planner::refresh_positioning() { reset_acceleration_rates(); } +inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_name, const xyze_float_t &max_limit) { + const uint8_t lim_axis = axis > E_AXIS ? E_AXIS : axis; + const float before = val; + LIMIT(val, 1, max_limit[lim_axis]); + if (before != val) { + SERIAL_CHAR(axis_codes[lim_axis]); + SERIAL_ECHOPGM(" Max "); + serialprintPGM(setting_name); + SERIAL_ECHOLNPAIR(" limited to ", val); + } +} + +void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { + #if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #ifdef MAX_ACCEL_EDIT_VALUES + constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; + const xyze_float_t &max_acc_edit_scaled = max_accel_edit; + #else + constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION, + max_acc_edit_scaled = max_accel_edit * 2; + #endif + limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled); + #endif + settings.max_acceleration_mm_per_s2[axis] = targetValue; + + // Update steps per s2 to agree with the units per s2 (since they are used in the planner) + reset_acceleration_rates(); +} + +void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { + #if ENABLED(LIMITED_MAX_FR_EDITING) + #ifdef MAX_FEEDRATE_EDIT_VALUES + constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; + const xyze_float_t &max_fr_edit_scaled = max_fr_edit; + #else + constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE, + max_fr_edit_scaled = max_fr_edit * 2; + #endif + limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled); + #endif + settings.max_feedrate_mm_s[axis] = targetValue; +} + +void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { + #if HAS_CLASSIC_JERK + #if ENABLED(LIMITED_JERK_EDITING) + constexpr xyze_float_t max_jerk_edit = + #ifdef MAX_JERK_EDIT_VALUES + MAX_JERK_EDIT_VALUES + #else + { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, + (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } + #endif + ; + limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); + #endif + max_jerk[axis] = targetValue; + #else + UNUSED(axis); UNUSED(targetValue); + #endif +} + #if ENABLED(AUTOTEMP) void Planner::autotemp_M104_M109() { diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 2f3ee471d6..8919ae123c 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -40,7 +40,7 @@ #endif #if ABL_PLANAR - #include "../libs/vector_3.h" + #include "../libs/vector_3.h" // for matrix_3x3 #endif #if ENABLED(FWRETRACT) @@ -51,6 +51,15 @@ #include "../feature/mixing.h" #endif +#if HAS_CUTTER + #include "../feature/spindle_laser.h" +#endif + +// Feedrate for manual moves +#ifdef MANUAL_FEEDRATE + constexpr xyze_feedrate_t manual_feedrate_mm_m = MANUAL_FEEDRATE; +#endif + enum BlockFlagBit : char { // Recalculate trapezoids on entry junction. For optimization. BLOCK_BIT_RECALCULATE, @@ -95,15 +104,8 @@ typedef struct block_t { acceleration; // acceleration mm/sec^2 union { - // Data used by all move blocks - struct { - // Fields used by the Bresenham algorithm for tracing the line - uint32_t steps[NUM_AXIS]; // Step count along each axis - }; - // Data used by all sync blocks - struct { - int32_t position[NUM_AXIS]; // New position to force when this sync block is executed - }; + abce_ulong_t steps; // Step count along each axis + abce_long_t position; // New position to force when this sync block is executed }; uint32_t step_event_count; // The number of step events required to complete this block @@ -147,6 +149,10 @@ typedef struct block_t { final_rate, // The minimal rate at exit acceleration_steps_per_s2; // acceleration steps/sec^2 + #if HAS_CUTTER + cutter_power_t cutter_power; // Power level for Spindle, Laser, etc. + #endif + #if FAN_COUNT > 0 uint8_t fan_speed[FAN_COUNT]; #endif @@ -247,7 +253,7 @@ class Planner { static uint32_t max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2 static float steps_to_mm[XYZE_N]; // Millimeters per step - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) static float junction_deviation_mm; // (mm) M205 J #if ENABLED(LIN_ADVANCE) static float max_e_jerk // Calculated from junction_deviation_mm @@ -259,13 +265,11 @@ class Planner { #endif #if HAS_CLASSIC_JERK - static float max_jerk[ - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) - XYZ // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. - #else - XYZE // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. - #endif - ]; + #if HAS_LINEAR_E_JERK + static xyz_pos_t max_jerk; // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. + #else + static xyze_pos_t max_jerk; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. + #endif #endif #if HAS_LEVELING @@ -285,11 +289,11 @@ class Planner { #endif #if HAS_POSITION_FLOAT - static float position_float[XYZE]; + static xyze_pos_t position_float; #endif #if IS_KINEMATIC - static float position_cart[XYZE]; + static xyze_pos_t position_cart; #endif static skew_factor_t skew_factor; @@ -304,12 +308,12 @@ class Planner { * The current position of the tool in absolute steps * Recalculated if any axis_steps_per_mm are changed by gcode */ - static int32_t position[NUM_AXIS]; + static xyze_long_t position; /** * Speed of previous path line segment */ - static float previous_speed[NUM_AXIS]; + static xyze_float_t previous_speed; /** * Nominal speed of previous path line segment (mm/s)^2 @@ -338,7 +342,7 @@ class Planner { // Old direction bits. Used for speed calculations static unsigned char old_direction_bits; // Segment times (in µs). Used for speed calculations - static uint32_t axis_segment_time_us[2][3]; + static xy_ulong_t axis_segment_time_us[3]; #endif #if HAS_SPI_LCD @@ -361,6 +365,10 @@ class Planner { static void reset_acceleration_rates(); static void refresh_positioning(); + static void set_max_acceleration(const uint8_t axis, float targetValue); + static void set_max_feedrate(const uint8_t axis, float targetValue); + static void set_max_jerk(const AxisEnum axis, float targetValue); + #if EXTRUDERS FORCE_INLINE static void refresh_e_factor(const uint8_t e) { @@ -434,12 +442,9 @@ class Planner { #else - FORCE_INLINE static float fade_scaling_factor_for_z(const float &rz) { - UNUSED(rz); - return 1; - } + FORCE_INLINE static float fade_scaling_factor_for_z(const float&) { return 1; } - FORCE_INLINE static bool leveling_active_at_z(const float &rz) { UNUSED(rz); return true; } + FORCE_INLINE static bool leveling_active_at_z(const float&) { return true; } #endif @@ -454,8 +459,7 @@ class Planner { } } } - FORCE_INLINE static void skew(float (&raw)[XYZ]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - FORCE_INLINE static void skew(float (&raw)[XYZE]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } + FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) { @@ -466,8 +470,7 @@ class Planner { } } } - FORCE_INLINE static void unskew(float (&raw)[XYZ]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - FORCE_INLINE static void unskew(float (&raw)[XYZE]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } + FORCE_INLINE static void unskew(xyz_pos_t &raw) { unskew(raw.x, raw.y, raw.z); } #endif // SKEW_CORRECTION @@ -476,22 +479,24 @@ class Planner { * Apply leveling to transform a cartesian position * as it will be given to the planner and steppers. */ - static void apply_leveling(float &rx, float &ry, float &rz); - FORCE_INLINE static void apply_leveling(float (&raw)[XYZ]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - FORCE_INLINE static void apply_leveling(float (&raw)[XYZE]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - - static void unapply_leveling(float raw[XYZ]); + static void apply_leveling(xyz_pos_t &raw); + static void unapply_leveling(xyz_pos_t &raw); + FORCE_INLINE static void force_unapply_leveling(xyz_pos_t &raw) { + leveling_active = true; + unapply_leveling(raw); + leveling_active = false; + } #endif #if ENABLED(FWRETRACT) static void apply_retract(float &rz, float &e); - FORCE_INLINE static void apply_retract(float (&raw)[XYZE]) { apply_retract(raw[Z_AXIS], raw[E_AXIS]); } + FORCE_INLINE static void apply_retract(xyze_pos_t &raw) { apply_retract(raw.z, raw.e); } static void unapply_retract(float &rz, float &e); - FORCE_INLINE static void unapply_retract(float (&raw)[XYZE]) { unapply_retract(raw[Z_AXIS], raw[E_AXIS]); } + FORCE_INLINE static void unapply_retract(xyze_pos_t &raw) { unapply_retract(raw.z, raw.e); } #endif #if HAS_POSITION_MODIFIERS - FORCE_INLINE static void apply_modifiers(float (&pos)[XYZE] + FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos #if HAS_LEVELING , bool leveling = #if PLANNER_LEVELING @@ -512,7 +517,7 @@ class Planner { #endif } - FORCE_INLINE static void unapply_modifiers(float (&pos)[XYZE] + FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos #if HAS_LEVELING , bool leveling = #if PLANNER_LEVELING @@ -578,12 +583,12 @@ class Planner { * * Returns true if movement was buffered, false otherwise */ - static bool _buffer_steps(const int32_t (&target)[XYZE] + static bool _buffer_steps(const xyze_long_t &target #if HAS_POSITION_FLOAT - , const float (&target_float)[ABCE] + , const xyze_pos_t &target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); @@ -601,12 +606,12 @@ class Planner { * Returns true is movement is acceptable, false otherwise */ static bool _populate_block(block_t * const block, bool split_move, - const int32_t (&target)[XYZE] + const xyze_long_t &target #if HAS_POSITION_FLOAT - , const float (&target_float)[XYZE] + , const xyze_pos_t &target_float #endif - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); @@ -637,20 +642,20 @@ class Planner { * millimeters - the length of the movement, if known */ static bool buffer_segment(const float &a, const float &b, const float &c, const float &e - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); - FORCE_INLINE static bool buffer_segment(const float (&abce)[ABCE] - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) - , const float (&delta_mm_cart)[XYZE] + FORCE_INLINE static bool buffer_segment(abce_pos_t &abce + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) + , const xyze_float_t &delta_mm_cart #endif , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ) { - return buffer_segment(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS] - #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + return buffer_segment(abce.a, abce.b, abce.c, abce.e + #if IS_KINEMATIC && DISABLED(CLASSIC_JERK) , delta_mm_cart #endif , fr_mm_s, extruder, millimeters); @@ -675,12 +680,12 @@ class Planner { #endif ); - FORCE_INLINE static bool buffer_line(const float (&cart)[XYZE], const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 #if ENABLED(SCARA_FEEDRATE_SCALING) , const float &inv_duration=0.0 #endif ) { - return buffer_line(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters + return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters #if ENABLED(SCARA_FEEDRATE_SCALING) , inv_duration #endif @@ -701,7 +706,7 @@ class Planner { * Clears previous speed values. */ static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); - FORCE_INLINE static void set_position_mm(const float (&cart)[XYZE]) { set_position_mm(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS]); } + FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); } static void set_e_position_mm(const float &e); /** @@ -711,7 +716,7 @@ class Planner { * conversions are applied. */ static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); - FORCE_INLINE static void set_machine_position_mm(const float (&abce)[ABCE]) { set_machine_position_mm(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS]); } + FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); } /** * Get an axis position according to stepper position(s) @@ -868,7 +873,7 @@ class Planner { static void autotemp_M104_M109(); #endif - #if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE) + #if HAS_LINEAR_E_JERK FORCE_INLINE static void recalculate_max_e_jerk() { #define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5))) #if ENABLED(DISTINCT_E_FACTORS) @@ -940,23 +945,22 @@ class Planner { static void recalculate(); - #if ENABLED(JUNCTION_DEVIATION) + #if DISABLED(CLASSIC_JERK) - FORCE_INLINE static void normalize_junction_vector(float (&vector)[XYZE]) { + FORCE_INLINE static void normalize_junction_vector(xyze_float_t &vector) { float magnitude_sq = 0; LOOP_XYZE(idx) if (vector[idx]) magnitude_sq += sq(vector[idx]); - const float inv_magnitude = RSQRT(magnitude_sq); - LOOP_XYZE(idx) vector[idx] *= inv_magnitude; + vector *= RSQRT(magnitude_sq); } - FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, float (&unit_vec)[XYZE]) { + FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) { float limit_value = max_value; LOOP_XYZE(idx) if (unit_vec[idx]) // Avoid divide by zero NOMORE(limit_value, ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx])); return limit_value; } - #endif // JUNCTION_DEVIATION + #endif // !CLASSIC_JERK }; #define PLANNER_XY_FEEDRATE() (_MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS])) diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 6e6746bce8..080f4e41a8 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -108,21 +108,17 @@ static inline float dist1(const float &x1, const float &y1, const float &x2, con * power available on Arduino, I think it is not wise to implement it. */ void cubic_b_spline( - const float position[NUM_AXIS], // current position - const float target[NUM_AXIS], // target position - const float (&offset)[4], // a pair of offsets + const xyze_pos_t &position, // current position + const xyze_pos_t &target, // target position + const xy_pos_t (&offsets)[2], // a pair of offsets const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ) { // Absolute first and second control points are recovered. - const float first0 = position[X_AXIS] + offset[0], - first1 = position[Y_AXIS] + offset[1], - second0 = target[X_AXIS] + offset[2], - second1 = target[Y_AXIS] + offset[3]; + const xy_pos_t first = position + offsets[0], second = target + offsets[1]; - float bez_target[4]; - bez_target[X_AXIS] = position[X_AXIS]; - bez_target[Y_AXIS] = position[Y_AXIS]; + xyze_pos_t bez_target; + bez_target.set(position.x, position.y); float step = MAX_STEP; millis_t next_idle_ms = millis() + 200UL; @@ -141,15 +137,15 @@ void cubic_b_spline( bool did_reduce = false; float new_t = t + step; NOMORE(new_t, 1); - float new_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], new_t), - new_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], new_t); + float new_pos0 = eval_bezier(position.x, first.x, second.x, target.x, new_t), + new_pos1 = eval_bezier(position.y, first.y, second.y, target.y, new_t); for (;;) { if (new_t - t < (MIN_STEP)) break; const float candidate_t = 0.5f * (t + new_t), - candidate_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], candidate_t), - candidate_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], candidate_t), - interp_pos0 = 0.5f * (bez_target[X_AXIS] + new_pos0), - interp_pos1 = 0.5f * (bez_target[Y_AXIS] + new_pos1); + candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), + candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), + interp_pos0 = 0.5f * (bez_target.x + new_pos0), + interp_pos1 = 0.5f * (bez_target.y + new_pos1); if (dist1(candidate_pos0, candidate_pos1, interp_pos0, interp_pos1) <= (SIGMA)) break; new_t = candidate_t; new_pos0 = candidate_pos0; @@ -162,10 +158,10 @@ void cubic_b_spline( if (new_t - t > MAX_STEP) break; const float candidate_t = t + 2 * (new_t - t); if (candidate_t >= 1) break; - const float candidate_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], candidate_t), - candidate_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], candidate_t), - interp_pos0 = 0.5f * (bez_target[X_AXIS] + candidate_pos0), - interp_pos1 = 0.5f * (bez_target[Y_AXIS] + candidate_pos1); + const float candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), + candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), + interp_pos0 = 0.5f * (bez_target.x + candidate_pos0), + interp_pos1 = 0.5f * (bez_target.y + candidate_pos1); if (dist1(new_pos0, new_pos1, interp_pos0, interp_pos1) > (SIGMA)) break; new_t = candidate_t; new_pos0 = candidate_pos0; @@ -187,19 +183,19 @@ void cubic_b_spline( t = new_t; // Compute and send new position - bez_target[X_AXIS] = new_pos0; - bez_target[Y_AXIS] = new_pos1; - // FIXME. The following two are wrong, since the parameter t is - // not linear in the distance. - bez_target[Z_AXIS] = interp(position[Z_AXIS], target[Z_AXIS], t); - bez_target[E_AXIS] = interp(position[E_AXIS], target[E_AXIS], t); - apply_motion_limits(bez_target); + xyze_pos_t new_bez = { + new_pos0, new_pos1, + interp(position.z, target.z, t), // FIXME. These two are wrong, since the parameter t is + interp(position.e, target.e, t) // not linear in the distance. + }; + apply_motion_limits(new_bez); + bez_target = new_bez; #if HAS_LEVELING && !PLANNER_LEVELING - float pos[XYZE] = { bez_target[X_AXIS], bez_target[Y_AXIS], bez_target[Z_AXIS], bez_target[E_AXIS] }; + xyze_pos_t pos = bez_target; planner.apply_leveling(pos); #else - const float (&pos)[XYZE] = bez_target; + const xyze_pos_t &pos = bez_target; #endif if (!planner.buffer_line(pos, scaled_fr_mm_s, active_extruder, step)) diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index 5e959dd0f3..d0aa82858c 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -28,13 +28,12 @@ * */ -#include -#include "../core/macros.h" +#include "../core/types.h" void cubic_b_spline( - const float position[NUM_AXIS], // current position - const float target[NUM_AXIS], // target position - const float (&offset)[4], // a pair of offsets + const xyze_pos_t &position, // current position + const xyze_pos_t &target, // target position + const xy_pos_t (&offsets)[2], // a pair of offsets const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index ce0d84e41b..cbe6035af7 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -56,7 +56,7 @@ #include "../feature/backlash.h" #endif -float probe_offset[XYZ]; // Initialized by settings.load() +xyz_pos_t probe_offset; // Initialized by settings.load() #if ENABLED(BLTOUCH) #include "../feature/bltouch.h" @@ -146,10 +146,10 @@ float probe_offset[XYZ]; // Initialized by settings.load() // Move down to the bed to stow the probe void run_stow_moves_script() { - const float old_pos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + const xyz_pos_t oldpos = current_position; endstops.enable_z_probe(false); do_blocking_move_to_z(TOUCH_MI_RETRACT_Z, MMM_TO_MMS(HOMING_FEEDRATE_Z)); - do_blocking_move_to(old_pos, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + do_blocking_move_to(oldpos, MMM_TO_MMS(HOMING_FEEDRATE_Z)); } #elif ENABLED(Z_PROBE_ALLEN_KEY) @@ -159,35 +159,35 @@ float probe_offset[XYZ]; // Initialized by settings.load() #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE 0.0 #endif - constexpr float deploy_1[] = Z_PROBE_ALLEN_KEY_DEPLOY_1; + constexpr xyz_pos_t deploy_1 = Z_PROBE_ALLEN_KEY_DEPLOY_1; do_blocking_move_to(deploy_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_2 #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE 0.0 #endif - constexpr float deploy_2[] = Z_PROBE_ALLEN_KEY_DEPLOY_2; + constexpr xyz_pos_t deploy_2 = Z_PROBE_ALLEN_KEY_DEPLOY_2; do_blocking_move_to(deploy_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_3 #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE 0.0 #endif - constexpr float deploy_3[] = Z_PROBE_ALLEN_KEY_DEPLOY_3; + constexpr xyz_pos_t deploy_3 = Z_PROBE_ALLEN_KEY_DEPLOY_3; do_blocking_move_to(deploy_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_4 #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE 0.0 #endif - constexpr float deploy_4[] = Z_PROBE_ALLEN_KEY_DEPLOY_4; + constexpr xyz_pos_t deploy_4 = Z_PROBE_ALLEN_KEY_DEPLOY_4; do_blocking_move_to(deploy_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_5 #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE 0.0 #endif - constexpr float deploy_5[] = Z_PROBE_ALLEN_KEY_DEPLOY_5; + constexpr xyz_pos_t deploy_5 = Z_PROBE_ALLEN_KEY_DEPLOY_5; do_blocking_move_to(deploy_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE)); #endif } @@ -197,35 +197,35 @@ float probe_offset[XYZ]; // Initialized by settings.load() #ifndef Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE 0.0 #endif - constexpr float stow_1[] = Z_PROBE_ALLEN_KEY_STOW_1; + constexpr xyz_pos_t stow_1 = Z_PROBE_ALLEN_KEY_STOW_1; do_blocking_move_to(stow_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_STOW_2 #ifndef Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE 0.0 #endif - constexpr float stow_2[] = Z_PROBE_ALLEN_KEY_STOW_2; + constexpr xyz_pos_t stow_2 = Z_PROBE_ALLEN_KEY_STOW_2; do_blocking_move_to(stow_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_STOW_3 #ifndef Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE 0.0 #endif - constexpr float stow_3[] = Z_PROBE_ALLEN_KEY_STOW_3; + constexpr xyz_pos_t stow_3 = Z_PROBE_ALLEN_KEY_STOW_3; do_blocking_move_to(stow_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_STOW_4 #ifndef Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE 0.0 #endif - constexpr float stow_4[] = Z_PROBE_ALLEN_KEY_STOW_4; + constexpr xyz_pos_t stow_4 = Z_PROBE_ALLEN_KEY_STOW_4; do_blocking_move_to(stow_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE)); #endif #ifdef Z_PROBE_ALLEN_KEY_STOW_5 #ifndef Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE 0.0 #endif - constexpr float stow_5[] = Z_PROBE_ALLEN_KEY_STOW_5; + constexpr xyz_pos_t stow_5 = Z_PROBE_ALLEN_KEY_STOW_5; do_blocking_move_to(stow_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE)); #endif } @@ -263,11 +263,11 @@ inline void do_probe_raise(const float z_raise) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("do_probe_raise(", z_raise, ")"); float z_dest = z_raise; - if (probe_offset[Z_AXIS] < 0) z_dest -= probe_offset[Z_AXIS]; + if (probe_offset.z < 0) z_dest -= probe_offset.z; NOMORE(z_dest, Z_MAX_POS); - if (z_dest > current_position[Z_AXIS]) + if (z_dest > current_position.z) do_blocking_move_to_z(z_dest); } @@ -281,7 +281,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { BUZZ(100, 659); BUZZ(100, 698); - PGM_P const ds_str = deploy ? PSTR(MSG_MANUAL_DEPLOY) : PSTR(MSG_MANUAL_STOW); + PGM_P const ds_str = deploy ? GET_TEXT(MSG_MANUAL_DEPLOY) : GET_TEXT(MSG_MANUAL_STOW); ui.return_to_status(); // To display the new status message ui.set_status_P(ds_str, 99); serialprintPGM(ds_str); @@ -293,7 +293,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), PSTR("Continue")); #endif #if ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(PSTR("Stow Probe")); + ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe")); #endif while (wait_for_user) idle(); ui.reset_status(); @@ -384,11 +384,10 @@ bool set_probe_deployed(const bool deploy) { } #endif - const float oldXpos = current_position[X_AXIS], - oldYpos = current_position[Y_AXIS]; + const xy_pos_t old_xy = current_position; #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) - #if USES_Z_MIN_PROBE_ENDSTOP + #if HAS_CUSTOM_PROBE_PIN #define PROBE_STOWED() (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) #else #define PROBE_STOWED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) @@ -407,7 +406,7 @@ bool set_probe_deployed(const bool deploy) { if (PROBE_STOWED() == deploy) { // Unchanged after deploy/stow action? if (IsRunning()) { SERIAL_ERROR_MSG("Z-Probe failed"); - LCD_ALERTMESSAGEPGM("Err: ZPROBE"); + LCD_ALERTMESSAGEPGM_P(PSTR("Err: ZPROBE")); } stop(); return true; @@ -419,7 +418,7 @@ bool set_probe_deployed(const bool deploy) { #endif - do_blocking_move_to(oldXpos, oldYpos, current_position[Z_AXIS]); // return to position before deploy + do_blocking_move_to(old_xy); endstops.enable_z_probe(deploy); return false; } @@ -427,9 +426,9 @@ bool set_probe_deployed(const bool deploy) { #ifdef Z_AFTER_PROBING // After probing move to a preferred Z position void move_z_after_probing() { - if (current_position[Z_AXIS] != Z_AFTER_PROBING) { + if (current_position.z != Z_AFTER_PROBING) { do_blocking_move_to_z(Z_AFTER_PROBING); - current_position[Z_AXIS] = Z_AFTER_PROBING; + current_position.z = Z_AFTER_PROBING; } } #endif @@ -532,7 +531,7 @@ static bool do_probe_move(const float z, const feedRate_t fr_mm_s) { * @brief Probe at the current XY (possibly more than once) to find the bed Z. * * @details Used by probe_at_point to get the bed Z height at the current XY. - * Leaves current_position[Z_AXIS] at the height where the probe triggered. + * Leaves current_position.z at the height where the probe triggered. * * @return The Z position of the bed at the current XY or NAN on error. */ @@ -542,7 +541,7 @@ static float run_z_probe() { // Stop the probe before it goes too low to prevent damage. // If Z isn't known then probe to -10mm. - const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -probe_offset[Z_AXIS] + Z_PROBE_LOW_POINT : -10.0; + const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -probe_offset.z + Z_PROBE_LOW_POINT : -10.0; // Double-probing does a fast probe followed by a slow probe #if TOTAL_PROBING == 2 @@ -556,22 +555,22 @@ static float run_z_probe() { return NAN; } - const float first_probe_z = current_position[Z_AXIS]; + const float first_probe_z = current_position.z; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("1st Probe Z:", first_probe_z); // Raise to give the probe clearance - do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW // If the nozzle is well over the travel height then // move down quickly before doing the slow probe - const float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0 + (probe_offset[Z_AXIS] < 0 ? -probe_offset[Z_AXIS] : 0); - if (current_position[Z_AXIS] > z) { + const float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0 + (probe_offset.z < 0 ? -probe_offset.z : 0); + if (current_position.z > z) { // Probe down fast. If the probe never triggered, raise for probe clearance if (!do_probe_move(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) - do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); } #endif @@ -603,7 +602,7 @@ static float run_z_probe() { backlash.measure_with_probe(); #endif - const float z = current_position[Z_AXIS]; + const float z = current_position.z; #if EXTRA_PROBING // Insert Z measurement into probes[]. Keep it sorted ascending. @@ -654,7 +653,7 @@ static float run_z_probe() { #elif TOTAL_PROBING == 2 - const float z2 = current_position[Z_AXIS]; + const float z2 = current_position.z; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("2nd Probe Z:", z2, " Discrepancy:", first_probe_z - z2); @@ -664,7 +663,7 @@ static float run_z_probe() { #else // Return the single probe result - const float measured_z = current_position[Z_AXIS]; + const float measured_z = current_position.z; #endif @@ -694,20 +693,19 @@ float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_ } // TODO: Adapt for SCARA, where the offset rotates - float nx = rx, ny = ry; + xyz_pos_t npos = { rx, ry }; if (probe_relative) { - if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe - nx -= probe_offset[X_AXIS]; // Get the nozzle position - ny -= probe_offset[Y_AXIS]; + if (!position_is_reachable_by_probe(npos)) return NAN; // The given position is in terms of the probe + npos -= probe_offset; // Get the nozzle position } - else if (!position_is_reachable(nx, ny)) return NAN; // The given position is in terms of the nozzle + else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle - const float nz = + npos.z = #if ENABLED(DELTA) // Move below clip height or xy move will be aborted by do_blocking_move_to - _MIN(current_position[Z_AXIS], delta_clip_start_height) + _MIN(current_position.z, delta_clip_start_height) #else - current_position[Z_AXIS] + current_position.z #endif ; @@ -715,15 +713,15 @@ float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_ feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; // Move the probe to the starting XYZ - do_blocking_move_to(nx, ny, nz); + do_blocking_move_to(npos); float measured_z = NAN; if (!DEPLOY_PROBE()) { - measured_z = run_z_probe() + probe_offset[Z_AXIS]; + measured_z = run_z_probe() + probe_offset.z; const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; if (big_raise || raise_after == PROBE_PT_RAISE) - do_blocking_move_to_z(current_position[Z_AXIS] + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); else if (raise_after == PROBE_PT_STOW) if (STOW_PROBE()) measured_z = NAN; } @@ -738,7 +736,7 @@ float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_ if (isnan(measured_z)) { STOW_PROBE(); - LCD_MESSAGEPGM(MSG_ERR_PROBING_FAILED); + LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); SERIAL_ERROR_MSG(MSG_ERR_PROBING_FAILED); } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index dbdb66e143..ab546b9be8 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -29,9 +29,9 @@ #if HAS_BED_PROBE - constexpr float nozzle_to_probe_offset[XYZ] = NOZZLE_TO_PROBE_OFFSET; + constexpr xyz_pos_t nozzle_to_probe_offset = NOZZLE_TO_PROBE_OFFSET; - extern float probe_offset[XYZ]; + extern xyz_pos_t probe_offset; bool set_probe_deployed(const bool deploy); #ifdef Z_AFTER_PROBING @@ -44,6 +44,9 @@ PROBE_PT_BIG_RAISE // Raise to big clearance after run_z_probe }; float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true); + inline float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true) { + return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative); + } #define DEPLOY_PROBE() set_probe_deployed(true) #define STOW_PROBE() set_probe_deployed(false) #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) @@ -52,7 +55,8 @@ #else - constexpr float probe_offset[XYZ] = { 0 }; + constexpr xyz_pos_t probe_offset{0}; + #define DEPLOY_PROBE() #define STOW_PROBE() @@ -64,7 +68,7 @@ #if IS_KINEMATIC PROBE_X_MIN, MESH_MIN_X #else - (X_MIN_BED) + (MIN_PROBE_EDGE_LEFT), (X_MIN_POS) + probe_offset[X_AXIS] + (X_MIN_BED) + (MIN_PROBE_EDGE_LEFT), (X_MIN_POS) + probe_offset.x #endif ); } @@ -73,7 +77,7 @@ #if IS_KINEMATIC PROBE_X_MAX, MESH_MAX_X #else - (X_MAX_BED) - (MIN_PROBE_EDGE_RIGHT), (X_MAX_POS) + probe_offset[X_AXIS] + (X_MAX_BED) - (MIN_PROBE_EDGE_RIGHT), (X_MAX_POS) + probe_offset.x #endif ); } @@ -82,7 +86,7 @@ #if IS_KINEMATIC PROBE_Y_MIN, MESH_MIN_Y #else - (Y_MIN_BED) + (MIN_PROBE_EDGE_FRONT), (Y_MIN_POS) + probe_offset[Y_AXIS] + (Y_MIN_BED) + (MIN_PROBE_EDGE_FRONT), (Y_MIN_POS) + probe_offset.y #endif ); } @@ -91,7 +95,7 @@ #if IS_KINEMATIC PROBE_Y_MAX, MESH_MAX_Y #else - (Y_MAX_BED) - (MIN_PROBE_EDGE_BACK), (Y_MAX_POS) + probe_offset[Y_AXIS] + (Y_MAX_BED) - (MIN_PROBE_EDGE_BACK), (Y_MAX_POS) + probe_offset.y #endif ); } diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index fe98df46bf..768e311812 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -36,25 +36,25 @@ float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) - current_position[Z_AXIS] = Z_HOME_POS; + current_position.z = Z_HOME_POS; else { /** * SCARA homes XY at the same time */ - float homeposition[XYZ]; + xyz_pos_t homeposition; LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); - // SERIAL_ECHOLNPAIR("homeposition X:", homeposition[X_AXIS], " Y:", homeposition[Y_AXIS]); + // SERIAL_ECHOLNPAIR("homeposition X:", homeposition.x, " Y:", homeposition.y); /** * Get Home position SCARA arm angles using inverse kinematics, * and calculate homing offset using forward kinematics */ inverse_kinematics(homeposition); - forward_kinematics_SCARA(delta[A_AXIS], delta[B_AXIS]); + forward_kinematics_SCARA(delta.a, delta.b); - // SERIAL_ECHOLNPAIR("Cartesian X:", cartes[X_AXIS], " Y:", cartes[Y_AXIS]); + // SERIAL_ECHOLNPAIR("Cartesian X:", cartes.x, " Y:", cartes.y); current_position[axis] = cartes[axis]; @@ -62,8 +62,10 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { } } +static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; + /** - * Morgan SCARA Forward Kinematics. Results in cartes[]. + * Morgan SCARA Forward Kinematics. Results in 'cartes'. * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ @@ -74,8 +76,8 @@ void forward_kinematics_SCARA(const float &a, const float &b) { b_sin = sin(RADIANS(b)) * L2, b_cos = cos(RADIANS(b)) * L2; - cartes[X_AXIS] = a_cos + b_cos + SCARA_OFFSET_X; //theta - cartes[Y_AXIS] = a_sin + b_sin + SCARA_OFFSET_Y; //theta+phi + cartes.set(a_cos + b_cos + scara_offset.x, // theta + a_sin + b_sin + scara_offset.y); // theta+phi /* SERIAL_ECHOLNPAIR( @@ -86,31 +88,32 @@ void forward_kinematics_SCARA(const float &a, const float &b) { " b_sin=", b_sin, " b_cos=", b_cos ); - SERIAL_ECHOLNPAIR(" cartes (X,Y) = "(cartes[X_AXIS], ", ", cartes[Y_AXIS], ")"); + SERIAL_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); //*/ } /** - * Morgan SCARA Inverse Kinematics. Results in delta[]. + * Morgan SCARA Inverse Kinematics. Results in 'delta'. * * See http://forums.reprap.org/read.php?185,283327 * * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ -void inverse_kinematics(const float (&raw)[XYZ]) { +void inverse_kinematics(const xyz_pos_t &raw) { - static float C2, S2, SK1, SK2, THETA, PSI; + float C2, S2, SK1, SK2, THETA, PSI; - float sx = raw[X_AXIS] - SCARA_OFFSET_X, // Translate SCARA to standard X Y - sy = raw[Y_AXIS] - SCARA_OFFSET_Y; // With scaling factor. + // Translate SCARA to standard XY with scaling factor + const xy_pos_t spos = raw - scara_offset; + const float H2 = HYPOT2(spos.x, spos.y); if (L1 == L2) - C2 = HYPOT2(sx, sy) / L1_2_2 - 1; + C2 = H2 / L1_2_2 - 1; else - C2 = (HYPOT2(sx, sy) - (L1_2 + L2_2)) / (2.0 * L1 * L2); + C2 = (H2 - (L1_2 + L2_2)) / (2.0 * L1 * L2); - S2 = SQRT(1 - sq(C2)); + S2 = SQRT(1.0f - sq(C2)); // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End SK1 = L1 + L2 * C2; @@ -119,14 +122,12 @@ void inverse_kinematics(const float (&raw)[XYZ]) { SK2 = L2 * S2; // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(sx, sy); + THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); // Angle of Arm2 PSI = ATAN2(S2, C2); - delta[A_AXIS] = DEGREES(THETA); // theta is support arm angle - delta[B_AXIS] = DEGREES(THETA + PSI); // equal to sub arm angle (inverted motor) - delta[C_AXIS] = raw[Z_AXIS]; + delta.set(DEGREES(THETA), DEGREES(THETA + PSI), raw.z); /* DEBUG_POS("SCARA IK", raw); diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index 3a17cddbfd..cde1d1bcd6 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -36,11 +36,7 @@ float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, void scara_set_axis_is_at_home(const AxisEnum axis); -void inverse_kinematics(const float (&raw)[XYZ]); -FORCE_INLINE void inverse_kinematics(const float (&raw)[XYZE]) { - const float raw_xyz[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; - inverse_kinematics(raw_xyz); -} +void inverse_kinematics(const xyz_pos_t &raw); void forward_kinematics_SCARA(const float &a, const float &b); void scara_report_positions(); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index b806cb1142..c8e51525fe 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -169,10 +169,10 @@ uint8_t Stepper::steps_per_isr; #endif uint8_t Stepper::oversampling_factor; -int32_t Stepper::delta_error[XYZE] = { 0 }; +xyze_long_t Stepper::delta_error{0}; -uint32_t Stepper::advance_dividend[XYZE] = { 0 }, - Stepper::advance_divisor = 0, +xyze_ulong_t Stepper::advance_dividend{0}; +uint32_t Stepper::advance_divisor = 0, Stepper::step_events_completed = 0, // The number of step events executed in the current block Stepper::accelerate_until, // The count at which to stop accelerating Stepper::decelerate_after, // The count at which to start decelerating @@ -218,10 +218,9 @@ int32_t Stepper::ticks_nominal = -1; uint32_t Stepper::acc_step_rate; // needed for deceleration start point #endif -volatile int32_t Stepper::endstops_trigsteps[XYZ]; - -volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; -int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; +xyz_long_t Stepper::endstops_trigsteps; +xyze_long_t Stepper::count_position{0}; +xyze_int8_t Stepper::count_direction{0}; #define DUAL_ENDSTOP_APPLY_STEP(A,V) \ if (separate_multi_axis) { \ @@ -390,20 +389,20 @@ void Stepper::set_directions() { // what e-steppers will step. Likely all. Set all. if (motor_direction(E_AXIS)) { MIXER_STEPPER_LOOP(j) REV_E_DIR(j); - count_direction[E_AXIS] = -1; + count_direction.e = -1; } else { MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - count_direction[E_AXIS] = 1; + count_direction.e = 1; } #else if (motor_direction(E_AXIS)) { REV_E_DIR(stepper_extruder); - count_direction[E_AXIS] = -1; + count_direction.e = -1; } else { NORM_E_DIR(stepper_extruder); - count_direction[E_AXIS] = 1; + count_direction.e = 1; } #endif #endif // !LIN_ADVANCE @@ -1459,15 +1458,15 @@ void Stepper::stepper_pulse_phase_isr() { // Pulse Extruders // Tick the E axis, correct error term and update position #if EITHER(LIN_ADVANCE, MIXING_EXTRUDER) - delta_error[E_AXIS] += advance_dividend[E_AXIS]; - if (delta_error[E_AXIS] >= 0) { - count_position[E_AXIS] += count_direction[E_AXIS]; + delta_error.e += advance_dividend.e; + if (delta_error.e >= 0) { + count_position.e += count_direction.e; #if ENABLED(LIN_ADVANCE) - delta_error[E_AXIS] -= advance_divisor; + delta_error.e -= advance_divisor; // Don't step E here - But remember the number of steps to perform motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; #else // !LIN_ADVANCE && MIXING_EXTRUDER - // Don't adjust delta_error[E_AXIS] here! + // Don't adjust delta_error.e here! // Being positive is the criteria for ending the pulse. E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); #endif @@ -1504,8 +1503,8 @@ void Stepper::stepper_pulse_phase_isr() { #if DISABLED(LIN_ADVANCE) #if ENABLED(MIXING_EXTRUDER) - if (delta_error[E_AXIS] >= 0) { - delta_error[E_AXIS] -= advance_divisor; + if (delta_error.e >= 0) { + delta_error.e -= advance_divisor; E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN); } #else // !MIXING_EXTRUDER @@ -1660,10 +1659,7 @@ uint32_t Stepper::stepper_block_phase_isr() { // Sync block? Sync the stepper counts and return while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { - _set_position( - current_block->position[A_AXIS], current_block->position[B_AXIS], - current_block->position[C_AXIS], current_block->position[E_AXIS] - ); + _set_position(current_block->position); planner.discard_current_block(); // Try to get a new block @@ -1671,6 +1667,10 @@ uint32_t Stepper::stepper_block_phase_isr() { return interval; // No more queued movements! } + #if HAS_CUTTER + cutter.apply_power(current_block->cutter_power); + #endif + #if ENABLED(POWER_LOSS_RECOVERY) recovery.info.sdpos = current_block->sdpos; #endif @@ -1698,7 +1698,7 @@ uint32_t Stepper::stepper_block_phase_isr() { #endif #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) X_CMP D_(2)) ) #else - #define X_MOVE_TEST !!current_block->steps[A_AXIS] + #define X_MOVE_TEST !!current_block->steps.a #endif #if CORE_IS_XY || CORE_IS_YZ @@ -1716,7 +1716,7 @@ uint32_t Stepper::stepper_block_phase_isr() { #endif #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Y_CMP D_(2)) ) #else - #define Y_MOVE_TEST !!current_block->steps[B_AXIS] + #define Y_MOVE_TEST !!current_block->steps.b #endif #if CORE_IS_XZ || CORE_IS_YZ @@ -1734,17 +1734,17 @@ uint32_t Stepper::stepper_block_phase_isr() { #endif #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Z_CMP D_(2)) ) #else - #define Z_MOVE_TEST !!current_block->steps[C_AXIS] + #define Z_MOVE_TEST !!current_block->steps.c #endif uint8_t axis_bits = 0; if (X_MOVE_TEST) SBI(axis_bits, A_AXIS); if (Y_MOVE_TEST) SBI(axis_bits, B_AXIS); if (Z_MOVE_TEST) SBI(axis_bits, C_AXIS); - //if (!!current_block->steps[E_AXIS]) SBI(axis_bits, E_AXIS); - //if (!!current_block->steps[A_AXIS]) SBI(axis_bits, X_HEAD); - //if (!!current_block->steps[B_AXIS]) SBI(axis_bits, Y_HEAD); - //if (!!current_block->steps[C_AXIS]) SBI(axis_bits, Z_HEAD); + //if (!!current_block->steps.e) SBI(axis_bits, E_AXIS); + //if (!!current_block->steps.a) SBI(axis_bits, X_HEAD); + //if (!!current_block->steps.b) SBI(axis_bits, Y_HEAD); + //if (!!current_block->steps.c) SBI(axis_bits, Z_HEAD); axis_did_move = axis_bits; // No acceleration / deceleration time elapsed so far @@ -1767,15 +1767,10 @@ uint32_t Stepper::stepper_block_phase_isr() { step_event_count = current_block->step_event_count << oversampling; // Initialize Bresenham delta errors to 1/2 - delta_error[X_AXIS] = delta_error[Y_AXIS] = delta_error[Z_AXIS] = delta_error[E_AXIS] = -int32_t(step_event_count); + delta_error = -int32_t(step_event_count); - // Calculate Bresenham dividends - advance_dividend[X_AXIS] = current_block->steps[X_AXIS] << 1; - advance_dividend[Y_AXIS] = current_block->steps[Y_AXIS] << 1; - advance_dividend[Z_AXIS] = current_block->steps[Z_AXIS] << 1; - advance_dividend[E_AXIS] = current_block->steps[E_AXIS] << 1; - - // Calculate Bresenham divisor + // Calculate Bresenham dividends and divisors + advance_dividend = current_block->steps << 1; advance_divisor = step_event_count << 1; // No step events completed so far @@ -1840,7 +1835,7 @@ uint32_t Stepper::stepper_block_phase_isr() { // If delayed Z enable, enable it now. This option will severely interfere with // timing between pulses when chaining motion between blocks, and it could lead // to lost steps in both X and Y axis, so avoid using it unless strictly necessary!! - if (current_block->steps[Z_AXIS]) enable_Z(); + if (current_block->steps.z) enable_Z(); #endif // Mark the time_nominal as not calculated yet @@ -2195,26 +2190,18 @@ void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c #if CORE_IS_XY // corexy positioning // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html - count_position[A_AXIS] = a + b; - count_position[B_AXIS] = CORESIGN(a - b); - count_position[Z_AXIS] = c; + count_position.set(a + b, CORESIGN(a - b), c); #elif CORE_IS_XZ // corexz planning - count_position[A_AXIS] = a + c; - count_position[Y_AXIS] = b; - count_position[C_AXIS] = CORESIGN(a - c); + count_position.set(a + c, b, CORESIGN(a - c)); #elif CORE_IS_YZ // coreyz planning - count_position[X_AXIS] = a; - count_position[B_AXIS] = b + c; - count_position[C_AXIS] = CORESIGN(b - c); + count_position.set(a, b + c, CORESIGN(b - c)); #else // default non-h-bot planning - count_position[X_AXIS] = a; - count_position[Y_AXIS] = b; - count_position[Z_AXIS] = c; + count_position.set(a, b, c); #endif - count_position[E_AXIS] = e; + count_position.e = e; } /** @@ -2290,36 +2277,22 @@ void Stepper::report_positions() { if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); #endif - const int32_t xpos = count_position[X_AXIS], - ypos = count_position[Y_AXIS], - zpos = count_position[Z_AXIS]; + const xyz_long_t pos = count_position; #ifdef __AVR__ if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); #endif #if CORE_IS_XY || CORE_IS_XZ || ENABLED(DELTA) || IS_SCARA - SERIAL_ECHOPGM(MSG_COUNT_A); + SERIAL_ECHOPAIR(MSG_COUNT_A, pos.x, " B:", pos.y); #else - SERIAL_ECHOPGM(MSG_COUNT_X); + SERIAL_ECHOPAIR(MSG_COUNT_X, pos.x, " Y:", pos.y); #endif - SERIAL_ECHO(xpos); - - #if CORE_IS_XY || CORE_IS_YZ || ENABLED(DELTA) || IS_SCARA - SERIAL_ECHOPGM(" B:"); - #else - SERIAL_ECHOPGM(" Y:"); - #endif - SERIAL_ECHO(ypos); - #if CORE_IS_XZ || CORE_IS_YZ || ENABLED(DELTA) - SERIAL_ECHOPGM(" C:"); + SERIAL_ECHOLNPAIR(" C:", pos.z); #else - SERIAL_ECHOPGM(" Z:"); + SERIAL_ECHOLNPAIR(" Z:", pos.z); #endif - SERIAL_ECHO(zpos); - - SERIAL_EOL(); } #if ENABLED(BABYSTEPPING) @@ -2611,9 +2584,9 @@ void Stepper::report_positions() { #endif -#else +#else // PRINTRBOARD_G2 - #include "../HAL/HAL_DUE/G2_PWM.h" + #include HAL_PATH(../HAL, fastio/G2_PWM.h) #endif diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index d098dd4484..1ab455bd06 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -278,9 +278,9 @@ class Stepper { #endif // Delta error variables for the Bresenham line tracer - static int32_t delta_error[XYZE]; - static uint32_t advance_dividend[XYZE], - advance_divisor, + static xyze_long_t delta_error; + static xyze_ulong_t advance_dividend; + static uint32_t advance_divisor, step_events_completed, // The number of step events executed in the current block accelerate_until, // The point from where we need to stop acceleration decelerate_after, // The point from where we need to start decelerating @@ -320,24 +320,24 @@ class Stepper { // // Exact steps at which an endstop was triggered // - static volatile int32_t endstops_trigsteps[XYZ]; + static xyz_long_t endstops_trigsteps; // // Positions of stepper motors, in step units // - static volatile int32_t count_position[NUM_AXIS]; + static xyze_long_t count_position; // // Current direction of stepper motors (+1 or -1) // - static int8_t count_direction[NUM_AXIS]; + static xyze_int8_t count_direction; public: // // Constructor / initializer // - Stepper() { }; + Stepper() {}; // Initialize stepper hardware static void init(); @@ -382,13 +382,11 @@ class Stepper { // The extruder associated to the last movement FORCE_INLINE static uint8_t movement_extruder() { - return - #if ENABLED(MIXING_EXTRUDER) || EXTRUDERS < 2 - 0 - #else - last_moved_extruder + return (0 + #if EXTRUDERS > 1 && DISABLED(MIXING_EXTRUDER) + + last_moved_extruder #endif - ; + ); } // Handle a triggered endstop @@ -443,8 +441,9 @@ class Stepper { _set_position(a, b, c, e); if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); } + static inline void set_position(const xyze_long_t &abce) { set_position(abce.a, abce.b, abce.c, abce.e); } - static inline void set_position(const AxisEnum a, const int32_t &v) { + static inline void set_axis_position(const AxisEnum a, const int32_t &v) { planner.synchronize(); #ifdef __AVR__ @@ -469,6 +468,7 @@ class Stepper { // Set the current position in steps static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); + FORCE_INLINE static void _set_position(const abce_long_t &spos) { _set_position(spos.a, spos.b, spos.c, spos.e); } FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t scale, uint8_t* loops) { uint32_t timer; diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index a0910204e6..08a13c17aa 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -44,9 +44,9 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; // AI = Axis Enum Index // SWHW = SW/SH UART selection #if ENABLED(TMC_USE_SW_SPI) - #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK) + #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK, ST##_CHAIN_POS) #else - #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_RSENSE) + #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_RSENSE, ST##_CHAIN_POS) #endif #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(&ST##_HARDWARE_SERIAL, ST##_RSENSE, ST##_SLAVE_ADDRESS) @@ -653,93 +653,6 @@ void reset_trinamic_drivers() { #endif }; - #if TMC_USE_CHAIN - - enum TMC_axis_enum : unsigned char { _, X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5 }; - #define __TMC_CHAIN(Q,V) do{ stepper##Q.set_chain_info(Q,V); }while(0) - #define _TMC_CHAIN(Q) __TMC_CHAIN(Q, Q##_CHAIN_POS) - - #if AXIS_HAS_SPI(X) // First set chain array to uninitialized - __TMC_CHAIN(X, 0); - #endif - #if AXIS_HAS_SPI(X2) - __TMC_CHAIN(X2, 0); - #endif - #if AXIS_HAS_SPI(Y) - __TMC_CHAIN(Y, 0); - #endif - #if AXIS_HAS_SPI(Y2) - __TMC_CHAIN(Y2, 0); - #endif - #if AXIS_HAS_SPI(Z) - __TMC_CHAIN(Z, 0); - #endif - #if AXIS_HAS_SPI(Z2) - __TMC_CHAIN(Z2, 0); - #endif - #if AXIS_HAS_SPI(Z3) - __TMC_CHAIN(Z3, 0); - #endif - #if AXIS_HAS_SPI(E0) - __TMC_CHAIN(E0, 0); - #endif - #if AXIS_HAS_SPI(E1) - __TMC_CHAIN(E1, 0); - #endif - #if AXIS_HAS_SPI(E2) - __TMC_CHAIN(E2, 0); - #endif - #if AXIS_HAS_SPI(E3) - __TMC_CHAIN(E3, 0); - #endif - #if AXIS_HAS_SPI(E4) - __TMC_CHAIN(E4, 0); - #endif - #if AXIS_HAS_SPI(E5) - __TMC_CHAIN(E5, 0); - #endif - - #if AXIS_HAS_SPI(X) && X_CHAIN_POS // Now set up the SPI chain - _TMC_CHAIN(X); - #endif - #if AXIS_HAS_SPI(X2) && X2_CHAIN_POS - _TMC_CHAIN(X2); - #endif - #if AXIS_HAS_SPI(Y) && Y_CHAIN_POS - _TMC_CHAIN(Y); - #endif - #if AXIS_HAS_SPI(Y2) && Y2_CHAIN_POS - _TMC_CHAIN(Y2); - #endif - #if AXIS_HAS_SPI(Z) && Z_CHAIN_POS - _TMC_CHAIN(Z); - #endif - #if AXIS_HAS_SPI(Z2) && Z2_CHAIN_POS - _TMC_CHAIN(Z2); - #endif - #if AXIS_HAS_SPI(Z3) && Z3_CHAIN_POS - _TMC_CHAIN(Z3); - #endif - #if AXIS_HAS_SPI(E0) && E0_CHAIN_POS - _TMC_CHAIN(E0); - #endif - #if AXIS_HAS_SPI(E1) && E1_CHAIN_POS - _TMC_CHAIN(E1); - #endif - #if AXIS_HAS_SPI(E2) && E2_CHAIN_POS - _TMC_CHAIN(E2); - #endif - #if AXIS_HAS_SPI(E3) && E3_CHAIN_POS - _TMC_CHAIN(E3); - #endif - #if AXIS_HAS_SPI(E4) && E4_CHAIN_POS - _TMC_CHAIN(E4); - #endif - #if AXIS_HAS_SPI(E5) && E5_CHAIN_POS - _TMC_CHAIN(E5); - #endif - #endif // TMC_USE_CHAIN - #if AXIS_IS_TMC(X) _TMC_INIT(X, STEALTH_AXIS_XY); #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d637b68d7b..c33efb4030 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -94,17 +94,17 @@ Temperature thermalManager; */ #if HAS_HEATED_BED - #define _BED_PSTR(M,E) (E) == H_BED ? PSTR(M) : + #define _BED_PSTR(h) (h) == H_BED ? GET_TEXT(MSG_BED) : #else - #define _BED_PSTR(M,E) + #define _BED_PSTR(h) #endif #if HAS_HEATED_CHAMBER - #define _CHAMBER_PSTR(M,E) (E) == H_CHAMBER ? PSTR(M) : + #define _CHAMBER_PSTR(h) (h) == H_CHAMBER ? GET_TEXT(MSG_CHAMBER) : #else - #define _CHAMBER_PSTR(M,E) + #define _CHAMBER_PSTR(h) #endif -#define _E_PSTR(M,E,N) ((HOTENDS) >= (N) && (E) == (N)-1) ? PSTR(MSG_E##N " " M) : -#define TEMP_ERR_PSTR(M,E) _BED_PSTR(M##_BED,E) _CHAMBER_PSTR(M##_CHAMBER,E) _E_PSTR(M,E,2) _E_PSTR(M,E,3) _E_PSTR(M,E,4) _E_PSTR(M,E,5) _E_PSTR(M,E,6) PSTR(MSG_E1 " " M) +#define _E_PSTR(h,N) ((HOTENDS) > N && (h) == N) ? PSTR(LCD_STR_E##N) : +#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) // public: @@ -157,18 +157,6 @@ Temperature thermalManager; uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128); #endif - #if HAS_LCD_MENU - - uint8_t Temperature::lcd_tmpfan_speed[ - #if ENABLED(SINGLENOZZLE) - _MAX(EXTRUDERS, FAN_COUNT) - #else - FAN_COUNT - #endif - ]; // = { 0 } - - #endif - /** * Set the print fan speed for a target extruder */ @@ -187,9 +175,6 @@ Temperature thermalManager; if (target >= FAN_COUNT) return; fan_speed[target] = speed; - #if HAS_LCD_MENU - lcd_tmpfan_speed[target] = speed; - #endif } #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) @@ -389,7 +374,7 @@ volatile bool Temperature::temp_meas_ready = false; next_auto_fan_check_ms = next_temp_ms + 2500UL; #endif - if (target > GHV(BED_MAXTEMP, temp_range[heater].maxtemp) - 15) { + if (target > GHV(BED_MAXTEMP - 10, temp_range[heater].maxtemp - 15)) { SERIAL_ECHOLNPGM(MSG_PID_TEMP_TOO_HIGH); return; } @@ -533,10 +518,10 @@ volatile bool Temperature::temp_meas_ready = false; if (current_temp > watch_temp_target) heated = true; // - Flag if target temperature reached } else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired - _temp_error(heater, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, heater)); + _temp_error(heater, PSTR(MSG_T_HEATING_FAILED), GET_TEXT(MSG_HEATING_FAILED_LCD)); } else if (current_temp < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? - _temp_error(heater, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, heater)); + _temp_error(heater, PSTR(MSG_T_THERMAL_RUNAWAY), GET_TEXT(MSG_THERMAL_RUNAWAY)); } #endif } // every 2 seconds @@ -636,45 +621,34 @@ int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) { } } +#define _EFANOVERLAP(A,B) _FANOVERLAP(E##A,B) + #if HAS_AUTO_FAN - #define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_3_IS_0 (E3_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_3_IS_1 (E3_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_3_IS_2 (E3_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_4_IS_0 (E4_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) - #define AUTO_5_IS_0 (E5_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_5_IS_1 (E5_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_5_IS_2 (E5_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_5_IS_3 (E5_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) - #define AUTO_5_IS_4 (E5_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) #define CHAMBER_FAN_INDEX HOTENDS void Temperature::checkExtruderAutoFans() { + #define _EFAN(A,B) _EFANOVERLAP(A,B) ? B : static const uint8_t fanBit[] PROGMEM = { 0 #if HOTENDS > 1 - , AUTO_1_IS_0 ? 0 : 1 + , _EFAN(1,0) 1 #endif #if HOTENDS > 2 - , AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2 + , _EFAN(2,0) _EFAN(2,1) 2 #endif #if HOTENDS > 3 - , AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3, + , _EFAN(3,0) _EFAN(3,1) _EFAN(3,2) 3 #endif #if HOTENDS > 4 - , AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4, + , _EFAN(4,0) _EFAN(4,1) _EFAN(4,2) _EFAN(4,3) 4 #endif #if HOTENDS > 5 - , AUTO_5_IS_0 ? 0 : AUTO_5_IS_1 ? 1 : AUTO_5_IS_2 ? 2 : AUTO_5_IS_3 ? 3 : AUTO_5_IS_4 ? 4 : 5 + , _EFAN(5,0) _EFAN(5,1) _EFAN(5,2) _EFAN(5,3) _EFAN(5,4) 5 #endif #if HAS_AUTO_CHAMBER_FAN - , AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : AUTO_CHAMBER_IS_5 ? 5 : 6 + #define _CFAN(B) _FANOVERLAP(CHAMBER,B) ? B : + , _CFAN(0) _CFAN(1) _CFAN(2) _CFAN(3) _CFAN(4) _CFAN(5) 6 #endif }; uint8_t fanState = 0; @@ -746,7 +720,7 @@ int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) { // Temperature Error Handlers // -inline void loud_kill(PGM_P const lcd_msg) { +inline void loud_kill(PGM_P const lcd_msg, const heater_ind_t heater) { Running = false; #if USE_BEEPER for (uint8_t i = 20; i--;) { @@ -755,7 +729,7 @@ inline void loud_kill(PGM_P const lcd_msg) { } WRITE(BEEPER_PIN, HIGH); #endif - kill(lcd_msg); + kill(lcd_msg, HEATER_PSTR(heater)); } void Temperature::_temp_error(const heater_ind_t heater, PGM_P const serial_msg, PGM_P const lcd_msg) { @@ -792,34 +766,28 @@ void Temperature::_temp_error(const heater_ind_t heater, PGM_P const serial_msg, if (ELAPSED(ms, expire_ms)) ++killed; break; case 2: - loud_kill(lcd_msg); + loud_kill(lcd_msg1, heater); ++killed; break; } #elif defined(BOGUS_TEMPERATURE_GRACE_PERIOD) UNUSED(killed); #else - if (!killed) { killed = 1; loud_kill(lcd_msg); } + if (!killed) { killed = 1; loud_kill(lcd_msg, heater); } #endif } void Temperature::max_temp_error(const heater_ind_t heater) { - _temp_error(heater, PSTR(MSG_T_MAXTEMP), TEMP_ERR_PSTR(MSG_ERR_MAXTEMP, heater)); + _temp_error(heater, PSTR(MSG_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); } void Temperature::min_temp_error(const heater_ind_t heater) { - _temp_error(heater, PSTR(MSG_T_MINTEMP), TEMP_ERR_PSTR(MSG_ERR_MINTEMP, heater)); + _temp_error(heater, PSTR(MSG_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); } #if HOTENDS - float Temperature::get_pid_output_hotend(const uint8_t e) { - #if HOTENDS == 1 - #define _HOTEND_TEST true - #else - #define _HOTEND_TEST (e == active_extruder) - #endif - E_UNUSED(); + float Temperature::get_pid_output_hotend(const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; #if ENABLED(PIDTEMP) #if DISABLED(PID_OPENLOOP) @@ -860,8 +828,13 @@ void Temperature::min_temp_error(const heater_ind_t heater) { pid_output = work_pid[ee].Kp + work_pid[ee].Ki + work_pid[ee].Kd + float(MIN_POWER); #if ENABLED(PID_EXTRUSION_SCALING) + #if HOTENDS == 1 + constexpr bool this_hotend = true; + #else + const bool this_hotend = (ee == active_extruder); + #endif work_pid[ee].Kc = 0; - if (_HOTEND_TEST) { + if (this_hotend) { const long e_position = stepper.position(E_AXIS); if (e_position > last_e_position) { lpq[lpq_ptr] = e_position - last_e_position; @@ -887,7 +860,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { #endif // PID_OPENLOOP #if ENABLED(PID_DEBUG) - if (e == active_extruder) { + if (ee == active_extruder) { SERIAL_ECHO_START(); SERIAL_ECHOPAIR( MSG_PID_DEBUG, ee, @@ -895,6 +868,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { MSG_PID_DEBUG_OUTPUT, pid_output ); #if DISABLED(PID_OPENLOOP) + { SERIAL_ECHOPAIR( MSG_PID_DEBUG_PTERM, work_pid[ee].Kp, MSG_PID_DEBUG_ITERM, work_pid[ee].Ki, @@ -903,6 +877,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { , MSG_PID_DEBUG_CTERM, work_pid[ee].Kc #endif ); + } #endif SERIAL_EOL(); } @@ -911,12 +886,11 @@ void Temperature::min_temp_error(const heater_ind_t heater) { #else // No PID enabled #if HEATER_IDLE_HANDLER - #define _TIMED_OUT_TEST hotend_idle[ee].timed_out + const bool is_idling = hotend_idle[ee].timed_out; #else - #define _TIMED_OUT_TEST false + constexpr bool is_idling = false; #endif - const float pid_output = (!_TIMED_OUT_TEST && temp_hotend[ee].celsius < temp_hotend[ee].target) ? BANG_MAX : 0; - #undef _TIMED_OUT_TEST + const float pid_output = (!is_idling && temp_hotend[ee].celsius < temp_hotend[ee].target) ? BANG_MAX : 0; #endif @@ -943,7 +917,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { pid_reset = true; } else if (pid_error > PID_FUNCTIONAL_RANGE) { - pid_output = BANG_MAX; + pid_output = MAX_BED_POWER; pid_reset = true; } else { @@ -971,6 +945,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { #endif // PID_OPENLOOP #if ENABLED(PID_BED_DEBUG) + { SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR( " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, @@ -980,6 +955,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { MSG_PID_DEBUG_DTERM, work_pid.Kd, #endif ); + } #endif return pid_output; @@ -1000,7 +976,7 @@ void Temperature::manage_heater() { #if EARLY_WATCHDOG // If thermal manager is still not running, make sure to at least reset the watchdog! - if (!inited) return watchdog_reset(); + if (!inited) return watchdog_refresh(); #endif #if BOTH(PROBING_HEATERS_OFF, BED_LIMIT_SWITCHING) @@ -1032,7 +1008,7 @@ void Temperature::manage_heater() { HOTEND_LOOP() { #if ENABLED(THERMAL_PROTECTION_HOTENDS) if (degHotend(e) > temp_range[e].maxtemp) - _temp_error((heater_ind_t)e, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, e)); + _temp_error((heater_ind_t)e, PSTR(MSG_T_THERMAL_RUNAWAY), GET_TEXT(MSG_THERMAL_RUNAWAY)); #endif #if HEATER_IDLE_HANDLER @@ -1050,7 +1026,7 @@ void Temperature::manage_heater() { // Make sure temperature is increasing if (watch_hotend[e].next_ms && ELAPSED(ms, watch_hotend[e].next_ms)) { // Time to check this extruder? if (degHotend(e) < watch_hotend[e].target) // Failed to increase enough? - _temp_error((heater_ind_t)e, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, e)); + _temp_error((heater_ind_t)e, PSTR(MSG_T_HEATING_FAILED), GET_TEXT(MSG_HEATING_FAILED_LCD)); else // Start again if the target is still far off start_watching_hotend(e); } @@ -1059,7 +1035,7 @@ void Temperature::manage_heater() { #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) // Make sure measured temperatures are close together if (ABS(temp_hotend[0].celsius - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) - _temp_error(H_E0, PSTR(MSG_REDUNDANCY), PSTR(MSG_ERR_REDUNDANT_TEMP)); + _temp_error(H_E0, PSTR(MSG_REDUNDANCY), GET_TEXT(MSG_ERR_REDUNDANT_TEMP)); #endif } // HOTEND_LOOP @@ -1085,14 +1061,14 @@ void Temperature::manage_heater() { #if ENABLED(THERMAL_PROTECTION_BED) if (degBed() > BED_MAXTEMP) - _temp_error(H_BED, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, H_BED)); + _temp_error(H_BED, PSTR(MSG_T_THERMAL_RUNAWAY), GET_TEXT(MSG_THERMAL_RUNAWAY)); #endif #if WATCH_BED // Make sure temperature is increasing if (watch_bed.elapsed(ms)) { // Time to check the bed? if (degBed() < watch_bed.target) // Failed to increase enough? - _temp_error(H_BED, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, H_BED)); + _temp_error(H_BED, PSTR(MSG_T_HEATING_FAILED), GET_TEXT(MSG_HEATING_FAILED_LCD)); else // Start again if the target is still far off start_watching_bed(); } @@ -1163,14 +1139,14 @@ void Temperature::manage_heater() { #if ENABLED(THERMAL_PROTECTION_CHAMBER) if (degChamber() > CHAMBER_MAXTEMP) - _temp_error(H_CHAMBER, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, H_CHAMBER)); + _temp_error(H_CHAMBER, PSTR(MSG_T_THERMAL_RUNAWAY), GET_TEXT(MSG_THERMAL_RUNAWAY)); #endif #if WATCH_CHAMBER // Make sure temperature is increasing if (watch_chamber.elapsed(ms)) { // Time to check the chamber? if (degChamber() < watch_chamber.target) // Failed to increase enough? - _temp_error(H_CHAMBER, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, H_CHAMBER)); + _temp_error(H_CHAMBER, PSTR(MSG_T_HEATING_FAILED), GET_TEXT(MSG_HEATING_FAILED_LCD)); else start_watching_chamber(); // Start again if the target is still far off } @@ -1518,10 +1494,8 @@ void Temperature::updateTemperaturesFromRawValues() { filwidth.update_measured_mm(); #endif - #if ENABLED(USE_WATCHDOG) - // Reset the watchdog after we know we have a temperature measurement. - watchdog_reset(); - #endif + // Reset the watchdog on good temperature measurement + watchdog_refresh(); temp_meas_ready = false; } @@ -1700,19 +1674,19 @@ void Temperature::init() { #if HAS_AUTO_FAN_0 INIT_E_AUTO_FAN_PIN(E0_AUTO_FAN_PIN); #endif - #if HAS_AUTO_FAN_1 && !AUTO_1_IS_0 + #if HAS_AUTO_FAN_1 && !_EFANOVERLAP(1,0) INIT_E_AUTO_FAN_PIN(E1_AUTO_FAN_PIN); #endif - #if HAS_AUTO_FAN_2 && !(AUTO_2_IS_0 || AUTO_2_IS_1) + #if HAS_AUTO_FAN_2 && !(_EFANOVERLAP(2,0) || _EFANOVERLAP(2,1)) INIT_E_AUTO_FAN_PIN(E2_AUTO_FAN_PIN); #endif - #if HAS_AUTO_FAN_3 && !(AUTO_3_IS_0 || AUTO_3_IS_1 || AUTO_3_IS_2) + #if HAS_AUTO_FAN_3 && !(_EFANOVERLAP(3,0) || _EFANOVERLAP(3,1) || _EFANOVERLAP(3,2)) INIT_E_AUTO_FAN_PIN(E3_AUTO_FAN_PIN); #endif - #if HAS_AUTO_FAN_4 && !(AUTO_4_IS_0 || AUTO_4_IS_1 || AUTO_4_IS_2 || AUTO_4_IS_3) + #if HAS_AUTO_FAN_4 && !(_EFANOVERLAP(4,0) || _EFANOVERLAP(4,1) || _EFANOVERLAP(4,2) || _EFANOVERLAP(4,3)) INIT_E_AUTO_FAN_PIN(E4_AUTO_FAN_PIN); #endif - #if HAS_AUTO_FAN_5 && !(AUTO_5_IS_0 || AUTO_5_IS_1 || AUTO_5_IS_2 || AUTO_5_IS_3 || AUTO_5_IS_4) + #if HAS_AUTO_FAN_5 && !(_EFANOVERLAP(5,0) || _EFANOVERLAP(5,1) || _EFANOVERLAP(5,2) || _EFANOVERLAP(5,3) || _EFANOVERLAP(5,4)) INIT_E_AUTO_FAN_PIN(E5_AUTO_FAN_PIN); #endif #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E @@ -1813,8 +1787,7 @@ void Temperature::init() { * their target temperature by a configurable margin. * This is called when the temperature is set. (M104, M109) */ - void Temperature::start_watching_hotend(const uint8_t e) { - E_UNUSED(); + void Temperature::start_watching_hotend(const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; if (degTargetHotend(ee) && degHotend(ee) < degTargetHotend(ee) - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1)) { watch_hotend[ee].target = degHotend(ee) + WATCH_TEMP_INCREASE; @@ -1944,7 +1917,7 @@ void Temperature::init() { sm.state = TRRunaway; case TRRunaway: - _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, heater_id)); + _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), GET_TEXT(MSG_THERMAL_RUNAWAY)); } } @@ -2939,7 +2912,7 @@ void Temperature::isr() { #else PSTR("E " S_FMT) #endif - , heating ? PSTR(MSG_HEATING) : PSTR(MSG_COOLING) + , heating ? GET_TEXT(MSG_HEATING) : GET_TEXT(MSG_COOLING) ); } #endif @@ -3187,7 +3160,7 @@ void Temperature::isr() { #endif // HAS_HEATED_BED - #if 0 && HAS_HEATED_CHAMBER + #if HAS_HEATED_CHAMBER #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER #define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50 diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 63251cd40f..c294325d9b 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -39,10 +39,10 @@ #if HOTENDS <= 1 #define HOTEND_INDEX 0 - #define E_UNUSED() UNUSED(e) + #define E_NAME #else #define HOTEND_INDEX e - #define E_UNUSED() + #define E_NAME e #endif // Identifiers for other heaters @@ -304,17 +304,15 @@ class Temperature { static bool allow_cold_extrude; static int16_t extrude_min_temp; FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp; } - FORCE_INLINE static bool tooColdToExtrude(const uint8_t e) { - E_UNUSED(); + FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t e) { - E_UNUSED(); + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t E_NAME) { return tooCold(degTargetHotend(HOTEND_INDEX)); } #else - FORCE_INLINE static bool tooColdToExtrude(const uint8_t e) { UNUSED(e); return false; } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t e) { UNUSED(e); return false; } + FORCE_INLINE static bool tooColdToExtrude(const uint8_t) { return false; } + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t) { return false; } #endif FORCE_INLINE static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } @@ -478,12 +476,16 @@ class Temperature { #if ENABLED(ADAPTIVE_FAN_SLOWING) static uint8_t fan_speed_scaler[FAN_COUNT]; - #else - static constexpr uint8_t fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128); #endif static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { - return (fs * uint16_t(fan_speed_scaler[target])) >> 7; + return (fs * uint16_t( + #if ENABLED(ADAPTIVE_FAN_SLOWING) + fan_speed_scaler[target] + #else + 128 + #endif + )) >> 7; } static inline uint8_t scaledFanSpeed(const uint8_t target) { @@ -495,30 +497,6 @@ class Temperature { static void set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp); #endif - #if HAS_LCD_MENU - - static uint8_t lcd_tmpfan_speed[ - #if ENABLED(SINGLENOZZLE) - _MAX(EXTRUDERS, FAN_COUNT) - #else - FAN_COUNT - #endif - ]; - - static inline void lcd_setFanSpeed(const uint8_t target) { set_fan_speed(target, lcd_tmpfan_speed[target]); } - - #if HAS_FAN0 - FORCE_INLINE static void lcd_setFanSpeed0() { lcd_setFanSpeed(0); } - #endif - #if HAS_FAN1 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 1) - FORCE_INLINE static void lcd_setFanSpeed1() { lcd_setFanSpeed(1); } - #endif - #if HAS_FAN2 || (ENABLED(SINGLENOZZLE) && EXTRUDERS > 2) - FORCE_INLINE static void lcd_setFanSpeed2() { lcd_setFanSpeed(2); } - #endif - - #endif // HAS_LCD_MENU - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) void set_fans_paused(const bool p); #endif @@ -546,16 +524,13 @@ class Temperature { * Preheating hotends */ #ifdef MILLISECONDS_PREHEAT_TIME - static bool is_preheating(const uint8_t e) { - E_UNUSED(); + static bool is_preheating(const uint8_t E_NAME) { return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]); } - static void start_preheat_time(const uint8_t e) { - E_UNUSED(); + static void start_preheat_time(const uint8_t E_NAME) { preheat_end_time[HOTEND_INDEX] = millis() + MILLISECONDS_PREHEAT_TIME; } - static void reset_preheat_time(const uint8_t e) { - E_UNUSED(); + static void reset_preheat_time(const uint8_t E_NAME) { preheat_end_time[HOTEND_INDEX] = 0; } #else @@ -566,54 +541,41 @@ class Temperature { //inline so that there is no performance decrease. //deg=degreeCelsius - FORCE_INLINE static float degHotend(const uint8_t e) { - E_UNUSED(); - #if HOTENDS - return temp_hotend[HOTEND_INDEX].celsius; - #else - return 0; - #endif + FORCE_INLINE static float degHotend(const uint8_t E_NAME) { + return (0 + #if HOTENDS + + temp_hotend[HOTEND_INDEX].celsius + #endif + ); } #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawHotendTemp(const uint8_t e) { - E_UNUSED(); - #if HOTENDS - return temp_hotend[HOTEND_INDEX].raw; - #else - return 0; - #endif + FORCE_INLINE static int16_t rawHotendTemp(const uint8_t E_NAME) { + return (0 + #if HOTENDS + + temp_hotend[HOTEND_INDEX].raw + #endif + ); } #endif - FORCE_INLINE static int16_t degTargetHotend(const uint8_t e) { - E_UNUSED(); - #if HOTENDS - return temp_hotend[HOTEND_INDEX].target; - #else - return 0; - #endif + FORCE_INLINE static int16_t degTargetHotend(const uint8_t E_NAME) { + return (0 + #if HOTENDS + + temp_hotend[HOTEND_INDEX].target + #endif + ); } #if WATCH_HOTENDS static void start_watching_hotend(const uint8_t e=0); #else - static inline void start_watching_hotend(const uint8_t e=0) { UNUSED(e); } + static inline void start_watching_hotend(const uint8_t=0) {} #endif #if HOTENDS - #if HAS_LCD_MENU - static inline void start_watching_E0() { start_watching_hotend(0); } - static inline void start_watching_E1() { start_watching_hotend(1); } - static inline void start_watching_E2() { start_watching_hotend(2); } - static inline void start_watching_E3() { start_watching_hotend(3); } - static inline void start_watching_E4() { start_watching_hotend(4); } - static inline void start_watching_E5() { start_watching_hotend(5); } - #endif - - static void setTargetHotend(const int16_t celsius, const uint8_t e) { - E_UNUSED(); + static void setTargetHotend(const int16_t celsius, const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; #ifdef MILLISECONDS_PREHEAT_TIME if (celsius == 0) @@ -628,13 +590,11 @@ class Temperature { start_watching_hotend(ee); } - FORCE_INLINE static bool isHeatingHotend(const uint8_t e) { - E_UNUSED(); + FORCE_INLINE static bool isHeatingHotend(const uint8_t E_NAME) { return temp_hotend[HOTEND_INDEX].target > temp_hotend[HOTEND_INDEX].celsius; } - FORCE_INLINE static bool isCoolingHotend(const uint8_t e) { - E_UNUSED(); + FORCE_INLINE static bool isCoolingHotend(const uint8_t E_NAME) { return temp_hotend[HOTEND_INDEX].target < temp_hotend[HOTEND_INDEX].celsius; } @@ -765,8 +725,7 @@ class Temperature { #if HEATER_IDLE_HANDLER - static void reset_heater_idle_timer(const uint8_t e) { - E_UNUSED(); + static void reset_heater_idle_timer(const uint8_t E_NAME) { hotend_idle[HOTEND_INDEX].reset(); start_watching_hotend(HOTEND_INDEX); } diff --git a/Marlin/src/module/thermistor/thermistor_99.h b/Marlin/src/module/thermistor/thermistor_99.h new file mode 100644 index 0000000000..9d868619bb --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_99.h @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +// 100k bed thermistor with a 10K pull-up resistor - made by $ buildroot/share/scripts/createTemperatureLookupMarlin.py --rp=10000 + +const short temptable_99[][2] PROGMEM = { + { OV( 5.81), 350 }, // v=0.028 r=57.081 res=13.433 degC/count + { OV( 6.54), 340 }, // v=0.032 r=64.248 res=11.711 degC/count + { OV( 7.38), 330 }, // v=0.036 r=72.588 res=10.161 degC/count + { OV( 8.36), 320 }, // v=0.041 r=82.336 res=8.772 degC/count + { OV( 9.51), 310 }, // v=0.046 r=93.780 res=7.535 degC/count + { OV( 10.87), 300 }, // v=0.053 r=107.281 res=6.439 degC/count + { OV( 12.47), 290 }, // v=0.061 r=123.286 res=5.473 degC/count + { OV( 14.37), 280 }, // v=0.070 r=142.360 res=4.627 degC/count + { OV( 16.64), 270 }, // v=0.081 r=165.215 res=3.891 degC/count + { OV( 19.37), 260 }, // v=0.095 r=192.758 res=3.253 degC/count + { OV( 22.65), 250 }, // v=0.111 r=226.150 res=2.705 degC/count + { OV( 26.62), 240 }, // v=0.130 r=266.891 res=2.236 degC/count + { OV( 31.46), 230 }, // v=0.154 r=316.931 res=1.839 degC/count + { OV( 37.38), 220 }, // v=0.182 r=378.822 res=1.504 degC/count + { OV( 44.65), 210 }, // v=0.218 r=455.939 res=1.224 degC/count + { OV( 53.64), 200 }, // v=0.262 r=552.778 res=0.991 degC/count + { OV( 64.78), 190 }, // v=0.316 r=675.386 res=0.799 degC/count + { OV( 78.65), 180 }, // v=0.384 r=831.973 res=0.643 degC/count + { OV( 95.94), 170 }, // v=0.468 r=1033.801 res=0.516 degC/count + { OV(117.52), 160 }, // v=0.574 r=1296.481 res=0.414 degC/count + { OV(144.42), 150 }, // v=0.705 r=1641.900 res=0.333 degC/count + { OV(177.80), 140 }, // v=0.868 r=2101.110 res=0.269 degC/count + { OV(218.89), 130 }, // v=1.069 r=2718.725 res=0.220 degC/count + { OV(268.82), 120 }, // v=1.313 r=3559.702 res=0.183 degC/count + { OV(328.35), 110 }, // v=1.603 r=4719.968 res=0.155 degC/count + { OV(397.44), 100 }, // v=1.941 r=6343.323 res=0.136 degC/count + { OV(474.90), 90 }, // v=2.319 r=8648.807 res=0.124 degC/count + { OV(558.03), 80 }, // v=2.725 r=11975.779 res=0.118 degC/count + { OV(642.76), 70 }, // v=3.138 r=16859.622 res=0.119 degC/count + { OV(724.25), 60 }, // v=3.536 r=24161.472 res=0.128 degC/count + { OV(797.93), 50 }, // v=3.896 r=35295.361 res=0.146 degC/count + { OV(860.51), 40 }, // v=4.202 r=52635.209 res=0.178 degC/count + { OV(910.55), 30 }, // v=4.446 r=80262.251 res=0.229 degC/count + { OV(948.36), 20 }, // v=4.631 r=125374.433 res=0.313 degC/count + { OV(975.47), 10 }, // v=4.763 r=201020.458 res=0.449 degC/count + { OV(994.02), 0 } // v=4.854 r=331567.870 res=0.676 degC/count +}; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index f42f647e85..74272b97a9 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -122,6 +122,9 @@ #if ANY_THERMISTOR_IS(75) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "MGB18-104F39050L32 thermistor" #include "thermistor_75.h" #endif +#if ANY_THERMISTOR_IS(99) // 100k bed thermistor with a 10K pull-up resistor (on some Wanhao i3 models) + #include "thermistor_99.h" +#endif #if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup #include "thermistor_110.h" #endif diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 6178a7ce5d..b392e751d5 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -133,8 +133,8 @@ #endif // SWITCHING_NOZZLE -inline void _line_to_current(const AxisEnum fr_axis, const float fscale=1.0f) { - planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[fr_axis] * fscale, active_extruder); +inline void _line_to_current(const AxisEnum fr_axis, const float fscale=1) { + line_to_current_position(planner.settings.max_feedrate_mm_s[fr_axis] * fscale); } inline void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); } inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis); } @@ -150,11 +150,11 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a inline void magnetic_parking_extruder_tool_change(const uint8_t new_tool) { - const float oldx = current_position[X_AXIS], + const float oldx = current_position.x, grabpos = mpe_settings.parking_xpos[new_tool] + (new_tool ? mpe_settings.grab_distance : -mpe_settings.grab_distance), offsetcompensation = (0 #if HAS_HOTEND_OFFSET - + hotend_offset[X_AXIS][active_extruder] * mpe_settings.compensation_factor + + hotend_offset[active_extruder].x * mpe_settings.compensation_factor #endif ); @@ -174,7 +174,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 1 - current_position[X_AXIS] = mpe_settings.parking_xpos[new_tool] + offsetcompensation; + current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(1) Move extruder ", int(new_tool)); @@ -186,7 +186,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 2 - current_position[X_AXIS] = grabpos + offsetcompensation; + current_position.x = grabpos + offsetcompensation; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(2) Couple extruder ", int(new_tool)); @@ -201,7 +201,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 3 - current_position[X_AXIS] = mpe_settings.parking_xpos[new_tool] + offsetcompensation; + current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(3) Move extruder ", int(new_tool)); DEBUG_POS(" back to new extruder ParkPos", current_position); @@ -212,7 +212,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 4 - current_position[X_AXIS] = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; + current_position.x = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(4) Move extruder ", int(new_tool)); DEBUG_POS(" close to old extruder ParkPos", current_position); @@ -223,7 +223,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 5 - current_position[X_AXIS] = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; + current_position.x = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(5) Park extruder ", int(new_tool)); @@ -235,7 +235,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 6 - current_position[X_AXIS] = oldx; + current_position.x = oldx; if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("(6) Move extruder ", int(new_tool)); @@ -275,12 +275,12 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a constexpr float parkingposx[] = PARKING_EXTRUDER_PARKING_X; #if HAS_HOTEND_OFFSET - const float x_offset = hotend_offset[X_AXIS][active_extruder]; + const float x_offset = hotend_offset[active_extruder].x; #else constexpr float x_offset = 0; #endif - const float midpos = (parkingposx[0] + parkingposx[1]) * 0.5 + x_offset, + const float midpos = (parkingposx[0] + parkingposx[1]) * 0.5f + x_offset, grabpos = parkingposx[new_tool] + (new_tool ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset; /** @@ -296,7 +296,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a if (DEBUGGING(LEVELING)) DEBUG_POS("Start PE Tool-Change", current_position); - current_position[X_AXIS] = parkingposx[active_extruder] + x_offset; + current_position.x = parkingposx[active_extruder] + x_offset; if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); DEBUG_POS("Moving ParkPos", current_position); @@ -311,7 +311,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 3 - current_position[X_AXIS] += active_extruder ? -10 : 10; // move 10mm away from parked extruder + current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPGM("(3) Move near new extruder"); DEBUG_POS("Move away from parked extruder", current_position); @@ -329,10 +329,10 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 5 - current_position[X_AXIS] = grabpos + (new_tool ? -10 : 10); + current_position.x = grabpos + (new_tool ? -10 : 10); fast_line_to_current(X_AXIS); - current_position[X_AXIS] = grabpos; + current_position.x = grabpos; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("(5) Unpark extruder", current_position); @@ -341,9 +341,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 6 - current_position[X_AXIS] = midpos + current_position.x = midpos #if HAS_HOTEND_OFFSET - - hotend_offset[X_AXIS][new_tool] + - hotend_offset[new_tool].x #endif ; if (DEBUGGING(LEVELING)) { @@ -388,14 +388,14 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a if (DEBUGGING(LEVELING)) DEBUG_POS("Start ST Tool-Change", current_position); - current_position[X_AXIS] = placexpos; + current_position.x = placexpos; if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); DEBUG_POS("Move X SwitchPos", current_position); } fast_line_to_current(X_AXIS); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); + current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move Y SwitchPos + Security", current_position); @@ -409,7 +409,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[1]); safe_delay(500); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + current_position.y = SWITCHING_TOOLHEAD_Y_POS; if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); slow_line_to_current(Y_AXIS); @@ -417,13 +417,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a planner.synchronize(); safe_delay(200); - current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // move away from docked toolhead // 3. Move to the new toolhead - current_position[X_AXIS] = grabxpos; + current_position.x = grabxpos; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); @@ -431,7 +431,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a } fast_line_to_current(X_AXIS); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); + current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move Y SwitchPos + Security", current_position); @@ -440,7 +440,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 4. Grab and lock the new toolhead - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + current_position.y = SWITCHING_TOOLHEAD_Y_POS; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead"); @@ -454,7 +454,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[0]); safe_delay(500); - current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // Move away from docked toolhead planner.synchronize(); // Always sync the final move @@ -486,33 +486,33 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 1. Move to switch position current toolhead - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) { SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); DEBUG_POS("Move Y SwitchPos + Security", current_position); } fast_line_to_current(Y_AXIS); - current_position[X_AXIS] = placexclear; + current_position.x = placexclear; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move X SwitchPos + Security", current_position); } fast_line_to_current(X_AXIS); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + current_position.y = SWITCHING_TOOLHEAD_Y_POS; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move Y SwitchPos", current_position); } fast_line_to_current(Y_AXIS); - current_position[X_AXIS] = placexpos; + current_position.x = placexpos; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move X SwitchPos", current_position); } - planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25), active_extruder); + line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25f); // 2. Release and place toolhead in the dock @@ -521,16 +521,16 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_ECHOLNPGM("(2) Release and Place Toolhead"); } - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Release", current_position); - planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.1), active_extruder); + line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.1f); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_SECURITY; + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_SECURITY; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move Y SwitchPos + Security", current_position); } - planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS]), active_extruder); + line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); // 3. Move to new toolhead position @@ -539,7 +539,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); } - current_position[X_AXIS] = grabxpos; + current_position.x = grabxpos; if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X", current_position); fast_line_to_current(X_AXIS); @@ -550,11 +550,11 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_ECHOLNPGM("(4) Grab new toolhead, move to security position"); } - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Release", current_position); - planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS]), active_extruder); + line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); - current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + current_position.y = SWITCHING_TOOLHEAD_Y_POS; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_POS("Move Y SwitchPos", current_position); @@ -563,11 +563,11 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if ENABLED(PRIME_BEFORE_REMOVE) && (SWITCHING_TOOLHEAD_PRIME_MM || SWITCHING_TOOLHEAD_RETRACT_MM) #if SWITCHING_TOOLHEAD_PRIME_MM - current_position[E_AXIS] += SWITCHING_TOOLHEAD_PRIME_MM; + current_position.e += SWITCHING_TOOLHEAD_PRIME_MM; planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_PRIME_FEEDRATE), new_tool); #endif #if SWITCHING_TOOLHEAD_RETRACT_MM - current_position[E_AXIS] -= SWITCHING_TOOLHEAD_RETRACT_MM; + current_position.e -= SWITCHING_TOOLHEAD_RETRACT_MM; planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_RETRACT_FEEDRATE), new_tool); #endif #else @@ -575,13 +575,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a safe_delay(100); // Give switch time to settle #endif - current_position[X_AXIS] = grabxclear; + current_position.x = grabxclear; if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X + Security", current_position); _line_to_current(X_AXIS, 0.1f); planner.synchronize(); safe_delay(100); // Give switch time to settle - current_position[Y_AXIS] += SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // move away from docked toolhead planner.synchronize(); // Always sync last tool-change move @@ -601,6 +601,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS; const float placexpos = toolheadposx[active_extruder], grabxpos = toolheadposx[new_tool]; + const xyz_pos_t &hoffs = hotend_offset[active_extruder]; /** * 1. Raise Z-Axis to give enough clearance @@ -618,7 +619,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 1. Raise Z-Axis to give enough clearance - current_position[Z_AXIS] += SWITCHING_TOOLHEAD_Z_HOP; + current_position.z += SWITCHING_TOOLHEAD_Z_HOP; if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis ", current_position); fast_line_to_current(Z_AXIS); @@ -629,8 +630,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a SERIAL_ECHOLNPAIR("(2) Move near active extruder parking", active_extruder); DEBUG_POS("Moving ParkPos", current_position); } - current_position[X_AXIS] = hotend_offset[X_AXIS][active_extruder] + placexpos; - current_position[Y_AXIS] = hotend_offset[Y_AXIS][active_extruder] + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.set(hoffs.x + placexpos, + hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); fast_line_to_current(X_AXIS); // 3. Move gently to park position of active extruder @@ -641,7 +642,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_POS("Moving ParkPos", current_position); } - current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; slow_line_to_current(Y_AXIS); // 4. Disengage magnetic field, wait for delay @@ -657,16 +658,15 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a DEBUG_POS("Moving ParkPos", current_position); } - current_position[Y_AXIS] += SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; slow_line_to_current(Y_AXIS); - - current_position[X_AXIS] = hotend_offset[X_AXIS][active_extruder] + grabxpos; - current_position[Y_AXIS] = hotend_offset[Y_AXIS][active_extruder] + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.set(hoffs.x + grabxpos, + hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); fast_line_to_current(X_AXIS); // 6. Move gently to park position of new extruder - current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) { planner.synchronize(); DEBUG_ECHOLNPGM("(6) Move near new extruder"); @@ -681,7 +681,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 8. Unpark extruder - current_position[Y_AXIS] += SWITCHING_TOOLHEAD_Y_CLEAR; + current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(8) Unpark extruder"); slow_line_to_current(X_AXIS); planner.synchronize(); // Always sync the final move @@ -689,7 +689,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 9. Apply Z hotend offset to current position if (DEBUGGING(LEVELING)) DEBUG_POS("(9) Applying Z-offset", current_position); - current_position[Z_AXIS] += hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][new_tool]; + current_position.z += hoffs.z - hotend_offset[new_tool].z; if (DEBUGGING(LEVELING)) DEBUG_POS("EMST Tool-Change done.", current_position); } @@ -719,14 +719,15 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a const float xhome = x_home_pos(active_extruder); if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE - && IsRunning() - && (delayed_move_time || current_position[X_AXIS] != xhome) && ! no_move + && IsRunning() && !no_move + && (delayed_move_time || current_position.x != xhome) ) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("MoveX to ", xhome); // Park old head - planner.buffer_line(xhome, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder); + current_position.x = xhome; + line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS]); planner.synchronize(); } @@ -741,13 +742,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: // New current position is the position of the activated extruder - current_position[X_AXIS] = inactive_extruder_x_pos; + current_position.x = inactive_extruder_x_pos; // Save the inactive extruder's position (from the old current_position) - inactive_extruder_x_pos = destination[X_AXIS]; + inactive_extruder_x_pos = destination.x; break; case DXC_AUTO_PARK_MODE: // record current raised toolhead position for use by unpark - COPY(raised_parked_position, current_position); + raised_parked_position = current_position; active_extruder_parked = true; delayed_move_time = 0; break; @@ -852,7 +853,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(ADVANCED_PAUSE_FEATURE) do_pause_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); #else - current_position[E_AXIS] -= toolchange_settings.swap_length / planner.e_factor[old_tool]; + current_position.e -= toolchange_settings.swap_length / planner.e_factor[old_tool]; planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.retract_speed), old_tool); planner.synchronize(); #endif @@ -886,19 +887,18 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #endif #endif - set_destination_from_current(); + destination = current_position; #if DISABLED(SWITCHING_NOZZLE) if (can_move_away) { // Do a small lift to avoid the workpiece in the move back (below) - current_position[Z_AXIS] += toolchange_settings.z_raise; + current_position.z += toolchange_settings.z_raise; #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position[Z_AXIS], soft_endstop[Z_AXIS].max); + NOMORE(current_position.z, soft_endstop.max.z); #endif fast_line_to_current(Z_AXIS); #if ENABLED(TOOLCHANGE_PARK) - current_position[X_AXIS] = toolchange_settings.change_point.x; - current_position[Y_AXIS] = toolchange_settings.change_point.y; + current_position = toolchange_settings.change_point; #endif planner.buffer_line(current_position, feedrate_mm_s, old_tool); planner.synchronize(); @@ -906,15 +906,12 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #endif #if HAS_HOTEND_OFFSET + xyz_pos_t diff = hotend_offset[new_tool] - hotend_offset[old_tool]; #if ENABLED(DUAL_X_CARRIAGE) - constexpr float xdiff = 0; - #else - const float xdiff = hotend_offset[X_AXIS][new_tool] - hotend_offset[X_AXIS][old_tool]; + diff.x = 0; #endif - const float ydiff = hotend_offset[Y_AXIS][new_tool] - hotend_offset[Y_AXIS][old_tool], - zdiff = hotend_offset[Z_AXIS][new_tool] - hotend_offset[Z_AXIS][old_tool]; #else - constexpr float xdiff = 0, ydiff = 0, zdiff = 0; + constexpr xyz_pos_t diff{0}; #endif #if ENABLED(DUAL_X_CARRIAGE) @@ -932,30 +929,28 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #elif ENABLED(SWITCHING_NOZZLE) && !SWITCHING_NOZZLE_TWO_SERVOS // Switching Nozzle (single servo) // Raise by a configured distance to avoid workpiece, except with // SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead. - current_position[Z_AXIS] += _MAX(-zdiff, 0.0) + toolchange_settings.z_raise; + current_position.z += _MAX(-diff.z, 0.0) + toolchange_settings.z_raise; #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position[Z_AXIS], soft_endstop[Z_AXIS].max); + NOMORE(current_position.z, soft_endstop.max.z); #endif if (!no_move) fast_line_to_current(Z_AXIS); move_nozzle_servo(new_tool); #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Offset Tool XY by { ", xdiff, ", ", ydiff, ", ", zdiff, " }"); + #if DISABLED(DUAL_X_CARRIAGE) + active_extruder = new_tool; // Set the new active extruder + #endif - // The newly-selected extruder XY is actually at... - current_position[X_AXIS] += xdiff; - current_position[Y_AXIS] += ydiff; - current_position[Z_AXIS] += zdiff; - - // Set the new active extruder if not already done in tool specific function above - active_extruder = new_tool; + // The newly-selected extruder XYZ is actually at... + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Offset Tool XY by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); + current_position += diff; // Tell the planner the new "current position" sync_plan_position(); #if ENABLED(DELTA) //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function - const bool safe_to_move = current_position[Z_AXIS] < delta_clip_start_height - 1; + const bool safe_to_move = current_position.z < delta_clip_start_height - 1; #else constexpr bool safe_to_move = true; #endif @@ -985,21 +980,21 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { do_pause_e_move(toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.prime_speed)); do_pause_e_move(toolchange_settings.extra_prime, ADVANCED_PAUSE_PURGE_FEEDRATE); #else - current_position[E_AXIS] += toolchange_settings.swap_length / planner.e_factor[new_tool]; + current_position.e += toolchange_settings.swap_length / planner.e_factor[new_tool]; planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.prime_speed), new_tool); - current_position[E_AXIS] += toolchange_settings.extra_prime / planner.e_factor[new_tool]; + current_position.e += toolchange_settings.extra_prime / planner.e_factor[new_tool]; planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.prime_speed * 0.2f), new_tool); #endif planner.synchronize(); - planner.set_e_position_mm((destination[E_AXIS] = current_position[E_AXIS] = current_position[E_AXIS] - (TOOLCHANGE_FIL_EXTRA_PRIME))); + planner.set_e_position_mm((destination.e = current_position.e = current_position.e - (TOOLCHANGE_FIL_EXTRA_PRIME))); } #endif // Prevent a move outside physical bounds #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) // If the original position is within tool store area, go to X origin at once - if (destination[Y_AXIS] < SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR) { - current_position[X_AXIS] = 0; + if (destination.y < SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR) { + current_position.x = 0; planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], new_tool); planner.synchronize(); } @@ -1012,7 +1007,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(TOOLCHANGE_NO_RETURN) // Just move back down if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move back Z only"); - do_blocking_move_to_z(destination[Z_AXIS], planner.settings.max_feedrate_mm_s[Z_AXIS]); + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); #else // Move back to the original (or adjusted) position if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); @@ -1028,7 +1023,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(SWITCHING_NOZZLE) else { // Move back down. (Including when the new tool is higher.) - do_blocking_move_to_z(destination[Z_AXIS], planner.settings.max_feedrate_mm_s[Z_AXIS]); + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); } #endif diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 42b96e2c6a..613cb1612c 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -22,6 +22,7 @@ #pragma once #include "../inc/MarlinConfigPre.h" +#include "../core/types.h" #if EXTRUDERS > 1 @@ -31,7 +32,7 @@ int16_t prime_speed, retract_speed; #endif #if ENABLED(TOOLCHANGE_PARK) - struct { float x, y; } change_point; + xy_pos_t change_point; #endif float z_raise; } toolchange_settings_t; diff --git a/Marlin/src/pins/lpc1768/pins_BIGTREE_SKR_V1.3.h b/Marlin/src/pins/lpc1768/pins_BIGTREE_SKR_V1.3.h index 1febedf2fa..e0e9570c62 100644 --- a/Marlin/src/pins/lpc1768/pins_BIGTREE_SKR_V1.3.h +++ b/Marlin/src/pins/lpc1768/pins_BIGTREE_SKR_V1.3.h @@ -33,7 +33,9 @@ // // Servos // -#define SERVO0_PIN P2_00 +#ifndef SERVO0_PIN + #define SERVO0_PIN P2_00 +#endif // // Limit Switches @@ -165,14 +167,24 @@ // // Heaters / Fans // -#define HEATER_0_PIN P2_07 -#if HOTENDS == 1 - #define FAN1_PIN P2_04 -#else - #define HEATER_1_PIN P2_04 +#ifndef HEATER_0_PIN + #define HEATER_0_PIN P2_07 +#endif +#if HOTENDS == 1 + #ifndef FAN1_PIN + #define FAN1_PIN P2_04 + #endif +#else + #ifndef HEATER_1_PIN + #define HEATER_1_PIN P2_04 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN P2_03 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN P2_05 #endif -#define FAN_PIN P2_03 -#define HEATER_BED_PIN P2_05 /** * _____ _____ diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index bc8037da07..92dbf7b4b2 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -241,9 +241,9 @@ // #define LED_PIN P4_28 // (13) -// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +// define digital pin 5 for the filament runout sensor. Use the RAMPS 1.4 digital input 5 on the servos connector #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN P1_18 // (4) + #define FIL_RUNOUT_PIN P1_19 // (5) #endif #define PS_ON_PIN P2_12 // (12) diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 7a6465471c..23fbe7636c 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -164,7 +164,7 @@ #define SHIFT_OUT 34 #define SHIFT_EN 44 - #if MB(MEGATRONICS_31) || MB(MEGATRONICS_32) + #if MB(MEGATRONICS_31, MEGATRONICS_32) #define SD_DETECT_PIN 56 #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 4058c72836..7f6833080b 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -21,6 +21,8 @@ */ #pragma once +#include "../core/boards.h" + /** * Include pins definitions * @@ -35,15 +37,15 @@ #define MAX_EXTRUDERS 6 -#if MB(RAMPS_13_EFB) || MB(RAMPS_14_EFB) || MB(RAMPS_PLUS_EFB) || MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_SMART_EFB) || MB(RAMPS_DUO_EFB) || MB(RAMPS4DUE_EFB) +#if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB) #define IS_RAMPS_EFB -#elif MB(RAMPS_13_EEB) || MB(RAMPS_14_EEB) || MB(RAMPS_PLUS_EEB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_DUO_EEB) || MB(RAMPS4DUE_EEB) +#elif MB(RAMPS_13_EEB, RAMPS_14_EEB, RAMPS_PLUS_EEB, RAMPS_14_RE_ARM_EEB, RAMPS_SMART_EEB, RAMPS_DUO_EEB, RAMPS4DUE_EEB) #define IS_RAMPS_EEB -#elif MB(RAMPS_13_EFF) || MB(RAMPS_14_EFF) || MB(RAMPS_PLUS_EFF) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_SMART_EFF) || MB(RAMPS_DUO_EFF) || MB(RAMPS4DUE_EFF) +#elif MB(RAMPS_13_EFF, RAMPS_14_EFF, RAMPS_PLUS_EFF, RAMPS_14_RE_ARM_EFF, RAMPS_SMART_EFF, RAMPS_DUO_EFF, RAMPS4DUE_EFF) #define IS_RAMPS_EFF -#elif MB(RAMPS_13_EEF) || MB(RAMPS_14_EEF) || MB(RAMPS_PLUS_EEF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_DUO_EEF) || MB(RAMPS4DUE_EEF) +#elif MB(RAMPS_13_EEF, RAMPS_14_EEF, RAMPS_PLUS_EEF, RAMPS_14_RE_ARM_EEF, RAMPS_SMART_EEF, RAMPS_DUO_EEF, RAMPS4DUE_EEF) #define IS_RAMPS_EEF -#elif MB(RAMPS_13_SF) || MB(RAMPS_14_SF) || MB(RAMPS_PLUS_SF) || MB(RAMPS_14_RE_ARM_SF) || MB(RAMPS_SMART_SF) || MB(RAMPS_DUO_SF) || MB(RAMPS4DUE_SF) +#elif MB(RAMPS_13_SF, RAMPS_14_SF, RAMPS_PLUS_SF, RAMPS_14_RE_ARM_SF, RAMPS_SMART_SF, RAMPS_DUO_SF, RAMPS4DUE_SF) #define IS_RAMPS_SF #endif @@ -185,7 +187,7 @@ #elif MB(RAMBO) #include "rambo/pins_RAMBO.h" // ATmega2560 env:rambo -#elif MB(MINIRAMBO) || MB(MINIRAMBO_10A) +#elif MB(MINIRAMBO, MINIRAMBO_10A) #include "rambo/pins_MINIRAMBO.h" // ATmega2560 env:rambo #elif MB(EINSY_RAMBO) #include "rambo/pins_EINSY_RAMBO.h" // ATmega2560 env:rambo @@ -214,7 +216,7 @@ #include "mega/pins_MEGATRONICS.h" // ATmega2560 env:megaatmega2560 #elif MB(MEGATRONICS_2) #include "mega/pins_MEGATRONICS_2.h" // ATmega2560 env:megaatmega2560 -#elif MB(MEGATRONICS_3) || MB(MEGATRONICS_31) || MB(MEGATRONICS_32) +#elif MB(MEGATRONICS_3, MEGATRONICS_31, MEGATRONICS_32) #include "mega/pins_MEGATRONICS_3.h" // ATmega2560 env:megaatmega2560 #elif MB(ELEFU_3) #include "mega/pins_ELEFU_3.h" // ATmega2560 env:megaatmega2560 @@ -442,18 +444,18 @@ // STM32 ARM Cortex-M3 // -#elif MB(STM32F103R) - #include "stm32/pins_STM32F1R.h" // STM32F1 env:STM32F103R +#elif MB(STM32F103RE) + #include "stm32/pins_STM32F1R.h" // STM32F1 env:STM32F103RE #elif MB(MALYAN_M200) - #include "stm32/pins_MALYAN_M200.h" // STM32F1 env:malyanm200 + #include "stm32/pins_MALYAN_M200.h" // STM32F1 env:STM32F103CB_malyan #elif MB(STM3R_MINI) - #include "stm32/pins_STM3R_MINI.h" // STM32F1 env:STM32F103R + #include "stm32/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_PRO_VB) - #include "stm32/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103R + #include "stm32/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE #elif MB(MORPHEUS) - #include "stm32/pins_MORPHEUS.h" // STM32F1 env:STM32F103R + #include "stm32/pins_MORPHEUS.h" // STM32F1 env:STM32F103RE #elif MB(CHITU3D) - #include "stm32/pins_CHITU3D.h" // STM32F1 env:STM32F103R + #include "stm32/pins_CHITU3D.h" // STM32F1 env:STM32F103RE #elif MB(MKS_ROBIN) #include "stm32/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin #elif MB(MKS_ROBIN_MINI) @@ -463,21 +465,23 @@ #elif MB(MKS_ROBIN_LITE) #include "stm32/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(BIGTREE_SKR_MINI_V1_1) - #include "stm32/pins_BIGTREE_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103R_bigtree + #include "stm32/pins_BIGTREE_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_bigtree +#elif MB(BTT_SKR_MINI_E3_V1_2) + #include "stm32/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_bigtree #elif MB(BIGTREE_SKR_MINI_E3) - #include "stm32/pins_BIGTREE_SKR_MINI_E3.h" // STM32F1 env:STM32F103R_bigtree + #include "stm32/pins_BIGTREE_SKR_MINI_E3.h" // STM32F1 env:STM32F103RC_bigtree #elif MB(BIGTREE_SKR_E3_DIP) - #include "stm32/pins_BIGTREE_SKR_E3_DIP.h" // STM32F1 env:STM32F103R_bigtree + #include "stm32/pins_BIGTREE_SKR_E3_DIP.h" // STM32F1 env:STM32F103RC_bigtree #elif MB(JGAURORA_A5S_A1) #include "stm32/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 #elif MB(FYSETC_AIO_II) - #include "stm32/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103R_fysetc + #include "stm32/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103RC_fysetc #elif MB(FYSETC_CHEETAH) - #include "stm32/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103R_fysetc + #include "stm32/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103RC_fysetc #elif MB(FYSETC_CHEETAH_V12) - #include "stm32/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103R_fysetc + #include "stm32/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc #elif MB(LONGER3D_LK) - #include "stm32/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103V_longer + #include "stm32/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer // // ARM Cortex-M4F @@ -526,7 +530,8 @@ // Espressif ESP32 // -#elif MB(ESP32) +#elif MB(ESPRESSIF_ESP32) + #include "esp32/pins_ESP32.h" // ESP32 env:esp32 // @@ -902,7 +907,7 @@ // // Disable unused endstop / probe pins // -#if !USES_Z_MIN_PROBE_ENDSTOP +#if !HAS_CUSTOM_PROBE_PIN #undef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN -1 #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index e7a2a5da01..0ff0ec57ba 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -31,8 +31,12 @@ #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "Formbot Raptor" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Formbot Raptor" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif // // Servos diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index 990c8fc1f1..83a68e776f 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -43,6 +43,12 @@ #define BOARD_INFO_NAME "Archim 1.0" +// +// Timers +// +#define STEP_TIMER_NUM 3 +#define HAL_STEP_TIMER_ISR() void TC3_Handler() + // // Items marked * have been altered from Archim v1.0 // diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 4df3bc7f1a..d5cc3bed6a 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -126,7 +126,7 @@ #define MOTOR_CURRENT_PWM_Y_PIN 64 // PB19 MOTOR 3 #define MOTOR_CURRENT_PWM_E_PIN 61 // PA2 MOTOR 4 -//#define DEFAULT_PWM_MOTOR_CURRENT { 300, 400, 1000} // XY Z E0, 1000 = 1000mAh +#define DEFAULT_PWM_MOTOR_CURRENT { 300, 400, 1000} // XY Z E0, 1000 = 1000mAh // // Temperature Sensors diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index b457c7852c..45540e8dad 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -118,7 +118,7 @@ //#define E3_MS2_PIN ? //#define E3_MS3_PIN ? -#if USES_Z_MIN_PROBE_ENDSTOP +#if HAS_CUSTOM_PROBE_PIN #define Z_MIN_PROBE_PIN 49 #endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 6931654a7a..c8ff71673b 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -106,7 +106,7 @@ #define E2_CS_PIN 61 #endif -#if USES_Z_MIN_PROBE_ENDSTOP +#if HAS_CUSTOM_PROBE_PIN #define Z_MIN_PROBE_PIN 49 #endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h index 1ccf5ac064..ad0a58509b 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI.h +++ b/Marlin/src/pins/sanguino/pins_MELZI.h @@ -29,5 +29,4 @@ #define BOARD_INFO_NAME "Melzi" #endif -#define IS_MELZI #include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 0b119a422c..e4fdf69065 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -115,7 +115,7 @@ #endif -#if !defined(FAN_PIN) && (MB(AZTEEG_X1) || MB(STB_11) || ENABLED(IS_MELZI)) +#if !defined(FAN_PIN) && (MB(AZTEEG_X1, STB_11) || IS_MELZI) #define FAN_PIN 4 // Works for Panelolu2 too #endif @@ -132,7 +132,7 @@ //#define SDSS 24 #define SDSS 31 -#if ENABLED(IS_MELZI) +#if IS_MELZI #define LED_PIN 27 #elif MB(STB_11) #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED @@ -160,7 +160,7 @@ #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 ( like [www.digole.com] ) For Melzi V2.0 - #if ENABLED(IS_MELZI) + #if IS_MELZI #define LCD_PINS_RS 30 // CS chip select /SS chip slave select #define LCD_PINS_ENABLE 29 // SID (MOSI) #define LCD_PINS_D4 17 // SCK (CLK) clock @@ -187,7 +187,7 @@ #define DOGLCD_CS 17 #define LCD_BACKLIGHT_PIN 28 // PA3 - #elif ENABLED(IS_MELZI) + #elif IS_MELZI #define BEEPER_PIN 27 #define DOGLCD_CS 28 @@ -219,7 +219,7 @@ #if ENABLED(LCD_I2C_PANELOLU2) - #if ENABLED(IS_MELZI) + #if IS_MELZI #define BTN_ENC 29 #define LCD_SDSS 30 // Panelolu2 SD card reader rather than the Melzi #else diff --git a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_E3_DIP.h b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_E3_DIP.h index 1e8e605abb..d3c1cc2a1a 100644 --- a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_E3_DIP.h @@ -33,9 +33,15 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +#ifdef MCU_STM32F103RE + #define STM32_FLASH_SIZE (512 * 1024) +#else + #define STM32_FLASH_SIZE (256 * 1024) +#endif + #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE uint16(0x800) // 2KB -#define EEPROM_START_ADDRESS uint32(0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) +#define EEPROM_START_ADDRESS uint32(0x8000000 + STM32_FLASH_SIZE - 2 * EEPROM_PAGE_SIZE) #undef E2END #define E2END (EEPROM_PAGE_SIZE - 1) // 2KB diff --git a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_E3.h b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_E3.h index b0039b109c..7f0698483e 100644 --- a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_E3.h +++ b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_E3.h @@ -33,9 +33,15 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +#ifdef MCU_STM32F103RE + #define STM32_FLASH_SIZE (512 * 1024) +#else + #define STM32_FLASH_SIZE (256 * 1024) +#endif + #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE uint16(0x800) // 2KB -#define EEPROM_START_ADDRESS uint32(0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) +#define EEPROM_START_ADDRESS uint32(0x8000000 + STM32_FLASH_SIZE - 2 * EEPROM_PAGE_SIZE) #undef E2END #define E2END (EEPROM_PAGE_SIZE - 1) // 2KB diff --git a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_V1_1.h index 181773c6b1..01719236ad 100644 --- a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_MINI_V1_1.h @@ -33,6 +33,17 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +#ifdef MCU_STM32F103RE + #define STM32_FLASH_SIZE (512 * 1024) +#else + #define STM32_FLASH_SIZE (256 * 1024) +#endif + +#define FLASH_EEPROM_EMULATION +#define EEPROM_PAGE_SIZE (0x800) // 2KB +#define EEPROM_START_ADDRESS (0x8000000 + STM32_FLASH_SIZE - 2 * EEPROM_PAGE_SIZE) +#define E2END (EEPROM_PAGE_SIZE - 1) + // // Limit Switches // @@ -208,7 +219,3 @@ #define ST7920_DELAY_3 DELAY_NS(125) #endif -#define FLASH_EEPROM_EMULATION -#define EEPROM_PAGE_SIZE (0x800) // 2KB -#define EEPROM_START_ADDRESS (0x8000000 + (256 * 1024) - 2 * EEPROM_PAGE_SIZE) -#define E2END (EEPROM_PAGE_SIZE - 1) diff --git a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h index 807b366dad..01267e7fcf 100644 --- a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h +++ b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h @@ -207,6 +207,13 @@ #define LCD_PINS_ENABLE PG7 #define LCD_PINS_D4 PG3 + // CR10_Stock Display needs a different delay setting on SKR PRO v1.1, so undef it here. + // It will be defined again at the #HAS_GRAPHICAL_LCD section below. + #undef ST7920_DELAY_1 + #undef ST7920_DELAY_2 + #undef ST7920_DELAY_3 + + #else #define LCD_PINS_RS PD10 diff --git a/Marlin/src/pins/stm32/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32/pins_BTT_SKR_MINI_E3_V1_2.h new file mode 100644 index 0000000000..70aee57449 --- /dev/null +++ b/Marlin/src/pins/stm32/pins_BTT_SKR_MINI_E3_V1_2.h @@ -0,0 +1,167 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef TARGET_STM32F1 + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "BIGTREE SKR Mini E3 V1.2" + +// Release PB3/PB4 (E0 STP/DIR) from JTAG pins +#define DISABLE_JTAG + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#define FLASH_EEPROM_EMULATION +#define EEPROM_PAGE_SIZE uint16(0x800) // 2KB +#define EEPROM_START_ADDRESS uint32(0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) +#undef E2END +#define E2END (EEPROM_PAGE_SIZE - 1) // 2KB + +// +// Servos +// +#define SERVO0_PIN PA1 + +// +// Limit Switches +// +#define X_STOP_PIN PC0 +#define Y_STOP_PIN PC1 +#define Z_STOP_PIN PC2 + +// +// Z Probe must be this pins +// +#define Z_MIN_PROBE_PIN PC14 + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PC12 +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PB14 +#define X_STEP_PIN PB13 +#define X_DIR_PIN PB12 + +#define Y_ENABLE_PIN PB11 +#define Y_STEP_PIN PB10 +#define Y_DIR_PIN PB2 + +#define Z_ENABLE_PIN PB1 +#define Z_STEP_PIN PB0 +#define Z_DIR_PIN PC5 + +#define E0_ENABLE_PIN PD2 +#define E0_STEP_PIN PB3 +#define E0_DIR_PIN PB4 + +#if HAS_TMC220x + /** + * TMC2208/TMC2209 stepper drivers + */ + // + // Software serial + // + #define X_SERIAL_TX_PIN PB15 + #define X_SERIAL_RX_PIN PB15 + + #define Y_SERIAL_TX_PIN PC6 + #define Y_SERIAL_RX_PIN PC6 + + #define Z_SERIAL_TX_PIN PC10 + #define Z_SERIAL_RX_PIN PC10 + + #define E0_SERIAL_TX_PIN PC11 + #define E0_SERIAL_RX_PIN PC11 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input +#define TEMP_BED_PIN PC3 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC8 // EXTRUDER +#define HEATER_BED_PIN PC9 // BED +#define FAN_PIN PA8 + +// +// USB connect control +// +#define USB_CONNECT_PIN PC13 +#define USB_CONNECT_INVERTING false + +#define NEOPIXEL_PIN PC7 // LED driving pin + +#define SD_DETECT_PIN PC4 + +/** + * _____ + * 5V | · · | GND + * (LCD_EN) PB7 | · · | PB8 (LCD_RS) + * (LCD_D4) PB9 | · · | PA10 (BTN_EN2) + * RESET | · · | PA9 (BTN_EN1) + * (BTN_ENC) PB6 | · · | PB5 (BEEPER) + * ----- + * EXP1 + */ +#if HAS_SPI_LCD + #define BEEPER_PIN PB5 + #define BTN_ENC PB6 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PB8 + + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define LCD_PINS_ENABLE PB7 + #define LCD_PINS_D4 PB9 + + #else + #error "Only CR10_STOCKDISPLAY is currently supported on the BIGTREE_SKR_MINI_E3 V1.2." + #endif + +#endif // HAS_SPI_LCD + +// +// SD Support +// +#define HAS_ONBOARD_SD + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define ON_BOARD_SPI_DEVICE 1 //SPI1 +#define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32/pins_MALYAN_M200.h b/Marlin/src/pins/stm32/pins_MALYAN_M200.h index 302df62a45..87337c72b6 100644 --- a/Marlin/src/pins/stm32/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32/pins_MALYAN_M200.h @@ -42,6 +42,8 @@ // On STM32F103: // PB3, PB6, PB7, and PB8 can be used with pwm, which rules out TIM2 and TIM4. // On STM32F070, 16 and 17 are in use, but 1 and 3 are available. +#undef STEP_TIMER +#undef TEMP_TIMER #define STEP_TIMER 1 #define TEMP_TIMER 3 @@ -84,15 +86,7 @@ #define HEATER_0_PIN PB6 // HOTEND0 MOSFET #define HEATER_BED_PIN PB7 // BED MOSFET -// FAN_PIN is commented out here because the M200 example -// Configuration_adv.h does NOT override E0_AUTO_FAN_PIN. -#ifndef FAN_PIN - //#define FAN_PIN PB8 // FAN1 header on board - PRINT FAN -#endif -#define FAN1_PIN PB3 // FAN2 header on board - CONTROLLER FAN -#define FAN2_PIN -1 // FAN3 header on board - EXTRUDER0 FAN +#define MALYAN_FAN1_PIN PB8 // FAN1 header on board - PRINT FAN +#define MALYAN_FAN2_PIN PB3 // FAN2 header on board - CONTROLLER FAN -// This board has only the controller fan and the extruder fan -// If someone hacks to put a direct power fan on the controller, PB3 could -// be used as a separate print cooling fan. -#define ORIG_E0_AUTO_FAN_PIN PB8 +#define FAN1_PIN MALYAN_FAN2_PIN diff --git a/Marlin/src/pins/stm32/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32/pins_MKS_ROBIN.h index 7623f3fe23..fbb4768528 100644 --- a/Marlin/src/pins/stm32/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32/pins_MKS_ROBIN.h @@ -23,6 +23,8 @@ /** * MKS Robin (STM32F130ZET6) board pin assignments + * + * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware */ #ifndef __STM32F1__ @@ -36,7 +38,7 @@ // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // -#define DISABLE_DEBUG +#define DISABLE_JTAG // // Servos @@ -110,7 +112,7 @@ /** * Note: MKS Robin TFT screens use various TFT controllers. Supported screens - * are based on the ILI9342, ILI9328 and ST7798V. Define init sequences for + * are based on the ILI9341, ILI9328 and ST7798V. Define init sequences for * other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp * * If the screen stays white, disable 'LCD_RESET_PIN' @@ -124,18 +126,29 @@ #define FSMC_CS_PIN PG12 // NE4 #define FSMC_RS_PIN PF0 // A0 -// -// Custom SPI pins -// -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN -1 +#if ENABLED(TOUCH_BUTTONS) + #define TOUCH_CS_PIN PB1 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI +#endif -// -// Onboard SD Card -// -#define ONBOARD_SD_CS PC11 -#define SDSS PD2 +// SPI1(PA7) & SPI3(PB5) not available +#define ENABLE_SPI2 -#define SD_DETECT_PIN -1 // PF12 +#if ENABLED(SDIO_SUPPORT) + #define SCK_PIN PB13 // SPI2 + #define MISO_PIN PB14 // SPI2 + #define MOSI_PIN PB15 // SPI2 + #define SS_PIN -1 // PB12 is X- + #define SD_DETECT_PIN PF12 // SD_CD +#else + // SD as custom software SPI (SDIO pins) + #define SCK_PIN PC12 + #define MISO_PIN PC8 + #define MOSI_PIN PD2 + #define SS_PIN -1 + #define ONBOARD_SD_CS_PIN PC11 + #define SDSS PD2 + #define SD_DETECT_PIN -1 +#endif diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index a6223858cb..a09de08fe5 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -234,11 +234,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { const millis_t init_timeout = millis() + SD_INIT_TIMEOUT; uint32_t arg; - // If init takes more than 4s it could trigger - // watchdog leading to a reboot loop. - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif + watchdog_refresh(); // In case init takes too long // Set pin modes extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first @@ -252,10 +248,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { // Must supply min of 74 clock cycles with CS high. for (uint8_t i = 0; i < 10; i++) spiSend(0xFF); - // Initialization can cause the watchdog to timeout, so reinit it here - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif + watchdog_refresh(); // In case init takes too long // Command to go idle in SPI mode while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { @@ -269,10 +262,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); #endif - // Initialization can cause the watchdog to timeout, so reinit it here - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif + watchdog_refresh(); // In case init takes too long // check SD version for (;;) { @@ -294,10 +284,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { } } - // Initialization can cause the watchdog to timeout, so reinit it here - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif + watchdog_refresh(); // In case init takes too long // Initialize card and send host supports SDHC if SD2 arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 98a03af168..69d63dff1c 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -62,6 +62,7 @@ SdFile CardReader::root, CardReader::workDir, CardReader::workDirParents[MAX_DIR uint8_t CardReader::workDirDepth; #if ENABLED(SDCARD_SORT_ALPHA) + uint16_t CardReader::sort_count; #if ENABLED(SDSORT_GCODE) bool CardReader::sort_alpha; @@ -78,6 +79,7 @@ uint8_t CardReader::workDirDepth; #if ENABLED(SDSORT_USES_RAM) #if ENABLED(SDSORT_CACHE_NAMES) + uint16_t CardReader::nrFiles; // Cached total file count #if ENABLED(SDSORT_DYNAMIC_RAM) char **CardReader::sortshort, **CardReader::sortnames; #else @@ -94,6 +96,7 @@ uint8_t CardReader::workDirDepth; #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) uint8_t CardReader::isDir[(SDSORT_LIMIT+7)>>3]; #endif + #define IS_DIR(n) TEST(isDir[(n) >> 3], (n) & 0x07) #endif #endif // SDSORT_USES_RAM @@ -110,10 +113,6 @@ char CardReader::proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; uint32_t CardReader::filesize, CardReader::sdpos; -LsAction CardReader::lsAction; //stored for recursion. -uint16_t CardReader::nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. -char *CardReader::diveDirName; - CardReader::CardReader() { #if ENABLED(SDCARD_SORT_ALPHA) sort_count = 0; @@ -138,7 +137,10 @@ CardReader::CardReader() { #endif } -char *createFilename(char *buffer, const dir_t &p) { +// +// Get a DOS 8.3 filename in its useful form +// +char *createFilename(char * const buffer, const dir_t &p) { char *pos = buffer; for (uint8_t i = 0; i < 11; i++) { if (p.name[i] == ' ') continue; @@ -149,24 +151,78 @@ char *createFilename(char *buffer, const dir_t &p) { return buffer; } -/** - * Dive into a folder and recurse depth-first to perform a pre-set operation lsAction: - * LS_Count - Add +1 to nrFiles for every file within the parent - * LS_GetFilename - Get the filename of the file indexed by nrFile_index - * LS_SerialPrint - Print the full path and size of each file to serial output - */ +// +// Return 'true' if the item is a folder or G-code file +// +bool CardReader::is_dir_or_gcode(const dir_t &p) { + uint8_t pn0 = p.name[0]; -uint16_t nrFile_index; + if ( pn0 == DIR_NAME_FREE || pn0 == DIR_NAME_DELETED // Clear or Deleted entry + || pn0 == '.' || longFilename[0] == '.' // Hidden file + || !DIR_IS_FILE_OR_SUBDIR(&p) // Not a File or Directory + || (p.attributes & DIR_ATT_HIDDEN) // Hidden by attribute + ) return false; -void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=nullptr*/) { + flag.filenameIsDir = DIR_IS_SUBDIR(&p); // We know it's a File or Folder + + return ( + flag.filenameIsDir // All Directories are ok + || (p.name[8] == 'G' && p.name[9] != '~') // Non-backup *.G* files are accepted + ); +} + +// +// Get the number of (compliant) items in the folder +// +int CardReader::countItems(SdFile dir) { dir_t p; - uint8_t cnt = 0; + int c = 0; + while (dir.readDir(&p, longFilename) > 0) + c += is_dir_or_gcode(p); - // Read the next entry from a directory + #if ENABLED(SDCARD_SORT_ALPHA) && SDSORT_USES_RAM && SDSORT_CACHE_NAMES + nrFiles = c; + #endif + + return c; +} + +// +// Get file/folder info for an item by index +// +void CardReader::selectByIndex(SdFile dir, const uint8_t index) { + dir_t p; + for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0;) { + if (is_dir_or_gcode(p)) { + if (cnt == index) { + createFilename(filename, p); + return; // 0 based index + } + cnt++; + } + } +} + +// +// Get file/folder info for an item by name +// +void CardReader::selectByName(SdFile dir, const char * const match) { + dir_t p; + for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0; cnt++) { + if (is_dir_or_gcode(p)) { + createFilename(filename, p); + if (strcasecmp(match, filename) == 0) return; + } + } +} + +// +// Recursive method to list all files within a folder +// +void CardReader::printListing(SdFile parent, const char * const prepend/*=nullptr*/) { + dir_t p; while (parent.readDir(&p, longFilename) > 0) { - - // If the entry is a directory and the action is LS_SerialPrint - if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) { + if (DIR_IS_SUBDIR(&p)) { // Get the short name for the item, which we know is a folder char dosFilename[FILENAME_LENGTH]; @@ -188,68 +244,38 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m // Get a new directory object using the full path // and dive recursively into it. - SdFile dir; - if (!dir.open(&parent, dosFilename, O_READ)) { - if (lsAction == LS_SerialPrint) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_SD_CANT_OPEN_SUBDIR, dosFilename); - } + SdFile child; + if (!child.open(&parent, dosFilename, O_READ)) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(MSG_SD_CANT_OPEN_SUBDIR, dosFilename); } - lsDive(path, dir); + printListing(child, path); // close() is done automatically by destructor of SdFile } - else { - uint8_t pn0 = p.name[0]; - if (pn0 == DIR_NAME_FREE) break; - if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; - if (longFilename[0] == '.') continue; - - if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; - - flag.filenameIsDir = DIR_IS_SUBDIR(&p); - - if (!flag.filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; - - switch (lsAction) { // 1 based file count - case LS_Count: - nrFiles++; - break; - - case LS_SerialPrint: - createFilename(filename, p); - if (prepend) SERIAL_ECHO(prepend); - SERIAL_ECHO(filename); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(p.fileSize); - break; - - case LS_GetFilename: - createFilename(filename, p); - if (match != nullptr) { - if (strcasecmp(match, filename) == 0) return; - } - else if (cnt == nrFile_index) return; // 0 based index - cnt++; - break; - } - + else if (is_dir_or_gcode(p)) { + createFilename(filename, p); + if (prepend) SERIAL_ECHO(prepend); + SERIAL_ECHO(filename); + SERIAL_CHAR(' '); + SERIAL_ECHOLN(p.fileSize); } - } // while readDir + } } +// +// List all files on the SD card +// void CardReader::ls() { - lsAction = LS_SerialPrint; root.rewind(); - lsDive(nullptr, root); + printListing(root); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - /** - * Get a long pretty path based on a DOS 8.3 path - */ - void CardReader::printLongPath(char *path) { - lsAction = LS_GetFilename; + // + // Get a long pretty path based on a DOS 8.3 path + // + void CardReader::printLongPath(char * const path) { int i, pathLen = strlen(path); @@ -275,7 +301,7 @@ void CardReader::ls() { // Find the item, setting the long filename diveDir.rewind(); - lsDive(nullptr, diveDir, segment); + selectByName(diveDir, segment); // Print /LongNamePart to serial output SERIAL_CHAR('/'); @@ -305,16 +331,16 @@ void CardReader::ls() { #endif // LONG_FILENAME_HOST_SUPPORT -/** - * Echo the DOS 8.3 filename (and long filename, if any) - */ +// +// Echo the DOS 8.3 filename (and long filename, if any) +// void CardReader::printFilename() { if (file.isOpen()) { char dosFilename[FILENAME_LENGTH]; file.getDosName(dosFilename); SERIAL_ECHO(dosFilename); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - getfilename(0, dosFilename); + selectFileByName(dosFilename); if (longFilename[0]) { SERIAL_ECHO(' '); SERIAL_ECHO(longFilename); @@ -331,18 +357,11 @@ void CardReader::mount() { flag.mounted = false; if (root.isOpen()) root.close(); - #ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED - #endif - if (!sd2card.init(SPI_SPEED, SDSS) #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) && !sd2card.init(SPI_SPEED, LCD_SDSS) #endif - ) { - //if (!sd2card.init(SPI_HALF_SPEED,SDSS)) - SERIAL_ECHO_MSG(MSG_SD_INIT_FAIL); - } + ) SERIAL_ECHO_MSG(MSG_SD_INIT_FAIL); else if (!volume.init(&sd2card)) SERIAL_ERROR_MSG(MSG_SD_VOL_INIT_FAIL); else if (!root.openRoot(&volume)) @@ -354,7 +373,7 @@ void CardReader::mount() { settings.first_load(); #endif } - setroot(); + cdroot(); ui.refresh(); } @@ -401,26 +420,32 @@ void CardReader::openLogFile(char * const path) { openFile(path, false); } -void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) { - file.getDosName(dst); - while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; } - if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } -} - -void CardReader::getAbsFilename(char *t) { - *t++ = '/'; // Root folder +// +// Get the root-relative DOS path of the selected file +// +void CardReader::getAbsFilename(char *dst) { + *dst++ = '/'; uint8_t cnt = 1; - for (uint8_t i = 0; i < workDirDepth; i++) // Loop to current work dir - appendAtom(workDirParents[i], t, cnt); + auto appendAtom = [&](SdFile &file) { + file.getDosName(dst); + while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; } + if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } + }; + + for (uint8_t i = 0; i < workDirDepth; i++) // Loop down to current work dir + appendAtom(workDirParents[i]); if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH) - 1) { // Leave room for filename and nul - appendAtom(file, t, cnt); - --t; + appendAtom(file); + --dst; } - *t = '\0'; + *dst = '\0'; } +// +// Open a file by DOS path - for read or write +// void CardReader::openFile(char * const path, const bool read, const bool subcall/*=false*/) { if (!isMounted()) return; @@ -472,7 +497,7 @@ void CardReader::openFile(char * const path, const bool read, const bool subcall SERIAL_ECHOLNPAIR(MSG_SD_FILE_OPENED, fname, MSG_SD_SIZE, filesize); SERIAL_ECHOLNPGM(MSG_SD_FILE_SELECTED); - getfilename(0, fname); + selectFileByName(fname); ui.set_status(longFilename[0] ? longFilename : fname); //if (longFilename[0]) { // SERIAL_ECHOPAIR(MSG_SD_FILE_LONG_NAME, longFilename); @@ -486,7 +511,7 @@ void CardReader::openFile(char * const path, const bool read, const bool subcall SERIAL_ECHOLNPAIR(MSG_SD_OPEN_FILE_FAIL, fname, "."); else { flag.saving = true; - getfilename(0, fname); + selectFileByName(fname); #if ENABLED(EMERGENCY_PARSER) emergency_parser.disable(); #endif @@ -496,6 +521,9 @@ void CardReader::openFile(char * const path, const bool read, const bool subcall } } +// +// Delete a file by name in the working directory +// void CardReader::removeFile(const char * const name) { if (!isMounted()) return; @@ -527,7 +555,7 @@ void CardReader::report_status() { SERIAL_ECHOLNPGM(MSG_SD_NOT_PRINTING); } -void CardReader::write_command(char *buf) { +void CardReader::write_command(char * const buf) { char* begin = buf; char* npos = nullptr; char* end = buf + strlen(buf) - 1; @@ -584,7 +612,7 @@ void CardReader::checkautostart() { void CardReader::beginautostart() { autostart_index = 0; - setroot(); + cdroot(); } void CardReader::closefile(const bool store_location) { @@ -602,38 +630,42 @@ void CardReader::closefile(const bool store_location) { } } -/** - * Get the name of a file in the current directory by index - * with optional name to match. - */ -void CardReader::getfilename(uint16_t nr, const char * const match/*=nullptr*/) { +// +// Get info for a file in the working directory by index +// +void CardReader::selectFileByIndex(const uint16_t nr) { #if ENABLED(SDSORT_CACHE_NAMES) - if (match != nullptr) { - while (nr < sort_count) { - if (strcasecmp(match, sortshort[nr]) == 0) break; - nr++; - } - } if (nr < sort_count) { strcpy(filename, sortshort[nr]); strcpy(longFilename, sortnames[nr]); - flag.filenameIsDir = TEST(isDir[nr>>3], nr & 0x07); + flag.filenameIsDir = IS_DIR(nr); return; } - #endif // SDSORT_CACHE_NAMES - lsAction = LS_GetFilename; - nrFile_index = nr; + #endif workDir.rewind(); - lsDive(nullptr, workDir, match); + selectByIndex(workDir, nr); +} + +// +// Get info for a file in the working directory by DOS name +// +void CardReader::selectFileByName(const char * const match) { + #if ENABLED(SDSORT_CACHE_NAMES) + for (int nr = 0; nr < sort_count; nr++) + if (strcasecmp(match, sortshort[nr]) == 0) { + strcpy(filename, sortshort[nr]); + strcpy(longFilename, sortnames[nr]); + flag.filenameIsDir = IS_DIR(nr); + return; + } + #endif + workDir.rewind(); + selectByName(workDir, match); } uint16_t CardReader::countFilesInWorkDir() { - lsAction = LS_Count; - nrFiles = 0; workDir.rewind(); - lsDive(nullptr, workDir); - //SERIAL_ECHOLN(nrFiles); - return nrFiles; + return countItems(workDir); } /** @@ -650,11 +682,11 @@ const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, con static SdFile newDir1, newDir2; SdFile *sub = &newDir1, *startDir; - const char *dirname_start = path; + const char *item_name_adr = path; if (path[0] == '/') { curDir = &root; workDirDepth = 0; - dirname_start++; + item_name_adr++; } else curDir = &workDir; @@ -662,15 +694,15 @@ const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, con startDir = curDir; // Start dive - while (dirname_start) { + while (item_name_adr) { // Find next sub - char * const dirname_end = strchr(dirname_start, '/'); - if (dirname_end <= dirname_start) break; + char * const name_end = strchr(item_name_adr, '/'); + if (name_end <= item_name_adr) break; // Set subDirName - const uint8_t len = dirname_end - dirname_start; + const uint8_t len = name_end - item_name_adr; char dosSubdirname[len + 1]; - strncpy(dosSubdirname, dirname_start, len); + strncpy(dosSubdirname, item_name_adr, len); dosSubdirname[len] = 0; if (echo) SERIAL_ECHOLN(dosSubdirname); @@ -693,13 +725,13 @@ const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, con // Point sub pointer to unused newDir sub = (curDir != &newDir1) ? &newDir1 : &newDir2; - // dirname_start point to next sub - dirname_start = dirname_end + 1; + // item_name_adr point to next sub + item_name_adr = name_end + 1; } - return dirname_start; + return item_name_adr; } -void CardReader::chdir(const char * relpath) { +void CardReader::cd(const char * relpath) { SdFile newDir; SdFile *parent = workDir.isOpen() ? &workDir : &root; @@ -718,7 +750,7 @@ void CardReader::chdir(const char * relpath) { } } -int8_t CardReader::updir() { +int8_t CardReader::cdup() { if (workDirDepth > 0) { // At least 1 dir has been saved workDir = --workDirDepth ? workDirParents[workDirDepth - 1] : root; // Use parent, or root if none #if ENABLED(SDCARD_SORT_ALPHA) @@ -729,7 +761,7 @@ int8_t CardReader::updir() { return workDirDepth; } -void CardReader::setroot() { +void CardReader::cdroot() { workDir = root; flag.workDirIsRoot = true; #if ENABLED(SDCARD_SORT_ALPHA) @@ -740,10 +772,10 @@ void CardReader::setroot() { #if ENABLED(SDCARD_SORT_ALPHA) /** - * Get the name of a file in the current directory by sort-index + * Get the name of a file in the working directory by sort-index */ void CardReader::getfilename_sorted(const uint16_t nr) { - getfilename( + selectFileByIndex( #if ENABLED(SDSORT_GCODE) sort_alpha && #endif @@ -757,7 +789,7 @@ void CardReader::setroot() { #define SET_SORTNAME(I) (sortnames[I] = strdup(longest_filename())) #if ENABLED(SDSORT_CACHE_NAMES) // When caching also store the short name, since - // we're replacing the getfilename() behavior. + // we're replacing the selectFileByIndex() behavior. #define SET_SORTSHORT(I) (sortshort[I] = strdup(filename)) #else #define SET_SORTSHORT(I) NOOP @@ -854,7 +886,7 @@ void CardReader::setroot() { i); // If using RAM then read all filenames now. #if ENABLED(SDSORT_USES_RAM) - getfilename(i); + selectFileByIndex(i); SET_SORTNAME(i); SET_SORTSHORT(i); // char out[30]; @@ -871,8 +903,17 @@ void CardReader::setroot() { // Bubble Sort for (uint16_t i = fileCnt; --i;) { bool didSwap = false; + uint8_t o1 = sort_order[0]; + #if DISABLED(SDSORT_USES_RAM) + selectFileByIndex(o1); // Pre-fetch the first entry and save it + strcpy(name1, longest_filename()); // so the loop only needs one fetch + #if HAS_FOLDER_SORTING + bool dir1 = flag.filenameIsDir; + #endif + #endif + for (uint16_t j = 0; j < i; ++j) { - const uint16_t o1 = sort_order[j], o2 = sort_order[j + 1]; + const uint16_t o2 = sort_order[j + 1]; // Compare names from the array or just the two buffered names #if ENABLED(SDSORT_USES_RAM) @@ -884,12 +925,7 @@ void CardReader::setroot() { #if HAS_FOLDER_SORTING #if ENABLED(SDSORT_USES_RAM) // Folder sorting needs an index and bit to test for folder-ness. - const uint8_t ind1 = o1 >> 3, bit1 = o1 & 0x07, - ind2 = o2 >> 3, bit2 = o2 & 0x07; - #define _SORT_CMP_DIR(fs) \ - (((isDir[ind1] & _BV(bit1)) != 0) == ((isDir[ind2] & _BV(bit2)) != 0) \ - ? _SORT_CMP_NODIR() \ - : (isDir[fs > 0 ? ind1 : ind2] & (fs > 0 ? _BV(bit1) : _BV(bit2))) != 0) + #define _SORT_CMP_DIR(fs) IS_DIR(o1) == IS_DIR(o2) ? _SORT_CMP_NODIR() : IS_DIR(fs > 0 ? o1 : o2) #else #define _SORT_CMP_DIR(fs) ((dir1 == flag.filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? dir1 : !dir1)) #endif @@ -898,13 +934,9 @@ void CardReader::setroot() { // The most economical method reads names as-needed // throughout the loop. Slow if there are many. #if DISABLED(SDSORT_USES_RAM) - getfilename(o1); - strcpy(name1, longest_filename()); // save (or getfilename below will trounce it) - #if HAS_FOLDER_SORTING - bool dir1 = flag.filenameIsDir; - #endif - getfilename(o2); - char *name2 = longest_filename(); // use the string in-place + selectFileByIndex(o2); + const bool dir2 = flag.filenameIsDir; + char * const name2 = longest_filename(); // use the string in-place #endif // !SDSORT_USES_RAM // Sort the current pair according to settings. @@ -919,10 +951,22 @@ void CardReader::setroot() { _SORT_CMP_NODIR() #endif ) { + // Reorder the index, indicate that sorting happened + // Note that the next o1 will be the current o1. No new fetch needed. sort_order[j] = o2; sort_order[j + 1] = o1; didSwap = true; } + else { + // The next o1 is the current o2. No new fetch needed. + o1 = o2; + #if DISABLED(SDSORT_USES_RAM) + #if HAS_FOLDER_SORTING + dir1 = dir2; + #endif + strcpy(name1, name2); + #endif + } } if (!didSwap) break; } @@ -944,10 +988,10 @@ void CardReader::setroot() { sortshort = new char*[1]; isDir = new uint8_t[1]; #endif - getfilename(0); + selectFileByIndex(0); SET_SORTNAME(0); SET_SORTSHORT(0); - isDir[0] = flag.filenameIsDir ? 0x01 : 0x00; + isDir[0] = flag.filenameIsDir; #endif } @@ -984,6 +1028,9 @@ uint16_t CardReader::get_num_Files() { ; } +// +// Return from procedure or close out the Print Job +// void CardReader::printingHasFinished() { planner.synchronize(); file.close(); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 629efb2966..8ef8dbeae3 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -33,8 +33,6 @@ #include "SdFile.h" -enum LsAction : uint8_t { LS_SerialPrint, LS_Count, LS_GetFilename }; - typedef struct { bool saving:1, logging:1, @@ -51,48 +49,83 @@ typedef struct { class CardReader { public: + static card_flags_t flag; // Flags (above) + static char filename[FILENAME_LENGTH], // DOS 8.3 filename of the selected item + longFilename[LONG_FILENAME_LENGTH]; // Long name of the selected item + + // Fast! binary file transfer + #if ENABLED(BINARY_FILE_TRANSFER) + #if NUM_SERIAL > 1 + static int8_t transfer_port_index; + #else + static constexpr int8_t transfer_port_index = 0; + #endif + #endif + + // // // Methods // // // + CardReader(); - static void mount(); - static void write_command(char *buf); + static SdFile getroot() { return root; } + static void mount(); + static void release(); + static inline bool isMounted() { return flag.mounted; } + static void ls(); + + // SD Card Logging + static void openLogFile(char * const path); + static void write_command(char * const buf); + + // Auto-Start files + static int8_t autostart_index; // Index of autoX.g files static void beginautostart(); static void checkautostart(); + // Basic file ops static void openFile(char * const path, const bool read, const bool subcall=false); - static void openLogFile(char * const path); - static void removeFile(const char * const name); static void closefile(const bool store_location=false); - static void release(); - static void openAndPrintFile(const char *name); + static void removeFile(const char * const name); + + static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; } + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void printLongPath(char * const path); // Used by M33 + #endif + + // Working Directory for SD card menu + static void cdroot(); + static void cd(const char *relpath); + static int8_t cdup(); + static uint16_t countFilesInWorkDir(); + static uint16_t get_num_Files(); + + // Select a file + static void selectFileByIndex(const uint16_t nr); + static void selectFileByName(const char* const match); + + // Print job + static void openAndPrintFile(const char *name); // (working directory) + static void printingHasFinished(); + static void getAbsFilename(char *dst); static void startFileprint(); + static void printFilename(); static void stopSDPrint( #if SD_RESORT const bool re_sort=false #endif ); static void report_status(); - static void printingHasFinished(); - static void printFilename(); - - #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - static void printLongPath(char *path); + static inline void pauseSDPrint() { flag.sdprinting = false; } + static inline bool isPaused() { return isFileOpen() && !flag.sdprinting; } + static inline bool isPrinting() { return flag.sdprinting; } + #if HAS_PRINT_PROGRESS_PERMYRIAD + static inline uint16_t permyriadDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 9999) / 10000) : 0; } #endif + static inline uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } - static void getfilename(uint16_t nr, const char* const match=nullptr); - static uint16_t countFilesInWorkDir(); - - static void getAbsFilename(char *t); - - static void ls(); - static void chdir(const char *relpath); - static int8_t updir(); - static void setroot(); - + // Helper for open and remove static const char* diveToFile(SdFile*& curDir, const char * const path, const bool echo=false); - static uint16_t get_num_Files(); - #if ENABLED(SDCARD_SORT_ALPHA) static void presort(); static void getfilename_sorted(const uint16_t nr); @@ -102,7 +135,7 @@ public: //FORCE_INLINE static void setSortReverse(bool b) { sort_reverse = b; } #endif #else - FORCE_INLINE static void getfilename_sorted(const uint16_t nr) { getfilename(nr); } + FORCE_INLINE static void getfilename_sorted(const uint16_t nr) { selectFileByIndex(nr); } #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -111,17 +144,12 @@ public: static void removeJobRecoveryFile(); #endif - static inline void pauseSDPrint() { flag.sdprinting = false; } - static inline bool isMounted() { return flag.mounted; } static inline bool isFileOpen() { return isMounted() && file.isOpen(); } - static inline bool isPaused() { return isFileOpen() && !flag.sdprinting; } - static inline bool isPrinting() { return flag.sdprinting; } - static inline bool eof() { return sdpos >= filesize; } - static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } - static inline void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } static inline uint32_t getIndex() { return sdpos; } - static inline uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } + static inline bool eof() { return sdpos >= filesize; } + static inline void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } static inline char* getWorkDirName() { workDir.getDosName(filename); return filename; } + static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } @@ -139,27 +167,16 @@ public: } #endif - static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; } - -public: - static card_flags_t flag; - static char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH]; - static int8_t autostart_index; - static SdFile getroot() { return root; } - - #if ENABLED(BINARY_FILE_TRANSFER) - #if NUM_SERIAL > 1 - static int8_t transfer_port_index; - #else - static constexpr int8_t transfer_port_index = 0; - #endif - #endif - private: + // + // Working directory and parents + // static SdFile root, workDir, workDirParents[MAX_DIR_DEPTH]; static uint8_t workDirDepth; - // Sort files and folders alphabetically. + // + // Alphabetical file and folder sorting + // #if ENABLED(SDCARD_SORT_ALPHA) static uint16_t sort_count; // Count of sorted items in the current directory #if ENABLED(SDSORT_GCODE) @@ -188,6 +205,7 @@ private: // If using dynamic ram for names, allocate on the heap. #if ENABLED(SDSORT_CACHE_NAMES) + static uint16_t nrFiles; // Cache the total count #if ENABLED(SDSORT_DYNAMIC_RAM) static char **sortshort, **sortnames; #else @@ -216,25 +234,21 @@ private: static SdVolume volume; static SdFile file; + static uint32_t filesize, sdpos; + + // + // Procedure calls to other files + // #ifndef SD_PROCEDURE_DEPTH #define SD_PROCEDURE_DEPTH 1 #endif - static uint8_t file_subcall_ctr; static uint32_t filespos[SD_PROCEDURE_DEPTH]; static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; - static uint32_t filesize, sdpos; - - static LsAction lsAction; //stored for recursion. - static uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. - static char *diveDirName; - static void lsDive(const char *prepend, SdFile parent, const char * const match=nullptr); - - #if ENABLED(SDCARD_SORT_ALPHA) - static void flush_presort(); - #endif - + // + // SD Auto Reporting + // #if ENABLED(AUTO_REPORT_SD_STATUS) static uint8_t auto_report_sd_interval; static millis_t next_sd_report_ms; @@ -242,6 +256,19 @@ private: static int8_t auto_report_port; #endif #endif + + // + // Directory items + // + static bool is_dir_or_gcode(const dir_t &p); + static int countItems(SdFile dir); + static void selectByIndex(SdFile dir, const uint8_t index); + static void selectByName(SdFile dir, const char * const match); + static void printListing(SdFile parent, const char * const prepend=nullptr); + + #if ENABLED(SDCARD_SORT_ALPHA) + static void flush_presort(); + #endif }; #if ENABLED(USB_FLASH_DRIVE_SUPPORT) @@ -258,6 +285,7 @@ private: #endif #define IS_SD_PRINTING() card.flag.sdprinting +#define IS_SD_PAUSED() card.isPaused() #define IS_SD_FILE_OPEN() card.isFileOpen() extern CardReader card; @@ -265,6 +293,9 @@ extern CardReader card; #else // !SDSUPPORT #define IS_SD_PRINTING() false +#define IS_SD_PAUSED() false #define IS_SD_FILE_OPEN() false +#define LONG_FILENAME_LENGTH 0 + #endif // !SDSUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 5ab82d3af7..a429bfd28f 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -57,13 +57,13 @@ class Sd2Card { static void idle(); - inline bool readStart(const uint32_t block) { pos = block; return ready(); } - inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } - inline bool readStop() const { return true; } + inline bool readStart(const uint32_t block) { pos = block; return ready(); } + inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } + inline bool readStop() const { return true; } - inline bool writeStart(const uint32_t block, const uint32_t eraseCount) { UNUSED(eraseCount); pos = block; return ready(); } - inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } - inline bool writeStop() const { return true; } + inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return ready(); } + inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } + inline bool writeStop() const { return true; } bool readBlock(uint32_t block, uint8_t* dst); bool writeBlock(uint32_t blockNumber, const uint8_t* src); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h index 529bafbbc0..28a2841446 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h @@ -120,7 +120,7 @@ public: lenSize(0), valSize(0), pBuf(nullptr), - prsMode(modeArray) { } + prsMode(modeArray) {} ; void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) { diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h index 9ebefab5d1..1050d70c74 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h @@ -25,7 +25,7 @@ e-mail : support@circuitsathome.com */ #ifndef UHS_SCSI_H -#define UHS_SCSI_H +#define UHS_SCSI_H /* * Reference documents from T10 (http://www.t10.org) @@ -35,21 +35,21 @@ e-mail : support@circuitsathome.com */ /* Group 1 commands (CDB's here are should all be 6-bytes) */ -#define SCSI_CMD_TEST_UNIT_READY 0x00U -#define SCSI_CMD_REQUEST_SENSE 0x03U -#define SCSI_CMD_FORMAT_UNIT 0x04U -#define SCSI_CMD_READ_6 0x08U -#define SCSI_CMD_WRITE_6 0x0AU -#define SCSI_CMD_INQUIRY 0x12U +#define SCSI_CMD_TEST_UNIT_READY 0x00U +#define SCSI_CMD_REQUEST_SENSE 0x03U +#define SCSI_CMD_FORMAT_UNIT 0x04U +#define SCSI_CMD_READ_6 0x08U +#define SCSI_CMD_WRITE_6 0x0AU +#define SCSI_CMD_INQUIRY 0x12U #define SCSI_CMD_MODE_SELECT_6 0x15U -#define SCSI_CMD_MODE_SENSE_6 0x1AU -#define SCSI_CMD_START_STOP_UNIT 0x1BU +#define SCSI_CMD_MODE_SENSE_6 0x1AU +#define SCSI_CMD_START_STOP_UNIT 0x1BU #define SCSI_CMD_PREVENT_REMOVAL 0x1EU /* Group 2 Commands (CDB's here are 10-bytes) */ #define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23U -#define SCSI_CMD_READ_CAPACITY_10 0x25U -#define SCSI_CMD_READ_10 0x28U -#define SCSI_CMD_WRITE_10 0x2AU +#define SCSI_CMD_READ_CAPACITY_10 0x25U +#define SCSI_CMD_READ_10 0x28U +#define SCSI_CMD_WRITE_10 0x2AU #define SCSI_CMD_SEEK_10 0x2BU #define SCSI_CMD_ERASE_10 0x2CU #define SCSI_CMD_WRITE_AND_VERIFY_10 0x2EU @@ -107,10 +107,10 @@ e-mail : support@circuitsathome.com #define SCSI_CMD_READ_ALL_SUBCODES 0xDFU /* Vendor unique */ /* SCSI error codes */ -#define SCSI_S_NOT_READY 0x02U -#define SCSI_S_MEDIUM_ERROR 0x03U -#define SCSI_S_ILLEGAL_REQUEST 0x05U -#define SCSI_S_UNIT_ATTENTION 0x06U +#define SCSI_S_NOT_READY 0x02U +#define SCSI_S_MEDIUM_ERROR 0x03U +#define SCSI_S_ILLEGAL_REQUEST 0x05U +#define SCSI_S_UNIT_ATTENTION 0x06U #define SCSI_ASC_LBA_OUT_OF_RANGE 0x21U #define SCSI_ASC_MEDIA_CHANGED 0x28U #define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3AU @@ -324,4 +324,4 @@ struct SCSI_Request_Sense_Response { uint8_t SenseKeySpecific[3]; } __attribute__((packed)); -#endif /* UHS_SCSI_H */ +#endif /* UHS_SCSI_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h index 87f156db5c..4b8d387d27 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h @@ -25,7 +25,7 @@ e-mail : support@circuitsathome.com */ #ifndef UHS_PRINTF_HELPER_H -#define UHS_PRINTF_HELPER_H +#define UHS_PRINTF_HELPER_H #ifdef LOAD_UHS_PRINTF_HELPER #include @@ -197,4 +197,4 @@ void UHS_AVR_printf_HELPER_init() { #ifndef UHS_printf_HELPER_init #define UHS_printf_HELPER_init() (void(0)) #endif -#endif /* UHS_PRINTF_HELPER_H */ +#endif /* UHS_PRINTF_HELPER_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h index f368604a9a..114064044d 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h @@ -10,7 +10,7 @@ */ #ifndef MACRO_LOGIC_H -#define MACRO_LOGIC_H +#define MACRO_LOGIC_H #define AJK_CAT(a, ...) AJK_PRIMITIVE_CAT(a, __VA_ARGS__) #define AJK_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ @@ -150,4 +150,4 @@ Make 3 bogus function bodies AJK_MAKE_FUNS(unsigned Cfunc,(arg1, arg2),3,BODY) #endif -#endif /* MACRO_LOGIC_H */ +#endif /* MACRO_LOGIC_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h index f23d281e28..5408a94ade 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h @@ -23,7 +23,7 @@ */ #ifdef DYN_SWI_H #ifndef SWI_INLINE_H -#define SWI_INLINE_H +#define SWI_INLINE_H #ifndef SWI_MAXIMUM_ALLOWED #define SWI_MAXIMUM_ALLOWED 4 @@ -240,7 +240,7 @@ int exec_SWI(const dyn_SWI* klass) { } #endif /* defined(__arm__) */ -#endif /* SWI_INLINE_H */ +#endif /* SWI_INLINE_H */ #else #error "Never include SWI_INLINE.h directly, include dyn_SWI.h instead" #endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h index 2738c8c6ff..0fdb3ee3db 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h @@ -20,7 +20,7 @@ */ #ifndef DYN_SWI_H -#define DYN_SWI_H +#define DYN_SWI_H #if defined(__arm__) || defined(ARDUINO_ARCH_PIC32) @@ -109,10 +109,10 @@ extern "C" #elif defined(CORE_TEENSY) #ifndef NVIC_GET_ACTIVE -#define NVIC_GET_ACTIVE(n) (*((volatile uint32_t *)0xE000E300 + ((n) >> 5)) & (1 << ((n) & 31))) +#define NVIC_GET_ACTIVE(n) (*((volatile uint32_t *)0xE000E300 + ((n) >> 5)) & (1 << ((n) & 31))) #endif #ifndef NVIC_GET_PENDING -#define NVIC_GET_PENDING(n) (*((volatile uint32_t *)0xE000E200 + ((n) >> 5)) & (1 << ((n) & 31))) +#define NVIC_GET_PENDING(n) (*((volatile uint32_t *)0xE000E200 + ((n) >> 5)) & (1 << ((n) & 31))) #ifndef SWI_IRQ_NUM #ifdef __MK20DX256__ #define SWI_IRQ_NUM 17 @@ -169,4 +169,4 @@ extern int exec_SWI(const dyn_SWI* klass); #define DDSB() (void(0)) #endif #endif -#endif /* DYN_SWI_H */ +#endif /* DYN_SWI_H */ diff --git a/README.md b/README.md index 19cc7adb8e..b0c93bb01a 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level ----|---------|-----|-----|----|-----|--- [STEVAL-3DP001V1](http://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](http://www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes [Smoothieboard](http://reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no - [Adafruit Grand Central M4](https://www.adafruit.com/product/4064)|ARM-Cortex M4|120MHz|1M|256k|3.3V|yes + [Adafruit Grand Central M4](https://www.adafruit.com/product/4064)|[SAMD51P20A ARM-Cortex M4](https://www.microchip.com/wwwproducts/en/ATSAMD51P20A)|120MHz|1M|256k|3.3V|yes ## Submitting Patches diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index 5a07ef5b11..c2bcbdc758 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -2,10 +2,10 @@ # # generate_version # -# Make a _Version.h file +# Make a Version.h file to accompany CUSTOM_VERSION_FILE # -DIR=${1:-"Marlin/src/inc"} +DIR=${1:-"Marlin"} # MRCC3=$( git merge-base HEAD upstream/bugfix-2.0.x 2>/dev/null ) # MRCC2=$( git merge-base HEAD upstream/bugfix-1.1.x 2>/dev/null ) @@ -44,7 +44,30 @@ SOURCE_CODE_URL=$(awk -F'"' \ WEBSITE_URL=$(awk -F'"' \ '/#define WEBSITE_URL/{ print $2 }' < "${DIR}/Version.h") -cat > "${DIR}/_Version.h" < "${DIR}/Version.h" <. + * + */ +#pragma once + /** * THIS FILE IS AUTOMATICALLY GENERATED DO NOT MANUALLY EDIT IT. * IT DOES NOT GET COMMITTED TO THE REPOSITORY. @@ -53,15 +76,69 @@ cat > "${DIR}/_Version.h" <= 320 and position < 31040: byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') robin.write(byte) position += 1 finally: diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py index c11bbb37f6..95cb2a53ea 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py @@ -10,6 +10,7 @@ env.Replace(LDSCRIPT_PATH="buildroot/share/PlatformIO/ldscripts/mks_robin_lite.l # Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' def encrypt(source, target, env): import os + import sys key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] @@ -22,6 +23,8 @@ def encrypt(source, target, env): byte = firmware.read(1) if position >= 320 and position < 31040: byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') robin.write(byte) position += 1 finally: diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py index 2b3ba6f90d..62b2091dd5 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py @@ -10,6 +10,7 @@ env.Replace(LDSCRIPT_PATH="buildroot/share/PlatformIO/ldscripts/mks_robin_mini.l # Encrypt ${PROGNAME}.bin and save it as 'Robin_mini.bin' def encrypt(source, target, env): import os + import sys key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] @@ -22,6 +23,8 @@ def encrypt(source, target, env): byte = firmware.read(1) if position >= 320 and position < 31040: byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') robin.write(byte) position += 1 finally: diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py index eb8bca9b52..6a195fa089 100644 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py @@ -10,6 +10,7 @@ env.Replace(LDSCRIPT_PATH="buildroot/share/PlatformIO/ldscripts/mks_robin_nano.l # Encrypt ${PROGNAME}.bin and save it as 'Robin_nano.bin' def encrypt(source, target, env): import os + import sys key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] @@ -22,6 +23,8 @@ def encrypt(source, target, env): byte = firmware.read(1) if position >= 320 and position < 31040: byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') robin.write(byte) position += 1 finally: diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index 5c01303a38..d95d203b5a 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -62,7 +62,7 @@ OLDWD=`pwd` # # By default loop through all languages # -LANGS_DEFAULT="an bg ca cz da de el el-gr en es eu fi fr gl hr it jp-kana ko_KR nl pl pt pt-br ru sk tr uk vi zh_CN zh_TW test" +LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr it jp_kana ko_KR nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test" # # Generate data for language list MARLIN_LANGS or all if not provided diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf index b55e1a9a90..ef90656eba 100644 --- a/buildroot/share/fonts/marlin-6x12-3.bdf +++ b/buildroot/share/fonts/marlin-6x12-3.bdf @@ -1,7 +1,7 @@ STARTFONT 2.1 FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 SIZE 12 75 75 -FONTBOUNDINGBOX 12 13 0 -2 +FONTBOUNDINGBOX 12 15 0 -2 COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" COMMENT "Marlin 6x12 Fixed, for menu display" COMMENT "This font is based on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1'. Marlin symbols added at position 1-9. Added jp-kana data. Other missing char data from wqy-bitmapsong-bdf-1.0.0-RC1. Some chars tweaked for LCD display, such as ',;c69' etc." @@ -73075,8 +73075,8 @@ ENDCHAR STARTCHAR U_3099 ENCODING 12441 SWIDTH 1000 0 -DWIDTH 12 0 -BBX 4 3 0 7 +DWIDTH 6 0 +BBX 4 3 0 5 BITMAP 20 90 @@ -73085,8 +73085,8 @@ ENDCHAR STARTCHAR U_309B ENCODING 12443 SWIDTH 1000 0 -DWIDTH 12 0 -BBX 4 3 0 6 +DWIDTH 6 0 +BBX 4 3 0 5 BITMAP 20 90 @@ -73095,8 +73095,8 @@ ENDCHAR STARTCHAR U_309C ENCODING 12444 SWIDTH 1000 0 -DWIDTH 12 0 -BBX 3 3 0 6 +DWIDTH 6 0 +BBX 3 3 0 5 BITMAP 40 A0 @@ -73106,7 +73106,7 @@ STARTCHAR u30A0 ENCODING 12448 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 3 0 1 +BBX 5 3 0 3 BITMAP F8 00 @@ -73116,43 +73116,47 @@ STARTCHAR u30A1 ENCODING 12449 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP F0 10 60 40 +80 ENDCHAR STARTCHAR u30A2 ENCODING 12450 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP F8 08 28 30 20 +20 40 ENDCHAR STARTCHAR u30A3 ENCODING 12451 SWIDTH 545 0 DWIDTH 6 0 -BBX 3 4 1 0 +BBX 4 5 0 0 BITMAP +10 +20 +60 +A0 20 -40 -C0 -40 ENDCHAR STARTCHAR u30A4 ENCODING 12452 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 6 0 0 +BBX 5 7 0 0 BITMAP +08 10 20 60 @@ -73164,31 +73168,33 @@ STARTCHAR u30A5 ENCODING 12453 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP 20 F0 90 +10 20 ENDCHAR STARTCHAR u30A6 ENCODING 12454 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 20 F8 88 +88 08 10 -20 +60 ENDCHAR STARTCHAR u30A7 ENCODING 12455 SWIDTH 545 0 DWIDTH 6 0 -BBX 3 4 1 0 +BBX 3 4 0 0 BITMAP E0 40 @@ -73199,22 +73205,24 @@ STARTCHAR u30A8 ENCODING 12456 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 20 20 20 +20 F8 ENDCHAR STARTCHAR u30A9 ENCODING 12457 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP 20 F0 +20 60 A0 ENDCHAR @@ -73222,10 +73230,11 @@ STARTCHAR u30AA ENCODING 12458 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 10 F8 +10 30 50 90 @@ -73235,92 +73244,101 @@ STARTCHAR u30AB ENCODING 12459 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 40 F8 48 48 48 -90 +48 +98 ENDCHAR STARTCHAR u30AC ENCODING 12460 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 40 F8 48 48 48 -90 +48 +98 ENDCHAR STARTCHAR u30AD ENCODING 12461 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 20 F8 20 +20 F8 -20 -20 +10 +10 ENDCHAR STARTCHAR u30AE ENCODING 12462 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 20 F8 20 +20 F8 -20 -20 +10 +10 ENDCHAR STARTCHAR u30AF ENCODING 12463 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 5 7 0 0 BITMAP -70 -90 +40 +78 +48 +88 +08 10 -20 -C0 +60 ENDCHAR STARTCHAR u30B0 ENCODING 12464 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 -00 -70 -90 +08 +40 +78 +48 +88 +08 10 -20 -C0 +60 ENDCHAR STARTCHAR u30B1 ENCODING 12465 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP -40 -78 +80 +F8 +90 90 10 10 @@ -73330,12 +73348,13 @@ STARTCHAR u30B2 ENCODING 12466 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 -40 -78 +28 +80 +F8 +90 90 10 10 @@ -73345,65 +73364,71 @@ STARTCHAR u30BB3 ENCODING 12467 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 08 08 08 +08 F8 ENDCHAR STARTCHAR u30B4 ENCODING 12468 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 F8 08 08 08 +08 F8 ENDCHAR STARTCHAR u30BB5 ENCODING 12469 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 50 F8 50 +50 +50 10 20 -40 ENDCHAR STARTCHAR u30B6 ENCODING 12470 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 50 F8 50 +50 +50 10 20 -40 ENDCHAR STARTCHAR u30B7 ENCODING 12471 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP C0 08 C8 +08 10 E0 ENDCHAR @@ -73411,13 +73436,19 @@ STARTCHAR u30B8 ENCODING 12472 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 7 13 0 0 BITMAP +02 +00 +00 +00 +28 28 00 C0 08 C8 +08 10 E0 ENDCHAR @@ -73425,9 +73456,10 @@ STARTCHAR u30B9 ENCODING 12473 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP -F8 +70 +10 10 20 50 @@ -73437,11 +73469,13 @@ STARTCHAR u30BA ENCODING 12474 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 -F8 +70 +10 10 20 50 @@ -73451,9 +73485,10 @@ STARTCHAR u30BB ENCODING 12475 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 40 +40 F8 48 50 @@ -73464,10 +73499,11 @@ STARTCHAR u30BC ENCODING 12476 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 +40 40 F8 48 @@ -73479,37 +73515,42 @@ STARTCHAR u30BD ENCODING 12477 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP 88 -88 +48 48 10 -60 +10 +20 ENDCHAR STARTCHAR u30BE ENCODING 12478 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 88 -88 +48 48 10 -60 +10 +20 ENDCHAR STARTCHAR u30BF ENCODING 12479 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 7 0 0 BITMAP +40 78 48 A8 +18 10 60 ENDCHAR @@ -73517,13 +73558,15 @@ STARTCHAR u30C0 ENCODING 12480 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 +40 78 48 A8 +18 10 60 ENDCHAR @@ -73531,28 +73574,30 @@ STARTCHAR u30C1 ENCODING 12481 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 10 -E0 +60 20 F8 20 +20 40 ENDCHAR STARTCHAR u30C2 ENCODING 12482 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 10 -E0 +60 20 F8 20 +20 40 ENDCHAR STARTCHAR u30C3 @@ -73570,66 +73615,72 @@ STARTCHAR u30C4 ENCODING 12484 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP A8 A8 +A8 08 10 -20 +60 ENDCHAR STARTCHAR u30C5 ENCODING 12485 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 A8 A8 +A8 08 10 -20 +60 ENDCHAR STARTCHAR u30C6 ENCODING 12486 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 70 00 F8 20 20 +20 40 ENDCHAR STARTCHAR u30C7 ENCODING 12487 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 70 00 F8 20 20 +20 40 ENDCHAR STARTCHAR u30C8 ENCODING 12488 SWIDTH 545 0 DWIDTH 6 0 -BBX 3 6 1 0 +BBX 4 7 1 0 BITMAP 80 80 C0 A0 +90 80 80 ENDCHAR @@ -73637,14 +73688,15 @@ STARTCHAR u30C9 ENCODING 12489 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 8 1 0 +BBX 4 9 1 0 BITMAP 50 -00 +10 80 80 C0 A0 +90 80 80 ENDCHAR @@ -73652,9 +73704,10 @@ STARTCHAR u30CA ENCODING 12490 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 20 +20 F8 20 20 @@ -73665,38 +73718,41 @@ STARTCHAR u30CB ENCODING 12491 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP 70 00 00 00 +00 F8 ENDCHAR STARTCHAR u30CC ENCODING 12492 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP -F8 +78 08 -50 -20 -D0 +28 +10 +28 +C0 ENDCHAR STARTCHAR u30CD ENCODING 12493 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 20 -F8 +70 10 20 70 A8 +20 ENDCHAR STARTCHAR u30CE ENCODING 12494 @@ -73707,7 +73763,7 @@ BITMAP 20 20 20 -20 +40 40 80 ENDCHAR @@ -73715,11 +73771,12 @@ STARTCHAR u30CF ENCODING 12495 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP 10 -88 -88 +50 +50 +48 88 88 ENDCHAR @@ -73727,13 +73784,15 @@ STARTCHAR u30D0 ENCODING 12496 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 10 -88 -88 +50 +50 +48 88 88 ENDCHAR @@ -73741,14 +73800,15 @@ STARTCHAR u30D1 ENCODING 12497 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 18 18 00 10 -88 -88 +50 +50 +48 88 88 ENDCHAR @@ -73756,52 +73816,57 @@ STARTCHAR u30D2 ENCODING 12498 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 4 6 0 0 BITMAP 80 -80 -F8 +90 +E0 80 80 -78 +70 ENDCHAR STARTCHAR u30D3 ENCODING 12499 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 +00 +80 +90 +E0 80 80 -F8 -80 -80 -78 +70 ENDCHAR STARTCHAR u30D4 ENCODING 12500 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 18 -98 +18 +00 80 -F8 +90 +E0 80 80 -78 +70 ENDCHAR STARTCHAR u30D5 ENCODING 12501 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 08 08 +08 10 60 ENDCHAR @@ -73809,13 +73874,15 @@ STARTCHAR u30D6 ENCODING 12502 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 F8 08 08 +08 10 60 ENDCHAR @@ -73823,7 +73890,7 @@ STARTCHAR u30D7 ENCODING 12503 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 18 18 @@ -73831,6 +73898,7 @@ BITMAP F8 08 08 +08 10 60 ENDCHAR @@ -73838,72 +73906,79 @@ STARTCHAR u30D8 ENCODING 12504 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 4 0 1 +BBX 5 5 0 1 BITMAP -40 +60 A0 10 +10 08 ENDCHAR STARTCHAR u30D9 ENCODING 12505 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 1 +BBX 5 8 0 1 BITMAP 28 +28 00 -40 +60 A0 10 +10 08 ENDCHAR STARTCHAR u30DA ENCODING 12506 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 1 +BBX 5 8 0 1 BITMAP 18 18 -40 +00 +60 A0 10 +10 08 ENDCHAR STARTCHAR u30DB ENCODING 12507 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 20 F8 20 A8 A8 +A8 20 ENDCHAR STARTCHAR u30DC ENCODING 12508 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 20 F8 20 A8 A8 +A8 20 ENDCHAR STARTCHAR u30DD ENCODING 12509 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 18 18 @@ -73912,16 +73987,18 @@ F8 20 A8 A8 +A8 20 ENDCHAR STARTCHAR u30DE ENCODING 12510 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 08 +08 50 20 10 @@ -73930,23 +74007,26 @@ STARTCHAR u30DF ENCODING 12511 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 1 0 +BBX 4 6 1 0 BITMAP E0 00 E0 00 -F0 +C0 +30 ENDCHAR STARTCHAR u30E0 ENCODING 12512 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 7 0 0 BITMAP 20 +20 +20 40 -88 +48 F8 08 ENDCHAR @@ -73954,10 +74034,11 @@ STARTCHAR u30E1 ENCODING 12513 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP 08 -28 +48 +30 10 28 C0 @@ -73966,22 +74047,24 @@ STARTCHAR u30E2 ENCODING 12514 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP -F8 +F0 40 F8 40 +40 38 ENDCHAR STARTCHAR u30E3 ENCODING 12515 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 4 0 0 +BBX 5 5 0 0 BITMAP 40 F8 +48 50 40 ENDCHAR @@ -73989,9 +74072,10 @@ STARTCHAR u30E4 ENCODING 12516 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 40 +40 F8 48 50 @@ -74002,23 +74086,25 @@ STARTCHAR u30E5 ENCODING 12517 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP 60 20 20 +20 F0 ENDCHAR STARTCHAR u30E6 ENCODING 12518 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP 70 10 10 10 +10 F8 ENDCHAR STARTCHAR u30E7 @@ -74037,47 +74123,52 @@ STARTCHAR u30E8 ENCODING 12520 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 08 F8 08 +08 F8 ENDCHAR STARTCHAR u30E9 ENCODING 12521 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 70 00 F8 08 +08 10 -20 +60 ENDCHAR STARTCHAR u30EA ENCODING 12522 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 6 0 0 +BBX 4 7 0 0 BITMAP +10 90 90 90 90 10 -20 +60 ENDCHAR STARTCHAR u30EB ENCODING 12523 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 7 0 0 BITMAP 20 +20 +A0 A0 A8 A8 @@ -74087,54 +74178,58 @@ STARTCHAR u30EC ENCODING 12524 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 5 6 0 0 BITMAP 80 80 -90 -A0 +80 +88 +B0 C0 ENDCHAR STARTCHAR u30ED ENCODING 12525 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 88 88 88 +88 F8 ENDCHAR STARTCHAR u30EE ENCODING 12526 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP F0 90 10 -20 +10 +60 ENDCHAR STARTCHAR u30EF ENCODING 12527 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 88 +88 08 10 -20 +60 ENDCHAR STARTCHAR u30F0 ENCODING 12528 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 7 0 0 BITMAP 10 F8 @@ -74142,16 +74237,18 @@ F8 50 F8 10 +10 ENDCHAR STARTCHAR u30F1 ENCODING 12529 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP -F8 -08 -30 +70 +10 +20 +20 20 F8 ENDCHAR @@ -74159,23 +74256,25 @@ STARTCHAR u30F2 ENCODING 12530 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP F8 08 F8 08 -30 +10 +60 ENDCHAR STARTCHAR u30F3 ENCODING 12531 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 6 0 0 BITMAP C0 08 08 +08 10 E0 ENDCHAR @@ -74183,36 +74282,39 @@ STARTCHAR u30F4 ENCODING 12532 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 20 F8 88 +88 08 10 -20 +60 ENDCHAR STARTCHAR u30F5 ENCODING 12533 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP 40 F0 50 -A0 +50 +B0 ENDCHAR STARTCHAR u30F6 ENCODING 12534 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 4 0 0 +BBX 4 5 0 0 BITMAP -40 +80 F0 +A0 20 40 ENDCHAR @@ -74220,12 +74322,14 @@ STARTCHAR u30F7 ENCODING 12535 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 F8 88 +88 08 10 60 @@ -74234,28 +74338,31 @@ STARTCHAR u30F8 ENCODING 12536 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 0 +BBX 5 9 0 0 BITMAP 28 -00 +08 10 F8 50 50 F8 10 +10 ENDCHAR STARTCHAR u30F9 ENCODING 12537 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 -F8 -08 -30 +70 +10 +20 +20 20 F8 ENDCHAR @@ -74263,21 +74370,23 @@ STARTCHAR u30FA ENCODING 12538 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 9 0 0 BITMAP 28 +28 00 F8 08 F8 08 -30 +10 +60 ENDCHAR STARTCHAR u30FB ENCODING 12539 SWIDTH 545 0 DWIDTH 6 0 -BBX 2 2 2 2 +BBX 2 2 2 3 BITMAP C0 C0 @@ -74286,15 +74395,16 @@ STARTCHAR u30FC ENCODING 12540 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 1 0 2 +BBX 5 2 0 3 BITMAP -F8 +80 +78 ENDCHAR STARTCHAR u30FD ENCODING 12541 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 4 0 1 +BBX 5 4 0 2 BITMAP 80 60 @@ -74305,9 +74415,11 @@ STARTCHAR u30FE ENCODING 12542 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 1 +BBX 5 7 0 2 BITMAP 28 +28 +00 80 60 10 diff --git a/buildroot/share/git/firstpush b/buildroot/share/git/firstpush index 443166088c..132795b617 100755 --- a/buildroot/share/git/firstpush +++ b/buildroot/share/git/firstpush @@ -16,13 +16,15 @@ BRANCH=${INFO[5]} git push --set-upstream origin $BRANCH -TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') +which xdg-open >/dev/null && TOOL=xdg-open +which gnome-open >/dev/null && TOOL=gnome-open +which open >/dev/null && TOOL=open URL="https://github.com/$FORK/$REPO/commits/$BRANCH" -if [ -z "$TOOL" ]; then +if [ -z "$OPEN" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Viewing commits on $BRANCH..." - "$TOOL" "$URL" + "$OPEN" "$URL" fi diff --git a/buildroot/share/git/mfdoc b/buildroot/share/git/mfdoc index eba599c612..f2a2b08204 100755 --- a/buildroot/share/git/mfdoc +++ b/buildroot/share/git/mfdoc @@ -16,14 +16,16 @@ BRANCH=${INFO[5]} [[ $ORG == "MarlinFirmware" && $REPO == "MarlinDocumentation" ]] || { echo "Wrong repository." 1>&2; exit 1; } opensite() { - TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') + which xdg-open >/dev/null && TOOL=xdg-open + which gnome-open >/dev/null && TOOL=gnome-open + which open >/dev/null && TOOL=open URL="http://127.0.0.1:4000/" - if [ -z "$TOOL" ]; then + if [ -z "$OPEN" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening preview site in the browser..." - "$TOOL" "$URL" + "$OPEN" "$URL" fi } diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr index 73af049ab1..0220c0aa8e 100755 --- a/buildroot/share/git/mfpr +++ b/buildroot/share/git/mfpr @@ -23,15 +23,17 @@ OLDBRANCH=${INFO[5]} # See if it's been pushed yet if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush; fi -TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') +which xdg-open >/dev/null && TOOL=xdg-open +which gnome-open >/dev/null && TOOL=gnome-open +which open >/dev/null && TOOL=open URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" -if [ -z "$TOOL" ]; then +if [ -z "$OPEN" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening a New PR Form..." - "$TOOL" "$URL" + "$OPEN" "$URL" fi [[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH diff --git a/buildroot/share/git/mfpub b/buildroot/share/git/mfpub index 29eb0543d7..f77b923656 100755 --- a/buildroot/share/git/mfpub +++ b/buildroot/share/git/mfpub @@ -77,15 +77,17 @@ else git push -f origin fi - TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') + which xdg-open >/dev/null && TOOL=xdg-open + which gnome-open >/dev/null && TOOL=gnome-open + which open >/dev/null && TOOL=open URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" - if [ -z "$TOOL" ]; then + if [ -z "$OPEN" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening a New PR Form..." - "$TOOL" "$URL" + "$OPEN" "$URL" fi fi @@ -116,14 +118,16 @@ git checkout gh-pages || { echo "Something went wrong!"; exit 1; } rsync -av ${TMPFOLDER}/ ./ opensite() { - TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') + which xdg-open >/dev/null && TOOL=xdg-open + which gnome-open >/dev/null && TOOL=gnome-open + which open >/dev/null && TOOL=open URL="http://marlinfw.org/" - if [ -z "$TOOL" ]; then + if [ -z "$OPEN" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening the site in the browser..." - "$TOOL" "$URL" + "$OPEN" "$URL" fi } diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index a585ae3266..a83a309bd9 100644 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -11,11 +11,13 @@ MFINFO=$(mfinfo) || exit 1 [[ -d Marlin/src ]] || { echo "Please 'cd' up to repo root." ; exit 1 ; } TESTPATH=buildroot/share/tests +STATE_FILE=$( echo ./.pio/.mftestrc ) shopt -s extglob nocasematch -# Get test +# Get the environment and test number from the command TESTENV=${1:-'-'} +CHOICE=${2:-0} # Allow shorthand for test name case $TESTENV in @@ -28,8 +30,8 @@ case $TESTENV in m128) TESTENV='megaatmega1280' ;; m256) TESTENV='megaatmega2560' ;; mega) TESTENV='megaatmega2560' ;; - stm) TESTENV='STM32F103R' ;; - f1) TESTENV='STM32F103R' ;; + stm) TESTENV='STM32F103RE' ;; + f1) TESTENV='STM32F103RE' ;; f4) TESTENV='STM32F4' ;; f7) TESTENV='STM32F7' ;; teensy) TESTENV='teensy31' ;; @@ -37,6 +39,15 @@ case $TESTENV in t32) TESTENV='teensy31' ;; t35) TESTENV='teensy35' ;; t36) TESTENV='teensy35' ;; + # Build with the last-built env + -r) [[ -f "$STATE_FILE" ]] || { echo "No previous (-r) build state found." ; exit 1 ; } + read TESTENV <"$STATE_FILE" + platformio run --project-dir . -e $TESTENV + exit + ;; + # A -y may come first + -y) TESTENV=${2:-'-'} ; CHOICE=${3:-0} ;; + -[a-z]) echo "Unknown flag $TESTENV" ; exit 1 ;; -) ;; esac @@ -77,9 +88,6 @@ OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { echo "Can't find test '$T # TODO: List test descriptions with numbers TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) -# Get the entered or interactive test index -CHOICE=${2:-0} - # User entered a number? (( CHOICE && CHOICE > TESTCOUNT )) && { echo "Invalid test index '$CHOICE' (1-$TESTCOUNT)." ; exit 1 ; } @@ -135,6 +143,16 @@ echo "$OUT" | { done } +# Get a -y parameter the lazy way +[[ "$2" == "-y" || "$3" == "-y" ]] && BUILD_YES='Y' + # Build the test too? -echo ; read -p "Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES -[[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && platformio run --project-dir . -e $TESTENV +if [[ $BUILD_YES != 'Y' ]]; then + echo + read -p "Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES +fi + +[[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { + platformio run --project-dir . -e $TESTENV + echo "$TESTENV" >"$STATE_FILE" +} diff --git a/buildroot/share/tests/DUE-tests b/buildroot/share/tests/DUE-tests index 609790b5b8..80fb0b3148 100644 --- a/buildroot/share/tests/DUE-tests +++ b/buildroot/share/tests/DUE-tests @@ -9,6 +9,7 @@ set -e backup_ramps # pins_set is used below... restore_configs +opt_set LCD_LANGUAGE bg opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB opt_set TEMP_SENSOR_0 -2 opt_set TEMP_SENSOR_BED 2 @@ -23,7 +24,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ - FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ + FWRETRACT ARC_SUPPORT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ PSU_CONTROL AUTO_POWER_CONTROL \ SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ @@ -37,8 +38,10 @@ exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), EXTENSIBLE_UI, S-Curve, many restore_configs opt_set MOTHERBOARD BOARD_RADDS -opt_enable USE_XMAX_PLUG USE_YMAX_PLUG BLTOUCH AUTO_BED_LEVELING_BILINEAR \ - Z_TRIPLE_STEPPER_DRIVERS Z_TRIPLE_ENDSTOPS Z_STEPPER_AUTO_ALIGN ENDSTOPPULLUPS +opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ + Z_TRIPLE_STEPPER_DRIVERS Z_TRIPLE_ENDSTOPS Z_STEPPER_AUTO_ALIGN \ + Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #LULZBOT_TOUCH_UI LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT opt_add Z2_MAX_ENDSTOP_INVERTING false opt_add Z3_MAX_ENDSTOP_INVERTING false pins_set ramps/RAMPS X_MAX_PIN -1 @@ -51,6 +54,7 @@ exec_test $1 $2 "RADDS with ABL (Bilinear), Z_TRIPLE_STEPPER_DRIVERS and Z_STEPP # Test SWITCHING_EXTRUDER # restore_configs +opt_set LCD_LANGUAGE fi opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF opt_set EXTRUDERS 2 opt_set NUM_SERVOS 1 diff --git a/buildroot/share/tests/malyanm200-tests b/buildroot/share/tests/STM32F103CB_malyan-tests similarity index 78% rename from buildroot/share/tests/malyanm200-tests rename to buildroot/share/tests/STM32F103CB_malyan-tests index 3856d05866..fced4d5d24 100644 --- a/buildroot/share/tests/malyanm200-tests +++ b/buildroot/share/tests/STM32F103CB_malyan-tests @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 malyanM200 +# Build tests for STM32F103CB Malyan M200 # # exit on first failure diff --git a/buildroot/share/tests/STM32F103R_bigtree-tests b/buildroot/share/tests/STM32F103RC_bigtree-tests similarity index 84% rename from buildroot/share/tests/STM32F103R_bigtree-tests rename to buildroot/share/tests/STM32F103RC_bigtree-tests index 11479feb0d..50c37e36de 100644 --- a/buildroot/share/tests/STM32F103R_bigtree-tests +++ b/buildroot/share/tests/STM32F103RC_bigtree-tests @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 Bigtreetech (SKR Mini v1.1) +# Build tests for STM32F103RC Bigtreetech (SKR Mini v1.1) # # exit on first failure diff --git a/buildroot/share/tests/STM32F103RC_bigtree_USB-tests b/buildroot/share/tests/STM32F103RC_bigtree_USB-tests new file mode 100644 index 0000000000..8c83c029e6 --- /dev/null +++ b/buildroot/share/tests/STM32F103RC_bigtree_USB-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC Bigtreetech (SKR Mini E3) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BIGTREE_SKR_MINI_E3 +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +exec_test $1 $2 "Bigtreetech SKR Mini E3 - Basic Configuration" + +# clean up +restore_configs diff --git a/buildroot/share/tests/STM32F103R_fysetc-tests b/buildroot/share/tests/STM32F103RC_fysetc-tests similarity index 85% rename from buildroot/share/tests/STM32F103R_fysetc-tests rename to buildroot/share/tests/STM32F103RC_fysetc-tests index ad0f5ea81b..7d08fb7c58 100644 --- a/buildroot/share/tests/STM32F103R_fysetc-tests +++ b/buildroot/share/tests/STM32F103RC_fysetc-tests @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 FYSETC +# Build tests for STM32F103RC FYSETC # # exit on first failure diff --git a/buildroot/share/tests/STM32F103R-tests b/buildroot/share/tests/STM32F103RE-tests similarity index 94% rename from buildroot/share/tests/STM32F103R-tests rename to buildroot/share/tests/STM32F103RE-tests index 519957c470..63fe5ba393 100644 --- a/buildroot/share/tests/STM32F103R-tests +++ b/buildroot/share/tests/STM32F103RE-tests @@ -10,7 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_STM32F103R +opt_set MOTHERBOARD BOARD_STM32F103RE opt_set EXTRUDERS 2 opt_set SERIAL_PORT -1 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ diff --git a/buildroot/share/tests/STM32F103V_longer-tests b/buildroot/share/tests/STM32F103VE_longer-tests similarity index 100% rename from buildroot/share/tests/STM32F103V_longer-tests rename to buildroot/share/tests/STM32F103VE_longer-tests diff --git a/buildroot/share/tests/esp32-tests b/buildroot/share/tests/esp32-tests index 361750141b..9d44b14343 100644 --- a/buildroot/share/tests/esp32-tests +++ b/buildroot/share/tests/esp32-tests @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for esp32 +# Build tests for ESP32 # # exit on first failure @@ -10,7 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_ESP32 +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 opt_enable WIFISUPPORT GCODE_MACROS BAUD_RATE_GCODE opt_set "WIFI_SSID \"ssid\"" opt_set "WIFI_PWD \"password\"" diff --git a/buildroot/share/tests/megaatmega1280-tests b/buildroot/share/tests/megaatmega1280-tests index c4ab0f4a71..05e262f6e7 100644 --- a/buildroot/share/tests/megaatmega1280-tests +++ b/buildroot/share/tests/megaatmega1280-tests @@ -16,6 +16,7 @@ set -e # Test MESH_BED_LEVELING feature, with LCD # restore_configs +opt_set LCD_LANGUAGE an opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ G26_MESH_VALIDATION MESH_EDIT_MENU diff --git a/buildroot/share/tests/megaatmega2560-tests b/buildroot/share/tests/megaatmega2560-tests index fcab51b349..3a27b37cf8 100644 --- a/buildroot/share/tests/megaatmega2560-tests +++ b/buildroot/share/tests/megaatmega2560-tests @@ -25,22 +25,25 @@ opt_set TEMP_SENSOR_1 1 opt_set TEMP_SENSOR_BED 2 opt_set GRID_MAX_POINTS_X 16 opt_set FANMUX0_PIN 53 +opt_disable USE_WATCHDOG opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ BLINKM PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ - NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ - AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU \ + NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ + ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \ + AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DISTINCT_E_FACTORS \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE \ - SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ + SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE \ PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL opt_set TEMP_SENSOR_CHAMBER 3 opt_set HEATER_CHAMBER_PIN 45 -exec_test $1 $2 "RAMPS with 2 extruders, RepRap LCD, Linear ABL, LEDs, and many options" +exec_test $1 $2 "RAMPS, 2 extruders, LCD/SD, Probe, ABL-Linear, PLR, LEDs, many options" # # Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders @@ -48,6 +51,7 @@ exec_test $1 $2 "RAMPS with 2 extruders, RepRap LCD, Linear ABL, LEDs, and many use_example_configs AnimationExample opt_set SHOW_CUSTOM_BOOTSCREEN opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set LCD_LANGUAGE fr opt_set EXTRUDERS 5 opt_set TEMP_SENSOR_1 1 opt_set TEMP_SENSOR_2 5 @@ -58,7 +62,8 @@ opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATU REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ - MULTI_NOZZLE_DUPLICATION JUNCTION_DEVIATION LIN_ADVANCE QUICK_HOME \ + MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ + LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL exec_test $1 $2 "Azteeg X3 Pro with 5 extruders, RRDFGSC, probeless UBL, Linear Advance, and more" @@ -66,7 +71,7 @@ exec_test $1 $2 "Azteeg X3 Pro with 5 extruders, RRDFGSC, probeless UBL, Linear # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language # opt_enable Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE -opt_set LCD_LANGUAGE jp-kana +opt_set LCD_LANGUAGE jp_kana opt_disable SEGMENT_LEVELED_MOVES opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL exec_test $1 $2 "... Sled Z Probe, Skew, UBL Cartesian moves, Japanese, and Z probe BABYSTEPPING" @@ -76,10 +81,11 @@ exec_test $1 $2 "... Sled Z Probe, Skew, UBL Cartesian moves, Japanese, and Z pr # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES # restore_configs -opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ - AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL +opt_set LCD_LANGUAGE zh_CN opt_set NUM_SERVOS 1 -opt_enable NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK +opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ + AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ + NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK exec_test $1 $2 "RAMPS with ZONESTAR_LCD, Servo Probe, 3-Point ABL, DEBUG_LEVELING_FEATURE, EEPROM, G38, and more" # @@ -87,6 +93,7 @@ exec_test $1 $2 "RAMPS with ZONESTAR_LCD, Servo Probe, 3-Point ABL, DEBUG_LEVELI # restore_configs opt_set MOTHERBOARD BOARD_MINIRAMBO +opt_set LCD_LANGUAGE de opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ ULTIMAKERCONTROLLER SDSUPPORT PCA9632 LCD_INFO_MENU \ AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ @@ -104,6 +111,7 @@ exec_test $1 $2 "MINIRAMBO with M100, PWM_MOTOR_CURRENT, PRINTCOUNTER, etc." # restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set LCD_LANGUAGE el_gr opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY opt_set MIXING_STEPPERS 5 opt_set LCD_LANGUAGE ru @@ -114,6 +122,7 @@ exec_test $1 $2 "Mixing Extruder with 5 steppers, Cyrillic" # restore_configs opt_set MOTHERBOARD BOARD_RUMBA +opt_set LCD_LANGUAGE pt opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE @@ -140,6 +149,7 @@ exec_test $1 $2 "DUAL_X_CARRIAGE" # restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set LCD_LANGUAGE it opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 -4 opt_set SERVO_DELAY "{ 300, 300, 300 }" @@ -243,11 +253,11 @@ exec_test $1 $2 "Many less common options" # #restore_configs #opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr it jp_kana nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done # #restore_configs #opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr it jp_kana nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done ######## Example Configurations ############## # @@ -265,6 +275,7 @@ exec_test $1 $2 "Full-featured CR-10S config" # # Delta Config (generic) + ABL bilinear + BLTOUCH use_example_configs delta/generic +opt_set LCD_LANGUAGE cz opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR BLTOUCH BLTOUCH_FORCE_5V_MODE exec_test $1 $2 "Delta Config (generic) + ABL bilinear + BLTOUCH" @@ -272,6 +283,7 @@ exec_test $1 $2 "Delta Config (generic) + ABL bilinear + BLTOUCH" # Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS # use_example_configs delta/generic +opt_set LCD_LANGUAGE ko_KR opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 Z_PROBE_ALLEN_KEY EEPROM_SETTINGS EEPROM_CHITCHAT \ OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY exec_test $1 $2 "Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS" @@ -292,6 +304,7 @@ exec_test $1 $2 "Delta Config (FLSUN AC because it's complex)" # SCARA with TMC2130 # use_example_configs SCARA +opt_set LCD_LANGUAGE es opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ EEPROM_SETTINGS EEPROM_CHITCHAT ULTIMAKERCONTROLLER M114_DETAIL \ MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING @@ -306,6 +319,7 @@ exec_test $1 $2 "SCARA with TMC2130, TMC2209, and TMC2660" # Test mixed TMC config # restore_configs +opt_set LCD_LANGUAGE vi opt_set X_DRIVER_TYPE TMC2160 opt_set Y_DRIVER_TYPE TMC5160 opt_set Z_DRIVER_TYPE TMC2208 diff --git a/buildroot/share/tests/teensy31-tests b/buildroot/share/tests/teensy31-tests index a89002257d..a847d6f572 100644 --- a/buildroot/share/tests/teensy31-tests +++ b/buildroot/share/tests/teensy31-tests @@ -13,14 +13,14 @@ opt_set MOTHERBOARD BOARD_TEENSY31_32 exec_test $1 $2 "Teensy3.1 with default config" # -# Test as many features together as possible +# Test many features together # restore_configs opt_set MOTHERBOARD BOARD_TEENSY31_32 opt_set TEMP_SENSOR_0 1 opt_set TEMP_SENSOR_BED 1 opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCODE \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR DEBUG_LEVELING_FEATURE Z_MIN_PROBE_REPEATABILITY_TEST \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET PRINTCOUNTER SLOW_PWM_HEATERS PIDTEMPBED \ INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE PARK_HEAD_ON_PAUSE \ diff --git a/buildroot/share/vscode/AutoBuildMarlin/README.md b/buildroot/share/vscode/AutoBuildMarlin/README.md index 24123db9db..bb2080d564 100644 --- a/buildroot/share/vscode/AutoBuildMarlin/README.md +++ b/buildroot/share/vscode/AutoBuildMarlin/README.md @@ -34,7 +34,7 @@ Before you install AutoBuildMarlin you'll first need to [Install PlatformIO in V Icon|Action ----|------ - ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/B_small.png)|Start **PIO Build** to test your Marlin build - ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/C_small.png)|Start **PIO Clean** to delete old build files - ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/U_small.png)|Start **PIO Upload** to install Marlin on your board - ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/T_small.png)|Start **PIO Upload (traceback)** to install Marlin with debugging + ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/B_small.png)|Start **Marlin Build** to test your Marlin build + ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/U_small.png)|Start **Marlin Upload** to install Marlin on your board + ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/T_small.png)|Start **Marlin Upload (traceback)** to install Marlin with debugging + ![](https://github.com/MarlinFirmware/Marlin/raw/bugfix-2.0.x/buildroot/share/vscode/AutoBuildMarlin/img/C_small.png)|Start **Marlin Clean** to delete old build files diff --git a/buildroot/share/vscode/AutoBuildMarlin/extension.js b/buildroot/share/vscode/AutoBuildMarlin/extension.js index 01198a62bb..15b0b121e3 100644 --- a/buildroot/share/vscode/AutoBuildMarlin/extension.js +++ b/buildroot/share/vscode/AutoBuildMarlin/extension.js @@ -7,34 +7,34 @@ function activate(context) { console.log('Extension "AutoBuildMarlin" is now active!'); var NEXT_TERM_ID = 1; - var pio_build = vscode.commands.registerCommand('piobuild', function () { + var mf_build = vscode.commands.registerCommand('mfbuild', function () { vscode.commands.executeCommand('workbench.action.files.saveAll'); - const terminal = vscode.window.createTerminal(`AB Build #${NEXT_TERM_ID++}`); + const terminal = vscode.window.createTerminal(`Marlin Build #${NEXT_TERM_ID++}`); terminal.show(true); terminal.sendText("python buildroot/share/atom/auto_build.py build"); }); - var pio_clean = vscode.commands.registerCommand('pioclean', function () { - const terminal = vscode.window.createTerminal(`AB Clean #${NEXT_TERM_ID++}`); - terminal.show(true); - terminal.sendText("python buildroot/share/atom/auto_build.py clean"); - }); - var pio_upload = vscode.commands.registerCommand('pioupload', function () { + var mf_upload = vscode.commands.registerCommand('mfupload', function () { vscode.commands.executeCommand('workbench.action.files.saveAll'); - const terminal = vscode.window.createTerminal(`AB Upload #${NEXT_TERM_ID++}`); + const terminal = vscode.window.createTerminal(`Marlin Upload #${NEXT_TERM_ID++}`); terminal.show(true); terminal.sendText("python buildroot/share/atom/auto_build.py upload"); }); - var pio_traceback = vscode.commands.registerCommand('piotraceback', function () { + var mf_traceback = vscode.commands.registerCommand('mftraceback', function () { vscode.commands.executeCommand('workbench.action.files.saveAll'); - const terminal = vscode.window.createTerminal(`AB Traceback #${NEXT_TERM_ID++}`); + const terminal = vscode.window.createTerminal(`Marlin Traceback #${NEXT_TERM_ID++}`); terminal.show(true); terminal.sendText("python buildroot/share/atom/auto_build.py traceback"); }); + var mf_clean = vscode.commands.registerCommand('mfclean', function () { + const terminal = vscode.window.createTerminal(`Marlin Clean #${NEXT_TERM_ID++}`); + terminal.show(true); + terminal.sendText("python buildroot/share/atom/auto_build.py clean"); + }); - context.subscriptions.push(pio_build); - context.subscriptions.push(pio_clean); - context.subscriptions.push(pio_upload); - context.subscriptions.push(pio_traceback); + context.subscriptions.push(mf_build); + context.subscriptions.push(mf_upload); + context.subscriptions.push(mf_traceback); + context.subscriptions.push(mf_clean); } exports.activate = activate; diff --git a/buildroot/share/vscode/AutoBuildMarlin/package.json b/buildroot/share/vscode/AutoBuildMarlin/package.json index ac30b225e3..9c00085a06 100644 --- a/buildroot/share/vscode/AutoBuildMarlin/package.json +++ b/buildroot/share/vscode/AutoBuildMarlin/package.json @@ -6,65 +6,69 @@ "publisher": "marlinfirmware", "icon": "logo.svg", "engines": { - "vscode": "^1.23.0" + "vscode": "^1.32.0" }, "enableProposedApi": true, "categories": [ "Other" ], "activationEvents": [ - "onCommand:piobuild", - "onCommand:pioclean", - "onCommand:pioupload", - "onCommand:piotraceback" + "onCommand:mfbuild", + "onCommand:mfclean", + "onCommand:mfupload", + "onCommand:mftraceback" ], "main": "./extension", "contributes": { "viewsContainers": { "activitybar": [ { - "id": "auto-build", - "title": "Auto Build Marlin", + "id": "autoBuildVC", + "title": "Marlin Build", "icon": "resources/AB.svg" } ] }, "views": { - "auto-build": [ + "autoBuildVC": [ { - "id": "autobuild", - "name": " " + "id": "autoBuildView", + "name": "Build…" + }, + { + "id": "marlinView", + "name": "Marlin Info" } ] }, "commands": [ { - "command": "piobuild", - "title": "PIO Build", + "command": "mfbuild", + "title": "Build", "icon": { "light": "resources/B48x48_light.svg", "dark": "resources/B48x48_dark.svg" } }, { - "command": "pioupload", - "title": "PIO Upload", + "command": "mfupload", + "title": "Upload", "icon": { "light": "resources/U48x48_light.svg", "dark": "resources/U48x48_dark.svg" } }, { - "command": "piotraceback", - "title": "PIO Upload (traceback)", + "command": "mftraceback", + "title": "Upload (traceback)", "icon": { "light": "resources/T48x48_light.svg", "dark": "resources/T48x48_dark.svg" } }, { - "command": "pioclean", - "title": "PIO Clean", + "command": "mfclean", + "title": "Clean", "icon": { "light": "resources/C48x48_light.svg", "dark": "resources/C48x48_dark.svg" @@ -74,20 +78,24 @@ "menus": { "view/title": [ { - "command": "piobuild", - "group": "navigation@1" + "command": "mfbuild", + "group": "navigation@1", + "when": "view == autoBuildView || view == marlinView" }, { - "command": "pioupload", - "group": "navigation@2" + "command": "mfupload", + "group": "navigation@2", + "when": "view == autoBuildView || view == marlinView" }, { - "command": "piotraceback", - "group": "navigation@3" + "command": "mftraceback", + "group": "navigation@3", + "when": "view == autoBuildView || view == marlinView" }, { - "command": "pioclean", - "group": "navigation@4" + "command": "mfclean", + "group": "navigation@4", + "when": "view == autoBuildView || view == marlinView" } ] } @@ -100,10 +108,10 @@ "test": "npm run compile && node ./node_modules/vscode/bin/test" }, "devDependencies": { - "vscode": "^1.1.17", - "typescript": "^2.6.1", - "tslint": "^5.8.0", - "@types/node": "^7.0.43", + "@types/vscode": "^1.34.0", + "typescript": "^3.5.1", + "tslint": "^5.16.0", + "@types/node": "^10.14.17", "@types/mocha": "^2.2.42" } } diff --git a/config/default/Configuration.h b/config/default/Configuration.h index 16f1ca6800..155605f609 100644 --- a/config/default/Configuration.h +++ b/config/default/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/default/Configuration_adv.h b/config/default/Configuration_adv.h index bac2acf1bc..426f64ba05 100644 --- a/config/default/Configuration_adv.h +++ b/config/default/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/3DFabXYZ/Migbot/Configuration.h b/config/examples/3DFabXYZ/Migbot/Configuration.h index 02e2735ec0..6b41bba573 100644 --- a/config/examples/3DFabXYZ/Migbot/Configuration.h +++ b/config/examples/3DFabXYZ/Migbot/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "AJMartel" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -731,6 +731,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 225, 225, 3, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -739,6 +744,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1590, 1590, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -752,35 +762,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1590 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.016 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1589,10 +1602,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/3DFabXYZ/Migbot/Configuration_adv.h b/config/examples/3DFabXYZ/Migbot/Configuration_adv.h index 1007185a93..45a8dc2b1b 100644 --- a/config/examples/3DFabXYZ/Migbot/Configuration_adv.h +++ b/config/examples/3DFabXYZ/Migbot/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON false // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/ADIMLab/Gantry v1/Configuration.h b/config/examples/ADIMLab/Gantry v1/Configuration.h index 9456800d83..90f102d0a1 100644 --- a/config/examples/ADIMLab/Gantry v1/Configuration.h +++ b/config/examples/ADIMLab/Gantry v1/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(ETE-Design, Gantry v1)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -746,28 +746,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 20.0 #define DEFAULT_ZJERK 0.4 @@ -775,6 +762,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.16 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1559,10 +1557,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/ADIMLab/Gantry v1/Configuration_adv.h b/config/examples/ADIMLab/Gantry v1/Configuration_adv.h index abb62a6962..2b193c68c4 100644 --- a/config/examples/ADIMLab/Gantry v1/Configuration_adv.h +++ b/config/examples/ADIMLab/Gantry v1/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu #define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/ADIMLab/_Bootscreen.h b/config/examples/ADIMLab/Gantry v1/_Bootscreen.h similarity index 100% rename from config/examples/ADIMLab/_Bootscreen.h rename to config/examples/ADIMLab/Gantry v1/_Bootscreen.h diff --git a/config/examples/ADIMLab/Gantry v2/Configuration.h b/config/examples/ADIMLab/Gantry v2/Configuration.h index 9be12ff0ca..dd1afb9240 100644 --- a/config/examples/ADIMLab/Gantry v2/Configuration.h +++ b/config/examples/ADIMLab/Gantry v2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(ETE-Design, Gantry v2)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1559,10 +1572,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/ADIMLab/Gantry v2/Configuration_adv.h b/config/examples/ADIMLab/Gantry v2/Configuration_adv.h index e4ef517ca7..745c1a0542 100644 --- a/config/examples/ADIMLab/Gantry v2/Configuration_adv.h +++ b/config/examples/ADIMLab/Gantry v2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/ADIMLab/Gantry v2/_Bootscreen.h b/config/examples/ADIMLab/Gantry v2/_Bootscreen.h new file mode 100644 index 0000000000..ebb0ad9a81 --- /dev/null +++ b/config/examples/ADIMLab/Gantry v2/_Bootscreen.h @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Made with Marlin Bitmap Converter + * http://marlinfw.org/tools/u8glib/converter.html + */ +#define CUSTOM_BOOTSCREEN_BMPWIDTH 88 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00111111,B11111000,B00000000,B01000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00011110,B01111111,B11111111,B00000000,B10000100,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00111111,B11111111,B11111111,B11111111,B00000100,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00111111,B11111111,B11111111,B11111110,B00001100,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B01111111,B11111111,B11111111,B11110000,B00001000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00001111,B11111111,B11100000,B00000000,B00011000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B11111111,B11100011,B10000000,B00111000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00010011,B11111111,B11100001,B10000000,B01111000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00011111,B10001111,B11100011,B10000000,B11110000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00011110,B00001111,B11111111,B10000001,B11110000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000110,B00011111,B11111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B11111111,B11111110,B00001111,B11100000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000111,B11111111,B11110000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00001111,B11111100,B00000011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00011111,B11000000,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00111110,B00011111,B11111111,B11111110,B00111111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B01111100,B11111111,B11111111,B11111100,B00001111,B11100000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11111001,B11111111,B11111111,B11110000,B00001111,B11110000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11110011,B11111111,B11111111,B11111000,B00011111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11100111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000001,B11101111,B11111111,B11111111,B11111111,B11111111,B11111110,B00000000,B00000000,B00000000, + B00000000,B00000001,B11101111,B11111110,B00001111,B11111111,B11111111,B11101111,B10000000,B00000000,B00000000, + B00000000,B00000001,B11001111,B11110000,B00000001,B11111111,B11111111,B11110011,B11111000,B00000000,B00000000, + B00000000,B00000000,B11101111,B11100000,B00000000,B11111111,B11111111,B11111000,B01100000,B00000000,B00000000, + B00000000,B00000000,B11101111,B11100000,B00000000,B00111111,B11111111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11101111,B11000000,B00000000,B00011111,B11111111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B01100111,B11100100,B00000000,B00001111,B11111111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00110011,B11111100,B00000000,B00000111,B11111111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00011001,B11111100,B00000000,B00000011,B11100000,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00001100,B01111000,B00000000,B00000001,B11100000,B00111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B01110000,B00011100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000011,B10000000,B00000000,B00000000,B00000000,B00001110,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000001,B11100000,B00000000,B00000000,B00000000,B00001111,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000001,B11110000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000001,B11111000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000, + B00000000,B00000000,B00000001,B11111100,B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000, + B00000000,B00000000,B00000011,B11111100,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000, + B00000000,B00000000,B00000111,B11111100,B00000000,B00000000,B00000000,B00001111,B11100000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000001,B11111111,B10000111,B10011111,B00000111,B10011110,B00000000,B00000000,B00111000,B00000000, + B00000111,B10000001,B11111111,B11000011,B10011111,B00000111,B10001110,B00000000,B00000000,B00111000,B00000000, + B00000111,B10000001,B11000011,B11100011,B10011111,B00000111,B10001110,B00000000,B00000000,B00111000,B00000000, + B00001111,B11000001,B11000000,B11100011,B10011111,B10001111,B10001110,B00000000,B00111100,B00111011,B00000000, + B00001111,B11000001,B11000000,B11100011,B10011111,B10001111,B10001110,B00000000,B11111110,B00111111,B10000000, + B00011101,B11000001,B11000000,B01110011,B10011111,B10011111,B10001110,B00000000,B11111111,B00111111,B10000000, + B00011100,B11100001,B11000000,B01110011,B10011101,B11011011,B10001110,B00000000,B01101111,B00111011,B11000000, + B00011100,B11100001,B11000000,B01110011,B10011101,B11111011,B10001110,B00000000,B00111111,B00111011,B11000000, + B00111111,B11110001,B11000000,B11100011,B10011100,B11111011,B10001110,B00000000,B11111111,B00111011,B11000000, + B00111111,B11110001,B11000000,B11100011,B10011100,B11110011,B10001110,B00000000,B11101111,B00111011,B11000000, + B01111000,B01110001,B11000001,B11100011,B10011100,B11110011,B10001110,B00000001,B11101111,B00111011,B11000000, + B01110000,B01111001,B11111111,B11000011,B10011100,B01100011,B10001111,B11111111,B11101111,B00111111,B10000000, + B01110000,B00111001,B11111111,B10000011,B10011100,B01100011,B10001111,B11111110,B11110111,B00111111,B10000000, + B11110000,B01111101,B11111111,B00000111,B10011110,B00000011,B11011111,B11111100,B01100111,B00100111,B00000000 +}; diff --git a/config/examples/AlephObjects/TAZ4/Configuration.h b/config/examples/AlephObjects/TAZ4/Configuration.h index 777eb8e5ff..58f26adfaa 100644 --- a/config/examples/AlephObjects/TAZ4/Configuration.h +++ b/config/examples/AlephObjects/TAZ4/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Aleph Objects Inc, TAZ)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 7 #define TEMP_SENSOR_1 0 @@ -745,6 +745,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 800, 800, 8, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -753,6 +758,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -766,35 +776,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 10.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.051 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1578,10 +1591,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/AlephObjects/TAZ4/Configuration_adv.h b/config/examples/AlephObjects/TAZ4/Configuration_adv.h index 05ae34b208..ebb4d6fe02 100644 --- a/config/examples/AlephObjects/TAZ4/Configuration_adv.h +++ b/config/examples/AlephObjects/TAZ4/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Alfawise/U20-bltouch/Configuration.h b/config/examples/Alfawise/U20-bltouch/Configuration.h index 00f1ece40f..2329a1b7a5 100644 --- a/config/examples/Alfawise/U20-bltouch/Configuration.h +++ b/config/examples/Alfawise/U20-bltouch/Configuration.h @@ -82,7 +82,7 @@ // Valid platformio.ini submodel values are U20_PLUS U20 U30 LK1 LK2 LK4 -// Valid platformio.ini touchscreens are TS_V11 TS_V12 +// Valid platformio.ini touchscreens are TS_V11 TS_V12 TS_V19 // 2 - Select the screen controller type. Most common is ILI9341 - First option. If your screen remains white, // Try the alternate setting - this should enable ST7789V or ILI9328. For other LCDs... code is needed @@ -97,6 +97,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Hobi, tpruvot" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -136,8 +137,7 @@ * * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ -#define SERIAL_PORT_2 2 -#define NUM_SERIAL 2 +//#define SERIAL_PORT_2 2 /** * This setting determines the communication speed of the printer. @@ -360,7 +360,7 @@ * Specify whether the power supply is active HIGH or active LOW. */ //#define PSU_CONTROL -//#define PSU_NAME "Power Supply" +#define PSU_NAME "360W 24V/15A" #if ENABLED(PSU_CONTROL) #define PSU_ACTIVE_HIGH false // Set 'false' for ATX (1), 'true' for X-Box (2) @@ -422,6 +422,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -439,8 +440,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -789,6 +788,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 100, 25 } +#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 250, 250, 200, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -797,6 +801,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 200, 200, 100, 3000 } +#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 600, 600, 400, 6000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -810,35 +819,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 200 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + #define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.10 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1638,10 +1650,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en @@ -2130,19 +2142,27 @@ #if ENABLED(TS_V11) // Alfawise U20 ILI9341 2.8 TP Ver 1.1 / Green PCB on the back of touchscreen - #define XPT2046_X_CALIBRATION 11605 - #define XPT2046_Y_CALIBRATION 9091 + #define XPT2046_X_CALIBRATION 12000 + #define XPT2046_Y_CALIBRATION 9000 #define XPT2046_X_OFFSET -24 #define XPT2046_Y_OFFSET -17 #endif #if ENABLED(TS_V12) // Alfawise U30 ILI9341 2.8 TP Ver 1.2 / Blue PCB on the back of touchscreen - #define XPT2046_X_CALIBRATION 12316 - #define XPT2046_Y_CALIBRATION -8981 + #define XPT2046_X_CALIBRATION 12000 + #define XPT2046_Y_CALIBRATION -9000 #define XPT2046_X_OFFSET -43 #define XPT2046_Y_OFFSET 257 #endif + + #if ENABLED(TS_V19) + // Longer LK4/U30 2.8" Ver 2019 / Blue PCB, SID240x320-8PCB-D + #define XPT2046_X_CALIBRATION -12000 + #define XPT2046_Y_CALIBRATION 9000 + #define XPT2046_X_OFFSET 320 + #define XPT2046_Y_OFFSET 0 + #endif #endif // diff --git a/config/examples/Alfawise/U20-bltouch/Configuration_adv.h b/config/examples/Alfawise/U20-bltouch/Configuration_adv.h index 0a5629b873..fa635405a8 100644 --- a/config/examples/Alfawise/U20-bltouch/Configuration_adv.h +++ b/config/examples/Alfawise/U20-bltouch/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -603,20 +604,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -890,6 +903,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1360,12 +1378,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1804,91 +1822,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2114,7 +2132,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2122,7 +2140,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2130,7 +2148,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2138,7 +2156,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2146,7 +2164,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2154,7 +2172,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2162,7 +2180,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2170,7 +2188,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2178,7 +2196,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2186,7 +2204,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2194,7 +2212,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2202,7 +2220,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2210,7 +2228,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Alfawise/U20/Configuration.h b/config/examples/Alfawise/U20/Configuration.h index 9186d0c843..75b760cca1 100644 --- a/config/examples/Alfawise/U20/Configuration.h +++ b/config/examples/Alfawise/U20/Configuration.h @@ -82,7 +82,7 @@ // Valid platformio.ini submodel values are U20_PLUS U20 U30 LK1 LK2 LK4 -// Valid platformio.ini touchscreens are TS_V11 TS_V12 +// Valid platformio.ini touchscreens are TS_V11 TS_V12 TS_V19 // 2 - Select the screen controller type. Most common is ILI9341 - First option. If your screen remains white, // Try the alternate setting - this should enable ST7789V or ILI9328. For other LCDs... code is needed @@ -97,6 +97,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Hobi, tpruvot" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -136,8 +137,7 @@ * * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ -#define SERIAL_PORT_2 2 -#define NUM_SERIAL 2 +//#define SERIAL_PORT_2 2 /** * This setting determines the communication speed of the printer. @@ -360,7 +360,7 @@ * Specify whether the power supply is active HIGH or active LOW. */ //#define PSU_CONTROL -//#define PSU_NAME "Power Supply" +#define PSU_NAME "360W 24V/15A" #if ENABLED(PSU_CONTROL) #define PSU_ACTIVE_HIGH false // Set 'false' for ATX (1), 'true' for X-Box (2) @@ -422,6 +422,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -439,8 +440,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -789,6 +788,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 100, 25 } +#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 250, 250, 200, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -797,6 +801,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 200, 200, 100, 3000 } +#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 600, 600, 400, 6000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -810,35 +819,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 200 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + #define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.10 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1637,10 +1649,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en @@ -2129,19 +2141,27 @@ #if ENABLED(TS_V11) // Alfawise U20 ILI9341 2.8 TP Ver 1.1 / Green PCB on the back of touchscreen - #define XPT2046_X_CALIBRATION 11605 - #define XPT2046_Y_CALIBRATION 9091 + #define XPT2046_X_CALIBRATION 12000 + #define XPT2046_Y_CALIBRATION 9000 #define XPT2046_X_OFFSET -24 #define XPT2046_Y_OFFSET -17 #endif #if ENABLED(TS_V12) // Alfawise U30 ILI9341 2.8 TP Ver 1.2 / Blue PCB on the back of touchscreen - #define XPT2046_X_CALIBRATION 12316 - #define XPT2046_Y_CALIBRATION -8981 + #define XPT2046_X_CALIBRATION 12000 + #define XPT2046_Y_CALIBRATION -9000 #define XPT2046_X_OFFSET -43 #define XPT2046_Y_OFFSET 257 #endif + + #if ENABLED(TS_V19) + // Longer LK4/U30 2.8" Ver 2019 / Blue PCB, SID240x320-8PCB-D + #define XPT2046_X_CALIBRATION -12000 + #define XPT2046_Y_CALIBRATION 9000 + #define XPT2046_X_OFFSET 320 + #define XPT2046_Y_OFFSET 0 + #endif #endif // diff --git a/config/examples/Alfawise/U20/Configuration_adv.h b/config/examples/Alfawise/U20/Configuration_adv.h index 278fd67095..4ceb0f06c6 100644 --- a/config/examples/Alfawise/U20/Configuration_adv.h +++ b/config/examples/Alfawise/U20/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1359,12 +1377,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1803,91 +1821,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2113,7 +2131,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2121,7 +2139,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2129,7 +2147,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2137,7 +2155,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2145,7 +2163,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2153,7 +2171,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2161,7 +2179,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2169,7 +2187,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2177,7 +2195,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2185,7 +2203,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2193,7 +2211,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2201,7 +2219,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2209,7 +2227,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/AliExpress/CL-260/Configuration.h b/config/examples/AliExpress/CL-260/Configuration.h index 342b6b94ee..7db163b067 100644 --- a/config/examples/AliExpress/CL-260/Configuration.h +++ b/config/examples/AliExpress/CL-260/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, CL-260)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/AliExpress/UM2pExt/Configuration.h b/config/examples/AliExpress/UM2pExt/Configuration.h index d24c75cdc9..8415915e80 100644 --- a/config/examples/AliExpress/UM2pExt/Configuration.h +++ b/config/examples/AliExpress/UM2pExt/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 20 #define TEMP_SENSOR_1 20 @@ -736,6 +736,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 40, 45} +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -744,6 +749,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -757,35 +767,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1569,10 +1582,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/AliExpress/UM2pExt/Configuration_adv.h b/config/examples/AliExpress/UM2pExt/Configuration_adv.h index 74bf6ea7fb..dcf42d9f56 100644 --- a/config/examples/AliExpress/UM2pExt/Configuration_adv.h +++ b/config/examples/AliExpress/UM2pExt/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A2/Configuration.h b/config/examples/Anet/A2/Configuration.h index 1a6c4b37f0..fb0c02b4ac 100644 --- a/config/examples/Anet/A2/Configuration.h +++ b/config/examples/Anet/A2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Modmike, Anet A2)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/A2/Configuration_adv.h b/config/examples/Anet/A2/Configuration_adv.h index a3fb3c5c56..03642b8cd2 100644 --- a/config/examples/Anet/A2/Configuration_adv.h +++ b/config/examples/Anet/A2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A2plus/Configuration.h b/config/examples/Anet/A2plus/Configuration.h index 8ef0e7b11b..7f1b05d817 100644 --- a/config/examples/Anet/A2plus/Configuration.h +++ b/config/examples/Anet/A2plus/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Modmike, Anet A2 Plus)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/A2plus/Configuration_adv.h b/config/examples/Anet/A2plus/Configuration_adv.h index a3fb3c5c56..03642b8cd2 100644 --- a/config/examples/Anet/A2plus/Configuration_adv.h +++ b/config/examples/Anet/A2plus/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A6/Configuration.h b/config/examples/Anet/A6/Configuration.h index 8122d4cd19..8291c6f208 100644 --- a/config/examples/Anet/A6/Configuration.h +++ b/config/examples/Anet/A6/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Ralf_E, ANET A6 config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 11 #define TEMP_SENSOR_1 0 @@ -756,6 +756,11 @@ //#define DEFAULT_MAX_FEEDRATE { 400, 400, 20, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -769,6 +774,11 @@ #define DEFAULT_MAX_ACCELERATION { 9000, 5000, 50, 10000 } //#define DEFAULT_MAX_ACCELERATION { 10000, 10000, 200, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -777,51 +787,48 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves -//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts -//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves // ANET A6 Firmware V2.0 defaults: // Accel: 1000 A-retract: 1000 #define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves -//#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration for printing moves -//#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts -//#define DEFAULT_TRAVEL_ACCELERATION 4000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -// ANET A6 Firmware V2.0 defaults (jerk): -// Vxy-jerk: 10, Vz-jerk: +000.30, Ve-jerk: 5 -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) + // ANET A6 Firmware V2.0 defaults: + // XY: 10, Z: +000.30, E: 5 #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1677,10 +1684,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/A6/Configuration_adv.h b/config/examples/Anet/A6/Configuration_adv.h index 26835659ff..018456d339 100644 --- a/config/examples/Anet/A6/Configuration_adv.h +++ b/config/examples/Anet/A6/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A6/_Statusscreen.h b/config/examples/Anet/A6/_Statusscreen.h new file mode 100644 index 0000000000..4547f3fd44 --- /dev/null +++ b/config/examples/Anet/A6/_Statusscreen.h @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +// +// Status Screen Logo bitmap +// +#define STATUS_LOGO_Y 10 +#define STATUS_LOGO_WIDTH 40 + +const unsigned char status_logo_bmp[] PROGMEM = { + B01110000,B00000000,B00001000,B00000011,B10001110, + B10001000,B00000000,B00001000,B00000100,B01010000, + B10001010,B11000111,B00111110,B00000100,B01010000, + B11111011,B00101000,B10001000,B00000111,B11001110, + B10001010,B00101111,B00001000,B00000100,B01010001, + B10001010,B00101000,B00001000,B00000100,B01010001, + B10001010,B00100111,B00000110,B00000100,B01001110 +}; + +// +// Use default bitmaps +// +#define STATUS_HOTEND_ANIM +#define STATUS_BED_ANIM +#define STATUS_HEATERS_X 48 +#define STATUS_BED_X 74 diff --git a/config/examples/Anet/A8/Configuration.h b/config/examples/Anet/A8/Configuration.h index eeae0493e3..036e429308 100644 --- a/config/examples/Anet/A8/Configuration.h +++ b/config/examples/Anet/A8/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Bob Kuhn, Anet config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -384,6 +385,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -401,8 +403,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -738,6 +738,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 8, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -746,6 +751,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -759,35 +769,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.10 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1584,10 +1597,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/A8/Configuration_adv.h b/config/examples/Anet/A8/Configuration_adv.h index 7c66ebfbc3..0d9dd66878 100644 --- a/config/examples/Anet/A8/Configuration_adv.h +++ b/config/examples/Anet/A8/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A8/_Statusscreen.h b/config/examples/Anet/A8/_Statusscreen.h new file mode 100644 index 0000000000..ddd62ea532 --- /dev/null +++ b/config/examples/Anet/A8/_Statusscreen.h @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +// +// Status Screen Logo bitmap +// +#define STATUS_LOGO_Y 10 +#define STATUS_LOGO_WIDTH 40 + +const unsigned char status_logo_bmp[] PROGMEM = { + B01110000,B00000000,B00001000,B00000011,B10001110, + B10001000,B00000000,B00001000,B00000100,B01010001, + B10001010,B11000111,B00111110,B00000100,B01010001, + B11111011,B00101000,B10001000,B00000111,B11001110, + B10001010,B00101111,B00001000,B00000100,B01010001, + B10001010,B00101000,B00001000,B00000100,B01010001, + B10001010,B00100111,B00000110,B00000100,B01001110 +}; + +// +// Use default bitmaps +// +#define STATUS_HOTEND_ANIM +#define STATUS_BED_ANIM +#define STATUS_HEATERS_X 48 +#define STATUS_BED_X 74 diff --git a/config/examples/Anet/A8plus/Configuration.h b/config/examples/Anet/A8plus/Configuration.h index 06aee7111b..6b87ea5442 100644 --- a/config/examples/Anet/A8plus/Configuration.h +++ b/config/examples/Anet/A8plus/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Martin Zeman - Zemistr, Anet A8 Plus)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -384,6 +385,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -401,8 +403,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -736,6 +736,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 50, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -744,6 +749,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -757,35 +767,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.10 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1569,10 +1582,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/A8plus/Configuration_adv.h b/config/examples/Anet/A8plus/Configuration_adv.h index 2617928545..793de072bb 100644 --- a/config/examples/Anet/A8plus/Configuration_adv.h +++ b/config/examples/Anet/A8plus/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Anet/A8plus/_Statusscreen.h b/config/examples/Anet/A8plus/_Statusscreen.h new file mode 100644 index 0000000000..1235997b79 --- /dev/null +++ b/config/examples/Anet/A8plus/_Statusscreen.h @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +// +// Status Screen Logo bitmap +// +#define STATUS_LOGO_Y 6 +#define STATUS_LOGO_WIDTH 40 + +const unsigned char status_logo_bmp[] PROGMEM = { + B01110000,B00000000,B00001000,B00000011,B10001110, + B10001000,B00000000,B00001000,B00000100,B01010001, + B10001010,B11000111,B00111110,B00000100,B01010001, + B11111011,B00101000,B10001000,B00000111,B11001110, + B10001010,B00101111,B00001000,B00000100,B01010001, + B10001010,B00101000,B00001000,B00000100,B01010001, + B10001010,B00100111,B00000110,B00000100,B01001110, + B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00001110,B01000000,B00000000,B00000000, + B00000000,B00010001,B01000000,B00000000,B00000000, + B00000000,B00010001,B01010001,B00111000,B00000000, + B00000000,B00011110,B01010001,B01000000,B00000000, + B00000000,B00010000,B01010001,B00111000,B00000000, + B00000000,B00010000,B01010001,B00000100,B00000000, + B00000000,B00010000,B01001110,B00111000,B00000000 +}; + +// +// Use default bitmaps +// +#define STATUS_HOTEND_ANIM +#define STATUS_BED_ANIM +#define STATUS_HEATERS_X 48 +#define STATUS_BED_X 74 diff --git a/config/examples/Anet/E16/Configuration.h b/config/examples/Anet/E16/Configuration.h index 487ab36a57..9d069f33a9 100644 --- a/config/examples/Anet/E16/Configuration.h +++ b/config/examples/Anet/E16/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "InsanityAutomation" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -737,6 +737,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 50, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -745,6 +750,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -758,35 +768,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1570,10 +1583,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Anet/E16/Configuration_adv.h b/config/examples/Anet/E16/Configuration_adv.h index de6d2d8cad..4cbe45bd8f 100644 --- a/config/examples/Anet/E16/Configuration_adv.h +++ b/config/examples/Anet/E16/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/AnyCubic/i3/Configuration.h b/config/examples/AnyCubic/i3/Configuration.h index e5f96e0d97..e182ed83f2 100644 --- a/config/examples/AnyCubic/i3/Configuration.h +++ b/config/examples/AnyCubic/i3/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 6, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1500, 1500, 50, 8000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK 2.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 2.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.002 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/AnyCubic/i3/Configuration_adv.h b/config/examples/AnyCubic/i3/Configuration_adv.h index 4535ddd15d..7ed5bd349f 100644 --- a/config/examples/AnyCubic/i3/Configuration_adv.h +++ b/config/examples/AnyCubic/i3/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/ArmEd/Configuration.h b/config/examples/ArmEd/Configuration.h index 05436cb482..9cbb3a1075 100644 --- a/config/examples/ArmEd/Configuration.h +++ b/config/examples/ArmEd/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -726,6 +726,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 20, 120 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -734,6 +739,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1000, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -747,35 +757,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 1.5 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.026 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1559,10 +1572,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/ArmEd/Configuration_adv.h b/config/examples/ArmEd/Configuration_adv.h index 206ec66b73..c3ef8cbf28 100644 --- a/config/examples/ArmEd/Configuration_adv.h +++ b/config/examples/ArmEd/Configuration_adv.h @@ -383,6 +383,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -606,20 +607,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -893,6 +906,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1359,12 +1377,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1803,91 +1821,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2113,7 +2131,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2121,7 +2139,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2129,7 +2147,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2137,7 +2155,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2145,7 +2163,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2153,7 +2171,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2161,7 +2179,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2169,7 +2187,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2177,7 +2195,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2185,7 +2203,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2193,7 +2211,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2201,7 +2219,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2209,7 +2227,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Azteeg/X5GT/Configuration.h b/config/examples/Azteeg/X5GT/Configuration.h index 12574f07b8..d558eae524 100644 --- a/config/examples/Azteeg/X5GT/Configuration.h +++ b/config/examples/Azteeg/X5GT/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BIBO/TouchX/cyclops/Configuration.h b/config/examples/BIBO/TouchX/cyclops/Configuration.h index e9995f707a..93da7abf51 100644 --- a/config/examples/BIBO/TouchX/cyclops/Configuration.h +++ b/config/examples/BIBO/TouchX/cyclops/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 2500 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1100 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 7.0 #define DEFAULT_YJERK 7.0 #define DEFAULT_ZJERK 0.65 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.018 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h b/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h index 948553cc02..2879c329e3 100644 --- a/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h +++ b/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/BIBO/TouchX/default/Configuration.h b/config/examples/BIBO/TouchX/default/Configuration.h index 3cde043a46..5546a516c9 100644 --- a/config/examples/BIBO/TouchX/default/Configuration.h +++ b/config/examples/BIBO/TouchX/default/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 5 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1100 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 7.0 #define DEFAULT_YJERK 7.0 #define DEFAULT_ZJERK 0.65 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.018 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BIBO/TouchX/default/Configuration_adv.h b/config/examples/BIBO/TouchX/default/Configuration_adv.h index 57b3879264..4165b2d25c 100644 --- a/config/examples/BIBO/TouchX/default/Configuration_adv.h +++ b/config/examples/BIBO/TouchX/default/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/BQ/Hephestos/Configuration.h b/config/examples/BQ/Hephestos/Configuration.h index 045c0698d5..5e22c32c5a 100644 --- a/config/examples/BQ/Hephestos/Configuration.h +++ b/config/examples/BQ/Hephestos/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -713,6 +713,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 3.3, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -721,6 +726,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -734,35 +744,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.062 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1546,10 +1559,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BQ/Hephestos/Configuration_adv.h b/config/examples/BQ/Hephestos/Configuration_adv.h index 7caba1b36a..5476d3d249 100644 --- a/config/examples/BQ/Hephestos/Configuration_adv.h +++ b/config/examples/BQ/Hephestos/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/BQ/Hephestos_2/Configuration.h b/config/examples/BQ/Hephestos_2/Configuration.h index ae0d1771e0..e528e82d97 100644 --- a/config/examples/BQ/Hephestos_2/Configuration.h +++ b/config/examples/BQ/Hephestos_2/Configuration.h @@ -80,6 +80,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "@jbrazio" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -391,6 +392,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -408,8 +410,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 70 #define TEMP_SENSOR_1 0 @@ -726,6 +726,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 3, 120 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -734,6 +739,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 3000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -747,35 +757,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 10.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.011 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BQ/Hephestos_2/Configuration_adv.h b/config/examples/BQ/Hephestos_2/Configuration_adv.h index 39546c03aa..4a12213fa7 100644 --- a/config/examples/BQ/Hephestos_2/Configuration_adv.h +++ b/config/examples/BQ/Hephestos_2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -897,6 +910,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1363,12 +1381,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1807,91 +1825,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2117,7 +2135,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2125,7 +2143,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2133,7 +2151,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2141,7 +2159,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2149,7 +2167,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2157,7 +2175,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2165,7 +2183,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2173,7 +2191,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2181,7 +2199,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2189,7 +2207,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2197,7 +2215,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2205,7 +2223,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2213,7 +2231,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/BQ/WITBOX/Configuration.h b/config/examples/BQ/WITBOX/Configuration.h index 520538fb87..ffb30cb4fb 100644 --- a/config/examples/BQ/WITBOX/Configuration.h +++ b/config/examples/BQ/WITBOX/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(bq Witbox)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -713,6 +713,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 7.2, 80 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -721,6 +726,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 10, 1000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -734,35 +744,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1546,10 +1559,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/BQ/WITBOX/Configuration_adv.h b/config/examples/BQ/WITBOX/Configuration_adv.h index 7caba1b36a..5476d3d249 100644 --- a/config/examples/BQ/WITBOX/Configuration_adv.h +++ b/config/examples/BQ/WITBOX/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Cartesio/Configuration.h b/config/examples/Cartesio/Configuration.h index 2a059914ab..e8c4924825 100644 --- a/config/examples/Cartesio/Configuration.h +++ b/config/examples/Cartesio/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(MaukCC, CartesioE)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -384,6 +385,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -401,8 +403,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 -1 @@ -724,6 +724,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 20, 20 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -732,6 +737,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -745,35 +755,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1557,10 +1570,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Cartesio/Configuration_adv.h b/config/examples/Cartesio/Configuration_adv.h index 4829230178..ffcf7f0283 100644 --- a/config/examples/Cartesio/Configuration_adv.h +++ b/config/examples/Cartesio/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-10/Configuration.h b/config/examples/Creality/CR-10/Configuration.h index f107cfcfbb..38e1e6273e 100644 --- a/config/examples/Creality/CR-10/Configuration.h +++ b/config/examples/Creality/CR-10/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Creality CR-10)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 2.7 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-10/Configuration_adv.h b/config/examples/Creality/CR-10/Configuration_adv.h index 38579f130b..96062dc771 100644 --- a/config/examples/Creality/CR-10/Configuration_adv.h +++ b/config/examples/Creality/CR-10/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-10S/Configuration.h b/config/examples/Creality/CR-10S/Configuration.h index 30904e3d1a..4731c7e7c9 100644 --- a/config/examples/Creality/CR-10S/Configuration.h +++ b/config/examples/Creality/CR-10S/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(printedsolid.com, CR-10S)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 2500, 2500, 100, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 800 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.067 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1559,10 +1572,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-10S/Configuration_adv.h b/config/examples/Creality/CR-10S/Configuration_adv.h index 39c40f594f..c6cf09c1d2 100644 --- a/config/examples/Creality/CR-10S/Configuration_adv.h +++ b/config/examples/Creality/CR-10S/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-10_5S/Configuration.h b/config/examples/Creality/CR-10_5S/Configuration.h index 03037f5a8a..65ae14eef2 100644 --- a/config/examples/Creality/CR-10_5S/Configuration.h +++ b/config/examples/Creality/CR-10_5S/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Evgeny-SPB, CR-10 S5)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -726,6 +726,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -734,6 +739,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 300, 300, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -747,35 +757,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1561,10 +1574,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-10_5S/Configuration_adv.h b/config/examples/Creality/CR-10_5S/Configuration_adv.h index a18004fc7a..b067757774 100644 --- a/config/examples/Creality/CR-10_5S/Configuration_adv.h +++ b/config/examples/Creality/CR-10_5S/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-10mini/Configuration.h b/config/examples/Creality/CR-10mini/Configuration.h index f6124787b0..1b82e86b43 100644 --- a/config/examples/Creality/CR-10mini/Configuration.h +++ b/config/examples/Creality/CR-10mini/Configuration.h @@ -81,6 +81,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -392,6 +393,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -409,8 +411,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -744,6 +744,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -752,6 +757,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -765,35 +775,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.067 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1577,10 +1590,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-10mini/Configuration_adv.h b/config/examples/Creality/CR-10mini/Configuration_adv.h index 9f265b4bcb..666e50c1aa 100644 --- a/config/examples/Creality/CR-10mini/Configuration_adv.h +++ b/config/examples/Creality/CR-10mini/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-20 Pro/Configuration.h b/config/examples/Creality/CR-20 Pro/Configuration.h index c7962db100..65f93c55c6 100644 --- a/config/examples/Creality/CR-20 Pro/Configuration.h +++ b/config/examples/Creality/CR-20 Pro/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(CR-20 Pro)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1561,10 +1574,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-20 Pro/Configuration_adv.h b/config/examples/Creality/CR-20 Pro/Configuration_adv.h index 62861301fb..055265160f 100644 --- a/config/examples/Creality/CR-20 Pro/Configuration_adv.h +++ b/config/examples/Creality/CR-20 Pro/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-20/Configuration.h b/config/examples/Creality/CR-20/Configuration.h index d1166cb475..cd9005cabc 100644 --- a/config/examples/Creality/CR-20/Configuration.h +++ b/config/examples/Creality/CR-20/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(m0oml)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1561,10 +1574,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-20/Configuration_adv.h b/config/examples/Creality/CR-20/Configuration_adv.h index 5ef0e0ecb5..4e77e0008d 100644 --- a/config/examples/Creality/CR-20/Configuration_adv.h +++ b/config/examples/Creality/CR-20/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/CR-8/Configuration.h b/config/examples/Creality/CR-8/Configuration.h index 571758dbde..73bb713274 100644 --- a/config/examples/Creality/CR-8/Configuration.h +++ b/config/examples/Creality/CR-8/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(D-side, CR-8)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/CR-8/Configuration_adv.h b/config/examples/Creality/CR-8/Configuration_adv.h index 872dd34dc5..23c32a77e7 100644 --- a/config/examples/Creality/CR-8/Configuration_adv.h +++ b/config/examples/Creality/CR-8/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/Ender-2/Configuration.h b/config/examples/Creality/Ender-2/Configuration.h index 4ffdada6b4..e9899dd97c 100644 --- a/config/examples/Creality/Ender-2/Configuration.h +++ b/config/examples/Creality/Ender-2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(tommie, Ender 2/4)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/Ender-2/Configuration_adv.h b/config/examples/Creality/Ender-2/Configuration_adv.h index a694cd9b15..2f58e95262 100644 --- a/config/examples/Creality/Ender-2/Configuration_adv.h +++ b/config/examples/Creality/Ender-2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/Ender-3/Configuration.h b/config/examples/Creality/Ender-3/Configuration.h index a0c7888788..8d1cc86cba 100644 --- a/config/examples/Creality/Ender-3/Configuration.h +++ b/config/examples/Creality/Ender-3/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Ender-3)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/Ender-3/Configuration_adv.h b/config/examples/Creality/Ender-3/Configuration_adv.h index 4af52ddc11..d068366ca4 100644 --- a/config/examples/Creality/Ender-3/Configuration_adv.h +++ b/config/examples/Creality/Ender-3/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 580 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 580 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 580 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/Ender-4/Configuration.h b/config/examples/Creality/Ender-4/Configuration.h index 3015b74690..0f63b169cb 100644 --- a/config/examples/Creality/Ender-4/Configuration.h +++ b/config/examples/Creality/Ender-4/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Skorpi, Creality Ender-4, brandstaetter)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 2.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/Ender-4/Configuration_adv.h b/config/examples/Creality/Ender-4/Configuration_adv.h index 8f4262e48d..804ca18bb5 100644 --- a/config/examples/Creality/Ender-4/Configuration_adv.h +++ b/config/examples/Creality/Ender-4/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON false // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Creality/Ender-5/Configuration.h b/config/examples/Creality/Ender-5/Configuration.h index 204be000bf..66d0dc13bc 100644 --- a/config/examples/Creality/Ender-5/Configuration.h +++ b/config/examples/Creality/Ender-5/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Ender-5)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1561,10 +1574,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Creality/Ender-5/Configuration_adv.h b/config/examples/Creality/Ender-5/Configuration_adv.h index 89d508aa90..f990c9b515 100644 --- a/config/examples/Creality/Ender-5/Configuration_adv.h +++ b/config/examples/Creality/Ender-5/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Dagoma/Disco Ultimate/Configuration.h b/config/examples/Dagoma/Disco Ultimate/Configuration.h index 732cce94c7..271e6d376c 100644 --- a/config/examples/Dagoma/Disco Ultimate/Configuration.h +++ b/config/examples/Dagoma/Disco Ultimate/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "InsanityAutomation" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 18 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 4, 170 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 1000, 20, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20 #define DEFAULT_YJERK 20 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.053 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h b/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h index b46b40e6d3..fb13cd9e75 100644 --- a/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h +++ b/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration.h b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration.h index e9224face5..e3d54d68a8 100644 --- a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration.h +++ b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Sidewinder X1)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 50, 40 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.032 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h index 8f3db3fa79..394f6c2c9c 100644 --- a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h +++ b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Einstart-S/Configuration.h b/config/examples/Einstart-S/Configuration.h index 255b3b6200..430b7fde5c 100644 --- a/config/examples/Einstart-S/Configuration.h +++ b/config/examples/Einstart-S/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "elsie tech corp" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 666 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Einstart-S/Configuration_adv.h b/config/examples/Einstart-S/Configuration_adv.h index 7f19fe213b..69b9edbfe4 100644 --- a/config/examples/Einstart-S/Configuration_adv.h +++ b/config/examples/Einstart-S/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration.h b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration.h index 7bb62ab321..d72e5b09c5 100644 --- a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration.h +++ b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h index e0299a507a..9f68fe357c 100644 --- a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 700 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 500 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/FYSETC/Cheetah 1.2/base/Configuration.h b/config/examples/FYSETC/Cheetah 1.2/base/Configuration.h index be04105204..9ade0468b4 100644 --- a/config/examples/FYSETC/Cheetah 1.2/base/Configuration.h +++ b/config/examples/FYSETC/Cheetah 1.2/base/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h b/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h index e0299a507a..9f68fe357c 100644 --- a/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 700 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 500 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/FYSETC/Cheetah/BLTouch/Configuration.h b/config/examples/FYSETC/Cheetah/BLTouch/Configuration.h index 39b146d9da..ccddc2e153 100644 --- a/config/examples/FYSETC/Cheetah/BLTouch/Configuration.h +++ b/config/examples/FYSETC/Cheetah/BLTouch/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -730,6 +732,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +745,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +763,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1578,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h b/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h index e0299a507a..9f68fe357c 100644 --- a/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 700 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 500 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/FYSETC/Cheetah/base/Configuration.h b/config/examples/FYSETC/Cheetah/base/Configuration.h index 67fbd1ed30..00f490fcbc 100644 --- a/config/examples/FYSETC/Cheetah/base/Configuration.h +++ b/config/examples/FYSETC/Cheetah/base/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FYSETC/Cheetah/base/Configuration_adv.h b/config/examples/FYSETC/Cheetah/base/Configuration_adv.h index e0299a507a..9f68fe357c 100644 --- a/config/examples/FYSETC/Cheetah/base/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah/base/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 700 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 500 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Felix/DUAL/Configuration.h b/config/examples/Felix/DUAL/Configuration.h index 9adfb27ad2..be26b9d9e9 100644 --- a/config/examples/Felix/DUAL/Configuration.h +++ b/config/examples/Felix/DUAL/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, Felix/DUAL)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -707,6 +707,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -715,6 +720,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -728,35 +738,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.023 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1540,10 +1553,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Felix/Configuration_adv.h b/config/examples/Felix/DUAL/Configuration_adv.h similarity index 98% rename from config/examples/Felix/Configuration_adv.h rename to config/examples/Felix/DUAL/Configuration_adv.h index 7848cac6ce..95b54d8917 100644 --- a/config/examples/Felix/Configuration_adv.h +++ b/config/examples/Felix/DUAL/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Felix/README.md b/config/examples/Felix/DUAL/README.md similarity index 100% rename from config/examples/Felix/README.md rename to config/examples/Felix/DUAL/README.md diff --git a/config/examples/Felix/Configuration.h b/config/examples/Felix/Single/Configuration.h similarity index 97% rename from config/examples/Felix/Configuration.h rename to config/examples/Felix/Single/Configuration.h index f379d63cff..159176547e 100644 --- a/config/examples/Felix/Configuration.h +++ b/config/examples/Felix/Single/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, Felix)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -707,6 +707,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -715,6 +720,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -728,35 +738,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.023 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1540,10 +1553,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Felix/Single/Configuration_adv.h b/config/examples/Felix/Single/Configuration_adv.h new file mode 100644 index 0000000000..95b54d8917 --- /dev/null +++ b/config/examples/Felix/Single/Configuration_adv.h @@ -0,0 +1,2784 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value +#endif + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +/** + * Heated Chamber settings + */ +#if TEMP_SENSOR_CHAMBER + #define CHAMBER_MINTEMP 5 + #define CHAMBER_MAXTEMP 60 + #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + //#define CHAMBER_LIMIT_SWITCHING + //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + //#define HEATER_CHAMBER_INVERTING false +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds + #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // Add an experimental additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information with 'M114 D' +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/m) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed + //#define CONTROLLERFAN_SPEED_Z_ONLY 127 // Reduce noise on machines that keep Z enabled +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * FAST PWM FAN Settings + * + * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a + * frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY [undefined by default] + * Set this to your desired frequency. + * If left undefined this defaults to F = F_CPU/(2*255*1) + * ie F = 31.4 Khz on 16 MHz microcontrollers or F = 39.2 KHz on 20 MHz microcontrollers + * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 + //#define USE_OCR2A_AS_TOP +#endif + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm + //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 0 + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage + #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage + #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 3 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially +//#define HOMING_BACKOFF_MM { 2, 2, 2 } // (mm) Move away from the endstops after homing + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then + * check the wiring of the BROWN, RED and ORANGE wires. + * + * Note: If the trigger signal of your probe is not being recognized, it has been very often + * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + //#define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! + * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. + * If disabled, OD mode is the hard-coded default on 3.0 + * On startup, Marlin will compare its eeprom to this vale. If the selected mode + * differs, a mode set eeprom write will be completed at initialization. + * Use the option below to force an eeprom write to a V3.1 probe regardless. + */ + //#define BLTOUCH_SET_5V_MODE + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Use "HIGH SPEED" mode for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function + * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + */ + //#define BLTOUCH_HS_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + +#endif // BLTOUCH + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + // Define probe X and Y positions for Z1, Z2 [, Z3] + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + + // Set number of iterations to align + #define Z_STEPPER_ALIGN_ITERATIONS 3 + + // Enable to restore leveling setup after operation + #define RESTORE_LEVELING_AFTER_G34 + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle + + // Stop criterion. If the accuracy is better than this stop iterating early + #define Z_STEPPER_ALIGN_ACC 0.02 +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // Set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// Minimum time that a segment needs to take if the buffer is emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (ms) + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // increments while checking for the contact to be broken. + #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) + #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/m) + #endif + #endif +#endif + +/** + * Automatic backlash, position and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#define CALIBRATION_GCODE +#if ENABLED(CALIBRATION_GCODE) + + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm + + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/m + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/m + + // The following parameters refer to the conical section of the nozzle tip. + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + // Probing at the exact top center only works if the center is flat. If + // probing on a screwhead or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define pin which is read during calibration + #ifndef CALIBRATION_PIN + #define CALIBRATION_PIN -1 // Override in pins.h or set to -1 to use your Z endstop + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if EITHER(ULTIPANEL, EXTENSIBLE_UI) + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) + #if ENABLED(ULTIPANEL) + #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +#if HAS_LCD_MENU + + // Include a page of printer information in the LCD Main Menu + //#define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + //#define LED_CONTROL_MENU + #if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif + #endif + +#endif // HAS_LCD_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + +#if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the Z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + #define EVENT_GCODE_SD_STOP "G28XY" // G-code to run on Stop Print (e.g., "G28XY" or "G27") + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate + //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + // Leave the heaters on after Stop Print (not recommended!) + //#define SD_ABORT_NO_COOLDOWN + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS3_USB + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + #if HAS_SDCARD_CONNECTION + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + //#define SDCARD_CONNECTION LCD + #endif + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_GRAPHICAL_LCD + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if ENABLED(U8GLIB_ST7920) + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customizations + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_GRAPHICAL_LCD + +// +// Lulzbot Touch UI +// +#if ENABLED(LULZBOT_TOUCH_UI) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping + //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping + //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping + //#define OTHER_PIN_LAYOUT // Define pins manually below + #if ENABLED(OTHER_PIN_LAYOUT) + // The pins for CS and MOD_RESET (PD) must be chosen. + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // UTF8 processing and rendering. + // Unsupported characters are shown as '?'. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + // Western accents support. These accented characters use + // combined bitmaps and require relatively little storage. + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + // Additional character groups. These characters require + // full bitmaps and take up considerable storage: + //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ + //#define TOUCH_UI_UTF8_COPYRIGHT // © ® + //#define TOUCH_UI_UTF8_GERMANIC // ß + //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ + //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ + //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ + //#define TOUCH_UI_UTF8_ORDINALS // º ª + //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ + //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ + //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ + #endif + #endif + + // Use a smaller font when labels don't fit buttons + #define TOUCH_UI_FIT_TEXT + + // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE) + //#define LCD_LANGUAGE_1 en + //#define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE + + // Output extra debug info for Touch UI events + //#define TOUCH_UI_DEBUG +#endif + +// +// FSMC Graphical TFT +// +#if ENABLED(FSMC_GRAPHICAL_TFT) + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Override MIN_PROBE_EDGE for each side of the build plate + * Useful to get probe points to exact positions on targets or + * to allow leveling to avoid plate clamps on only specific + * sides of the bed. + * + * If you are replacing the prior *_PROBE_BED_POSITION options, + * LEFT and FRONT values in most cases will map directly over + * RIGHT and REAR would be the inverse such as + * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) + * + * This will allow all positions to match at compilation, however + * should the probe position be modified with M851XY then the + * probe points will follow. This prevents any change from causing + * the probe to be unable to reach any points. + */ +#if PROBE_SELECTED && !IS_KINEMATIC + //#define MIN_PROBE_EDGE_LEFT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_RIGHT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_FRONT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_BACK MIN_PROBE_EDGE +#endif + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 200000 : Maximum for LV8729 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +// Add M575 G-code to change the baud rate +//#define BAUD_RATE_GCODE + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// This option inserts short delays between lines of serial output. +#define SERIAL_OVERRUN_PROTECTION + +// @section extras + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if EXTRUDERS > 1 + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_NO_RETURN // Never return to the previous position on tool-change + + // Retract and prime filament on tool-change + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + #define TOOLCHANGE_FIL_SWAP_LENGTH 12 // (mm) + #define TOOLCHANGE_FIL_EXTRA_PRIME 2 // (mm) + #define TOOLCHANGE_FIL_SWAP_RETRACT_SPEED 3600 // (mm/m) + #define TOOLCHANGE_FIL_SWAP_PRIME_SPEED 3600 // (mm/m) + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#define TOOLCHANGE_PARK + #if ENABLED(TOOLCHANGE_PARK) + #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/m) + #endif +#endif + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #if AXIS_DRIVER_TYPE_X(TMC26X) + #define X_MAX_CURRENT 1000 // (mA) + #define X_SENSE_RESISTOR 91 // (mOhms) + #define X_MICROSTEPS 16 // Number of microsteps + #endif + + #if AXIS_DRIVER_TYPE_X2(TMC26X) + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC26X) + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC26X) + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC26X) + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC26X) + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E2(TMC26X) + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E3(TMC26X) + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E4(TMC26X) + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E5(TMC26X) + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode + * connect your SPI pins to the hardware SPI interface on your board and define + * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 + * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN + * to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without + * a resistor. + * The drivers can also be used with hardware serial. + * + * TMCStepper library is required to use TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + */ +#if HAS_TRINAMIC + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #if AXIS_IS_TMC(X) + #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... + #endif + + #if AXIS_IS_TMC(X2) + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + #define X2_RSENSE 0.11 + #define X2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y) + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y2) + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + #define Y2_RSENSE 0.11 + #define Y2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z) + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z2) + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + #define Z2_RSENSE 0.11 + #define Z2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z3) + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define Z3_RSENSE 0.11 + #define Z3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E0) + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E1) + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + #define E1_RSENSE 0.11 + #define E1_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E2) + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + #define E2_RSENSE 0.11 + #define E2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E3) + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + #define E3_RSENSE 0.11 + #define E3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E4) + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + #define E4_RSENSE 0.11 + #define E4_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E5) + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + #define E5_RSENSE 0.11 + #define E5_CHAIN_POS -1 + #endif + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + #define X_SLAVE_ADDRESS 0 + #define Y_SLAVE_ADDRESS 0 + #define Z_SLAVE_ADDRESS 0 + #define X2_SLAVE_ADDRESS 0 + #define Y2_SLAVE_ADDRESS 0 + #define Z2_SLAVE_ADDRESS 0 + #define Z3_SLAVE_ADDRESS 0 + #define E0_SLAVE_ADDRESS 0 + #define E1_SLAVE_ADDRESS 0 + #define E2_SLAVE_ADDRESS 0 + #define E3_SLAVE_ADDRESS 0 + #define E4_SLAVE_ADDRESS 0 + #define E5_SLAVE_ADDRESS 0 + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_E + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * CHOPPER_DEFAULT_19V + * CHOPPER_DEFAULT_24V + * CHOPPER_DEFAULT_36V + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define you own with + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V + + /** + * Monitor Trinamic drivers for error conditions, + * like overtemperature and short to ground. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + + /** + * Use StallGuard2 to home / probe X, Y, Z. + * + * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only + * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set [XYZ]_HOME_BUMP_MM to 0. + * + * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when + * homing and adds a guard period for endstop triggering. + */ + //#define SENSORLESS_HOMING // StallGuard capable drivers only + + /** + * Use StallGuard2 to probe the bed with the nozzle. + * + * CAUTION: This could cause damage to machines that use a lead screw or threaded rod + * to move the Z axis. Take extreme care when attempting to enable this feature. + */ + //#define SENSORLESS_PROBING // StallGuard capable drivers only + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 8 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 8 + //#define Z_STALL_SENSITIVITY 8 + //#define SPI_ENDSTOPS // TMC2130 only + //#define IMPROVE_HOMING_RELIABILITY + #endif + + /** + * Beta feature! + * Create a 50/50 square wave step pulse optimal for stepper drivers. + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * Arduino-L6470 library (0.7.0 or higher) is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + * + * Requires the following to be defined in your pins_YOUR_BOARD file + * L6470_CHAIN_SCK_PIN + * L6470_CHAIN_MISO_PIN + * L6470_CHAIN_MOSI_PIN + * L6470_CHAIN_SS_PIN + * L6470_RESET_CHAIN_PIN (optional) + */ +#if HAS_DRIVER(L6470) + + //#define L6470_CHITCHAT // Display additional status info + + #if AXIS_DRIVER_TYPE_X(L6470) + #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) + #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) + #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) + #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) + #endif + + #if AXIS_DRIVER_TYPE_X2(L6470) + #define X2_MICROSTEPS 128 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Y(L6470) + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Y2(L6470) + #define Y2_MICROSTEPS 128 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z(L6470) + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z2(L6470) + #define Z2_MICROSTEPS 128 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z3(L6470) + #define Z3_MICROSTEPS 128 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E0(L6470) + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E1(L6470) + #define E1_MICROSTEPS 128 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E2(L6470) + #define E2_MICROSTEPS 128 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E3(L6470) + #define E3_MICROSTEPS 128 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E4(L6470) + #define E4_MICROSTEPS 128 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E5(L6470) + #define E5_MICROSTEPS 128 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #endif + + /** + * Monitor L6470 drivers for error conditions like over temperature and over current. + * In the case of over temperature Marlin can decrease the drive until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. + * I not present or I0 or I1 - X, Y, Z or E0 + * I2 - X2, Y2, Z2 or E1 + * I3 - Z3 or E3 + * I4 - E4 + * I5 - E5 + * M916 - Increase drive level until get thermal warning + * M917 - Find minimum current thresholds + * M918 - Increase speed until max or error + * M122 S0/1 - Report driver parameters + */ + //#define MONITOR_L6470_DRIVER_STATUS + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + #define KVAL_HOLD_STEP_DOWN 1 + //#define L6470_STOP_ON_ERROR + #endif + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) + + // Canon RC-1 or homebrew digital camera trigger + // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) +#endif + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define SPINDLE_LASER_ACTIVE_HIGH false // Set to "true" if the on/off function is active HIGH + #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // Set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + #else + #define SPEED_POWER_SLOPE 0.3922 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 10 + #define SPEED_POWER_MAX 100 // 0-100% + #endif +#endif + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. + +// Enable and set a (default) feedrate for all G0 moves +//#define G0_FEEDRATE 3000 // (mm/m) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define CUSTOM_USER_MENU_TITLE "Custom Commands" + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +//#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + //#define HOST_PROMPT_SUPPORT +#endif + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + // Use M119 to find reasonable values after connecting your hardware: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behavior is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" + //#define WEBSUPPORT // Start a webserver with auto-discovery + //#define OTASUPPORT // Support over-the-air firmware updates +#endif + +/** + * Prusa Multi-Material Unit v2 + * Enable in Configuration.h + */ +#if ENABLED(PRUSA_MMU2) + + // Serial port used for communication with MMU2. + // For AVR enable the UART port used for the MMU. (e.g., internalSerial) + // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) + #define INTERNAL_SERIAL_PORT 2 + #define MMU2_SERIAL internalSerial + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + #if ENABLED(MMU2_MENUS) + // Settings for filament load / unload from the LCD menu. + // This is for Prusa MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 562 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // PRUSA_MMU2 + +/** + * Advanced Print Counter settings + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE diff --git a/config/examples/Felix/Single/README.md b/config/examples/Felix/Single/README.md new file mode 100644 index 0000000000..48fe099151 --- /dev/null +++ b/config/examples/Felix/Single/README.md @@ -0,0 +1,60 @@ +# Felix 2.0/3.0 Configuration for Marlin Firmware + +Bringing silky smooth prints to Felix. + +## Build HOWTO + + - Install the latest non-beta Arduino software IDE/toolset: http://www.arduino.cc/en/Main/Software + - Download the Marlin firmware + - [Latest developement version](https://github.com/MarlinFirmware/Marlin/tree/Development) + - [Stable version](https://github.com/MarlinFirmware/Marlin/tree/Development) + - In both cases use the "Download Zip" button on the right. + +``` +cd Marlin/src +cp config/examples/Felix/Configuration_adv.h . +``` + +The next step depends on your setup: + +### Single Extruder Configuration + + cp config/examples/Felix/Configuration.h . + +### Dual Extruder Configuration + + cp config/examples/Felix/DUAL/Configuration.h Configuration.h + +### Compile Firmware + + - Start the Arduino IDE. + - Select Tools -> Board -> Arduino Mega 2560 + - Select the correct serial port in Tools -> Serial Port (usually /dev/ttyUSB0) + - Open Marlin.pde or .ino + - Click the Verify/Compile button + +### Flash Firmware + +#### Connected directly via USB + + - Click the Upload button. If all goes well the firmware is uploading + +#### Remote update + +Find the latest Arduino build: + + ls -altr /tmp/ + drwxr-xr-x 5 chrono users 12288 Mar 3 21:41 build6072035599686630843.tmp + +Copy the firmware to your printer host: + + scp /tmp/build6072035599686630843.tmp/Marlin.cpp.hex a.b.c.d:/tmp/ + +Connect to your printer host via ssh, stop Octoprint or any other service that may block your USB device and make sure you have avrdude installed, then run: + + avrdude -C/etc/avrdude.conf -v -v -v -patmega2560 -cwiring -P/dev/ttyUSB0 \ + -b115200 -D -Uflash:w:/tmp/Marlin.cpp.hex:i + +## Acknowledgements + +Mashed together and tested on https://apollo.open-resource.org/mission:resources:picoprint based on collaborative teamwork of @andrewsil1 and @thinkyhead. diff --git a/config/examples/FlashForge/CreatorPro/Configuration.h b/config/examples/FlashForge/CreatorPro/Configuration.h index d8000b4d4a..4ca6da6768 100644 --- a/config/examples/FlashForge/CreatorPro/Configuration.h +++ b/config/examples/FlashForge/CreatorPro/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "M. Baker" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -2 #define TEMP_SENSOR_1 -2 @@ -717,6 +717,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 250, 250, 20, 100 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -725,6 +730,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -738,35 +748,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 20.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 2.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.64 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1549,10 +1562,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FlashForge/CreatorPro/Configuration_adv.h b/config/examples/FlashForge/CreatorPro/Configuration_adv.h index 4fe03c42ab..b2d5266e50 100644 --- a/config/examples/FlashForge/CreatorPro/Configuration_adv.h +++ b/config/examples/FlashForge/CreatorPro/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -888,6 +901,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1354,12 +1372,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1798,91 +1816,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2108,7 +2126,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2116,7 +2134,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2124,7 +2142,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2132,7 +2150,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2140,7 +2158,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2148,7 +2166,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2156,7 +2174,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2164,7 +2182,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2172,7 +2190,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2180,7 +2198,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2188,7 +2206,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2196,7 +2214,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2204,7 +2222,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/FolgerTech/i3-2020/Configuration.h b/config/examples/FolgerTech/i3-2020/Configuration.h index 4960cd50b8..4b2ec2f048 100644 --- a/config/examples/FolgerTech/i3-2020/Configuration.h +++ b/config/examples/FolgerTech/i3-2020/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -731,6 +731,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 250, 250, 2, 17 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -739,6 +744,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 4, 750 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -752,35 +762,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.5 #define DEFAULT_YJERK 8.5 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 4.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.058 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1577,10 +1590,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/FolgerTech/i3-2020/Configuration_adv.h b/config/examples/FolgerTech/i3-2020/Configuration_adv.h index 488c7b73ae..8c6e72bd35 100644 --- a/config/examples/FolgerTech/i3-2020/Configuration_adv.h +++ b/config/examples/FolgerTech/i3-2020/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Formbot/Raptor/Configuration.h b/config/examples/Formbot/Raptor/Configuration.h index fad911678a..7b159f5987 100644 --- a/config/examples/Formbot/Raptor/Configuration.h +++ b/config/examples/Formbot/Raptor/Configuration.h @@ -113,6 +113,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Tinymachines3D" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -424,6 +425,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -441,8 +443,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -781,6 +781,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -808,6 +813,11 @@ #endif #define DEFAULT_MAX_ACCELERATION { X_ACCEL, Y_ACCEL, 400, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -821,28 +831,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #if ENABLED(X_SPREADCYCLE) || DISABLED(X_2208) #define DEFAULT_XJERK 20.0 #else @@ -854,10 +851,26 @@ #define DEFAULT_YJERK 5.0 #endif #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM (.4 * DEFAULT_YJERK * DEFAULT_YJERK / DEFAULT_ACCELERATION) // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1676,10 +1689,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Formbot/Raptor/Configuration_adv.h b/config/examples/Formbot/Raptor/Configuration_adv.h index 655443a27e..f79425b769 100644 --- a/config/examples/Formbot/Raptor/Configuration_adv.h +++ b/config/examples/Formbot/Raptor/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Formbot/T_Rex_2+/Configuration.h b/config/examples/Formbot/T_Rex_2+/Configuration.h index 583f6d0336..2389f6c983 100644 --- a/config/examples/Formbot/T_Rex_2+/Configuration.h +++ b/config/examples/Formbot/T_Rex_2+/Configuration.h @@ -75,6 +75,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Formbot-3D" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -392,6 +393,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -409,8 +411,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -754,6 +754,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 100, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -762,6 +767,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -775,35 +785,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 12.0 // More conservative numbers. #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.017 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1605,10 +1618,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Formbot/T_Rex_2+/Configuration_adv.h b/config/examples/Formbot/T_Rex_2+/Configuration_adv.h index 7f5ba7c33e..aa52343a6e 100644 --- a/config/examples/Formbot/T_Rex_2+/Configuration_adv.h +++ b/config/examples/Formbot/T_Rex_2+/Configuration_adv.h @@ -383,6 +383,7 @@ #else #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) #endif + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -606,20 +607,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -1359,12 +1372,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1803,91 +1816,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2113,7 +2126,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2121,7 +2134,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2129,7 +2142,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2137,7 +2150,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2145,7 +2158,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2153,7 +2166,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2161,7 +2174,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2169,7 +2182,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2177,7 +2190,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2185,7 +2198,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2193,7 +2206,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2201,7 +2214,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2209,7 +2222,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Formbot/T_Rex_3/Configuration.h b/config/examples/Formbot/T_Rex_3/Configuration.h index df29a67c06..f6cefe4904 100644 --- a/config/examples/Formbot/T_Rex_3/Configuration.h +++ b/config/examples/Formbot/T_Rex_3/Configuration.h @@ -76,6 +76,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Formbot-3D" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -387,6 +388,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -404,8 +406,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -736,6 +736,11 @@ //#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } #define DEFAULT_MAX_FEEDRATE { 250, 100, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -744,6 +749,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -753,44 +763,43 @@ * M204 T Travel Acceleration */ -//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves -//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts -//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves - #define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 1500 // E acceleration for retracts #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 12.0 // More conservative numbers. #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.017 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1596,10 +1605,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Formbot/T_Rex_3/Configuration_adv.h b/config/examples/Formbot/T_Rex_3/Configuration_adv.h index 4d70eaabae..3a1a5da2b2 100644 --- a/config/examples/Formbot/T_Rex_3/Configuration_adv.h +++ b/config/examples/Formbot/T_Rex_3/Configuration_adv.h @@ -383,6 +383,7 @@ #else #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) #endif + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -606,20 +607,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -893,6 +906,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1359,12 +1377,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1803,91 +1821,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2113,7 +2131,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2121,7 +2139,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2129,7 +2147,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2137,7 +2155,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2145,7 +2163,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2153,7 +2171,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2161,7 +2179,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2169,7 +2187,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2177,7 +2195,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2185,7 +2203,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2193,7 +2211,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2201,7 +2219,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2209,7 +2227,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Fysetc/AIO_II/Configuration.h b/config/examples/Fysetc/AIO_II/Configuration.h index a9c1d34829..7c658157f6 100644 --- a/config/examples/Fysetc/AIO_II/Configuration.h +++ b/config/examples/Fysetc/AIO_II/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Fysetc/AIO_II/Configuration_adv.h b/config/examples/Fysetc/AIO_II/Configuration_adv.h index 0bfa79d000..98d4d00d46 100644 --- a/config/examples/Fysetc/AIO_II/Configuration_adv.h +++ b/config/examples/Fysetc/AIO_II/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 700 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 650 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 650 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Fysetc/F6_13/Configuration.h b/config/examples/Fysetc/F6_13/Configuration.h index 3c0eeaee0e..3048dc1732 100644 --- a/config/examples/Fysetc/F6_13/Configuration.h +++ b/config/examples/Fysetc/F6_13/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -385,6 +386,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -402,8 +404,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -727,6 +727,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -735,6 +740,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -748,35 +758,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1560,10 +1573,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Fysetc/F6_13/Configuration_adv.h b/config/examples/Fysetc/F6_13/Configuration_adv.h index 435f1b485d..6d7f45360d 100644 --- a/config/examples/Fysetc/F6_13/Configuration_adv.h +++ b/config/examples/Fysetc/F6_13/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/A10/Configuration.h b/config/examples/Geeetech/A10/Configuration.h index 51aaa489a8..8a681622c2 100644 --- a/config/examples/Geeetech/A10/Configuration.h +++ b/config/examples/Geeetech/A10/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Phr3d13, Geeetech A10 default)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -708,6 +708,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -716,6 +721,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -729,35 +739,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1543,10 +1556,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/A10/Configuration_adv.h b/config/examples/Geeetech/A10/Configuration_adv.h index affcf4399a..781571dc7c 100644 --- a/config/examples/Geeetech/A10/Configuration_adv.h +++ b/config/examples/Geeetech/A10/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/A10M/Configuration.h b/config/examples/Geeetech/A10M/Configuration.h index ab3f257825..625b1b728e 100644 --- a/config/examples/Geeetech/A10M/Configuration.h +++ b/config/examples/Geeetech/A10M/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -708,6 +708,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -716,6 +721,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -729,35 +739,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1543,10 +1556,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/A10M/Configuration_adv.h b/config/examples/Geeetech/A10M/Configuration_adv.h index 0991769350..7ba8e1b0b2 100644 --- a/config/examples/Geeetech/A10M/Configuration_adv.h +++ b/config/examples/Geeetech/A10M/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/A20M/Configuration.h b/config/examples/Geeetech/A20M/Configuration.h index 1bcec7ac72..faa7431d3a 100644 --- a/config/examples/Geeetech/A20M/Configuration.h +++ b/config/examples/Geeetech/A20M/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -708,6 +708,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -716,6 +721,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -729,35 +739,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1542,10 +1555,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/A20M/Configuration_adv.h b/config/examples/Geeetech/A20M/Configuration_adv.h index 409a1b1658..f63b25f2d8 100644 --- a/config/examples/Geeetech/A20M/Configuration_adv.h +++ b/config/examples/Geeetech/A20M/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/GT2560/Configuration.h b/config/examples/Geeetech/GT2560/Configuration.h index 44f5939b5e..6ecc7f639f 100644 --- a/config/examples/Geeetech/GT2560/Configuration.h +++ b/config/examples/Geeetech/GT2560/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -740,6 +740,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -748,6 +753,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 50, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -761,35 +771,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 4.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1573,10 +1586,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h b/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h index 7b26ebec7a..50522cea0d 100644 --- a/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h +++ b/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(R. de Weerd, I3 Pro X)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 40, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 4.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.01 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/MeCreator2/Configuration.h b/config/examples/Geeetech/MeCreator2/Configuration.h index edfd2c9179..4a4eaae321 100644 --- a/config/examples/Geeetech/MeCreator2/Configuration.h +++ b/config/examples/Geeetech/MeCreator2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Phr3d13, MeCreator2)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -732,6 +732,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 250, 250, 400, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -740,6 +745,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -753,35 +763,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) - #define DEFAULT_XJERK 0 - #define DEFAULT_YJERK 0 +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) + #define DEFAULT_XJERK 2 + #define DEFAULT_YJERK 2 #define DEFAULT_ZJERK 0.6 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 50.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.001 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1565,10 +1578,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/MeCreator2/Configuration_adv.h b/config/examples/Geeetech/MeCreator2/Configuration_adv.h index 66c10df22f..fa82fe332b 100644 --- a/config/examples/Geeetech/MeCreator2/Configuration_adv.h +++ b/config/examples/Geeetech/MeCreator2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1354,12 +1372,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1798,91 +1816,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2108,7 +2126,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2116,7 +2134,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2124,7 +2142,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2132,7 +2150,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2140,7 +2158,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2148,7 +2166,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2156,7 +2174,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2164,7 +2182,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2172,7 +2190,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2180,7 +2198,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2188,7 +2206,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2196,7 +2214,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2204,7 +2222,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h index 02d543fa1b..f86078badc 100644 --- a/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(1138-4EB, Geeetech Prusa i3 Pro B BLTouch config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -745,6 +745,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -753,6 +758,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -766,35 +776,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1579,10 +1592,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/Prusa i3 Pro B/README.md b/config/examples/Geeetech/Prusa i3 Pro B/bltouch/README.md similarity index 100% rename from config/examples/Geeetech/Prusa i3 Pro B/README.md rename to config/examples/Geeetech/Prusa i3 Pro B/bltouch/README.md diff --git a/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h index bae11398aa..9a3c24ccf7 100644 --- a/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(1138-4EB, Geeetech Prusa i3 Pro B config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -745,6 +745,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -753,6 +758,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -766,35 +776,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1578,10 +1591,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/Prusa i3 Pro B/noprobe/README.md b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/README.md new file mode 100644 index 0000000000..30fcf2e443 --- /dev/null +++ b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/README.md @@ -0,0 +1,54 @@ +These are example configurations for the low-cost [Acrylic Prusa I3 pro B 3D Printer DIY kit](http://www.geeetech.com/acrylic-geeetech-prusa-i3-pro-b-3d-printer-diy-kit-p-917.html) and the [3DTouch auto bed leveling sensor](http://www.geeetech.com/geeetech-3dtouch-auto-bed-leveling-sensor-for-3d-printer-p-1010.html) based on: + +- `../GT2560/` +- [Marlin 1.1.4 With 3DTouch / BLTouch for i3 Pro B](https://www.geeetech.com/forum/viewtopic.php?t=19846) + +The main characteristics of these configurations are: + +- The defined motherboard is `BOARD_GT2560_REV_A_PLUS`. +- Travel limits are adjusted to the printer bed size and position. +- An example `SKEW_CORRECTION` for a particular printer is enabled. See comments below about how to adjust it to a particular printer. +- Using the LCD controller for bed leveling is enabled. + - `PROBE_MANUALLY` is enabled, which *provides a means to do "Auto" Bed Leveling without a probe*. + - The `LEVEL_BED_CORNERS` option for manual bed adjustment is enabled. + - Bilinear bed leveling is enabled, the boundaries for probing are adjusted to the glass size, and extrapolation is enabled. +- `PRINTCOUNTER` is enabled, in order to track statistical data. +- `INDIVIDUAL_AXIS_HOMING_MENU` is enabled, which adds individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +- The speaker is enabled for the UI feedback. +- `bltouch` variant: + - `USE_ZMAX_PLUG` is enabled. See comments about connections below. + - Heaters and fans are turned off when probing. + - Multiple probing is set to 3. + +# First-time configuration + +## Skew factor + +The skew factor must be adjusted for each printer: + +- First, uncomment `#define XY_SKEW_FACTOR 0.0`, compile and upload the firmware. +- Then, print [YACS (Yet Another Calibration Square)](https://www.thingiverse.com/thing:2563185). Hint, scale it considering a margin for brim (if used). The larger, the better to make error measurements. +- Measure the printed part according to the comments in the example configuration file, and set `XY_DIAG_AC`, `XY_DIAG_BD` and `Y_SIDE_AD`. +- Last, comment `#define XY_SKEW_FACTOR 0.0` again, compile and upload. + +## 3DTouch auto leveling sensor + +- Print a suitable mount to attach the sensor to the printer. The example configuration file is adjusted to http://www.geeetech.com/wiki/images/6/61/3DTouch_auto_leveling_sensor-1.zip +- Unlike suggested in [geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor](https://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor), the existing end stop switch is expected to be kept connected to Z_MIN. So, the sensor is to be connected to Z_MAX, according to Marlin's default settings. Furthermore, GT2560-A+ provides a connector for the servo next to thermistor connectors (see [GT2560](https://www.geeetech.com/wiki/images/thumb/4/45/GT2560_wiring.jpg/700px-GT2560_wiring.jpg) and [GT2560-A+](http://i.imgur.com/E0t34VU.png)). +- Be careful to respect the polarity of the sensor when connecting it to the GT2560-A+. Unlike end stops, reversing the connection will prevent the sensor from working properly. +- [Test](http://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor#Testing) and [calibrate](https://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor#Calibration) the sensor. +- If using the GT2560-A+ and with the sensor connected to Z_MAX and an endstop connected to Z_MIN use the following calibration routine instead. + +## 3DTouch Calibration with Z_MAX + +- Home the printer with `G28` command. +- Disable the Z axis software endstop with `M211 S0 Z0` +- Reset the probe Z_OFFSET with `M851 Z0` +- Move to the center of the bed with `G1 X100 Y100` +- Move Z incrementally until the nozzle is the correct height from the bed using a shim or piece of paper, record this Z movement, for example -0.2. +- Do a single probe at the current point in the middle of the bed using `G30` and not the returned value, for example 1.9. Invert this value, i.e. -1.9, and add it to the Z offset above, i.e. -0.2 in this example giving -2.1. +- Update the probe Z_OFFSET to this value using `M851` i.e. `M851 Z-2.1`. +- Re-enable software end-stops with `M211 S1 Z0` +- Save this value to the EEPROM with `M500`. +- Update the start G-Code in your slicer software to insert a `G29` after the last `G28`. +- Carefully test that the offset is correct in the first print. diff --git a/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h index 3ad7d31902..6e90fd0e39 100644 --- a/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Phr3d13, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h index affcf4399a..781571dc7c 100644 --- a/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h +++ b/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h index c7c00987b0..30cf637a8a 100644 --- a/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Phr3d13, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h index affcf4399a..781571dc7c 100644 --- a/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h +++ b/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/HMS434/Configuration.h b/config/examples/HMS434/Configuration.h index 463585eae2..54b4214e49 100644 --- a/config/examples/HMS434/Configuration.h +++ b/config/examples/HMS434/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Scheepers, MaukCC)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 0 @@ -712,6 +712,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 1000, 1000, 40, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -720,6 +725,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -733,35 +743,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1545,10 +1558,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/HMS434/Configuration_adv.h b/config/examples/HMS434/Configuration_adv.h index e89f3699e9..a17eb82ad0 100644 --- a/config/examples/HMS434/Configuration_adv.h +++ b/config/examples/HMS434/Configuration_adv.h @@ -371,6 +371,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -594,20 +595,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -857,6 +870,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1334,12 +1352,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1778,91 +1796,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2088,7 +2106,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2096,7 +2114,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2104,7 +2122,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2112,7 +2130,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2120,7 +2138,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2128,7 +2146,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2136,7 +2154,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2144,7 +2162,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2152,7 +2170,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2160,7 +2178,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2168,7 +2186,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2176,7 +2194,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2184,7 +2202,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Infitary/i3-M508/Configuration.h b/config/examples/Infitary/i3-M508/Configuration.h index 9f19367910..7d648499ac 100644 --- a/config/examples/Infitary/i3-M508/Configuration.h +++ b/config/examples/Infitary/i3-M508/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(tjclement, Infitary M508)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Infitary/i3-M508/Configuration_adv.h b/config/examples/Infitary/i3-M508/Configuration_adv.h index 47ee220ae9..86cf3d0b5c 100644 --- a/config/examples/Infitary/i3-M508/Configuration_adv.h +++ b/config/examples/Infitary/i3-M508/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/JGAurora/A1/Configuration.h b/config/examples/JGAurora/A1/Configuration.h index 8445110af1..ba6510b4a4 100644 --- a/config/examples/JGAurora/A1/Configuration.h +++ b/config/examples/JGAurora/A1/Configuration.h @@ -77,6 +77,7 @@ // ╚╝╚═╝╩ ╩└─┘┴└─└─┘┴└─┴ ┴╚ └─┘┴└─└─┘┴ ┴o└─┘└─┘┴ ┴ #define STRING_CONFIG_H_AUTHOR "(Roberto Mariani & Samuel Pinches)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -753,28 +753,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 13.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.4 @@ -782,6 +769,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1565,10 +1563,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/JGAurora/A1/Configuration_adv.h b/config/examples/JGAurora/A1/Configuration_adv.h index d9a3fe6f6b..6789582147 100644 --- a/config/examples/JGAurora/A1/Configuration_adv.h +++ b/config/examples/JGAurora/A1/Configuration_adv.h @@ -384,6 +384,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -607,20 +608,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -894,6 +907,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1360,12 +1378,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1804,91 +1822,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2114,7 +2132,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2122,7 +2140,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2130,7 +2148,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2138,7 +2156,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2146,7 +2164,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2154,7 +2172,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2162,7 +2180,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2170,7 +2188,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2178,7 +2196,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2186,7 +2204,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2194,7 +2212,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2202,7 +2220,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2210,7 +2228,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/JGAurora/A5/Configuration.h b/config/examples/JGAurora/A5/Configuration.h index 8e2c31a08e..7b00e9753e 100644 --- a/config/examples/JGAurora/A5/Configuration.h +++ b/config/examples/JGAurora/A5/Configuration.h @@ -77,6 +77,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Telli Mantelli, Kris Waclawski, Samuel Pinches & Michael Gilardi, 21 Jan 2018)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 15 // manual calibration of thermistor in JGAurora A5 hotend #define TEMP_SENSOR_1 0 @@ -737,6 +737,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -745,6 +750,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 500, 100, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -758,35 +768,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 3.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.005 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1570,10 +1583,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/JGAurora/A5/Configuration_adv.h b/config/examples/JGAurora/A5/Configuration_adv.h index 8fde777de9..25ed8aea52 100644 --- a/config/examples/JGAurora/A5/Configuration_adv.h +++ b/config/examples/JGAurora/A5/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/JGAurora/A5S/Configuration.h b/config/examples/JGAurora/A5S/Configuration.h index 09f34afe2c..9eff362706 100644 --- a/config/examples/JGAurora/A5S/Configuration.h +++ b/config/examples/JGAurora/A5S/Configuration.h @@ -77,6 +77,7 @@ // ╚╝╚═╝╩ ╩└─┘┴└─└─┘┴└─┴ ┴╚ └─┘┴└─└─┘┴ ┴o└─┘└─┘┴ ┴ #define STRING_CONFIG_H_AUTHOR "(Roberto Mariani & Samuel Pinches)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -753,28 +753,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 13.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.4 @@ -782,6 +769,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1565,10 +1563,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/JGAurora/A5S/Configuration_adv.h b/config/examples/JGAurora/A5S/Configuration_adv.h index d9a3fe6f6b..6789582147 100644 --- a/config/examples/JGAurora/A5S/Configuration_adv.h +++ b/config/examples/JGAurora/A5S/Configuration_adv.h @@ -384,6 +384,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -607,20 +608,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -894,6 +907,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1360,12 +1378,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1804,91 +1822,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2114,7 +2132,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2122,7 +2140,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2130,7 +2148,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2138,7 +2156,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2146,7 +2164,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2154,7 +2172,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2162,7 +2180,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2170,7 +2188,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2178,7 +2196,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2186,7 +2204,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2194,7 +2212,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2202,7 +2220,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2210,7 +2228,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/MakerParts/Configuration.h b/config/examples/MakerParts/Configuration.h index b5ed76af06..5803b380f1 100644 --- a/config/examples/MakerParts/Configuration.h +++ b/config/examples/MakerParts/Configuration.h @@ -38,26 +38,6 @@ */ #define CONFIGURATION_H_VERSION 020000 -//=========================================================================== -//===== Pololus calibration ================================================= -//=========================================================================== - -// Voltage reference on potentiometer on Green Pololus in millivolts -#define Vref_mV 800UL - -// Rsc value used on PCB of the Green Pololus -#define Rsc_mOhms 100UL - -// Estimated maximum acceleration for X and Y axis -#define MAX_XYAXIS_ACCEL (3UL * (Vref_mV) * 100UL / (Rsc_mOhms)) - -// Notes: -// If we could use 1.65A as motor current, then 3000 mm/s^2 as acceleration -// if perfectly achievable. Using 1A as motor current, 2400 mm/s^2 acceleration -// is perfectly possible without losing any steps -// On A4988 drivers, maximum current can be calculated as I_TripMax= Vref/(8*Rs) -// - //=========================================================================== //============================= Getting Started ============================= //=========================================================================== @@ -92,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "ejtagle" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -403,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -420,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -745,13 +725,23 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 2, 30 } // For 300mm/s printing +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ -#define DEFAULT_MAX_ACCELERATION { MAX_XYAXIS_ACCEL, MAX_XYAXIS_ACCEL, 10, 200 } +#define DEFAULT_MAX_ACCELERATION { 2400, 2400, 10, 200 } + +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif /** * Default Acceleration (change/s) change = mm/s @@ -761,40 +751,43 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -#define DEFAULT_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z and E acceleration for printing moves +#define DEFAULT_ACCELERATION 2400 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 100 // E acceleration for retracts -#define DEFAULT_TRAVEL_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z acceleration for travel (non printing) moves +#define DEFAULT_TRAVEL_ACCELERATION 2400 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 2.0 #define DEFAULT_YJERK 2.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 8.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.001 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1578,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/MakerParts/Configuration_adv.h b/config/examples/MakerParts/Configuration_adv.h index 9e9a2b279c..07312aac00 100644 --- a/config/examples/MakerParts/Configuration_adv.h +++ b/config/examples/MakerParts/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Malyan/M150/Configuration.h b/config/examples/Malyan/M150/Configuration.h index 25a37e560d..62d8a59410 100644 --- a/config/examples/Malyan/M150/Configuration.h +++ b/config/examples/Malyan/M150/Configuration.h @@ -77,6 +77,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Gunther)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -745,6 +745,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -753,6 +758,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 700, 700, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -766,35 +776,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 700 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.037 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1599,10 +1612,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Malyan/M150/Configuration_adv.h b/config/examples/Malyan/M150/Configuration_adv.h index af59554c0f..3ec3eb8aa3 100644 --- a/config/examples/Malyan/M150/Configuration_adv.h +++ b/config/examples/Malyan/M150/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Malyan/M200/Configuration.h b/config/examples/Malyan/M200/Configuration.h index 179d0cdfa7..043b32d569 100644 --- a/config/examples/Malyan/M200/Configuration.h +++ b/config/examples/Malyan/M200/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(xC0000005, Malyan M200 build)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -146,7 +147,7 @@ #define EXTRUDERS 1 // Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. -#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 // For Cyclops or any "multi-extruder" that shares a single nozzle. //#define SINGLENOZZLE @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 11 #define TEMP_SENSOR_1 0 @@ -474,9 +474,10 @@ // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it // Ultimaker - #define DEFAULT_Kp 26.15 - #define DEFAULT_Ki 2.74 - #define DEFAULT_Kd 62.35 + //#define DEFAULT_Kp 26.15 + //#define DEFAULT_Ki 2.74 + //#define DEFAULT_Kd 62.35 + // MakerGear //#define DEFAULT_Kp 7.0 //#define DEFAULT_Ki 0.1 @@ -487,6 +488,11 @@ //#define DEFAULT_Ki 2.25 //#define DEFAULT_Kd 440 + // Malyan M200 + #define DEFAULT_Kp 20.0 + #define DEFAULT_Ki 2.02 + #define DEFAULT_Kd 100.00 + #endif // PIDTEMP //=========================================================================== @@ -506,7 +512,7 @@ * heater. If your configuration is significantly different than this and you don't understand * the issues involved, don't use bed PID until someone else verifies that your hardware works. */ -//#define PIDTEMPBED +#define PIDTEMPBED //#define BED_LIMIT_SWITCHING @@ -524,9 +530,9 @@ //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) - #define DEFAULT_bedKp 231.09 - #define DEFAULT_bedKi 45.21 - #define DEFAULT_bedKd 295.34 + //#define DEFAULT_bedKp 231.09 + //#define DEFAULT_bedKi 45.21 + //#define DEFAULT_bedKd 295.34 //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune @@ -534,6 +540,11 @@ //#define DEFAULT_bedKi 1.41 //#define DEFAULT_bedKd 1675.16 + // Malyan M200 + #define DEFAULT_bedKp 14.00 + #define DEFAULT_bedKi 0.9 + #define DEFAULT_bedKd 120.4 + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED @@ -724,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -732,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -745,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1036,8 +1060,8 @@ // @section machine // The size of the print bed -#define X_BED_SIZE 200 -#define Y_BED_SIZE 200 +#define X_BED_SIZE 120 +#define Y_BED_SIZE 120 // Travel limits (mm) after homing, corresponding to endstop positions. #define X_MIN_POS 0 @@ -1045,7 +1069,7 @@ #define Z_MIN_POS 0 #define X_MAX_POS X_BED_SIZE #define Y_MAX_POS Y_BED_SIZE -#define Z_MAX_POS 200 +#define Z_MAX_POS 120 /** * Software Endstops @@ -1263,7 +1287,7 @@ #endif // Add a menu item to move between bed corners for manual bed adjustment -#define LEVEL_BED_CORNERS +//#define LEVEL_BED_CORNERS #if ENABLED(LEVEL_BED_CORNERS) #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling @@ -1557,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en @@ -1612,7 +1636,7 @@ */ //#define SPI_SPEED SPI_HALF_SPEED //#define SPI_SPEED SPI_QUARTER_SPEED -#define SPI_SPEED SPI_EIGHTH_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED /** * SD CARD: ENABLE CRC diff --git a/config/examples/Malyan/M200/Configuration_adv.h b/config/examples/Malyan/M200/Configuration_adv.h index cf422c358e..0b24879332 100644 --- a/config/examples/Malyan/M200/Configuration_adv.h +++ b/config/examples/Malyan/M200/Configuration_adv.h @@ -277,9 +277,9 @@ * The fan will turn on automatically whenever any stepper is enabled * and turn off after a set period after all steppers are turned off. */ -//#define USE_CONTROLLER_FAN +#define USE_CONTROLLER_FAN // Malyan M200: uncomment if you use FAN2 to cool the board (original) #if ENABLED(USE_CONTROLLER_FAN) - //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLER_FAN_PIN MALYAN_FAN2_PIN // Set a custom pin for the controller fan #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled #define CONTROLLERFAN_SPEED 255 // 255 == full speed //#define CONTROLLERFAN_SPEED_Z_ONLY 127 // Reduce noise on machines that keep Z enabled @@ -346,7 +346,9 @@ * Multiple extruders can be assigned to the same pin in which case * the fan will turn on when any selected extruder is above the threshold. */ -//#define E0_AUTO_FAN_PIN -1 +//#define FAN_PIN MALYAN_FAN1_PIN // Malyan M200: uncomment if you use FAN1 to cool the part and FAN2 to cool the extruder +//#define E0_AUTO_FAN_PIN MALYAN_FAN2_PIN // Malyan M200: uncomment if you use FAN1 to cool the part and FAN2 to cool the extruder +#define E0_AUTO_FAN_PIN MALYAN_FAN1_PIN // Malyan M200: uncomment if you use FAN1 to cool the extruder and the part (original) #define E1_AUTO_FAN_PIN -1 #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 @@ -379,6 +381,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +605,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Micromake/C1/basic/Configuration.h b/config/examples/Micromake/C1/basic/Configuration.h index 93489b0516..594c79ac33 100644 --- a/config/examples/Micromake/C1/basic/Configuration.h +++ b/config/examples/Micromake/C1/basic/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(MetalSearch, Micromake C1 factory settings)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Micromake/C1/README.md b/config/examples/Micromake/C1/basic/README.md similarity index 100% rename from config/examples/Micromake/C1/README.md rename to config/examples/Micromake/C1/basic/README.md diff --git a/config/examples/Micromake/C1/enhanced/Configuration.h b/config/examples/Micromake/C1/enhanced/Configuration.h index d4dcbb6698..7eb2d51166 100644 --- a/config/examples/Micromake/C1/enhanced/Configuration.h +++ b/config/examples/Micromake/C1/enhanced/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(MetalSearch, Micromake C1 enhanced)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -729,6 +729,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -750,35 +760,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Micromake/C1/enhanced/Configuration_adv.h b/config/examples/Micromake/C1/enhanced/Configuration_adv.h index 420653d890..930a4afc54 100644 --- a/config/examples/Micromake/C1/enhanced/Configuration_adv.h +++ b/config/examples/Micromake/C1/enhanced/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Micromake/C1/enhanced/README.md b/config/examples/Micromake/C1/enhanced/README.md new file mode 100644 index 0000000000..0111f6f00a --- /dev/null +++ b/config/examples/Micromake/C1/enhanced/README.md @@ -0,0 +1,15 @@ +# Micromake C1 + +### In the folder "basic" +Configuration files for Micromake C1 without mods + - English LCD 2X16 Characters + - Motors 16 STEPS + - No heated bed + - No probe, etc. + - Like a standard C1 as shipped by Micromake. + +### In the folder "enhanced" +Configuration files for Micromake C1 with… + - 128 STEPS configured with jumper on the motherboard (all open for 128 Steps). + - Capacitive Probe (Adjust offsets at your convenience) + - French language with no accents for Japanese LCD. diff --git a/config/examples/Mks/Robin/Configuration.h b/config/examples/Mks/Robin/Configuration.h index 07cb10d359..62b879434d 100644 --- a/config/examples/Mks/Robin/Configuration.h +++ b/config/examples/Mks/Robin/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -384,6 +385,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -401,8 +403,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -726,6 +726,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -734,6 +739,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -747,35 +757,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1559,10 +1572,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Mks/Robin/Configuration_adv.h b/config/examples/Mks/Robin/Configuration_adv.h index 00297f58af..da89d5c371 100644 --- a/config/examples/Mks/Robin/Configuration_adv.h +++ b/config/examples/Mks/Robin/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Mks/Sbase/Configuration.h b/config/examples/Mks/Sbase/Configuration.h index f144b1ddb6..ebccfc97e5 100644 --- a/config/examples/Mks/Sbase/Configuration.h +++ b/config/examples/Mks/Sbase/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Mks/Sbase/Configuration_adv.h b/config/examples/Mks/Sbase/Configuration_adv.h index 63e1a876f2..bcb31934bb 100644 --- a/config/examples/Mks/Sbase/Configuration_adv.h +++ b/config/examples/Mks/Sbase/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -890,6 +903,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1356,12 +1374,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1800,91 +1818,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2110,7 +2128,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2118,7 +2136,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2126,7 +2144,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2134,7 +2152,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2142,7 +2160,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2150,7 +2168,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2158,7 +2176,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2166,7 +2184,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2174,7 +2192,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2182,7 +2200,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2190,7 +2208,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2198,7 +2216,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2206,7 +2224,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt b/config/examples/Mks/Sbase/README.txt similarity index 100% rename from config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt rename to config/examples/Mks/Sbase/README.txt diff --git a/config/examples/Printrbot/PrintrboardG2/Configuration.h b/config/examples/Printrbot/PrintrboardG2/Configuration.h index 4dfeefb576..7e4eaab494 100644 --- a/config/examples/Printrbot/PrintrboardG2/Configuration.h +++ b/config/examples/Printrbot/PrintrboardG2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -102,7 +103,7 @@ * * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ -#define SERIAL_PORT 0 +#define SERIAL_PORT -1 /** * Select a secondary serial port on the board to use for communication with the host. @@ -384,6 +385,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -401,8 +403,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -728,6 +728,11 @@ //#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } #define DEFAULT_MAX_FEEDRATE { 30, 30,30,30 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -737,6 +742,11 @@ //#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } #define DEFAULT_MAX_ACCELERATION { 100, 100, 100, 100 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -745,44 +755,44 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves -//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts -//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves #define DEFAULT_ACCELERATION 100 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 100 // E acceleration for retracts #define DEFAULT_TRAVEL_ACCELERATION 100 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 1.0 #define DEFAULT_YJERK 1.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.004 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1566,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/RapideLite/RL200/Configuration.h b/config/examples/RapideLite/RL200/Configuration.h index 91bddbf06f..4f6f59a639 100644 --- a/config/examples/RapideLite/RL200/Configuration.h +++ b/config/examples/RapideLite/RL200/Configuration.h @@ -72,7 +72,8 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(platon42)" // Who made the changes. -// +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) + /** * *** VENDORS PLEASE READ *** * @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/RapideLite/RL200/Configuration_adv.h b/config/examples/RapideLite/RL200/Configuration_adv.h index 0a13f81e30..0085d516f3 100644 --- a/config/examples/RapideLite/RL200/Configuration_adv.h +++ b/config/examples/RapideLite/RL200/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/RepRapPro/Huxley/Configuration.h b/config/examples/RepRapPro/Huxley/Configuration.h index f250870d23..c018cce3e7 100644 --- a/config/examples/RepRapPro/Huxley/Configuration.h +++ b/config/examples/RepRapPro/Huxley/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(indazoo, Huxley v1)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -765,6 +765,11 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define DEFAULT_MAX_Z_FEEDRATE 3.3 // older Huxley has problem with speeds > 3.3 mm/s on Z axis #define DEFAULT_MAX_FEEDRATE { 200, 200, DEFAULT_MAX_Z_FEEDRATE, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -773,6 +778,11 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 50, 1000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -786,35 +796,38 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1607,10 +1620,10 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/RepRapWorld/Megatronics/Configuration.h b/config/examples/RepRapWorld/Megatronics/Configuration.h index 39561c347b..e9dfd88873 100644 --- a/config/examples/RepRapWorld/Megatronics/Configuration.h +++ b/config/examples/RepRapWorld/Megatronics/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "RepRapWorld.com" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/RigidBot/Configuration.h b/config/examples/RigidBot/Configuration.h index 3a85d9f86d..b663e6e32a 100644 --- a/config/examples/RigidBot/Configuration.h +++ b/config/examples/RigidBot/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, RigidBot)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -386,6 +387,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -403,8 +405,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 // DGlass3D = 5; RigidBot = 1; 3DSv6 = 5 #define TEMP_SENSOR_1 0 @@ -723,6 +723,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -731,6 +736,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 800, 800, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -744,35 +754,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.043 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1556,10 +1569,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/RigidBot/Configuration_adv.h b/config/examples/RigidBot/Configuration_adv.h index 4604dae51f..04209121fa 100644 --- a/config/examples/RigidBot/Configuration_adv.h +++ b/config/examples/RigidBot/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/SCARA/Configuration.h b/config/examples/SCARA/Configuration.h index 64b2191134..1d79a972ba 100644 --- a/config/examples/SCARA/Configuration.h +++ b/config/examples/SCARA/Configuration.h @@ -99,6 +99,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -410,6 +411,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -427,8 +429,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -734,6 +734,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 30, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -742,6 +747,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 300, 300, 20, 1000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -755,35 +765,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 3.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.025 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1567,10 +1580,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/SCARA/Configuration_adv.h b/config/examples/SCARA/Configuration_adv.h index 8db4c49b02..a2a0aa96f2 100644 --- a/config/examples/SCARA/Configuration_adv.h +++ b/config/examples/SCARA/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/STM32/Black_STM32F407VET6/Configuration.h b/config/examples/STM32/Black_STM32F407VET6/Configuration.h index 2f772633df..135fb75d20 100644 --- a/config/examples/STM32/Black_STM32F407VET6/Configuration.h +++ b/config/examples/STM32/Black_STM32F407VET6/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h b/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h index e4cdc12787..3926fd6b2d 100644 --- a/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h +++ b/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/STM32/STM32F103R/Configuration.h b/config/examples/STM32/STM32F103RE/Configuration.h similarity index 97% rename from config/examples/STM32/STM32F103R/Configuration.h rename to config/examples/STM32/STM32F103RE/Configuration.h index f31ac7831b..77d23d8501 100644 --- a/config/examples/STM32/STM32F103R/Configuration.h +++ b/config/examples/STM32/STM32F103RE/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -129,7 +130,7 @@ // Choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_STM32F103R + #define MOTHERBOARD BOARD_STM32F103RE #endif // Name displayed in the LCD "Ready" message and Info menu @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #warning temp_sensor set to 998/999 (fake) #define TEMP_SENSOR_0 999 @@ -727,6 +727,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -735,6 +740,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -748,35 +758,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 13.0 #define DEFAULT_YJERK 13.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.048 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1560,10 +1573,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/STM32/STM32F4/Configuration.h b/config/examples/STM32/STM32F4/Configuration.h index 2c303616f8..f9e69304b0 100644 --- a/config/examples/STM32/STM32F4/Configuration.h +++ b/config/examples/STM32/STM32F4/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/STM32/stm32f103ret6/Configuration.h b/config/examples/STM32/stm32f103ret6/Configuration.h index 16b6cd7020..3ebb230cc4 100644 --- a/config/examples/STM32/stm32f103ret6/Configuration.h +++ b/config/examples/STM32/stm32f103ret6/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -129,7 +130,7 @@ // Choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_STM32F103R + #define MOTHERBOARD BOARD_STM32F103RE #endif // Name displayed in the LCD "Ready" message and Info menu @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #warning temp_sensor set to 998/999 (fake) #define TEMP_SENSOR_0 999 @@ -727,6 +727,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -735,6 +740,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -748,35 +758,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 13.0 #define DEFAULT_YJERK 13.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.048 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1560,10 +1573,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Sanguinololu/Configuration.h b/config/examples/Sanguinololu/Configuration.h index 64b533ad9d..628aa111db 100644 --- a/config/examples/Sanguinololu/Configuration.h +++ b/config/examples/Sanguinololu/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thinkyhead, Sanguinololu)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -756,6 +756,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 8, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -764,6 +769,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -777,35 +787,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1589,10 +1602,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Sanguinololu/Configuration_adv.h b/config/examples/Sanguinololu/Configuration_adv.h index 3124a1ec78..79947eaba7 100644 --- a/config/examples/Sanguinololu/Configuration_adv.h +++ b/config/examples/Sanguinololu/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tevo/Michelangelo/Configuration.h b/config/examples/Tevo/Michelangelo/Configuration.h index 4168fbe0fb..81b8d3401f 100644 --- a/config/examples/Tevo/Michelangelo/Configuration.h +++ b/config/examples/Tevo/Michelangelo/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Tevo Michelangelo)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 60, 55 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 10000, 10000, 400, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 5000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tevo/Michelangelo/Configuration_adv.h b/config/examples/Tevo/Michelangelo/Configuration_adv.h index 6f14749ccf..93d0c2c0fa 100644 --- a/config/examples/Tevo/Michelangelo/Configuration_adv.h +++ b/config/examples/Tevo/Michelangelo/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tevo/Tarantula Pro/Configuration.h b/config/examples/Tevo/Tarantula Pro/Configuration.h index c9876e9377..4d53d8b865 100644 --- a/config/examples/Tevo/Tarantula Pro/Configuration.h +++ b/config/examples/Tevo/Tarantula Pro/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Tevo Tarantula Pro)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 50, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1556,10 +1569,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tevo/Tarantula Pro/Configuration_adv.h b/config/examples/Tevo/Tarantula Pro/Configuration_adv.h index e0ed161591..e0df0217de 100644 --- a/config/examples/Tevo/Tarantula Pro/Configuration_adv.h +++ b/config/examples/Tevo/Tarantula Pro/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,16 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle + // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -885,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1351,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1795,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2105,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2113,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2121,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2129,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2137,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2145,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2153,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2161,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2169,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2177,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2185,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2193,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2201,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration.h b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration.h index 2ae9e405c9..104cfa0d62 100644 --- a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration.h +++ b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Tevo Tornado V1)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -751,28 +751,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.4 @@ -780,6 +767,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.026 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1561,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h index 9337d9e8be..f6c324be2a 100644 --- a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h +++ b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration.h b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration.h index 37401fdfdc..c38dcf0516 100644 --- a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration.h +++ b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Tevo Tornado V2)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -751,28 +751,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.4 @@ -780,6 +767,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.026 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1561,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h index 9337d9e8be..f6c324be2a 100644 --- a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h +++ b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/TheBorg/Configuration.h b/config/examples/TheBorg/Configuration.h index 4286c6f8a4..a9cfc7f625 100644 --- a/config/examples/TheBorg/Configuration.h +++ b/config/examples/TheBorg/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Spawn32, The_Borg)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/TheBorg/Configuration_adv.h b/config/examples/TheBorg/Configuration_adv.h index 38b0eac834..d0fbc165d3 100644 --- a/config/examples/TheBorg/Configuration_adv.h +++ b/config/examples/TheBorg/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/TinyBoy2/Configuration.h b/config/examples/TinyBoy2/Configuration.h index 78f5b78be6..cfa19bc6bd 100644 --- a/config/examples/TinyBoy2/Configuration.h +++ b/config/examples/TinyBoy2/Configuration.h @@ -88,6 +88,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(StefanB, TinyBoy2)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -405,6 +406,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -422,8 +424,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -776,6 +776,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 7, 35 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -784,6 +789,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -797,35 +807,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1614,10 +1627,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/TinyBoy2/Configuration_adv.h b/config/examples/TinyBoy2/Configuration_adv.h index ca6ebd41fb..1cedcd8fc9 100644 --- a/config/examples/TinyBoy2/Configuration_adv.h +++ b/config/examples/TinyBoy2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tronxy/X1/Configuration.h b/config/examples/Tronxy/X1/Configuration.h index 5f3a4ce823..e9902c8517 100644 --- a/config/examples/Tronxy/X1/Configuration.h +++ b/config/examples/Tronxy/X1/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Claus Naeveke, 0.1)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 11 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 400, 400, 40, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 20.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.053 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tronxy/X3A/Configuration.h b/config/examples/Tronxy/X3A/Configuration.h index 75b1551113..95c1e1fcc2 100644 --- a/config/examples/Tronxy/X3A/Configuration.h +++ b/config/examples/Tronxy/X3A/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Schullebernd, Tronxy X3A)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 6 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1500, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 15.0 #define DEFAULT_YJERK 15.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.09 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1562,10 +1575,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tronxy/X3A/Configuration_adv.h b/config/examples/Tronxy/X3A/Configuration_adv.h index 54de647600..18f515568e 100644 --- a/config/examples/Tronxy/X3A/Configuration_adv.h +++ b/config/examples/Tronxy/X3A/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tronxy/X5S-2E/Configuration.h b/config/examples/Tronxy/X5S-2E/Configuration.h index ce81d16bd1..ff0ad44962 100644 --- a/config/examples/Tronxy/X5S-2E/Configuration.h +++ b/config/examples/Tronxy/X5S-2E/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Anthony Rich, OEM stock config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -385,6 +386,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -402,8 +404,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -746,6 +746,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -754,6 +759,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 1000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -767,35 +777,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 20.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.16 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1579,10 +1592,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tronxy/X5S-2E/Configuration_adv.h b/config/examples/Tronxy/X5S-2E/Configuration_adv.h index a0510df92d..b4212d96a6 100644 --- a/config/examples/Tronxy/X5S-2E/Configuration_adv.h +++ b/config/examples/Tronxy/X5S-2E/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Tronxy/X5S/Configuration.h b/config/examples/Tronxy/X5S/Configuration.h index 0f468a7b4d..5ab4e8d928 100644 --- a/config/examples/Tronxy/X5S/Configuration.h +++ b/config/examples/Tronxy/X5S/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 150 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1000, 1000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 18.0 #define DEFAULT_YJERK 18.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.13 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Tronxy/XY100/Configuration.h b/config/examples/Tronxy/XY100/Configuration.h index 6152d48284..41373c1a3f 100644 --- a/config/examples/Tronxy/XY100/Configuration.h +++ b/config/examples/Tronxy/XY100/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Rob Griffiths, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -736,6 +736,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -744,6 +749,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 1000, 5000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -757,35 +767,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 20.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.16 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1569,10 +1582,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/UltiMachine/Archim1/Configuration.h b/config/examples/UltiMachine/Archim1/Configuration.h index 26b09c64bb..42a00c4bde 100644 --- a/config/examples/UltiMachine/Archim1/Configuration.h +++ b/config/examples/UltiMachine/Archim1/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/UltiMachine/Archim1/Configuration_adv.h b/config/examples/UltiMachine/Archim1/Configuration_adv.h index 0d8f0a74dd..77cbf11fb0 100644 --- a/config/examples/UltiMachine/Archim1/Configuration_adv.h +++ b/config/examples/UltiMachine/Archim1/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/UltiMachine/Archim2/Configuration.h b/config/examples/UltiMachine/Archim2/Configuration.h index a6baaec3d6..11f5b0686a 100644 --- a/config/examples/UltiMachine/Archim2/Configuration.h +++ b/config/examples/UltiMachine/Archim2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/UltiMachine/Archim2/Configuration_adv.h b/config/examples/UltiMachine/Archim2/Configuration_adv.h index b9aa479139..ea462c2b04 100644 --- a/config/examples/UltiMachine/Archim2/Configuration_adv.h +++ b/config/examples/UltiMachine/Archim2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/VORONDesign/Configuration.h b/config/examples/VORONDesign/Configuration.h index 96abead889..85b2110c8d 100644 --- a/config/examples/VORONDesign/Configuration.h +++ b/config/examples/VORONDesign/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 5 @@ -734,6 +734,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 75, 75 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -742,6 +747,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 , 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -755,35 +765,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 15.0 #define DEFAULT_ZJERK 0.4 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.03 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1567,10 +1580,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/VORONDesign/Configuration_adv.h b/config/examples/VORONDesign/Configuration_adv.h index 112f85030e..d7e393245d 100644 --- a/config/examples/VORONDesign/Configuration_adv.h +++ b/config/examples/VORONDesign/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Velleman/K8200/Configuration.h b/config/examples/Velleman/K8200/Configuration.h index 4537da2122..f02c806b71 100644 --- a/config/examples/Velleman/K8200/Configuration.h +++ b/config/examples/Velleman/K8200/Configuration.h @@ -88,6 +88,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(K8200, @CONSULitAS)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -403,6 +404,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -420,8 +422,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -754,6 +754,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -762,6 +767,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -775,35 +785,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.04 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1591,10 +1604,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Velleman/K8200/Configuration_adv.h b/config/examples/Velleman/K8200/Configuration_adv.h index b8f87d7066..d440cef09f 100644 --- a/config/examples/Velleman/K8200/Configuration_adv.h +++ b/config/examples/Velleman/K8200/Configuration_adv.h @@ -392,6 +392,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -615,20 +616,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -902,6 +915,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1368,12 +1386,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1812,91 +1830,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2122,7 +2140,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2130,7 +2148,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2138,7 +2156,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2146,7 +2164,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2154,7 +2172,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2162,7 +2180,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2170,7 +2188,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2178,7 +2196,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2186,7 +2204,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2194,7 +2212,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2202,7 +2220,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2210,7 +2228,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2218,7 +2236,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Velleman/K8400/Dual-head/Configuration.h b/config/examples/Velleman/K8400/Dual-head/Configuration.h index 6b0ffb7998..a18f843c24 100644 --- a/config/examples/Velleman/K8400/Dual-head/Configuration.h +++ b/config/examples/Velleman/K8400/Dual-head/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Anthony Birkett, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 5 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.007 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Velleman/K8400/Configuration_adv.h b/config/examples/Velleman/K8400/Dual-head/Configuration_adv.h similarity index 98% rename from config/examples/Velleman/K8400/Configuration_adv.h rename to config/examples/Velleman/K8400/Dual-head/Configuration_adv.h index 13ad305e88..82b0a8d4e8 100644 --- a/config/examples/Velleman/K8400/Configuration_adv.h +++ b/config/examples/Velleman/K8400/Dual-head/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Velleman/K8400/README.md b/config/examples/Velleman/K8400/Dual-head/README.md similarity index 100% rename from config/examples/Velleman/K8400/README.md rename to config/examples/Velleman/K8400/Dual-head/README.md diff --git a/config/examples/Velleman/K8400/Configuration.h b/config/examples/Velleman/K8400/Single-head/Configuration.h similarity index 97% rename from config/examples/Velleman/K8400/Configuration.h rename to config/examples/Velleman/K8400/Single-head/Configuration.h index 7a16004c50..0ee10ba035 100644 --- a/config/examples/Velleman/K8400/Configuration.h +++ b/config/examples/Velleman/K8400/Single-head/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Anthony Birkett, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.5 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 20.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.007 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Velleman/K8400/Single-head/Configuration_adv.h b/config/examples/Velleman/K8400/Single-head/Configuration_adv.h new file mode 100644 index 0000000000..82b0a8d4e8 --- /dev/null +++ b/config/examples/Velleman/K8400/Single-head/Configuration_adv.h @@ -0,0 +1,2784 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value +#endif + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +/** + * Heated Chamber settings + */ +#if TEMP_SENSOR_CHAMBER + #define CHAMBER_MINTEMP 5 + #define CHAMBER_MAXTEMP 60 + #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + //#define CHAMBER_LIMIT_SWITCHING + //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + //#define HEATER_CHAMBER_INVERTING false +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 1000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 1 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds + #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // Add an experimental additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information with 'M114 D' +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/m) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN 2 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed + //#define CONTROLLERFAN_SPEED_Z_ONLY 127 // Reduce noise on machines that keep Z enabled +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * FAST PWM FAN Settings + * + * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a + * frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY [undefined by default] + * Set this to your desired frequency. + * If left undefined this defaults to F = F_CPU/(2*255*1) + * ie F = 31.4 Khz on 16 MHz microcontrollers or F = 39.2 KHz on 20 MHz microcontrollers + * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 + //#define USE_OCR2A_AS_TOP +#endif + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm + //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 0 + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage + #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage + #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 10 +#define Y_HOME_BUMP_MM 10 +#define Z_HOME_BUMP_MM 3 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially +//#define HOMING_BACKOFF_MM { 2, 2, 2 } // (mm) Move away from the endstops after homing + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then + * check the wiring of the BROWN, RED and ORANGE wires. + * + * Note: If the trigger signal of your probe is not being recognized, it has been very often + * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + //#define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! + * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. + * If disabled, OD mode is the hard-coded default on 3.0 + * On startup, Marlin will compare its eeprom to this vale. If the selected mode + * differs, a mode set eeprom write will be completed at initialization. + * Use the option below to force an eeprom write to a V3.1 probe regardless. + */ + //#define BLTOUCH_SET_5V_MODE + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Use "HIGH SPEED" mode for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function + * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + */ + //#define BLTOUCH_HS_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + +#endif // BLTOUCH + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + // Define probe X and Y positions for Z1, Z2 [, Z3] + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + + // Set number of iterations to align + #define Z_STEPPER_ALIGN_ITERATIONS 3 + + // Enable to restore leveling setup after operation + #define RESTORE_LEVELING_AFTER_G34 + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle + + // Stop criterion. If the accuracy is better than this stop iterating early + #define Z_STEPPER_ALIGN_ACC 0.02 +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // Set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// Minimum time that a segment needs to take if the buffer is emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (ms) + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // increments while checking for the contact to be broken. + #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) + #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/m) + #endif + #endif +#endif + +/** + * Automatic backlash, position and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#define CALIBRATION_GCODE +#if ENABLED(CALIBRATION_GCODE) + + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm + + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/m + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/m + + // The following parameters refer to the conical section of the nozzle tip. + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + // Probing at the exact top center only works if the center is flat. If + // probing on a screwhead or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define pin which is read during calibration + #ifndef CALIBRATION_PIN + #define CALIBRATION_PIN -1 // Override in pins.h or set to -1 to use your Z endstop + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if EITHER(ULTIPANEL, EXTENSIBLE_UI) + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) + #if ENABLED(ULTIPANEL) + #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +#if HAS_LCD_MENU + + // Include a page of printer information in the LCD Main Menu + //#define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + //#define LED_CONTROL_MENU + #if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif + #endif + +#endif // HAS_LCD_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + +#if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the Z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + #define EVENT_GCODE_SD_STOP "G28XY" // G-code to run on Stop Print (e.g., "G28XY" or "G27") + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate + //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + // Leave the heaters on after Stop Print (not recommended!) + //#define SD_ABORT_NO_COOLDOWN + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS3_USB + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + #if HAS_SDCARD_CONNECTION + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + //#define SDCARD_CONNECTION LCD + #endif + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_GRAPHICAL_LCD + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if ENABLED(U8GLIB_ST7920) + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customizations + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_GRAPHICAL_LCD + +// +// Lulzbot Touch UI +// +#if ENABLED(LULZBOT_TOUCH_UI) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping + //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping + //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping + //#define OTHER_PIN_LAYOUT // Define pins manually below + #if ENABLED(OTHER_PIN_LAYOUT) + // The pins for CS and MOD_RESET (PD) must be chosen. + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // UTF8 processing and rendering. + // Unsupported characters are shown as '?'. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + // Western accents support. These accented characters use + // combined bitmaps and require relatively little storage. + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + // Additional character groups. These characters require + // full bitmaps and take up considerable storage: + //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ + //#define TOUCH_UI_UTF8_COPYRIGHT // © ® + //#define TOUCH_UI_UTF8_GERMANIC // ß + //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ + //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ + //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ + //#define TOUCH_UI_UTF8_ORDINALS // º ª + //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ + //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ + //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ + #endif + #endif + + // Use a smaller font when labels don't fit buttons + #define TOUCH_UI_FIT_TEXT + + // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE) + //#define LCD_LANGUAGE_1 en + //#define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE + + // Output extra debug info for Touch UI events + //#define TOUCH_UI_DEBUG +#endif + +// +// FSMC Graphical TFT +// +#if ENABLED(FSMC_GRAPHICAL_TFT) + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Override MIN_PROBE_EDGE for each side of the build plate + * Useful to get probe points to exact positions on targets or + * to allow leveling to avoid plate clamps on only specific + * sides of the bed. + * + * If you are replacing the prior *_PROBE_BED_POSITION options, + * LEFT and FRONT values in most cases will map directly over + * RIGHT and REAR would be the inverse such as + * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) + * + * This will allow all positions to match at compilation, however + * should the probe position be modified with M851XY then the + * probe points will follow. This prevents any change from causing + * the probe to be unable to reach any points. + */ +#if PROBE_SELECTED && !IS_KINEMATIC + //#define MIN_PROBE_EDGE_LEFT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_RIGHT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_FRONT MIN_PROBE_EDGE + //#define MIN_PROBE_EDGE_BACK MIN_PROBE_EDGE +#endif + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 200000 : Maximum for LV8729 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 26 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +// Add M575 G-code to change the baud rate +//#define BAUD_RATE_GCODE + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// This option inserts short delays between lines of serial output. +#define SERIAL_OVERRUN_PROTECTION + +// @section extras + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if EXTRUDERS > 1 + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_NO_RETURN // Never return to the previous position on tool-change + + // Retract and prime filament on tool-change + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + #define TOOLCHANGE_FIL_SWAP_LENGTH 12 // (mm) + #define TOOLCHANGE_FIL_EXTRA_PRIME 2 // (mm) + #define TOOLCHANGE_FIL_SWAP_RETRACT_SPEED 3600 // (mm/m) + #define TOOLCHANGE_FIL_SWAP_PRIME_SPEED 3600 // (mm/m) + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#define TOOLCHANGE_PARK + #if ENABLED(TOOLCHANGE_PARK) + #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/m) + #endif +#endif + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 5 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 600 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 100 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #if AXIS_DRIVER_TYPE_X(TMC26X) + #define X_MAX_CURRENT 1000 // (mA) + #define X_SENSE_RESISTOR 91 // (mOhms) + #define X_MICROSTEPS 16 // Number of microsteps + #endif + + #if AXIS_DRIVER_TYPE_X2(TMC26X) + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC26X) + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC26X) + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC26X) + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC26X) + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E2(TMC26X) + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E3(TMC26X) + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E4(TMC26X) + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E5(TMC26X) + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode + * connect your SPI pins to the hardware SPI interface on your board and define + * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 + * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN + * to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without + * a resistor. + * The drivers can also be used with hardware serial. + * + * TMCStepper library is required to use TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + */ +#if HAS_TRINAMIC + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #if AXIS_IS_TMC(X) + #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... + #endif + + #if AXIS_IS_TMC(X2) + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + #define X2_RSENSE 0.11 + #define X2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y) + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y2) + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + #define Y2_RSENSE 0.11 + #define Y2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z) + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z2) + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + #define Z2_RSENSE 0.11 + #define Z2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z3) + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define Z3_RSENSE 0.11 + #define Z3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E0) + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E1) + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + #define E1_RSENSE 0.11 + #define E1_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E2) + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + #define E2_RSENSE 0.11 + #define E2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E3) + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + #define E3_RSENSE 0.11 + #define E3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E4) + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + #define E4_RSENSE 0.11 + #define E4_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E5) + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + #define E5_RSENSE 0.11 + #define E5_CHAIN_POS -1 + #endif + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + #define X_SLAVE_ADDRESS 0 + #define Y_SLAVE_ADDRESS 0 + #define Z_SLAVE_ADDRESS 0 + #define X2_SLAVE_ADDRESS 0 + #define Y2_SLAVE_ADDRESS 0 + #define Z2_SLAVE_ADDRESS 0 + #define Z3_SLAVE_ADDRESS 0 + #define E0_SLAVE_ADDRESS 0 + #define E1_SLAVE_ADDRESS 0 + #define E2_SLAVE_ADDRESS 0 + #define E3_SLAVE_ADDRESS 0 + #define E4_SLAVE_ADDRESS 0 + #define E5_SLAVE_ADDRESS 0 + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_E + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * CHOPPER_DEFAULT_19V + * CHOPPER_DEFAULT_24V + * CHOPPER_DEFAULT_36V + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define you own with + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V + + /** + * Monitor Trinamic drivers for error conditions, + * like overtemperature and short to ground. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + + /** + * Use StallGuard2 to home / probe X, Y, Z. + * + * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only + * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set [XYZ]_HOME_BUMP_MM to 0. + * + * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when + * homing and adds a guard period for endstop triggering. + */ + //#define SENSORLESS_HOMING // StallGuard capable drivers only + + /** + * Use StallGuard2 to probe the bed with the nozzle. + * + * CAUTION: This could cause damage to machines that use a lead screw or threaded rod + * to move the Z axis. Take extreme care when attempting to enable this feature. + */ + //#define SENSORLESS_PROBING // StallGuard capable drivers only + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 8 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 8 + //#define Z_STALL_SENSITIVITY 8 + //#define SPI_ENDSTOPS // TMC2130 only + //#define IMPROVE_HOMING_RELIABILITY + #endif + + /** + * Beta feature! + * Create a 50/50 square wave step pulse optimal for stepper drivers. + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * Arduino-L6470 library (0.7.0 or higher) is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + * + * Requires the following to be defined in your pins_YOUR_BOARD file + * L6470_CHAIN_SCK_PIN + * L6470_CHAIN_MISO_PIN + * L6470_CHAIN_MOSI_PIN + * L6470_CHAIN_SS_PIN + * L6470_RESET_CHAIN_PIN (optional) + */ +#if HAS_DRIVER(L6470) + + //#define L6470_CHITCHAT // Display additional status info + + #if AXIS_DRIVER_TYPE_X(L6470) + #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) + #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) + #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) + #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) + #endif + + #if AXIS_DRIVER_TYPE_X2(L6470) + #define X2_MICROSTEPS 128 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Y(L6470) + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Y2(L6470) + #define Y2_MICROSTEPS 128 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z(L6470) + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z2(L6470) + #define Z2_MICROSTEPS 128 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_Z3(L6470) + #define Z3_MICROSTEPS 128 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E0(L6470) + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E1(L6470) + #define E1_MICROSTEPS 128 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E2(L6470) + #define E2_MICROSTEPS 128 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E3(L6470) + #define E3_MICROSTEPS 128 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E4(L6470) + #define E4_MICROSTEPS 128 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #endif + + #if AXIS_DRIVER_TYPE_E5(L6470) + #define E5_MICROSTEPS 128 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #endif + + /** + * Monitor L6470 drivers for error conditions like over temperature and over current. + * In the case of over temperature Marlin can decrease the drive until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. + * I not present or I0 or I1 - X, Y, Z or E0 + * I2 - X2, Y2, Z2 or E1 + * I3 - Z3 or E3 + * I4 - E4 + * I5 - E5 + * M916 - Increase drive level until get thermal warning + * M917 - Find minimum current thresholds + * M918 - Increase speed until max or error + * M122 S0/1 - Report driver parameters + */ + //#define MONITOR_L6470_DRIVER_STATUS + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + #define KVAL_HOLD_STEP_DOWN 1 + //#define L6470_STOP_ON_ERROR + #endif + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) + + // Canon RC-1 or homebrew digital camera trigger + // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) +#endif + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define SPINDLE_LASER_ACTIVE_HIGH false // Set to "true" if the on/off function is active HIGH + #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // Set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + #else + #define SPEED_POWER_SLOPE 0.3922 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 10 + #define SPEED_POWER_MAX 100 // 0-100% + #endif +#endif + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. + +// Enable and set a (default) feedrate for all G0 moves +//#define G0_FEEDRATE 3000 // (mm/m) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define CUSTOM_USER_MENU_TITLE "Custom Commands" + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +//#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + //#define HOST_PROMPT_SUPPORT +#endif + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + // Use M119 to find reasonable values after connecting your hardware: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behavior is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" + //#define WEBSUPPORT // Start a webserver with auto-discovery + //#define OTASUPPORT // Support over-the-air firmware updates +#endif + +/** + * Prusa Multi-Material Unit v2 + * Enable in Configuration.h + */ +#if ENABLED(PRUSA_MMU2) + + // Serial port used for communication with MMU2. + // For AVR enable the UART port used for the MMU. (e.g., internalSerial) + // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) + #define INTERNAL_SERIAL_PORT 2 + #define MMU2_SERIAL internalSerial + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + #if ENABLED(MMU2_MENUS) + // Settings for filament load / unload from the LCD menu. + // This is for Prusa MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 562 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // PRUSA_MMU2 + +/** + * Advanced Print Counter settings + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE diff --git a/config/examples/Velleman/K8400/Single-head/README.md b/config/examples/Velleman/K8400/Single-head/README.md new file mode 100644 index 0000000000..1ebdd16ef2 --- /dev/null +++ b/config/examples/Velleman/K8400/Single-head/README.md @@ -0,0 +1,15 @@ +# Configuration for Velleman K8400 Vertex +http://www.k8400.eu/ + +Configuration files for the K8400, ported upstream from the official Velleman firmware. +Like its predecessor, (K8200), the K8400 is a 3Drag clone. There are some minor differences, documented in pins_K8400.h. + +Single and dual head configurations provided. Copy the correct Configuration.h and Configuration_adv.h to the /src/config directory. + +**NOTE: This configuration includes the community sourced feed rate fix. Use 100% feed rate in Repetier!** + +For implementation and updated K8400 firmware, see https://github.com/birkett/Velleman-K8400-Firmware + +### Original Sources +Credit to Velleman for the original 1.0.x based code:
+http://www.vertex3dprinter.eu/downloads/files/vertex/firmware/vertex-m1-v1.4-h2.zip diff --git a/config/examples/WASP/PowerWASP/Configuration.h b/config/examples/WASP/PowerWASP/Configuration.h index 8e1e3ba1fb..a27c67871f 100644 --- a/config/examples/WASP/PowerWASP/Configuration.h +++ b/config/examples/WASP/PowerWASP/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Julian + Jason)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -402,6 +403,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -419,8 +421,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 0 @@ -744,6 +744,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 150, 150, 15, 20 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -752,6 +757,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 10000, 10000, 50, 500 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -765,35 +775,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 15.0 #define DEFAULT_YJERK 15.0 #define DEFAULT_ZJERK 0.5 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 1.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.023 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1577,10 +1590,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/WASP/PowerWASP/Configuration_adv.h b/config/examples/WASP/PowerWASP/Configuration_adv.h index ddc59ae65e..fb104f367b 100644 --- a/config/examples/WASP/PowerWASP/Configuration_adv.h +++ b/config/examples/WASP/PowerWASP/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Wanhao/Duplicator 6/Configuration.h b/config/examples/Wanhao/Duplicator 6/Configuration.h index 9bf46181bb..5af65f167d 100644 --- a/config/examples/Wanhao/Duplicator 6/Configuration.h +++ b/config/examples/Wanhao/Duplicator 6/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Rob Mendon, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 20 #define TEMP_SENSOR_1 0 @@ -735,6 +735,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -743,6 +748,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 500 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -756,35 +766,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 1.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.027 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1568,10 +1581,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Wanhao/Duplicator 6/Configuration_adv.h b/config/examples/Wanhao/Duplicator 6/Configuration_adv.h index 9ed77b96c7..4bf273df93 100644 --- a/config/examples/Wanhao/Duplicator 6/Configuration_adv.h +++ b/config/examples/Wanhao/Duplicator 6/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm #define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/Wanhao/Duplicator i3 2.1/Chippy_Bootscreen.h b/config/examples/Wanhao/Duplicator i3 2.1/Chippy_Bootscreen.h new file mode 100644 index 0000000000..1407c6f173 --- /dev/null +++ b/config/examples/Wanhao/Duplicator i3 2.1/Chippy_Bootscreen.h @@ -0,0 +1,74 @@ +/** + * Made with Marlin Bitmap Converter + * http://marlinfw.org/tools/u8glib/converter.html + * + * This bitmap from 128x64 pasted image + */ +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B00000000,B00000000,B00000000,B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000,B00001111,B00000000,B00000001,B00000000,B00000000,B00001111,B00000000,B00000000, + B00000000,B00000001,B11111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00001000,B10000000,B10000001,B00000000,B00000000,B00001000,B10000000,B00000000, + B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11000000,B00000000,B00001000,B10111101,B11000001,B00111100,B00011110,B00001000,B10111101,B00100000, + B00000000,B00000011,B00000000,B00000000,B00000011,B11111100,B01000000,B00000000,B00001111,B00100100,B10000001,B00100100,B00000010,B00001111,B00100101,B00100000, + B00000000,B00000011,B00000000,B00000000,B00000000,B00000100,B01111000,B00000000,B00001000,B10100100,B10011101,B00100101,B11011110,B11101000,B10100100,B11000000, + B00000000,B00000011,B00000000,B00000000,B00000000,B00000100,B00001000,B00000000,B00001000,B10100100,B10000001,B00100100,B00010010,B00001000,B10100101,B00100000, + B00000000,B00000011,B00111111,B11111111,B00000000,B00000100,B00001000,B00000000,B00001111,B00111100,B11000001,B00100100,B00011110,B00001111,B00111101,B00100000, + B00000000,B00000011,B00111111,B11111111,B11111111,B10000100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110000,B00000111,B11111111,B11000100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110000,B00000000,B00000000,B11000100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110011,B11000000,B00000000,B11000100,B00001000,B10000000,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110011,B11000000,B00000000,B11000100,B00001001,B10000000,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110011,B11000000,B00000000,B11000100,B00001011,B10000000,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00110011,B11000001,B11111100,B11000100,B00001011,B10000000,B11100011,B11000010,B00000000,B00000000,B00000010,B00000000,B00000000,B00100000, + B00000000,B00000011,B00110011,B11000001,B11111100,B11000100,B00001011,B11100011,B11100010,B00000010,B00000000,B00000000,B00100000,B00000000,B00000000,B00100000, + B00000000,B00000011,B00110011,B11000001,B11111100,B11000100,B00001011,B11100011,B11100010,B00001110,B01001000,B11101111,B01110100,B11110011,B11001111,B00100000, + B00000000,B00000011,B00110011,B11000000,B00000000,B11000100,B00001001,B11111111,B11000011,B11010010,B01001001,B00000001,B00100100,B10010010,B01000001,B00100000, + B00000000,B00000011,B00110000,B00000000,B00000000,B11000100,B00001000,B11111111,B10000010,B00010010,B01001001,B00001111,B00100100,B10010010,B01001111,B00100000, + B00000111,B11111111,B00110000,B00000000,B00000000,B11000100,B00001000,B01111111,B00000010,B00010010,B01001001,B00001001,B00100100,B10010010,B01001001,B00100000, + B00001111,B11111111,B00110000,B00000000,B00000000,B11000100,B00001000,B00111100,B00000011,B11001110,B01111000,B11101111,B00110100,B11110010,B01001111,B00100000, + B00001111,B11111111,B00110000,B00000000,B00000000,B11000100,B00001000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00001111,B10000111,B00110001,B11000000,B00011100,B11000100,B01111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B00000111,B00110001,B11100000,B00111100,B11000100,B01111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00011111,B10000011,B00110000,B11111111,B11111000,B11000100,B01111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00111111,B11000011,B00110000,B00111111,B11100000,B11001100,B01111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111111,B11100011,B00111111,B11000000,B00000000,B11001100,B01111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B11111000,B11110011,B00011111,B11111111,B00000000,B11001100,B00001000,B00000000,B00000000,B00000111,B00000000,B01000000,B00000000,B01000000,B00000000,B00000000, + B11111000,B01110011,B00000000,B11111111,B11111111,B11001100,B00001000,B00000000,B00000000,B00000100,B10000000,B01000000,B00000100,B00000000,B00000000,B00000000, + B11110000,B01110011,B00000000,B00000001,B11111111,B10001100,B00001000,B00000000,B00000000,B00000100,B10011110,B01110001,B11101110,B10001101,B11000000,B00000000, + B01110000,B01100011,B00000000,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000111,B00010010,B01001001,B00100100,B10010001,B00000000,B00000000, + B00100000,B01000011,B00000000,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000100,B10010010,B01001001,B00100100,B10010000,B11000000,B00000000, + B00000000,B00000011,B00011111,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000100,B10010010,B01001001,B00100100,B10010000,B01000000,B00000000, + B00000000,B00000011,B00010001,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000100,B10011110,B01110001,B11100110,B10001101,B11000000,B00000000, + B00000000,B00000011,B00010001,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00010001,B00000111,B00000000,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00011111,B00000111,B11111000,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00000000,B00000000,B01111111,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00000000,B00000000,B00000111,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B00000000,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B11110000,B00000000,B00000000,B00001100,B00001000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000001,B11111111,B10000000,B00000000,B00001100,B00010000,B00100000,B00000000,B00100000,B00000000,B10000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000001,B11111111,B11111000,B00000000,B00001100,B01100000,B00100000,B00000010,B00000000,B00000000,B10000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000001,B11111111,B11111111,B11000000,B00001100,B11100000,B00111000,B11110111,B01001111,B00111100,B11100011,B11010010,B00000111,B01111000,B00000000, + B00000000,B00000001,B11111111,B11111111,B11111110,B00001101,B11100000,B00100100,B10010010,B01001001,B00000100,B10010010,B01010010,B00001000,B00001000,B00000000, + B00000000,B00000001,B11111111,B11111111,B11111111,B11111111,B11100000,B00100100,B10010010,B01001001,B00111100,B10010010,B01001100,B00001000,B01111000,B00000000, + B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11100000,B00100100,B10010010,B01001001,B00100100,B10010010,B01010010,B00001000,B01001000,B00000000, + B00000000,B00000000,B00001111,B11111111,B11111111,B11111111,B11100000,B00111000,B11110011,B01001001,B00111100,B11100011,B11010010,B01000111,B01111000,B00000000, + B00000000,B00000000,B00000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B00000001,B10110110,B11011011,B01101101,B10110110,B11011011,B01101101,B10110110,B11011011,B00000000, + B00000000,B00000000,B00000000,B00000000,B00001111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B00100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100 +}; diff --git a/config/examples/Wanhao/Duplicator i3 2.1/Configuration.h b/config/examples/Wanhao/Duplicator i3 2.1/Configuration.h new file mode 100644 index 0000000000..363020cafb --- /dev/null +++ b/config/examples/Wanhao/Duplicator i3 2.1/Configuration.h @@ -0,0 +1,2227 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// Author info of this build printed to the host during boot and M115 +#define STRING_CONFIG_H_AUTHOR "(Matthew Piercey, Bot-In-a-Box Educational Robotics)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE2 "https://botinabox.ca" + +// Show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// Choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI +#endif + +// Name displayed in the LCD "Ready" message and Info menu +#define CUSTOM_MACHINE_NAME "Wanhao i3" + +// Printer's unique ID, used by some programs to differentiate between machines. +// Choose your own or use a service like http://www.uuidgenerator.net/version4 +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5, 6] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +/** + * Prusa Multi-Material Unit v2 + * + * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. + * Requires EXTRUDERS = 5 + * + * For additional configuration see Configuration_adv.h + */ +//#define PRUSA_MMU2 + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo) +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism using movements and no solenoid + * + * project : https://www.thingiverse.com/thing:3080893 + * movements : https://youtu.be/0xCEiG9VS3k + * https://youtu.be/Bqbcs0CU2FE + */ +//#define MAGNETIC_PARKING_EXTRUDER + +#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #if ENABLED(PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined. + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + + #define MPE_FAST_SPEED 9000 // (mm/m) Speed for travel before last distance point + #define MPE_SLOW_SPEED 4500 // (mm/m) Speed for last distance travel to park and couple + #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point + #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling + + #endif + +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD + +/** + * Magnetic Switching Toolhead + * + * Support swappable and dockable toolheads with a magnetic + * docking mechanism using movement and no servo. + */ +//#define MAGNETIC_SWITCHING_TOOLHEAD + +/** + * Electromagnetic Switching Toolhead + * + * Parking for CoreXY / HBot kinematics. + * Toolheads are parked at one edge and held with an electromagnet. + * Supports more than 2 Toolheads. See https://youtu.be/JolbsAKTKf4 + */ +//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD + +#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1) + //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock + #if ENABLED(PRIME_BEFORE_REMOVE) + #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length + #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length + #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/m) Extruder prime feedrate + #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/m) Extruder retract feedrate + #endif + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching + #endif +#endif + +/** + * "Mixing Extruder" + * - Adds G-codes M163 and M164 to set and "commit" the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools. + * - This implementation supports up to two mixing extruders. + * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation). + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands + //#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD + #if ENABLED(GRADIENT_MIX) + //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias + #endif +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Power Supply Control + * + * Enable and connect the power supply to the PS_ON_PIN. + * Specify whether the power supply is active HIGH or active LOW. + */ +//#define PSU_CONTROL +//#define PSU_NAME "Power Supply" + +#if ENABLED(PSU_CONTROL) + #define PSU_ACTIVE_HIGH false // Set 'false' for ATX (1), 'true' for X-Box (2) + + //#define PS_DEFAULT_OFF // Keep power off until enabled directly with M80 + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define AUTO_POWER_CHAMBER_FAN + //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU over this temperature + //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU over this temperature + #define POWER_TIMEOUT 30 + #endif +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 331 : (3.3V scaled thermistor 1 table) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 + * 20 : Pt100 with circuit in the Ultimainboard V2.x + * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 67 : 450C thermistor from SliceEngineering + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * 1000 : Custom - Specify parameters in Configuration_adv.h + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + */ +#define TEMP_SENSOR_0 99 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 +#define TEMP_SENSOR_BED 99 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 +#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 +#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +// Below this temperature the heater will be switched off +// because it probably indicates a broken thermistor wire. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 +#define BED_MINTEMP 5 + +// Above this temperature the heater will be switched off. +// This can protect components from overheating, but NOT from shorts and failures. +// (Use MINTEMP for thermistor short/failure protection.) +#define HEATER_0_MAXTEMP 260 +#define HEATER_1_MAXTEMP 260 +#define HEATER_2_MAXTEMP 260 +#define HEATER_3_MAXTEMP 260 +#define HEATER_4_MAXTEMP 260 +#define HEATER_5_MAXTEMP 260 +#define BED_MAXTEMP 100 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM) + //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // Wanhao Duplicator i3 + #define DEFAULT_Kp 29 + #define DEFAULT_Ki 2.00 + #define DEFAULT_Kd 97 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//====================== PID > Bed Temperature Control ====================== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + //#define MIN_BED_POWER 0 + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + // Wanhao Duplicator i3 + #define DEFAULT_bedKp 249.52 + #define DEFAULT_bedKi 47.89 + #define DEFAULT_bedKd 325.03 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed +#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, + * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Threshold + * + * Enable if your probe or endstops falsely trigger due to noise. + * + * - Higher values may affect repeatability or accuracy of some bed probes. + * - To fix noise install a 100nF ceramic capacitor inline with the switch. + * - This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, which already have the 100nF capacitor. + * + * :[2,3,4,5,6,7] + */ +//#define ENDSTOP_NOISE_THRESHOLD 2 + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 100 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 700, 700, 100, 10000 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 700 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 700 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Junction Deviation + * + * Use Junction Deviation instead of traditional Jerk Limiting + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#if DISABLED(JUNCTION_DEVIATION) + #define DEFAULT_XJERK 8.0 + #define DEFAULT_YJERK 8.0 + #define DEFAULT_ZJERK 0.4 +#endif + +#define DEFAULT_EJERK 5.0 // May be used by Linear Advance + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_PIN + * + * Define this pin if the probe is not connected to Z_MIN_PIN. + * If not defined the default pin for the selected MOTHERBOARD + * will be used. Most of the time the default is what you want. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + */ +//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH + +/** + * Touch-MI Probe by hotends.fr + * + * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed. + * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is + * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position. + * + * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING, + * and a minimum Z_HOMING_HEIGHT of 10. + */ +//#define TOUCH_MI_PROBE +#if ENABLED(TOUCH_MI_PROBE) + #define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts + //#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed + //#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu) +#endif + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice. +//#define RACK_AND_PINION_PROBE +#if ENABLED(RACK_AND_PINION_PROBE) + #define Z_PROBE_DEPLOY_X X_MIN_POS + #define Z_PROBE_RETRACT_X X_MAX_POS +#endif + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +/** + * Multiple Probing + * + * You may get improved results by probing 2 or more times. + * With EXTRA_PROBING the more atypical reading(s) will be disregarded. + * + * A total of 2 does fast/slow probes with a weighted average. + * A total of 3 or more adds more slow probes, taking the average. + */ +//#define MULTIPLE_PROBING 2 +//#define EXTRA_PROBING 1 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// Before deploy/stow pause for user confirmation +//#define PAUSE_BEFORE_DEPLOY_STOW +#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) + //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false + +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false +#define INVERT_E5_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 150 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // Set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + + // Set one or more commands to execute on filament runout. + // (After 'M412 H' Marlin will ask the host to handle the process.) + #define FILAMENT_RUNOUT_SCRIPT "M600" + + // After a runout is detected, continue printing this length of filament + // before executing the runout script. Useful for a sensor at the end of + // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. + //#define FILAMENT_RUNOUT_DISTANCE_MM 25 + + #ifdef FILAMENT_RUNOUT_DISTANCE_MM + // Enable this option to use an encoder disc that toggles the runout pin + // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM + // large enough to avoid false positives.) + //#define FILAMENT_MOTION_SENSOR + #endif +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #endif + +#endif + +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment + //#define MESH_EDIT_MENU // Add a menu to edit mesh points +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + #define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Move nozzle up before moving between corners + #define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// Validate that endstops are triggered on homing moves +#define VALIDATE_HOMING_ENDSTOPS + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +/** + * EEPROM + * + * Persistent storage to preserve configurable settings across reboots. + * + * M500 - Store settings to EEPROM. + * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) + * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) + */ +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. +#if ENABLED(EEPROM_SETTINGS) + //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. +#endif + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_LABEL "PLA" +#define PREHEAT_1_TEMP_HOTEND 205 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_LABEL "ABS" +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z_raise } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1) } + #define NOZZLE_CLEAN_END_POINT { 100, 60, (Z_MIN_POS + 1) } + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Move the nozzle to the initial position after cleaning + #define NOZZLE_CLEAN_GOBACK + + // Enable for a purge/clean station that's always at the gantry height (thus no Z move) + //#define NOZZLE_CLEAN_NO_Z +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, + * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * Info Screen Style (0:Classic, 1:Prusa) + * + * :[0:'Classic', 1:'Prusa'] + */ +#define LCD_INFO_SCREEN_STYLE 0 + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// This option reverses the encoder direction for Select Screen. +// +// If CLOCKWISE normally moves LEFT this makes it go RIGHT. +// If CLOCKWISE normally moves RIGHT this makes it go LEFT. +// +//#define REVERSE_SELECT_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +// +// 3-wire SR LCD with strobe using 74HC4094 +// https://github.com/mikeshub/SailfishLCD +// Uses the code directly from Sailfish +// +//#define FF_INTERFACEBOARD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +#define LCD_FOR_MELZI + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// MKS MINI12864 with graphic controller and SD support +// https://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// FYSETC variant of the MINI12864 graphic controller with SD support +// https://wiki.fysetc.com/Mini12864_Panel/ +// +//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default +//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) +//#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight +//#define FYSETC_MINI_12864_2_1 // Type A/B. Neopixel RGB Backlight + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 +// A clone of the RepRapDiscount full graphics display but with +// different pins/wiring (see pins_ANET_10.h). +// +//#define ANET_FULL_GRAPHICS_LCD + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================== OLED Displays ============================== +//============================================================================= + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + #define U8GLIB_SSD1306 + //#define U8GLIB_SH1106 +#endif + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// Einstart S OLED SSD1306 +// +//#define U8GLIB_SH1106_EINSTART + +// +// Overlord OLED display/controller with i2c buzzer and LEDs +// +//#define OVERLORD_OLED + +//============================================================================= +//========================== Extensible UI Displays =========================== +//============================================================================= + +// +// DGUS Touch Display with DWIN OS +// +//#define DGUS_LCD + +// +// Touch-screen LCD for Malyan M200 printers +// +//#define MALYAN_LCD + +// +// LulzBot Color Touch UI for FTDI EVE (FT800/FT810) displays +// See Configuration_adv.h for all configuration options. +// +//#define LULZBOT_TOUCH_UI + +// +// Third-party or vendor-customized controller interfaces. +// Sources should be installed in 'src/lcd/extensible_ui'. +// +//#define EXTENSIBLE_UI + +//============================================================================= +//=============================== Graphical TFTs ============================== +//============================================================================= + +// +// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) +// +//#define FSMC_GRAPHICAL_TFT + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 +// +//#define TOUCH_BUTTONS +#if ENABLED(TOUCH_BUTTONS) + #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens + #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus + + #define XPT2046_X_CALIBRATION 12316 + #define XPT2046_Y_CALIBRATION -8981 + #define XPT2046_X_OFFSET -43 + #define XPT2046_Y_OFFSET 257 +#endif + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +// :[0,1,2,3,4,5,6,7] +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +// Support for PCA9533 PWM LED driver +// https://github.com/mikeshub/SailfishRGB_LED +//#define PCA9533 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if EITHER(RGB_LED, RGBW_LED) + //#define RGB_LED_R_PIN 34 + //#define RGB_LED_G_PIN 43 + //#define RGB_LED_B_PIN 35 + //#define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin + //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE + //#define NEOPIXEL2_PIN 5 + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup + + // Use a single Neopixel LED for static (background) lighting + //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use + //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// (ms) Delay before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES diff --git a/config/examples/Wanhao/Duplicator i3 2.1/Configuration_adv.h b/config/examples/Wanhao/Duplicator i3 2.1/Configuration_adv.h new file mode 100644 index 0000000000..5476f1a3c5 --- /dev/null +++ b/config/examples/Wanhao/Duplicator i3 2.1/Configuration_adv.h @@ -0,0 +1,2718 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value +#endif + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +/** + * Heated Chamber settings + */ +#if TEMP_SENSOR_CHAMBER + #define CHAMBER_MINTEMP 5 + #define CHAMBER_MAXTEMP 60 + #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + //#define CHAMBER_LIMIT_SWITCHING + //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + //#define HEATER_CHAMBER_INVERTING false +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds + #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // Add an experimental additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/m) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed + //#define CONTROLLERFAN_SPEED_Z_ONLY 127 // Reduce noise on machines that keep Z enabled +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * FAST PWM FAN Settings + * + * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a + * frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY [undefined by default] + * Set this to your desired frequency. + * If left undefined this defaults to F = F_CPU/(2*255*1) + * ie F = 31.4 Khz on 16 MHz microcontrollers or F = 39.2 KHz on 20 MHz microcontrollers + * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 + //#define USE_OCR2A_AS_TOP +#endif + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 0 + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage + #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage + #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially +//#define HOMING_BACKOFF_MM { 2, 2, 2 } // (mm) Move away from the endstops after homing + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then + * check the wiring of the BROWN, RED and ORANGE wires. + * + * Note: If the trigger signal of your probe is not being recognized, it has been very often + * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + //#define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! + * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. + * If disabled, OD mode is the hard-coded default on 3.0 + * On startup, Marlin will compare its eeprom to this vale. If the selected mode + * differs, a mode set eeprom write will be completed at initialization. + * Use the option below to force an eeprom write to a V3.1 probe regardless. + */ + //#define BLTOUCH_SET_5V_MODE + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Use "HIGH SPEED" mode for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function + * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + */ + //#define BLTOUCH_HS_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + +#endif // BLTOUCH + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + // Define probe X and Y positions for Z1, Z2 [, Z3] + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + + // Set number of iterations to align + #define Z_STEPPER_ALIGN_ITERATIONS 3 + + // Enable to restore leveling setup after operation + #define RESTORE_LEVELING_AFTER_G34 + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle + + // Stop criterion. If the accuracy is better than this stop iterating early + #define Z_STEPPER_ALIGN_ACC 0.02 +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // Set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// Minimum time that a segment needs to take if the buffer is emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (ms) + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // increments while checking for the contact to be broken. + #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) + #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/m) + #endif + #endif +#endif + +/** + * Automatic backlash, position and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#define CALIBRATION_GCODE +#if ENABLED(CALIBRATION_GCODE) + + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm + + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/m + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/m + + // The following parameters refer to the conical section of the nozzle tip. + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + // Probing at the exact top center only works if the center is flat. If + // probing on a screwhead or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define pin which is read during calibration + #ifndef CALIBRATION_PIN + #define CALIBRATION_PIN -1 // Override in pins.h or set to -1 to use your Z endstop + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if EITHER(ULTIPANEL, EXTENSIBLE_UI) + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) + #if ENABLED(ULTIPANEL) + #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +#if HAS_LCD_MENU + + // Include a page of printer information in the LCD Main Menu + //#define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + //#define LED_CONTROL_MENU + #if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif + #endif + +#endif // HAS_LCD_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the Z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + #define EVENT_GCODE_SD_STOP "G28XY" // G-code to run on Stop Print (e.g., "G28XY" or "G27") + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate + //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + // Leave the heaters on after Stop Print (not recommended!) + //#define SD_ABORT_NO_COOLDOWN + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS3_USB + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + #if HAS_SDCARD_CONNECTION + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + //#define SDCARD_CONNECTION LCD + #endif + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_GRAPHICAL_LCD + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if ENABLED(U8GLIB_ST7920) + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customizations + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_GRAPHICAL_LCD + +// +// Lulzbot Touch UI +// +#if ENABLED(LULZBOT_TOUCH_UI) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping + //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping + //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping + //#define OTHER_PIN_LAYOUT // Define pins manually below + #if ENABLED(OTHER_PIN_LAYOUT) + // The pins for CS and MOD_RESET (PD) must be chosen. + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + + // When labels do not fit buttons, use smaller font + #define TOUCH_UI_FIT_TEXT + + // Runtime language selection (otherwise LCD_LANGUAGE) + //#define TOUCH_UI_LANGUAGE_MENU + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE +#endif + +// +// FSMC Graphical TFT +// +#if ENABLED(FSMC_GRAPHICAL_TFT) + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 200000 : Maximum for LV8729 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 32 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +// Add M575 G-code to change the baud rate +//#define BAUD_RATE_GCODE + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// This option inserts short delays between lines of serial output. +#define SERIAL_OVERRUN_PROTECTION + +// @section extras + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if EXTRUDERS > 1 + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_NO_RETURN // Never return to the previous position on tool-change + + // Retract and prime filament on tool-change + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + #define TOOLCHANGE_FIL_SWAP_LENGTH 12 // (mm) + #define TOOLCHANGE_FIL_EXTRA_PRIME 2 // (mm) + #define TOOLCHANGE_FIL_SWAP_RETRACT_SPEED 3600 // (mm/m) + #define TOOLCHANGE_FIL_SWAP_PRIME_SPEED 3600 // (mm/m) + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#define TOOLCHANGE_PARK + #if ENABLED(TOOLCHANGE_PARK) + #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/m) + #endif +#endif + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #if AXIS_DRIVER_TYPE_X(TMC26X) + #define X_MAX_CURRENT 1000 // (mA) + #define X_SENSE_RESISTOR 91 // (mOhms) + #define X_MICROSTEPS 16 // Number of microsteps + #endif + + #if AXIS_DRIVER_TYPE_X2(TMC26X) + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC26X) + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC26X) + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC26X) + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC26X) + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E2(TMC26X) + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E3(TMC26X) + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E4(TMC26X) + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E5(TMC26X) + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode + * connect your SPI pins to the hardware SPI interface on your board and define + * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 + * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN + * to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without + * a resistor. + * The drivers can also be used with hardware serial. + * + * TMCStepper library is required to use TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + */ +#if HAS_TRINAMIC + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #if AXIS_IS_TMC(X) + #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 + #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #endif + + #if AXIS_IS_TMC(X2) + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + #define X2_RSENSE 0.11 + #define X2_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(Y) + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(Y2) + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + #define Y2_RSENSE 0.11 + #define Y2_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(Z) + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(Z2) + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + #define Z2_RSENSE 0.11 + #define Z2_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(Z3) + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define Z3_RSENSE 0.11 + #define Z3_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E0) + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E1) + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + #define E1_RSENSE 0.11 + #define E1_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E2) + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + #define E2_RSENSE 0.11 + #define E2_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E3) + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + #define E3_RSENSE 0.11 + #define E3_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E4) + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + #define E4_RSENSE 0.11 + #define E4_CHAIN_POS 0 + #endif + + #if AXIS_IS_TMC(E5) + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + #define E5_RSENSE 0.11 + #define E5_CHAIN_POS 0 + #endif + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + #define X_SLAVE_ADDRESS 0 + #define Y_SLAVE_ADDRESS 0 + #define Z_SLAVE_ADDRESS 0 + #define X2_SLAVE_ADDRESS 0 + #define Y2_SLAVE_ADDRESS 0 + #define Z2_SLAVE_ADDRESS 0 + #define Z3_SLAVE_ADDRESS 0 + #define E0_SLAVE_ADDRESS 0 + #define E1_SLAVE_ADDRESS 0 + #define E2_SLAVE_ADDRESS 0 + #define E3_SLAVE_ADDRESS 0 + #define E4_SLAVE_ADDRESS 0 + #define E5_SLAVE_ADDRESS 0 + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_E + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * CHOPPER_DEFAULT_19V + * CHOPPER_DEFAULT_24V + * CHOPPER_DEFAULT_36V + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define you own with + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V + + /** + * Monitor Trinamic drivers for error conditions, + * like overtemperature and short to ground. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + + /** + * Use StallGuard2 to home / probe X, Y, Z. + * + * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only + * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set [XYZ]_HOME_BUMP_MM to 0. + * + * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when + * homing and adds a guard period for endstop triggering. + */ + //#define SENSORLESS_HOMING // StallGuard capable drivers only + + /** + * Use StallGuard2 to probe the bed with the nozzle. + * + * CAUTION: This could cause damage to machines that use a lead screw or threaded rod + * to move the Z axis. Take extreme care when attempting to enable this feature. + */ + //#define SENSORLESS_PROBING // StallGuard capable drivers only + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 8 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 8 + //#define Z_STALL_SENSITIVITY 8 + //#define SPI_ENDSTOPS // TMC2130 only + //#define IMPROVE_HOMING_RELIABILITY + #endif + + /** + * Beta feature! + * Create a 50/50 square wave step pulse optimal for stepper drivers. + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * Arduino-L6470 library (0.7.0 or higher) is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + * + * Requires the following to be defined in your pins_YOUR_BOARD file + * L6470_CHAIN_SCK_PIN + * L6470_CHAIN_MISO_PIN + * L6470_CHAIN_MOSI_PIN + * L6470_CHAIN_SS_PIN + * L6470_RESET_CHAIN_PIN (optional) + */ +#if HAS_DRIVER(L6470) + + //#define L6470_CHITCHAT // Display additional status info + + #if AXIS_DRIVER_TYPE_X(L6470) + #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) + #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) + #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) + #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper + #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #endif + + #if AXIS_DRIVER_TYPE_X2(L6470) + #define X2_MICROSTEPS 128 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_Y(L6470) + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_Y2(L6470) + #define Y2_MICROSTEPS 128 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_Z(L6470) + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_Z2(L6470) + #define Z2_MICROSTEPS 128 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_Z3(L6470) + #define Z3_MICROSTEPS 128 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E0(L6470) + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E1(L6470) + #define E1_MICROSTEPS 128 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E2(L6470) + #define E2_MICROSTEPS 128 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E3(L6470) + #define E3_MICROSTEPS 128 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E4(L6470) + #define E4_MICROSTEPS 128 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS 0 + #endif + + #if AXIS_DRIVER_TYPE_E5(L6470) + #define E5_MICROSTEPS 128 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS 0 + #endif + + /** + * Monitor L6470 drivers for error conditions like over temperature and over current. + * In the case of over temperature Marlin can decrease the drive until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. + * I not present or I0 or I1 - X, Y, Z or E0 + * I2 - X2, Y2, Z2 or E1 + * I3 - Z3 or E3 + * I4 - E4 + * I5 - E5 + * M916 - Increase drive level until get thermal warning + * M917 - Find minimum current thresholds + * M918 - Increase speed until max or error + * M122 S0/1 - Report driver parameters + */ + //#define MONITOR_L6470_DRIVER_STATUS + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + #define KVAL_HOLD_STEP_DOWN 1 + //#define L6470_STOP_ON_ERROR + #endif + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) + + // Canon RC-1 or homebrew digital camera trigger + // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) +#endif + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define SPINDLE_LASER_ACTIVE_HIGH false // Set to "true" if the on/off function is active HIGH + #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // Set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + #else + #define SPEED_POWER_SLOPE 0.3922 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 10 + #define SPEED_POWER_MAX 100 // 0-100% + #endif +#endif + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. + +// Enable and set a (default) feedrate for all G0 moves +//#define G0_FEEDRATE 3000 // (mm/m) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define CUSTOM_USER_MENU_TITLE "Custom Commands" + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +//#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + //#define HOST_PROMPT_SUPPORT +#endif + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + // Use M119 to find reasonable values after connecting your hardware: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behavior is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" + //#define WEBSUPPORT // Start a webserver with auto-discovery + //#define OTASUPPORT // Support over-the-air firmware updates +#endif + +/** + * Prusa Multi-Material Unit v2 + * Enable in Configuration.h + */ +#if ENABLED(PRUSA_MMU2) + + // Serial port used for communication with MMU2. + // For AVR enable the UART port used for the MMU. (e.g., internalSerial) + // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) + #define INTERNAL_SERIAL_PORT 2 + #define MMU2_SERIAL internalSerial + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + #if ENABLED(MMU2_MENUS) + // Settings for filament load / unload from the LCD menu. + // This is for Prusa MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 562 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // PRUSA_MMU2 + +/** + * Advanced Print Counter settings + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE diff --git a/config/examples/Wanhao/Duplicator i3 2.1/README.md b/config/examples/Wanhao/Duplicator i3 2.1/README.md new file mode 100644 index 0000000000..d2a7ea6401 --- /dev/null +++ b/config/examples/Wanhao/Duplicator i3 2.1/README.md @@ -0,0 +1,21 @@ +Configuration for the Wanhao Duplicator i3 v2.1 + +[Made by Bot-In-a-Box Educational Robotics](https://botinabox.ca) +[See original configuration repo](https://github.com/BotInABoxER/marlin2-for-wanhao-i3) + +Notes: +- YMMV, but the included thermistor table has been tested to work with a 100k bed thermistor with a 10K pull-up resistor +- The smaller Marlin logo is used to save memory +- You may have a 4.7K pull-up resistor, in which case the included thermistor table will be off +- The included thermistor table was generated with `buildroot/share/scripts/createTemperatureLookupMarlin.py --rp=10000` +- Includes an optional custom Wanhao logo bootscreen designed to fit the stock LCD +- Includes an optional custom Chippy from Bot-In-a-Box bootscreen designed to fit the stock LCD + +Inspirations: +- https://www.thingiverse.com/thing:3378807 (Custom firmware 1.x by Nitrogen777) +- https://www.thingiverse.com/thing:3378807 (Custom firmware 2.x by Remotheman) + +Instructions: +- Copy the `Configuration.h`, `_Bootscreen.h` (or `Chippy_Bootscreen.h`; rename it `_Bootscreen.h`), and `Configuration_adv.h` to the `Marlin/ directory` +- Copy the `thermistor_99.h` and `thermistors.h` files to the `Marlin/src/modules/thermistors` directory +- Flash the firmware onto your Melzi (https://www.fission3d.com/guides/flash-bootloader-and-install-firmware-with-raspberry-pi might help) diff --git a/config/examples/Wanhao/Duplicator i3 2.1/_Bootscreen.h b/config/examples/Wanhao/Duplicator i3 2.1/_Bootscreen.h new file mode 100644 index 0000000000..34686deeaa --- /dev/null +++ b/config/examples/Wanhao/Duplicator i3 2.1/_Bootscreen.h @@ -0,0 +1,72 @@ +/** + * Made with Marlin Bitmap Converter + * http://marlinfw.org/tools/u8glib/converter.html + * + * This bitmap from 128x64 pasted image + */ +#define CUSTOM_BOOTSCREEN_BMPWIDTH 104 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B00000000,B00000011,B11111111,B10111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10111111,B10000000,B01111111,B11111111,B00111111,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B10111111,B11111111,B11111111,B11111111,B01111111,B11100000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B10111111,B11111111,B11111111,B11111110,B01111111,B11110000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B00111111,B11111111,B11111111,B11111100,B11111111,B11111000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B01111111,B11111111,B11111111,B11111101,B11111111,B11111110,B00111100,B00000000, + B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B01111111,B11111111,B11111111,B11111101,B11111111,B11111111,B11111111,B11000000, + B00000000,B00000000,B00000000,B00000000,B01111111,B11111110,B01111111,B11111111,B11111111,B11111101,B11111111,B11111111,B10000001,B11100000, + B00000000,B00000000,B00000000,B00000001,B11111111,B11111110,B11111111,B11111111,B11111111,B11111101,B11111111,B11111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000011,B11111111,B11111110,B11111111,B11111111,B11111111,B11111101,B11111111,B11111110,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111111,B11111110,B11111111,B11111111,B11111111,B11111101,B11111111,B11111110,B00000000,B00000000, + B00000000,B00000000,B00000000,B01101111,B11111111,B11111110,B11111111,B11111111,B11111111,B11111101,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000000,B00000001,B11101111,B11111111,B11111110,B11111111,B11111111,B11111111,B11111101,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000000,B01100111,B11001111,B11111111,B11111110,B01111111,B11111111,B11111111,B11111101,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000111,B01111111,B11011111,B11111111,B11111111,B01111111,B11111111,B11111111,B11111100,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000111,B11111111,B11011111,B11111111,B11111111,B01111111,B11111111,B11111111,B11111110,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000011,B11111111,B11011111,B11111111,B11111111,B00111111,B11111111,B11111111,B11111110,B11111111,B11111111,B10000000,B00000000, + B00000000,B00000011,B11111111,B11001111,B11111111,B11111111,B10111111,B11111111,B11111111,B11111110,B01111111,B11111111,B10000000,B00000000, + B00000000,B00000001,B11111111,B11101111,B11111111,B11111111,B10111111,B11111111,B11111111,B11111111,B01111111,B11111111,B11000000,B00000000, + B00000000,B00000001,B11111111,B11101111,B11111111,B11111111,B10011111,B11111111,B11111111,B11111111,B01111111,B11111111,B11000000,B00000000, + B00000000,B00000001,B11111111,B11101111,B11111111,B11111111,B11011111,B11111111,B11111111,B11111111,B01111111,B11111111,B11000000,B00000000, + B00000000,B00000001,B11111111,B11100111,B11111111,B11111111,B11011111,B11111111,B11111111,B11111111,B00111111,B11111111,B11000000,B00000000, + B00000000,B00000001,B11111111,B11110111,B11111111,B11111111,B11011111,B11111111,B11111111,B11111111,B10111111,B11111111,B11000000,B00000000, + B00000000,B01000001,B11111111,B11110011,B11111111,B11111111,B11001111,B11111111,B11111111,B11111111,B10111111,B11111111,B10000000,B00000000, + B00000000,B01100001,B11111111,B11111001,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B10111111,B11111111,B10100000,B00000000, + B00000000,B01111001,B11111111,B11111101,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B00111111,B11111111,B00110000,B00000000, + B00001000,B01111111,B11111111,B11111100,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B01111111,B11111110,B01110000,B00000000, + B00001100,B00111111,B11111111,B11111110,B01111111,B11111111,B11101111,B11111111,B11111111,B11111100,B00111111,B11111100,B11111000,B00000000, + B00001111,B00111111,B11111111,B11111111,B00000000,B00111111,B11101111,B11111111,B11111111,B11110001,B10001111,B11111001,B11111100,B00000000, + B00000111,B11111111,B11111111,B11111111,B00111111,B10001111,B11100111,B11111111,B11111111,B11000011,B11100011,B11111011,B11111110,B00000000, + B00000111,B11111111,B11111111,B11111110,B00111111,B11100011,B11000000,B11111111,B11111110,B00000001,B11111000,B11110011,B11111111,B00000000, + B00000011,B11111111,B11111111,B11111000,B00011111,B11111000,B00000000,B00001111,B11110000,B00000001,B11111110,B00000111,B11111111,B00000000, + B00000011,B11111111,B11111111,B11100000,B00001111,B11111101,B11000000,B00000000,B00000000,B00000001,B11111111,B11101111,B11111111,B00000000, + B00000001,B11111111,B11111111,B11000000,B00001111,B11111101,B11111100,B00000000,B00000000,B00000111,B11111111,B11100111,B11111110,B00000000, + B00000000,B11111111,B11111111,B10000000,B00000111,B11111101,B11111110,B00000000,B00000000,B00001111,B11111111,B11100011,B11111100,B00000000, + B00000000,B01111111,B11111111,B00000000,B00000011,B11111101,B11111111,B00000000,B00000000,B00011111,B11111111,B10000011,B11111100,B00000000, + B00000000,B00111111,B11111110,B00000000,B00000011,B11111001,B11111111,B00000000,B00000000,B00011111,B11111110,B00000111,B11111000,B00000000, + B00000000,B00011111,B11111100,B00000000,B00000011,B11111011,B11111111,B10000000,B00000000,B00111111,B11111100,B00000111,B11111000,B00000000, + B00000000,B00011111,B11110000,B00000000,B00000011,B11110001,B11111111,B11000000,B00000000,B01111111,B11100000,B00001111,B11111000,B00000000, + B00000000,B00001111,B11110000,B00000000,B00000111,B11110000,B00001111,B11000000,B00000000,B11111111,B10000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11000000,B00000000,B00001111,B11110000,B00000001,B11000000,B00000000,B11111111,B10000000,B00011111,B11100000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000111,B10000111,B10000001,B11110000,B00011110,B00000111,B10001111,B00000011,B11000000,B01111100,B00000000,B11111111,B00000000, + B00000111,B10000111,B10000111,B10000001,B11110000,B00011111,B00000111,B10001111,B00000011,B11000000,B01111100,B00000001,B11111111,B10000000, + B00000111,B10000111,B10000111,B10000011,B11111000,B00011111,B00000111,B10001111,B00000011,B11000000,B11111110,B00000011,B11111111,B11000000, + B00000111,B10000111,B10000111,B10000011,B11111000,B00011111,B10000111,B10001111,B00000011,B11000000,B11111110,B00000111,B11111111,B11100000, + B00000111,B10000111,B10000111,B10000111,B10111100,B00011111,B11000111,B10001111,B00000011,B11000001,B11101111,B00000111,B11000011,B11100000, + B00000111,B10000111,B10000111,B10000111,B00011100,B00011111,B11100111,B10001111,B00000011,B11000001,B11000111,B00001111,B10000001,B11110000, + B00000111,B10000111,B10000111,B10000111,B00011100,B00011111,B11110111,B10001111,B11111111,B11000001,B11000111,B00001111,B00000000,B11110000, + B00000111,B11001111,B11001111,B10001111,B00011110,B00011111,B11111111,B10001111,B11111111,B11000011,B11000111,B10001111,B00000000,B11110000, + B00000011,B11001111,B11001111,B00001110,B00001110,B00011111,B11111111,B10001111,B11111111,B11000011,B10000011,B10001111,B00000000,B11110000, + B00000011,B11101111,B11011111,B00001111,B11111110,B00011110,B11111111,B10001111,B00000011,B11000011,B11111111,B10001111,B00000000,B11110000, + B00000001,B11111111,B11111110,B00011111,B11111111,B00011110,B01111111,B10001111,B00000011,B11000111,B11111111,B11001111,B10000001,B11110000, + B00000001,B11111100,B11111110,B00011111,B11111111,B00011110,B00111111,B10001111,B00000011,B11000111,B11111111,B11000111,B11000011,B11100000, + B00000000,B11111100,B11111100,B00011111,B11111111,B00011110,B00011111,B10001111,B00000011,B11000111,B11111111,B11000111,B11111111,B11100000, + B00000000,B01111100,B11111000,B00111110,B00001111,B10011110,B00001111,B10001111,B00000011,B11001111,B10000011,B11100011,B11111111,B11000000, + B00000000,B01111000,B01111000,B00111100,B00000111,B10011110,B00001111,B10001111,B00000011,B11001111,B00000001,B11100001,B11111111,B10000000, + B00000000,B00111000,B01110000,B00111100,B00000111,B10011110,B00000111,B10001111,B00000011,B11001111,B00000001,B11100000,B01111110,B00000000 +}; diff --git a/config/examples/Wanhao/Duplicator i3 Mini/Configuration.h b/config/examples/Wanhao/Duplicator i3 Mini/Configuration.h index 6a256a95fb..35cb62a9bd 100644 --- a/config/examples/Wanhao/Duplicator i3 Mini/Configuration.h +++ b/config/examples/Wanhao/Duplicator i3 Mini/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Wanhao i3 Mini)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 13 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 15, 50 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 3000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.05 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h b/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h index 9ea28ae69e..5f8998d8f8 100644 --- a/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h +++ b/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/adafruit/ST7565/Configuration.h b/config/examples/adafruit/ST7565/Configuration.h index 8ed568a92d..71285deee5 100644 --- a/config/examples/adafruit/ST7565/Configuration.h +++ b/config/examples/adafruit/ST7565/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -725,6 +725,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -733,6 +738,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -746,35 +756,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1558,10 +1571,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Anycubic/Kossel/Configuration.h b/config/examples/delta/Anycubic/Kossel/Configuration.h index c18b065415..428fd0b0ef 100644 --- a/config/examples/delta/Anycubic/Kossel/Configuration.h +++ b/config/examples/delta/Anycubic/Kossel/Configuration.h @@ -87,6 +87,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "@brandstaetter, @grbd" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -398,6 +399,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -415,8 +417,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -855,6 +855,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 100, 100, 100, 100} +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -863,6 +868,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 3000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -876,35 +886,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 5.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.003 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1744,10 +1757,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Anycubic/Kossel/Configuration_adv.h b/config/examples/delta/Anycubic/Kossel/Configuration_adv.h index 260b9a1f45..c362918bca 100644 --- a/config/examples/delta/Anycubic/Kossel/Configuration_adv.h +++ b/config/examples/delta/Anycubic/Kossel/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/Dreammaker/Overlord/Configuration.h b/config/examples/delta/Dreammaker/Overlord/Configuration.h index 4bb023181d..3fc7551028 100644 --- a/config/examples/delta/Dreammaker/Overlord/Configuration.h +++ b/config/examples/delta/Dreammaker/Overlord/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Team Overlord/TimMoore)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 201 #define TEMP_SENSOR_1 201 @@ -827,28 +827,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta @@ -856,6 +843,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1668,10 +1666,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h b/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h index 7fa5d375a4..c460cb716c 100644 --- a/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h +++ b/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2099,7 +2117,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2107,7 +2125,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2115,7 +2133,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2123,7 +2141,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2131,7 +2149,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2139,7 +2157,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2147,7 +2165,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2155,7 +2173,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2163,7 +2181,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2171,7 +2189,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2179,7 +2197,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2187,7 +2205,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2195,7 +2213,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration.h b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration.h index c69a173ed1..5c8047fed3 100644 --- a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration.h +++ b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Team Overlord/TimMoore)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 201 #define TEMP_SENSOR_1 201 @@ -839,28 +839,15 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta @@ -868,6 +855,17 @@ #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1679,10 +1677,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h index 7fa5d375a4..c460cb716c 100644 --- a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h +++ b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage #define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2099,7 +2117,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2107,7 +2125,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2115,7 +2133,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2123,7 +2141,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2131,7 +2149,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2139,7 +2157,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2147,7 +2165,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2155,7 +2173,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2163,7 +2181,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2171,7 +2189,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2179,7 +2197,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2187,7 +2205,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2195,7 +2213,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/FLSUN/auto_calibrate/Configuration.h b/config/examples/delta/FLSUN/auto_calibrate/Configuration.h index 0fe1da9925..1555b6bef8 100644 --- a/config/examples/delta/FLSUN/auto_calibrate/Configuration.h +++ b/config/examples/delta/FLSUN/auto_calibrate/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(LVD, FLSUN-AC)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -807,6 +807,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -815,6 +820,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -828,35 +838,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1672,10 +1685,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h b/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h index eb4f8146c3..83a2335d44 100644 --- a/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h +++ b/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/FLSUN/kossel/Configuration.h b/config/examples/delta/FLSUN/kossel/Configuration.h index 74bd37da76..45d54086d0 100644 --- a/config/examples/delta/FLSUN/kossel/Configuration.h +++ b/config/examples/delta/FLSUN/kossel/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(LVD, FLSUN-AC)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -807,6 +807,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -815,6 +820,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -828,35 +838,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1671,10 +1684,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/FLSUN/kossel/Configuration_adv.h b/config/examples/delta/FLSUN/kossel/Configuration_adv.h index eb4f8146c3..83a2335d44 100644 --- a/config/examples/delta/FLSUN/kossel/Configuration_adv.h +++ b/config/examples/delta/FLSUN/kossel/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/FLSUN/kossel_mini/Configuration.h b/config/examples/delta/FLSUN/kossel_mini/Configuration.h index 5c81e5f1f8..fa5067aca9 100644 --- a/config/examples/delta/FLSUN/kossel_mini/Configuration.h +++ b/config/examples/delta/FLSUN/kossel_mini/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Michael Henke, flsun Kossel Mini)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -807,6 +807,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -815,6 +820,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -828,35 +838,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.016 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1671,10 +1684,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h b/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h index 1cfa958cd4..625d260c13 100644 --- a/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h +++ b/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/Geeetech/Rostock 301/Configuration.h b/config/examples/delta/Geeetech/Rostock 301/Configuration.h index 1eedcf2e06..8539bb1610 100644 --- a/config/examples/delta/Geeetech/Rostock 301/Configuration.h +++ b/config/examples/delta/Geeetech/Rostock 301/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(Phr3d13, Geeetech Rostock 301)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -797,6 +797,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -805,6 +810,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -818,35 +828,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1659,10 +1672,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h b/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h index 1ee610af6b..5675381a24 100644 --- a/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h +++ b/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/Hatchbox_Alpha/Configuration.h b/config/examples/delta/Hatchbox_Alpha/Configuration.h index bc3f024b39..905b3076f8 100644 --- a/config/examples/delta/Hatchbox_Alpha/Configuration.h +++ b/config/examples/delta/Hatchbox_Alpha/Configuration.h @@ -77,6 +77,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -812,6 +812,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 200 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -820,6 +825,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -833,35 +843,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.053 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1687,10 +1700,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/MKS/SBASE/Configuration.h b/config/examples/delta/MKS/SBASE/Configuration.h index 915c069efb..7792f04210 100644 --- a/config/examples/delta/MKS/SBASE/Configuration.h +++ b/config/examples/delta/MKS/SBASE/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 0 @@ -797,6 +797,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -805,6 +810,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -818,35 +828,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1659,10 +1672,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/MKS/SBASE/Configuration_adv.h b/config/examples/delta/MKS/SBASE/Configuration_adv.h index 0727cd9cbd..437790ed3f 100644 --- a/config/examples/delta/MKS/SBASE/Configuration_adv.h +++ b/config/examples/delta/MKS/SBASE/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/Tevo Little Monster/Configuration.h b/config/examples/delta/Tevo Little Monster/Configuration.h index 1c894ce327..4229874768 100644 --- a/config/examples/delta/Tevo Little Monster/Configuration.h +++ b/config/examples/delta/Tevo Little Monster/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(HEINRICHS)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -801,6 +801,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 25000, 25000, 25000, 5000 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -809,6 +814,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -822,35 +832,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 5000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.008 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1663,10 +1676,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/Tevo Little Monster/Configuration_adv.h b/config/examples/delta/Tevo Little Monster/Configuration_adv.h index 801b19fc91..865e81f020 100644 --- a/config/examples/delta/Tevo Little Monster/Configuration_adv.h +++ b/config/examples/delta/Tevo Little Monster/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/generic/Configuration.h b/config/examples/delta/generic/Configuration.h index 34e68585ba..f39a779333 100644 --- a/config/examples/delta/generic/Configuration.h +++ b/config/examples/delta/generic/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 0 @@ -797,6 +797,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -805,6 +810,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -818,35 +828,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1659,10 +1672,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/generic/Configuration_adv.h b/config/examples/delta/generic/Configuration_adv.h index 1cfa958cd4..625d260c13 100644 --- a/config/examples/delta/generic/Configuration_adv.h +++ b/config/examples/delta/generic/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/kossel_mini/Configuration.h b/config/examples/delta/kossel_mini/Configuration.h index 6f32e89d80..29da9d67f5 100644 --- a/config/examples/delta/kossel_mini/Configuration.h +++ b/config/examples/delta/kossel_mini/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 7 #define TEMP_SENSOR_1 0 @@ -797,6 +797,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -805,6 +810,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -818,35 +828,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1661,10 +1674,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/kossel_mini/Configuration_adv.h b/config/examples/delta/kossel_mini/Configuration_adv.h index 1cfa958cd4..625d260c13 100644 --- a/config/examples/delta/kossel_mini/Configuration_adv.h +++ b/config/examples/delta/kossel_mini/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/delta/kossel_pro/Configuration.h b/config/examples/delta/kossel_pro/Configuration.h index 8920710d84..d994e39770 100644 --- a/config/examples/delta/kossel_pro/Configuration.h +++ b/config/examples/delta/kossel_pro/Configuration.h @@ -76,6 +76,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -387,6 +388,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -404,8 +406,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -790,6 +790,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -798,6 +803,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 9000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -811,35 +821,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1661,10 +1674,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/kossel_xl/Configuration.h b/config/examples/delta/kossel_xl/Configuration.h index 2e11a8c991..3cc6eeeb0d 100644 --- a/config/examples/delta/kossel_xl/Configuration.h +++ b/config/examples/delta/kossel_xl/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(oxivanisher)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -800,6 +800,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -808,6 +813,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -821,35 +831,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK DEFAULT_XJERK #define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 20.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1662,10 +1675,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/delta/kossel_xl/Configuration_adv.h b/config/examples/delta/kossel_xl/Configuration_adv.h index 45a07f4667..231edc2786 100644 --- a/config/examples/delta/kossel_xl/Configuration_adv.h +++ b/config/examples/delta/kossel_xl/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -891,6 +904,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1357,12 +1375,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1801,91 +1819,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2111,7 +2129,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2119,7 +2137,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2127,7 +2145,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2135,7 +2153,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2143,7 +2161,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2151,7 +2169,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2159,7 +2177,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2167,7 +2185,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2175,7 +2193,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2183,7 +2201,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2191,7 +2209,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2199,7 +2217,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2207,7 +2225,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/gCreate/gMax1.5+/Configuration.h b/config/examples/gCreate/gMax1.5+/Configuration.h index d5278a6db0..75bcd006c8 100644 --- a/config/examples/gCreate/gMax1.5+/Configuration.h +++ b/config/examples/gCreate/gMax1.5+/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -388,6 +389,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -405,8 +407,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -738,6 +738,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 25, 25 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -746,6 +751,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 800, 800, 700, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -759,35 +769,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.5 #define DEFAULT_YJERK 8.5 #define DEFAULT_ZJERK 0.7 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 4.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.058 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1585,10 +1598,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/gCreate/gMax1.5+/Configuration_adv.h b/config/examples/gCreate/gMax1.5+/Configuration_adv.h index fa0c0e0b23..9a99c63ca8 100644 --- a/config/examples/gCreate/gMax1.5+/Configuration_adv.h +++ b/config/examples/gCreate/gMax1.5+/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/makibox/Configuration.h b/config/examples/makibox/Configuration.h index 4db20e066e..e8482ab639 100644 --- a/config/examples/makibox/Configuration.h +++ b/config/examples/makibox/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -728,6 +728,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 60, 60, 20, 45 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -736,6 +741,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 30, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -749,35 +759,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1561,10 +1574,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/makibox/Configuration_adv.h b/config/examples/makibox/Configuration_adv.h index 411986b0c8..8fbce26e14 100644 --- a/config/examples/makibox/Configuration_adv.h +++ b/config/examples/makibox/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/tvrrug/Round2/Configuration.h b/config/examples/tvrrug/Round2/Configuration.h index 7c193cff3c..8613b81cb7 100644 --- a/config/examples/tvrrug/Round2/Configuration.h +++ b/config/examples/tvrrug/Round2/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 @@ -718,6 +718,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 45 } // David TVRR +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -728,6 +733,11 @@ /* MICHEL: This has an impact on the "ripples" in print walls */ +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -741,35 +751,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 10.0 #define DEFAULT_YJERK 10.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.08 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1553,10 +1566,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/tvrrug/Round2/Configuration_adv.h b/config/examples/tvrrug/Round2/Configuration_adv.h index 82c6bb2ee7..0c830c6a24 100644 --- a/config/examples/tvrrug/Round2/Configuration_adv.h +++ b/config/examples/tvrrug/Round2/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -889,6 +902,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1355,12 +1373,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1799,91 +1817,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2109,7 +2127,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2117,7 +2135,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2125,7 +2143,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2133,7 +2151,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2141,7 +2159,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2149,7 +2167,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2157,7 +2175,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2165,7 +2183,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2173,7 +2191,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2181,7 +2199,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2189,7 +2207,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2197,7 +2215,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2205,7 +2223,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/config/examples/wt150/Configuration.h b/config/examples/wt150/Configuration.h index ff3a7c38d2..8aa573ada6 100644 --- a/config/examples/wt150/Configuration.h +++ b/config/examples/wt150/Configuration.h @@ -72,6 +72,7 @@ // Author info of this build printed to the host during boot and M115 #define STRING_CONFIG_H_AUTHOR "(none, wt150)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) /** * *** VENDORS PLEASE READ *** @@ -383,6 +384,7 @@ * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -400,8 +402,6 @@ * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * - * :{ '0':"Not used", '1':"100k / 4.7k - EPCOS", '331':"(3.3V thermistor 1)", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '512':"100k RPW-Ultra hotend thermistor", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '18':"ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327" '20':"Pt100 (Ultimainboard V2.x)", '201':"Pt100 (Overlord)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '61':"100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup", '66':"Dyze Design 4.7M High Temperature thermistor", '67':"Slice Engineering 450C High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595", '998':"Dummy 1", '999':"Dummy 2", '1000':"Custom thermistor params" } */ #define TEMP_SENSOR_0 -2 #define TEMP_SENSOR_1 0 @@ -730,6 +730,11 @@ */ #define DEFAULT_MAX_FEEDRATE { 83.333333, 83.333333, 19.5, 26.666666 } +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) @@ -738,6 +743,11 @@ */ #define DEFAULT_MAX_ACCELERATION { 1200, 1200, 100, 10000 } +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -751,35 +761,38 @@ #define DEFAULT_TRAVEL_ACCELERATION 1200 // X, Y, Z acceleration for travel (non printing) moves /** - * Junction Deviation - * - * Use Junction Deviation instead of traditional Jerk Limiting - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -//#define JUNCTION_DEVIATION -#if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge -#endif - -/** - * Default Jerk (mm/s) + * Default Jerk limits (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#if DISABLED(JUNCTION_DEVIATION) +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) #define DEFAULT_XJERK 8.0 #define DEFAULT_YJERK 8.0 #define DEFAULT_ZJERK 0.3 + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif #endif #define DEFAULT_EJERK 5.0 // May be used by Linear Advance +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.021 // (mm) Distance from real junction edge +#endif + /** * S-Curve Acceleration * @@ -1563,10 +1576,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el-gr, es, eu, fi, fr, gl, hr, it, jp-kana, - * ko_KR, nl, pl, pt, pt-br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, it, jp_kana, + * ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/config/examples/wt150/Configuration_adv.h b/config/examples/wt150/Configuration_adv.h index 2a02e84234..7301b38229 100644 --- a/config/examples/wt150/Configuration_adv.h +++ b/config/examples/wt150/Configuration_adv.h @@ -379,6 +379,7 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. @@ -602,20 +603,32 @@ //#define Z_STEPPER_AUTO_ALIGN #if ENABLED(Z_STEPPER_AUTO_ALIGN) // Define probe X and Y positions for Z1, Z2 [, Z3] - #define Z_STEPPER_ALIGN_X { 10, 150, 290 } - #define Z_STEPPER_ALIGN_Y { 290, 10, 290 } + #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } } + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Currently requires triple stepper drivers. + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down. + // In case the stepper (spindle) position is further out than the test point. + // Use a value > 1. NOTE: This may cause instability + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif + // Set number of iterations to align #define Z_STEPPER_ALIGN_ITERATIONS 3 + // Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G34 // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline G34 will handle - // Use the amplification factor to de-/increase correction step. - // In case the stepper (spindle) position is further out than the test point - // Use a value > 1. NOTE: This may cause instability - #define Z_STEPPER_ALIGN_AMP 1.0 // Stop criterion. If the accuracy is better than this stop iterating early #define Z_STEPPER_ALIGN_ACC 0.02 #endif @@ -890,6 +903,11 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY +#if HAS_PRINT_PROGRESS + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits (Graphical LCD only) + //#define SHOW_REMAINING_TIME // Display estimated time to completion (Graphical LCD only) +#endif + #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) @@ -1356,12 +1374,12 @@ * Useful to get probe points to exact positions on targets or * to allow leveling to avoid plate clamps on only specific * sides of the bed. - * + * * If you are replacing the prior *_PROBE_BED_POSITION options, * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as + * RIGHT and REAR would be the inverse such as * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * + * * This will allow all positions to match at compilation, however * should the probe position be modified with M851XY then the * probe points will follow. This prevents any change from causing @@ -1800,91 +1818,91 @@ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_MICROSTEPS 16 // 0..256 #define X_RSENSE 0.11 - #define X_CHAIN_POS 0 // 0 - Not chained, 1 - MCU MOSI connected, 2 - next in chain, ... + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... #endif #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_MICROSTEPS 16 #define X2_RSENSE 0.11 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y) #define Y_CURRENT 800 #define Y_MICROSTEPS 16 #define Y_RSENSE 0.11 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_MICROSTEPS 16 #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z) #define Z_CURRENT 800 #define Z_MICROSTEPS 16 #define Z_RSENSE 0.11 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_MICROSTEPS 16 #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E0) #define E0_CURRENT 800 #define E0_MICROSTEPS 16 #define E0_RSENSE 0.11 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 #define E1_MICROSTEPS 16 #define E1_RSENSE 0.11 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 #define E2_MICROSTEPS 16 #define E2_RSENSE 0.11 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 #define E3_MICROSTEPS 16 #define E3_RSENSE 0.11 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 #define E4_MICROSTEPS 16 #define E4_RSENSE 0.11 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 #define E5_MICROSTEPS 16 #define E5_RSENSE 0.11 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** @@ -2110,7 +2128,7 @@ #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current (VALID: 375 x (1 - 16) - 6A max - rounds down) #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - #define X_CHAIN_POS 0 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_CHAIN_POS -1 // Position in SPI chain. (<=0 : Not in chain. 1 : Nearest MOSI) #endif #if AXIS_DRIVER_TYPE_X2(L6470) @@ -2118,7 +2136,7 @@ #define X2_OVERCURRENT 2000 #define X2_STALLCURRENT 1500 #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS 0 + #define X2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y(L6470) @@ -2126,7 +2144,7 @@ #define Y_OVERCURRENT 2000 #define Y_STALLCURRENT 1500 #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS 0 + #define Y_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Y2(L6470) @@ -2134,7 +2152,7 @@ #define Y2_OVERCURRENT 2000 #define Y2_STALLCURRENT 1500 #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS 0 + #define Y2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z(L6470) @@ -2142,7 +2160,7 @@ #define Z_OVERCURRENT 2000 #define Z_STALLCURRENT 1500 #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS 0 + #define Z_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z2(L6470) @@ -2150,7 +2168,7 @@ #define Z2_OVERCURRENT 2000 #define Z2_STALLCURRENT 1500 #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS 0 + #define Z2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_Z3(L6470) @@ -2158,7 +2176,7 @@ #define Z3_OVERCURRENT 2000 #define Z3_STALLCURRENT 1500 #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS 0 + #define Z3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E0(L6470) @@ -2166,7 +2184,7 @@ #define E0_OVERCURRENT 2000 #define E0_STALLCURRENT 1500 #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS 0 + #define E0_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E1(L6470) @@ -2174,7 +2192,7 @@ #define E1_OVERCURRENT 2000 #define E1_STALLCURRENT 1500 #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS 0 + #define E1_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E2(L6470) @@ -2182,7 +2200,7 @@ #define E2_OVERCURRENT 2000 #define E2_STALLCURRENT 1500 #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS 0 + #define E2_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E3(L6470) @@ -2190,7 +2208,7 @@ #define E3_OVERCURRENT 2000 #define E3_STALLCURRENT 1500 #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS 0 + #define E3_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E4(L6470) @@ -2198,7 +2216,7 @@ #define E4_OVERCURRENT 2000 #define E4_STALLCURRENT 1500 #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS 0 + #define E4_CHAIN_POS -1 #endif #if AXIS_DRIVER_TYPE_E5(L6470) @@ -2206,7 +2224,7 @@ #define E5_OVERCURRENT 2000 #define E5_STALLCURRENT 1500 #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS 0 + #define E5_CHAIN_POS -1 #endif /** diff --git a/platformio.ini b/platformio.ini index 190c8af5da..2597b4f7de 100644 --- a/platformio.ini +++ b/platformio.ini @@ -28,7 +28,7 @@ lib_deps = U8glib-HAL=https://github.com/MarlinFirmware/U8glib-HAL/archive/bugfix.zip LiquidCrystal@1.3.4 TMCStepper@>=0.5.0,<1.0.0 - Adafruit NeoPixel@1.1.3 + Adafruit NeoPixel@1.2.5 LiquidTWI2=https://github.com/lincomatic/LiquidTWI2/archive/master.zip Arduino-L6470=https://github.com/ameyer/Arduino-L6470/archive/dev.zip SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip @@ -253,7 +253,7 @@ monitor_speed = 250000 # # STM32F103RE # -[env:STM32F103R] +[env:STM32F103RE] platform = ststm32 framework = arduino board = genericSTM32F103RE @@ -262,20 +262,20 @@ build_flags = !python Marlin/src/HAL/HAL_STM32F1/build_flags.py -DDEBUG_LEVEL=0 build_unflags = -std=gnu++11 lib_deps = ${common.lib_deps} -lib_ignore = U8glib-HAL, Adafruit NeoPixel, SPI +lib_ignore = Adafruit NeoPixel, SPI src_filter = ${common.default_src_filter} + monitor_speed = 250000 # -# STM32F103R_fysetc +# STM32F103RC_fysetc # -[env:STM32F103R_fysetc] +[env:STM32F103RC_fysetc] platform = ststm32 framework = arduino board = genericSTM32F103RC #board_build.core = maple platform_packages = tool-stm32duino -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103R_fysetc.py +extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py build_flags = !python Marlin/src/HAL/HAL_STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DDEBUG_LEVEL=0 -DHAVE_SW_SERIAL @@ -292,12 +292,12 @@ upload_protocol = serial # # BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) # -[env:STM32F103R_bigtree] +[env:STM32F103RC_bigtree] platform = ststm32 framework = arduino board = genericSTM32F103RC platform_packages = tool-stm32duino -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F1_SKR_MINI.py +extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py build_flags = !python Marlin/src/HAL/HAL_STM32F1/build_flags.py ${common.build_flags} -DDEBUG_LEVEL=0 -std=gnu++14 build_unflags = -std=gnu++11 @@ -308,12 +308,12 @@ monitor_speed = 115200 upload_protocol = stlink debug_tool = stlink -[env:STM32F103R_bigtree_USB] +[env:STM32F103RC_bigtree_USB] platform = ststm32 framework = arduino board = genericSTM32F103RC platform_packages = tool-stm32duino -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F1_SKR_MINI.py +extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py build_flags = !python Marlin/src/HAL/HAL_STM32F1/build_flags.py ${common.build_flags} -DDEBUG_LEVEL=0 -DUSE_USB_COMPOSITE -std=gnu++14 build_unflags = -std=gnu++11 @@ -366,12 +366,12 @@ monitor_speed = 250000 # # Longer 3D board in Alfawise U20 (STM32F103VET6) # -[env:STM32F103V_longer] +[env:STM32F103VE_longer] platform = ststm32 framework = arduino board = genericSTM32F103VE monitor_speed = 250000 -extra_scripts = buildroot/share/PlatformIO/scripts/longer_STM32.py +extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py build_flags = !python Marlin/src/HAL/HAL_STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -USERIAL_USB -DSTM32F1xx -DU20 -DTS_V12 @@ -543,9 +543,9 @@ src_filter = ${common.default_src_filter} + monitor_speed = 250000 # -# Malyan M200 (STM32F1) +# Malyan M200 (STM32F103CB) # -[env:malyanm200] +[env:STM32F103CB_malyan] platform = ststm32 framework = arduino board = malyanM200 @@ -591,7 +591,7 @@ monitor_speed = 250000 # [env:linux_native] platform = native -build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ +build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined src_build_flags = -Wall -IMarlin/src/HAL/HAL_LINUX/include build_unflags = -Wall lib_ldf_mode = off