From 62c3cf41b068e32775b9e4cba077a8c1ddad1ce2 Mon Sep 17 00:00:00 2001 From: kisslorand Date: Sun, 20 Aug 2023 23:00:18 +0300 Subject: [PATCH] Corner Leveling Marlin Fix --- README.md | 2 +- TFT/src/User/API/FanControl.c | 2 +- TFT/src/User/API/LevelingControl.c | 4 +- TFT/src/User/API/Settings.c | 9 +- TFT/src/User/API/Settings.h | 13 +-- TFT/src/User/API/config.c | 20 ++-- TFT/src/User/API/config.h | 5 +- TFT/src/User/API/config.inc | 5 +- TFT/src/User/API/interfaceCmd.c | 2 +- TFT/src/User/API/parseACK.c | 66 +++++++----- TFT/src/User/Configuration.h | 12 +-- TFT/src/User/Menu/LevelCorner.c | 167 +++++++++++------------------ TFT/src/User/Menu/Leveling.c | 63 +++-------- TFT/src/User/Menu/Popup.c | 6 +- TFT/src/User/Menu/Terminal.c | 4 +- TFT/src/User/config.ini | 23 ++-- TFT/src/User/config_rrf.ini | 21 ++-- 17 files changed, 192 insertions(+), 232 deletions(-) diff --git a/README.md b/README.md index 6a214abb2b..b7598a5952 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ the following options must be enabled in Marlin firmware. `AUTO_REPORT_TEMPERATURES` (in Configuration_adv.h)
`AUTO_REPORT_POSITION` (in Configuration_adv.h)
`EXTENDED_CAPABILITIES_REPORT` (in Configuration_adv.h)
-`M115_GEOMETRY_REPORT` (in Configuration_adv.h)
+`MIN/MAX_SOFTWARE_ENDSTOPS` (in Configuration.h)
`M114_DETAIL` (in Configuration_adv.h)
`REPORT_FAN_CHANGE` (in Configuration_adv.h)
diff --git a/TFT/src/User/API/FanControl.c b/TFT/src/User/API/FanControl.c index 3a468c0c5a..776d9b7c71 100644 --- a/TFT/src/User/API/FanControl.c +++ b/TFT/src/User/API/FanControl.c @@ -27,7 +27,7 @@ bool fanIsValid(const uint8_t index) return false; else if (!infoSettings.ctrl_fan_en && index >= MAX_COOLING_FAN_COUNT) // controller cooling fan is disabled return false; - else if (index >= (MAX_COOLING_FAN_COUNT + MAX_CRTL_FAN_COUNT)) // invalid controller cooling fan index (not active/idle) + else if (index >= (MAX_COOLING_FAN_COUNT + MAX_CTRL_FAN_COUNT)) // invalid controller cooling fan index (not active/idle) return false; else return true; diff --git a/TFT/src/User/API/LevelingControl.c b/TFT/src/User/API/LevelingControl.c index 21cd6ce8ff..dae467469b 100644 --- a/TFT/src/User/API/LevelingControl.c +++ b/TFT/src/User/API/LevelingControl.c @@ -12,8 +12,8 @@ float probedZ = 0.0f; // last Z offset measured by probe int16_t setCoordValue(AXIS axis, ALIGN_POSITION align) { - return ((align == LEFT || align == BOTTOM) ? infoSettings.machine_size_min[axis] + infoSettings.level_edge - : infoSettings.machine_size_max[axis] - infoSettings.level_edge) - infoParameters.HomeOffset[axis]; + return ((align == LEFT || align == BOTTOM) ? infoSettings.level_edge + : infoSettings.bed_size[axis] - infoSettings.level_edge); } void levelingGetPointCoords(LEVELING_POINT_COORDS coords) diff --git a/TFT/src/User/API/Settings.c b/TFT/src/User/API/Settings.c index ac2a480535..ac0f21d32c 100644 --- a/TFT/src/User/API/Settings.c +++ b/TFT/src/User/API/Settings.c @@ -157,8 +157,13 @@ void initSettings(void) for (int i = 0; i < AXIS_NUM; i++) // x, y, z { - infoSettings.machine_size_min[i] = default_size_min[i]; - infoSettings.machine_size_max[i] = default_size_max[i]; + infoSettings.endstop_min[i] = default_size_min[i]; + infoSettings.endstop_max[i] = default_size_max[i]; + } + + for (int i = 0; i < AXIS_NUM - 1; i++) // x, y + { + infoSettings.bed_size[i] = default_size_max[i]; } for (int i = 0; i < SPEED_COUNT; i++) diff --git a/TFT/src/User/API/Settings.h b/TFT/src/User/API/Settings.h index 499116f564..a945f22a00 100644 --- a/TFT/src/User/API/Settings.h +++ b/TFT/src/User/API/Settings.h @@ -14,10 +14,10 @@ extern "C" { // Config version support (format YYYYMMDD) // change if new elements/keywords are added/removed/changed in the Configuration.h // this number should match CONFIG_VERSION in Configuration.h -#define CONFIG_SUPPPORT 20230821 +#define CONFIG_SUPPPORT 20231001 #define FONT_FLASH_SIGN 20230821 // (YYYYMMDD) change if fonts require updating -#define CONFIG_FLASH_SIGN 20230821 // (YYYYMMDD) change if any keyword(s) in config.ini is added or removed +#define CONFIG_FLASH_SIGN 20231001 // (YYYYMMDD) change if any keyword(s) in config.ini is added or removed #define LANGUAGE_FLASH_SIGN 20230821 // (YYYYMMDD) change if any keyword(s) in language pack is added or removed #define ICON_FLASH_SIGN 20230821 // (YYYYMMDD) change if any icon(s) is added or removed @@ -34,8 +34,8 @@ extern "C" { #define MAX_HEATER_COUNT (MAX_HOTEND_COUNT + 2) // hotends + bed + chamber #define MAX_HEATER_PID_COUNT (MAX_HOTEND_COUNT + 1) // hotends + bed #define MAX_COOLING_FAN_COUNT 6 -#define MAX_CRTL_FAN_COUNT 2 -#define MAX_FAN_COUNT (MAX_COOLING_FAN_COUNT + MAX_CRTL_FAN_COUNT) +#define MAX_CTRL_FAN_COUNT 2 +#define MAX_FAN_COUNT (MAX_COOLING_FAN_COUNT + MAX_CTRL_FAN_COUNT) #define AXIS_NUM (TOTAL_AXIS - 1) #define SPEED_COUNT 3 @@ -222,8 +222,9 @@ typedef struct uint16_t max_temp[MAX_HEATER_COUNT]; // hotends + bed + chamber uint16_t min_ext_temp; uint8_t fan_max[MAX_FAN_COUNT]; - int16_t machine_size_min[AXIS_NUM]; // X, Y, Z - int16_t machine_size_max[AXIS_NUM]; // X, Y, Z + int16_t endstop_min[AXIS_NUM]; // X, Y, Z + int16_t endstop_max[AXIS_NUM]; // X, Y, Z + uint16_t bed_size[AXIS_NUM - 1]; // X, Y uint16_t xy_speed[SPEED_COUNT]; uint16_t z_speed[SPEED_COUNT]; uint16_t ext_speed[SPEED_COUNT]; diff --git a/TFT/src/User/API/config.c b/TFT/src/User/API/config.c index b5d05a67b1..9635a303d2 100644 --- a/TFT/src/User/API/config.c +++ b/TFT/src/User/API/config.c @@ -774,18 +774,22 @@ void parseConfigKey(uint16_t index) if (key_seen("CtI:")) SET_VALID_INT_VALUE(infoSettings.fan_max[7], MIN_FAN_SPEED, MAX_FAN_SPEED); break; - case C_INDEX_SIZE_MIN: - if (key_seen("X")) SET_VALID_INT_VALUE(infoSettings.machine_size_min[X_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); - if (key_seen("Y")) SET_VALID_INT_VALUE(infoSettings.machine_size_min[Y_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); - if (key_seen("Z")) SET_VALID_INT_VALUE(infoSettings.machine_size_min[Z_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + case C_INDEX_ENDSTOP_MIN: + if (key_seen("X")) SET_VALID_INT_VALUE(infoSettings.endstop_min[X_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + if (key_seen("Y")) SET_VALID_INT_VALUE(infoSettings.endstop_min[Y_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + if (key_seen("Z")) SET_VALID_INT_VALUE(infoSettings.endstop_min[Z_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); break; - case C_INDEX_SIZE_MAX: - if (key_seen("X")) SET_VALID_INT_VALUE(infoSettings.machine_size_max[X_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); - if (key_seen("Y")) SET_VALID_INT_VALUE(infoSettings.machine_size_max[Y_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); - if (key_seen("Z")) SET_VALID_INT_VALUE(infoSettings.machine_size_max[Z_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + case C_INDEX_ENDSTOP_MAX: + if (key_seen("X")) SET_VALID_INT_VALUE(infoSettings.endstop_max[X_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + if (key_seen("Y")) SET_VALID_INT_VALUE(infoSettings.endstop_max[Y_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); + if (key_seen("Z")) SET_VALID_INT_VALUE(infoSettings.endstop_max[Z_AXIS], MIN_SIZE_LIMIT, MAX_SIZE_LIMIT); break; + case C_INDEX_BED_SIZE: + if (key_seen("X")) SET_VALID_INT_VALUE(infoSettings.bed_size[X_AXIS], 0, MAX_SIZE_LIMIT); + if (key_seen("Y")) SET_VALID_INT_VALUE(infoSettings.bed_size[Y_AXIS], 0, MAX_SIZE_LIMIT); + case C_INDEX_XY_SPEED: if (key_seen("S")) SET_VALID_INT_VALUE(infoSettings.xy_speed[0], MIN_SPEED_LIMIT, MAX_SPEED_LIMIT); if (key_seen("N")) SET_VALID_INT_VALUE(infoSettings.xy_speed[1], MIN_SPEED_LIMIT, MAX_SPEED_LIMIT); diff --git a/TFT/src/User/API/config.h b/TFT/src/User/API/config.h index 2e1eddeedb..14c3fde638 100644 --- a/TFT/src/User/API/config.h +++ b/TFT/src/User/API/config.h @@ -69,8 +69,9 @@ extern "C" { #define CONFIG_MAX_TEMP "max_temp:" #define CONFIG_MIN_TEMP "min_temp:" #define CONFIG_FAN_MAX "fan_max:" -#define CONFIG_SIZE_MIN "size_min:" -#define CONFIG_SIZE_MAX "size_max:" +#define CONFIG_ENDSTOP_MIN "pos_min:" +#define CONFIG_ENDSTOP_MAX "pos_max:" +#define CONFIG_BED_SIZE "bed_size:" #define CONFIG_XY_SPEED "xy_speed:" #define CONFIG_Z_SPEED "z_speed:" #define CONFIG_EXT_SPEED "ext_speed:" diff --git a/TFT/src/User/API/config.inc b/TFT/src/User/API/config.inc index 35b9f35f65..67fd545f9a 100644 --- a/TFT/src/User/API/config.inc +++ b/TFT/src/User/API/config.inc @@ -62,8 +62,9 @@ X_CONFIG (CONTROLLER_FAN) X_CONFIG (MAX_TEMP) X_CONFIG (MIN_TEMP) X_CONFIG (FAN_MAX) -X_CONFIG (SIZE_MIN) -X_CONFIG (SIZE_MAX) +X_CONFIG (ENDSTOP_MIN) +X_CONFIG (ENDSTOP_MAX) +X_CONFIG (BED_SIZE) X_CONFIG (XY_SPEED) X_CONFIG (Z_SPEED) X_CONFIG (EXT_SPEED) diff --git a/TFT/src/User/API/interfaceCmd.c b/TFT/src/User/API/interfaceCmd.c index 8173857671..b25debedf5 100644 --- a/TFT/src/User/API/interfaceCmd.c +++ b/TFT/src/User/API/interfaceCmd.c @@ -830,7 +830,7 @@ void sendQueueCmd(void) Serial_Forward(cmd_port_index, buf); sprintf(buf, "Cap:FAN_NUM:%d\n", infoSettings.fan_count); Serial_Forward(cmd_port_index, buf); - sprintf(buf, "Cap:FAN_CTRL_NUM:%d\n", infoSettings.ctrl_fan_en ? MAX_CRTL_FAN_COUNT : 0); + sprintf(buf, "Cap:FAN_CTRL_NUM:%d\n", infoSettings.ctrl_fan_en ? MAX_CTRL_FAN_COUNT : 0); Serial_Forward(cmd_port_index, buf); Serial_Forward(cmd_port_index, "ok\n"); diff --git a/TFT/src/User/API/parseACK.c b/TFT/src/User/API/parseACK.c index 40e3329f32..68749eafb7 100644 --- a/TFT/src/User/API/parseACK.c +++ b/TFT/src/User/API/parseACK.c @@ -643,7 +643,7 @@ void parseACK(void) speedQuerySetWait(false); } // parse and store flow rate percentage - else if (ack_seen("Flow: ")) + else if (ack_seen("Flow:")) { speedSetCurPercent(1, ack_value()); speedQuerySetWait(false); @@ -784,22 +784,23 @@ void parseACK(void) // Tuning parsed responses //---------------------------------------- - // parse and store build volume size - else if (ack_seen("work:")) + // parse and store soft endstops (M211) + else if (GET_BIT(infoMachineSettings.softwareEndstops, 1)) // check "M211 seen" flag { - if (ack_continue_seen("min:")) + if (ack_seen("Min:")) { - if (ack_continue_seen("x:")) infoSettings.machine_size_min[X_AXIS] = ack_value(); - if (ack_continue_seen("y:")) infoSettings.machine_size_min[Y_AXIS] = ack_value(); - if (ack_continue_seen("z:")) infoSettings.machine_size_min[Z_AXIS] = ack_value(); - } + // check endstop minimum values + if (ack_continue_seen("X")) infoSettings.endstop_min[X_AXIS] = ack_value(); + if (ack_continue_seen("Y")) infoSettings.endstop_min[Y_AXIS] = ack_value(); + if (ack_continue_seen("Z")) infoSettings.endstop_min[Z_AXIS] = ack_value(); - if (ack_continue_seen("max:")) - { - if (ack_continue_seen("x:")) infoSettings.machine_size_max[X_AXIS] = ack_value(); - if (ack_continue_seen("y:")) infoSettings.machine_size_max[Y_AXIS] = ack_value(); - if (ack_continue_seen("z:")) infoSettings.machine_size_max[Z_AXIS] = ack_value(); + // check endstop maximum values + if (ack_continue_seen("X")) infoSettings.endstop_max[X_AXIS] = ack_value(); + if (ack_continue_seen("Y")) infoSettings.endstop_max[Y_AXIS] = ack_value(); + if (ack_continue_seen("Z")) infoSettings.endstop_max[Z_AXIS] = ack_value(); } + + SET_BIT_OFF(infoMachineSettings.softwareEndstops, 1); // clear "M211 seen" flag } // parse M48, repeatability test else if (ack_starts_with("Mean:")) @@ -808,22 +809,22 @@ void parseACK(void) sprintf(tmpMsg, "Mean: %0.5f", ack_value()); - if (ack_continue_seen("Min: ")) - sprintf(&tmpMsg[strlen(tmpMsg)], "\nMin: %0.5f", ack_value()); - if (ack_continue_seen("Max: ")) - sprintf(&tmpMsg[strlen(tmpMsg)], "\nMax: %0.5f", ack_value()); - if (ack_continue_seen("Range: ")) - sprintf(&tmpMsg[strlen(tmpMsg)], "\nRange: %0.5f", ack_value()); + if (ack_continue_seen("Min:")) + sprintf(strchr(tmpMsg, '\0'), "\nMin: %0.5f", ack_value()); + if (ack_continue_seen("Max:")) + sprintf(strchr(tmpMsg, '\0'), "\nMax: %0.5f", ack_value()); + if (ack_continue_seen("Range:")) + sprintf(strchr(tmpMsg, '\0'), "\nRange: %0.5f", ack_value()); popupReminder(DIALOG_TYPE_INFO, (uint8_t *)"Repeatability Test", (uint8_t *)tmpMsg); } // parse M48, standard deviation - else if (ack_seen("Standard Deviation: ")) + else if (ack_seen("Standard Deviation:")) { char tmpMsg[100]; char * dialogMsg = (char *)getDialogMsgStr(); - if (memcmp(dialogMsg, "Mean: ", 6) == 0) + if (memcmp(dialogMsg, "Mean:", 5) == 0) { levelingSetProbedPoint(-1, -1, ack_value()); // save probed Z value sprintf(tmpMsg, "%s\nStandard Deviation: %0.5f", dialogMsg, ack_value()); @@ -835,10 +836,12 @@ void parseACK(void) else if (ack_starts_with("M211") || ack_seen("Soft endstops")) { uint8_t curValue = infoMachineSettings.softwareEndstops; - infoMachineSettings.softwareEndstops = ack_continue_seen("ON"); + SET_BIT_VALUE(infoMachineSettings.softwareEndstops, 0, ack_continue_seen("ON")); // set ON/Off bit if (curValue != infoMachineSettings.softwareEndstops) // send a notification only if status is changed addToast(DIALOG_TYPE_INFO, ack_cache); + + SET_BIT_ON(infoMachineSettings.softwareEndstops, 1); // set "M211 seen" flag } // parse M303, PID autotune finished message else if (ack_starts_with("PID Autotune finished")) @@ -916,16 +919,23 @@ void parseACK(void) mblUpdateStatus(true); } // parse G30, feedback to get the 4 corners Z value returned by Marlin for LevelCorner menu - else if (ack_seen("Bed X: ")) + else if (ack_seen("Bed X:")) { float x = ack_value(); - float y = 0; - if (ack_continue_seen("Y: ")) - y = ack_value(); + if (ack_continue_seen("Y:")) + { + float y = ack_value(); - if (ack_continue_seen("Z: ")) - levelingSetProbedPoint(x, y, ack_value()); // save probed Z value + if (ack_continue_seen("Z:")) + levelingSetProbedPoint(x, y, ack_value()); // save probed Z value + } + } + // parse G30 coordinate unreachable message + else if (ack_seen("Z Probe Past Bed")) + { + levelingSetProbedPoint(-1, -1, 0); // cancel waiting for coordinates + BUZZER_PLAY(SOUND_ERROR); } #if DELTA_PROBE_TYPE != 0 // parse and store Delta calibration settings diff --git a/TFT/src/User/Configuration.h b/TFT/src/User/Configuration.h index 679fd4772e..5bcb6bd0e1 100644 --- a/TFT/src/User/Configuration.h +++ b/TFT/src/User/Configuration.h @@ -1,7 +1,7 @@ #ifndef _CONFIGURATION_H_ #define _CONFIGURATION_H_ -#define CONFIG_VERSION 20230821 +#define CONFIG_VERSION 20231001 //==================================================================================================== //=============================== Settings Configurable On config.ini ================================ @@ -491,11 +491,11 @@ #define FAN_MAX {255, 255, 255, 255, 255, 255, 255, 255} // Default: {255, 255, 255, 255, 255, 255, 255, 255} /** - * Machine Size / Build Area - * The TFT will auto-detect the machine size (min and max) in Marlin firmware (requires - * enabling "M115_GEOMETRY_REPORT" in Configuration_adv.h in Marlin firmware). - * Format: [size_min: X Y Z] - * [size_max: X Y Z] + * Motion limits + * This sets the minimum and maximum motion limits. The TFT can autodetect it from an M211 respone. + * For this "MIN/MAX_SOFTWARE_ENDSTOPS" must be enabled in Marlin's "Configuration.h". + * Format: [pos_min: X Y Z] + * [pos_max: X Y Z] * Unit: [distance in mm] * Value range: [min: -2000, max: 2000] */ diff --git a/TFT/src/User/Menu/LevelCorner.c b/TFT/src/User/Menu/LevelCorner.c index df71ffa665..d322245374 100644 --- a/TFT/src/User/Menu/LevelCorner.c +++ b/TFT/src/User/Menu/LevelCorner.c @@ -1,91 +1,60 @@ #include "LevelCorner.h" #include "includes.h" -const uint8_t valIconIndex[LEVELING_POINT_COUNT] = {4, 5, 1, 0, 3}; +const uint8_t valIconIndex[] = {KEY_ICON_4, KEY_ICON_5, KEY_ICON_1, KEY_ICON_0}; // correlation between KEY position and measure point index -// buffer current Z value measured in Level Corner = {position 1, position 2, position 3, position 4, probe accuracy(M48)} -float levelCornerPosition[LEVELING_POINT_COUNT] = {0}; +// buffer current Z value measured in Level Corner = {position 1, position 2, position 3, position 4} +float levelCornerPosition[LEVELING_POINT_COUNT - 1] = {0}; int16_t origLevelEdge = -1; -uint8_t getLevelEdgeMin(void) +static uint8_t getLevelEdgeMin(void) { - // min edge limit for the probe with probe offset set in parseACK.c - int16_t maxXedge = getParameter(P_PROBE_OFFSET, AXIS_INDEX_X) + getParameter(P_HOME_OFFSET, AXIS_INDEX_X); - int16_t maxYedge = getParameter(P_PROBE_OFFSET, AXIS_INDEX_Y) + getParameter(P_HOME_OFFSET, AXIS_INDEX_Y); + uint16_t min_edge = 0; + int16_t single_edge; + int16_t probeOffset; + int16_t homeOffset; - maxXedge = ABS(maxXedge); - maxYedge = ABS(maxYedge); + // check edges of X axis + probeOffset = getParameter(P_PROBE_OFFSET, X_AXIS); + homeOffset = getParameter(P_HOME_OFFSET, X_AXIS); - return MAX(maxXedge, maxYedge) + 1; + single_edge = infoSettings.endstop_min[X_AXIS] + probeOffset + homeOffset; + if (single_edge > min_edge) min_edge = single_edge; + + single_edge = infoSettings.bed_size[X_AXIS] - infoSettings.endstop_max[X_AXIS] - probeOffset - homeOffset; + if (single_edge > min_edge) min_edge = single_edge; + + // check edges of Y axis + probeOffset = getParameter(P_PROBE_OFFSET, Y_AXIS); + homeOffset = getParameter(P_HOME_OFFSET, Y_AXIS); + + single_edge = infoSettings.endstop_min[Y_AXIS] + probeOffset + homeOffset; + if (single_edge > min_edge) min_edge = single_edge; + + single_edge = infoSettings.bed_size[Y_AXIS] - infoSettings.endstop_max[Y_AXIS] - probeOffset - homeOffset; + if (single_edge > min_edge) min_edge = single_edge; + + return min_edge + 1; } -uint8_t getLevelEdgeDefault(void) +static uint8_t getLevelEdgeDefault(void) { return MAX(origLevelEdge, getLevelEdgeMin()); } -void setLevelEdgeMin(void) +static void setLevelEdgeMin(void) { infoSettings.level_edge = getLevelEdgeMin(); } // draw values under icons -void refreshValue(MENUITEMS * levelItems, uint8_t index) +static void refreshValue(MENUITEMS * levelItems, uint8_t index) { - sprintf((char *)levelItems->items[valIconIndex[index]].label.address, "%.4f", levelCornerPosition[index]); + sprintf((char *)levelItems->items[valIconIndex[index]].label.address, "%.3f", levelCornerPosition[index]); menuDrawIconText(&levelItems->items[valIconIndex[index]], valIconIndex[index]); } -void checkRefreshValue(MENUITEMS * levelItems) -{ - LEVELING_POINT levelingPoint = levelingGetProbedPoint(); - - if (levelingPoint != LEVEL_NO_POINT) - { - levelCornerPosition[levelingPoint] = levelingGetProbedZ(); - refreshValue(levelItems, levelingPoint); - - levelingResetProbedPoint(); // reset to check for new updates - } -} - -// show M48 on icon -void drawProbeAccuracyIcon(MENUITEMS * levelItems) -{ - uint8_t index = 4; - GUI_POINT loc; - LIVE_INFO lvIcon; - char * str = "M48"; - - loc.x = 5; - loc.y = ICON_HEIGHT - 5; - - lvIcon.iconIndex = levelItems->items[valIconIndex[index]].icon; - lvIcon.enabled[0] = true; - lvIcon.enabled[1] = true; - lvIcon.enabled[2] = false; - - lvIcon.lines[0].h_align = LEFT; - lvIcon.lines[0].v_align = BOTTOM; - lvIcon.lines[0].fn_color = LC_VAL_COLOR; - lvIcon.lines[0].text_mode = GUI_TEXTMODE_TRANS; - lvIcon.lines[0].pos = loc; - lvIcon.lines[0].font = FONT_SIZE_NORMAL; - - lvIcon.lines[1].h_align = LEFT; - lvIcon.lines[1].v_align = BOTTOM; - lvIcon.lines[1].fn_color = LC_VAL_COLOR_2; - lvIcon.lines[1].text_mode = GUI_TEXTMODE_TRANS; - lvIcon.lines[1].pos = (GUI_POINT){loc.x - 2, loc.y - 2}; - lvIcon.lines[1].font = FONT_SIZE_NORMAL; - - lvIcon.lines[0].text = (uint8_t *)str; - lvIcon.lines[1].text = (uint8_t *)str; - - showLiveInfo(valIconIndex[index], &lvIcon, false); -} - void menuLevelCorner(void) { MENUITEMS levelCornerItems = { @@ -93,35 +62,32 @@ void menuLevelCorner(void) LABEL_LEVEL_CORNER, // icon label { - {ICON_POINT_4, LABEL_DYNAMIC}, - {ICON_POINT_3, LABEL_DYNAMIC}, + {ICON_POINT_4, LABEL_NULL}, + {ICON_POINT_3, LABEL_NULL}, {ICON_LEVEL_EDGE_DISTANCE, LABEL_DISTANCE}, - {ICON_BLTOUCH, LABEL_DYNAMIC}, - {ICON_POINT_1, LABEL_DYNAMIC}, - {ICON_POINT_2, LABEL_DYNAMIC}, + {ICON_Z_HOME, LABEL_HOME}, + {ICON_POINT_1, LABEL_NULL}, + {ICON_POINT_2, LABEL_NULL}, {ICON_RESUME, LABEL_START}, {ICON_BACK, LABEL_BACK}, } }; KEY_VALUES key_num = KEY_IDLE; - char iconText[LEVELING_POINT_COUNT][15]; + char iconText[LEVELING_POINT_COUNT - 1][5] = {"---", "---", "---", "---"}; - if (origLevelEdge < 0) // initialize leveling edge value to be used for leveling corner if not yet initialized (-1) + if (origLevelEdge < 0) // initialize leveling min_edge value to be used for leveling corner if not yet initialized (-1) { - origLevelEdge = infoSettings.level_edge; // save leveling edge value to restore after leveling corner completion - infoSettings.level_edge = getLevelEdgeDefault(); // set leveling edge value for leveling corner + origLevelEdge = infoSettings.level_edge; // save leveling min_edge value to restore after leveling corner completion + infoSettings.level_edge = getLevelEdgeDefault(); // set leveling min_edge value for leveling corner } - for (uint8_t i = 0; i < LEVELING_POINT_COUNT; i++) + for (uint8_t i = LEVEL_BOTTOM_LEFT; i <= LEVEL_TOP_LEFT; i++) { levelCornerItems.items[valIconIndex[i]].label.address = (uint8_t *)iconText[i]; - - refreshValue(&levelCornerItems, i); } menuDrawPage(&levelCornerItems); - drawProbeAccuracyIcon(&levelCornerItems); while (MENU_IS(menuLevelCorner)) { @@ -129,11 +95,25 @@ void menuLevelCorner(void) switch (key_num) { case KEY_ICON_0: - levelingProbePoint(LEVEL_TOP_LEFT); - break; - case KEY_ICON_1: - levelingProbePoint(LEVEL_TOP_RIGHT); + case KEY_ICON_4: + case KEY_ICON_5: + case KEY_ICON_6: + for (uint8_t lvlPoint = LEVEL_BOTTOM_LEFT; lvlPoint <= LEVEL_TOP_LEFT; lvlPoint++) + { + if (key_num < KEY_ICON_6 && key_num != valIconIndex[lvlPoint]) + continue; + + levelingProbePoint(lvlPoint); + + // wait until point probing is executed + TASK_LOOP_WHILE(levelingGetProbedPoint() == LEVEL_NO_POINT); + + levelCornerPosition[lvlPoint] = levelingGetProbedZ(); + refreshValue(&levelCornerItems, lvlPoint); + levelingResetProbedPoint(); // reset to check for new updates + } + break; case KEY_ICON_2: @@ -150,32 +130,11 @@ void menuLevelCorner(void) } case KEY_ICON_3: - mustStoreCmd("M48\n"); - - drawProbeAccuracyIcon(&levelCornerItems); - break; - - case KEY_ICON_4: - levelingProbePoint(LEVEL_BOTTOM_LEFT); - break; - - case KEY_ICON_5: - levelingProbePoint(LEVEL_BOTTOM_RIGHT); - break; - - case KEY_ICON_6: - for (int i = LEVEL_BOTTOM_LEFT; i <= LEVEL_TOP_LEFT; i++) - { - levelingProbePoint(i); - - // following loop needed to guarantee the value for each point beeing probed is updated at least one time on the menu - TASK_LOOP_WHILE(isNotEmptyCmdQueue(), checkRefreshValue(&levelCornerItems)); - } - + mustStoreCmd("G28 Z\n"); break; case KEY_ICON_7: - infoSettings.level_edge = origLevelEdge; // restore original leveling edge value + infoSettings.level_edge = origLevelEdge; // restore original leveling min_edge value origLevelEdge = -1; CLOSE_MENU(); break; @@ -185,7 +144,5 @@ void menuLevelCorner(void) } loopProcess(); - - checkRefreshValue(&levelCornerItems); } } diff --git a/TFT/src/User/Menu/Leveling.c b/TFT/src/User/Menu/Leveling.c index b949d4279a..6d3c44062a 100644 --- a/TFT/src/User/Menu/Leveling.c +++ b/TFT/src/User/Menu/Leveling.c @@ -1,37 +1,26 @@ #include "Leveling.h" #include "includes.h" -static uint8_t curSubmenu_index = 0; - void menuManualLeveling(void) { - ITEM itemSubmenu[] = { - // icon label - {ICON_DISABLE_STEPPERS, LABEL_XY_UNLOCK}, - {ICON_LEVEL_EDGE_DISTANCE, LABEL_DISTANCE}, - {ICON_BABYSTEP, LABEL_SHIM}, - }; - MENUITEMS manualLevelingItems = { // title LABEL_LEVELING, - // icon label + // icon label { - {ICON_POINT_4, LABEL_POINT_4}, - {ICON_POINT_3, LABEL_POINT_3}, - {ICON_PAGE_DOWN, LABEL_NEXT}, - {ICON_DISABLE_STEPPERS, LABEL_XY_UNLOCK}, - {ICON_POINT_1, LABEL_POINT_1}, - {ICON_POINT_2, LABEL_POINT_2}, - {ICON_POINT_5, LABEL_POINT_5}, - {ICON_BACK, LABEL_BACK}, + {ICON_POINT_4, LABEL_POINT_4}, + {ICON_POINT_3, LABEL_POINT_3}, + {ICON_LEVEL_EDGE_DISTANCE, LABEL_DISTANCE}, + {ICON_BABYSTEP, LABEL_SHIM}, + {ICON_POINT_1, LABEL_POINT_1}, + {ICON_POINT_2, LABEL_POINT_2}, + {ICON_POINT_5, LABEL_POINT_5}, + {ICON_BACK, LABEL_BACK}, } }; KEY_VALUES key_num = KEY_IDLE; - manualLevelingItems.items[KEY_ICON_3] = itemSubmenu[curSubmenu_index]; - menuDrawPage(&manualLevelingItems); while (MENU_IS(menuManualLeveling)) @@ -47,38 +36,16 @@ void menuManualLeveling(void) levelingMoveToPoint(LEVEL_TOP_RIGHT); break; - // change submenu + // set level edge distance case KEY_ICON_2: - curSubmenu_index = (curSubmenu_index + 1) % COUNT(itemSubmenu); - manualLevelingItems.items[KEY_ICON_3] = itemSubmenu[curSubmenu_index]; - - menuDrawItem(&manualLevelingItems.items[KEY_ICON_3], KEY_ICON_3); + infoSettings.level_edge = editIntValue(LEVELING_EDGE_DISTANCE_MIN, LEVELING_EDGE_DISTANCE_MAX, + LEVELING_EDGE_DISTANCE_DEFAULT, infoSettings.level_edge); break; - // handle submenu + // set level Z pos (shim) case KEY_ICON_3: - switch (curSubmenu_index) - { - // unlock XY axis - case 0: - storeCmd("M84 X Y E\n"); - break; - - // set level edge distance - case 1: - infoSettings.level_edge = editIntValue(LEVELING_EDGE_DISTANCE_MIN, LEVELING_EDGE_DISTANCE_MAX, - LEVELING_EDGE_DISTANCE_DEFAULT, infoSettings.level_edge); - break; - - // set level Z pos (shim) - case 2: - infoSettings.level_z_pos = editFloatValue(LEVELING_Z_POS_MIN, LEVELING_Z_POS_MAX, - LEVELING_Z_POS_DEFAULT, infoSettings.level_z_pos); - break; - - default: - break; - } + infoSettings.level_z_pos = editFloatValue(LEVELING_Z_POS_MIN, LEVELING_Z_POS_MAX, + LEVELING_Z_POS_DEFAULT, infoSettings.level_z_pos); break; case KEY_ICON_4: diff --git a/TFT/src/User/Menu/Popup.c b/TFT/src/User/Menu/Popup.c index ca07b9ad17..7473032b08 100644 --- a/TFT/src/User/Menu/Popup.c +++ b/TFT/src/User/Menu/Popup.c @@ -62,6 +62,9 @@ void windowReDrawButton(uint8_t position, uint8_t pressed) void popupDrawPage(DIALOG_TYPE type, BUTTON * btn, const uint8_t * title, const uint8_t * context, const uint8_t * yes, const uint8_t * no) { + TSC_ReDrawIcon = windowReDrawButton; + window.type = type; + if (btn != NULL) { buttonNum = 0; @@ -88,9 +91,6 @@ void popupDrawPage(DIALOG_TYPE type, BUTTON * btn, const uint8_t * title, const setMenuType(MENU_TYPE_SPLASH); } - - TSC_ReDrawIcon = windowReDrawButton; - window.type = type; } void menuDialog(void) diff --git a/TFT/src/User/Menu/Terminal.c b/TFT/src/User/Menu/Terminal.c index 33adbb8b0a..688cb2f991 100644 --- a/TFT/src/User/Menu/Terminal.c +++ b/TFT/src/User/Menu/Terminal.c @@ -104,7 +104,7 @@ typedef enum #define COMMAND_START_ROW 0 // row number for text box and send button #define KB_START_ROW 1 // row number for keyboard -#define CRTL_START_ROW (KB_START_ROW + KB_ROW_COUNT) // row number for control bar +#define CTRL_START_ROW (KB_START_ROW + KB_ROW_COUNT) // row number for control bar // for text in terminal #define CURSOR_H_OFFSET 2 @@ -226,7 +226,7 @@ const GUI_RECT editorKeyRect[KEY_COUNT] = { const GUI_RECT editorAreaRect[3] = { {0, COMMAND_START_ROW * CTRL_HEIGHT, LCD_WIDTH, ROW_HEIGHT}, // text box + send area {0, ROW_HEIGHT, LCD_WIDTH, LCD_HEIGHT - CTRL_HEIGHT}, // keyboard area - {0, CRTL_START_ROW * CTRL_HEIGHT, LCD_WIDTH, LCD_HEIGHT} // control bar area + {0, CTRL_START_ROW * CTRL_HEIGHT, LCD_WIDTH, LCD_HEIGHT} // control bar area }; const GUI_RECT terminalKeyRect[TERM_KEY_COUNT] = { diff --git a/TFT/src/User/config.ini b/TFT/src/User/config.ini index 969a6421f2..8d52bbd001 100644 --- a/TFT/src/User/config.ini +++ b/TFT/src/User/config.ini @@ -43,7 +43,7 @@ # AUTO_REPORT_TEMPERATURES (in Configuration_adv.h) # AUTO_REPORT_POSITION (in Configuration_adv.h) # EXTENDED_CAPABILITIES_REPORT (in Configuration_adv.h) -# M115_GEOMETRY_REPORT (in Configuration_adv.h) +# MIN/MAX_SOFTWARE_ENDSTOPS (in Configuration.h) # M114_DETAIL (in Configuration_adv.h) # REPORT_FAN_CHANGE (in Configuration_adv.h) # @@ -503,15 +503,22 @@ min_temp:180 # Value range: [min: 25, max: 255] fan_max:F0:255 F1:255 F2:255 F3:255 F4:255 F5:255 CtA:255 CtI:255 -#### Machine Size / Build Area -# The TFT will auto-detect the machine size (min and max) in Marlin firmware (requires -# enabling "M115_GEOMETRY_REPORT" in Configuration_adv.h in Marlin firmware). -# Format: [size_min: X Y Z] -# [size_max: X Y Z] +#### Motion limits +# This sets the minimum and maximum motion limits. The TFT can autodetect it from an M211 respone. +# For this "MIN/MAX_SOFTWARE_ENDSTOPS" must be enabled in Marlin's "Configuration.h". +# Format: [pos_min: X Y Z] +# [pos_max: X Y Z] # Unit: [distance in mm] # Value range: [min: -2000, max: 2000] -size_min:X0 Y0 Z0 -size_max:X235 Y235 Z250 +pos_min:X0 Y0 Z0 +pos_max:X235 Y235 Z250 + +#### Bed size +# Set the bed X and Y size. +# Format: [bed_size: X Y] +# Unit: [size in mm] +# Value range: [min: 0, max: 2000] +bed_size: X235 Y235 #### X & Y Move Speeds/Feedrates # Move speeds used in Move menu to move X and Y axes. diff --git a/TFT/src/User/config_rrf.ini b/TFT/src/User/config_rrf.ini index 02d29b005c..a7eb7e09d9 100644 --- a/TFT/src/User/config_rrf.ini +++ b/TFT/src/User/config_rrf.ini @@ -466,15 +466,22 @@ min_temp:180 # Value range: [min: 25, max: 255] fan_max:F0:255 F1:255 F2:255 F3:255 F4:255 F5:255 CtA:255 CtI:255 -#### Machine Size / Build Area -# The TFT will auto-detect the machine size (min and max) in Marlin firmware (requires -# enabling "M115_GEOMETRY_REPORT" in Configuration_adv.h in Marlin firmware). -# Format: [size_min: X Y Z] -# [size_max: X Y Z] +#### Motion limits +# This sets the minimum and maximum motion limits. The TFT can autodetect it from an M211 respone. +# For this "MIN/MAX_SOFTWARE_ENDSTOPS" must be enabled in Marlin's "Configuration.h". +# Format: [pos_min: X Y Z] +# [pos_max: X Y Z] # Unit: [distance in mm] # Value range: [min: -2000, max: 2000] -size_min:X0 Y0 Z0 -size_max:X235 Y235 Z250 +pos_min:X0 Y0 Z0 +pos_max:X235 Y235 Z250 + +#### Bed size +# Set the bed X and Y size. +# Format: [bed_size: X Y] +# Unit: [size in mm] +# Value range: [min: 0, max: 2000] +bed_size: X235 Y235 #### X & Y Move Speeds/Feedrates # Move speeds used in Move menu to move X and Y axes.