From 8bd0501bdf4b264e6d9eb63db64564f90d4253e5 Mon Sep 17 00:00:00 2001 From: InsanityAutomation Date: Sun, 17 Sep 2023 17:11:39 -0400 Subject: [PATCH] Allow bed tramming with probe to automatically calculate points by probe limits --- Marlin/src/inc/SanityCheck.h | 7 ++++--- Marlin/src/lcd/e3v2/proui/dwin.cpp | 7 ++++++- .../dgus_e3s1pro/DGUSReturnKeyCodeHandler.cpp | 7 ++++++- .../lcd/extui/dgus_reloaded/DGUSRxHandler.cpp | 12 +++++++++++- Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp | 7 ++++++- Marlin/src/lcd/extui/ui_api.cpp | 1 + Marlin/src/lcd/extui/ui_api.h | 1 + Marlin/src/lcd/menu/menu_bed_tramming.cpp | 17 +++++++++-------- 8 files changed, 44 insertions(+), 15 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 38e214a65f..799981faba 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1537,14 +1537,15 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #if ENABLED(LCD_BED_TRAMMING) - #ifndef BED_TRAMMING_INSET_LFRB - #error "LCD_BED_TRAMMING requires BED_TRAMMING_INSET_LFRB values." - #elif ENABLED(BED_TRAMMING_USE_PROBE) + #if ENABLED(BED_TRAMMING_USE_PROBE) #if !HAS_BED_PROBE #error "BED_TRAMMING_USE_PROBE requires a real probe." #elif ENABLED(SENSORLESS_PROBING) #error "BED_TRAMMING_USE_PROBE is incompatible with SENSORLESS_PROBING." #endif + #else + #ifndef BED_TRAMMING_INSET_LFRB + #error "LCD_BED_TRAMMING requires BED_TRAMMING_INSET_LFRB values." #endif #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 4924575fc5..b4a3e5ba9c 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -199,7 +199,7 @@ typedef struct { } select_t; select_t select_page{0}, select_print{0}; -#if ENABLED(LCD_BED_TRAMMING) +#if ENABLED(LCD_BED_TRAMMING) && DISABLED(BED_TRAMMING_USE_PROBE) constexpr float bed_tramming_inset_lfbr[] = BED_TRAMMING_INSET_LFRB; #endif @@ -2290,6 +2290,11 @@ void setFlow() { setPIntOnClick(MIN_PRINT_FLOW, MAX_PRINT_FLOW, []{ planner.refr #if ENABLED(LCD_BED_TRAMMING) void tramXY(const uint8_t point, float &x, float &y) { + #if ENABLED(BED_TRAMMING_USE_PROBE) + float bed_tramming_inset_lfbr[] = {X_MIN_BED + probe.min_x(), Y_MIN_BED + probe.min_y(), + X_MAX_BED - probe.max_x(), Y_MAX_BED - probe.max_y() }; + #endif + switch (point) { case 0: LCD_MESSAGE(MSG_TRAM_FL); diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSReturnKeyCodeHandler.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSReturnKeyCodeHandler.cpp index f6d2e2bb89..92a7ad2928 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSReturnKeyCodeHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSReturnKeyCodeHandler.cpp @@ -395,7 +395,12 @@ void DGUSReturnKeyCodeHandler::Command_SettingsMenu(DGUS_VP &vp, void *data) { } static void _gotoTrammingPoint(unsigned char point) { - constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + #if ENABLED(BED_TRAMMING_USE_PROBE) + float lfrb[4] = {X_MIN_BED + probe.min_x(), Y_MIN_BED + probe.min_y(), + X_MAX_BED - probe.max_x(), Y_MAX_BED - probe.max_y() }; + #else + constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + #endif float x, y; switch (point) { diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp index aa58e85692..074fc577fa 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp @@ -38,6 +38,9 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../../../feature/pause.h" #endif +#if ENABLED(BED_TRAMMING_USE_PROBE) + #include "../../../module/probe.h" +#endif #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../feature/powerloss.h" #endif @@ -464,7 +467,14 @@ void DGUSRxHandler::moveToPoint(DGUS_VP &vp, void *data_ptr) { } const uint8_t point = ((uint8_t*)data_ptr)[1]; - constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + + #if ENABLED(BED_TRAMMING_USE_PROBE) + float lfrb[4] = {X_MIN_BED + probe.min_x(), Y_MIN_BED + probe.min_y(), + X_MAX_BED - probe.max_x(), Y_MAX_BED - probe.max_y() }; + #else + constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + #endif + float x, y; switch (point) { diff --git a/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp b/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp index 2b14f8bbaa..3a14278bea 100644 --- a/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp +++ b/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp @@ -1045,7 +1045,12 @@ void RTSSHOW::RTS_HandleData() return; } - constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + #if ENABLED(LCD_BED_TRAMMING) && DISABLED(BED_TRAMMING_USE_PROBE) + constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + #else if ENABLED(BED_TRAMMING_USE_PROBE) + float lfrb[4] = getBedProbeLimits(); + #endif + //SERIAL_ECHOLNPGM_P(PSTR("BeginSwitch")); switch (Checkkey) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c1f5aa0f03..1cc7181ba4 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -922,6 +922,7 @@ namespace ExtUI { #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t axis) { return probe.offset.pos[axis]; } void setProbeOffset_mm(const_float_t val, const axis_t axis) { probe.offset.pos[axis] = val; } + float[4] getBedProbeLimits() {return {probe.min_x(), probe.min_y(), probe.max_x(), probe.max_y()};} #endif #if ENABLED(BACKLASH_GCODE) diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 7feb2c4297..19b7866891 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -292,6 +292,7 @@ namespace ExtUI { #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); void setProbeOffset_mm(const_float_t, const axis_t); + float[4] getBedProbeLimits(); #endif #if ENABLED(BACKLASH_GCODE) diff --git a/Marlin/src/lcd/menu/menu_bed_tramming.cpp b/Marlin/src/lcd/menu/menu_bed_tramming.cpp index b6b3e72124..34e5142811 100644 --- a/Marlin/src/lcd/menu/menu_bed_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_bed_tramming.cpp @@ -94,16 +94,22 @@ static_assert(COUNT(lco) == 4 || lcodiff == 1 || lcodiff == 3, "The first two BE constexpr int nr_edge_points = tramming_3_points ? 3 : 4; constexpr int available_points = nr_edge_points + ENABLED(BED_TRAMMING_INCLUDE_CENTER); constexpr int center_index = TERN(BED_TRAMMING_INCLUDE_CENTER, available_points - 1, -1); -constexpr float inset_lfrb[4] = BED_TRAMMING_INSET_LFRB; -constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] }, +#if DISABLED(BED_TRAMMING_USE_PROBE) + constexpr float inset_lfrb[4] = BED_TRAMMING_INSET_LFRB; + constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] }, rb { (X_MAX_BED) - inset_lfrb[2], (Y_MAX_BED) - inset_lfrb[3] }; - +#endif static int8_t bed_corner; /** * Move to the next corner coordinates */ static void _lcd_goto_next_corner() { + #if ENABLED(BED_TRAMMING_USE_PROBE) + xy_pos_t lf = {X_MIN_BED + probe.min_x(), Y_MIN_BED + probe.min_y() }, + rb = {X_MAX_BED - probe.max_x(), Y_MAX_BED - probe.max_y() }; + #endif + xy_pos_t corner_point = lf; // Left front if (tramming_3_points) { @@ -165,11 +171,6 @@ static void _lcd_goto_next_corner() { #if ENABLED(BED_TRAMMING_USE_PROBE) - #define VALIDATE_POINT(X, Y, STR) static_assert(Probe::build_time::can_reach((X), (Y)), \ - "BED_TRAMMING_INSET_LFRB " STR " inset is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.") - VALIDATE_POINT(lf.x, Y_CENTER, "left"); VALIDATE_POINT(X_CENTER, lf.y, "front"); - VALIDATE_POINT(rb.x, Y_CENTER, "right"); VALIDATE_POINT(X_CENTER, rb.y, "back"); - #ifndef PAGE_CONTAINS #define PAGE_CONTAINS(...) true #endif