Refactor Hilbert curve. Enhance Touch UI Bed Level Screen. (#21453)
This commit is contained in:
@ -30,25 +30,28 @@
|
||||
#define INC_POS SUB_POS(6,1), SUB_SIZE(2,1)
|
||||
#define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1)
|
||||
|
||||
void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) {
|
||||
if (what & BACKGROUND)
|
||||
cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT);
|
||||
void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) {
|
||||
char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)];
|
||||
if (isnan(value))
|
||||
strcpy_P(str, PSTR("-"));
|
||||
else
|
||||
dtostrf(value, width, precision, str);
|
||||
|
||||
if (what & FOREGROUND) {
|
||||
char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)];
|
||||
if (isnan(value))
|
||||
strcpy_P(str, PSTR("-"));
|
||||
else
|
||||
dtostrf(value, width, precision, str);
|
||||
if (units) {
|
||||
strcat_P(str, PSTR(" "));
|
||||
strcat_P(str, (const char*) units);
|
||||
}
|
||||
|
||||
if (units) {
|
||||
strcat_P(str, PSTR(" "));
|
||||
strcat_P(str, (const char*) units);
|
||||
}
|
||||
|
||||
cmd.tag(0)
|
||||
.text(VAL_POS, str)
|
||||
.tag(tag ).button(INC_POS, F("-"))
|
||||
.tag(tag+1).button(DEC_POS, F("+"));
|
||||
}
|
||||
cmd.text(VAL_POS, str);
|
||||
}
|
||||
|
||||
void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) {
|
||||
if (what & BACKGROUND)
|
||||
cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT);
|
||||
|
||||
if (what & FOREGROUND) {
|
||||
draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision);
|
||||
cmd.tag(tag ).button(INC_POS, F("-"))
|
||||
.tag(tag+1).button(DEC_POS, F("+"));
|
||||
}
|
||||
}
|
||||
|
@ -22,6 +22,13 @@
|
||||
#pragma once
|
||||
#include "../extended/screen_types.h"
|
||||
|
||||
void draw_adjuster_value(
|
||||
CommandProcessor& cmd,
|
||||
int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
float value, progmem_str units = nullptr,
|
||||
int8_t width = 5, uint8_t precision = 1
|
||||
);
|
||||
|
||||
void draw_adjuster(
|
||||
CommandProcessor& cmd,
|
||||
int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
|
@ -140,10 +140,13 @@ namespace Language_en {
|
||||
|
||||
PROGMEM Language_Str MSG_TOUCH_CALIBRATION_START = u8"Release to begin screen calibration";
|
||||
PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate";
|
||||
PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis";
|
||||
PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished";
|
||||
PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed";
|
||||
PROGMEM Language_Str MSG_LEVELING = u8"Leveling";
|
||||
PROGMEM Language_Str MSG_AXIS_LEVELING = u8"Axis Leveling";
|
||||
PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh";
|
||||
PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh";
|
||||
PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test";
|
||||
|
||||
#if ENABLED(TOUCH_UI_LULZBOT_BIO)
|
||||
PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home";
|
||||
|
@ -225,6 +225,7 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) {
|
||||
}
|
||||
|
||||
void BedMeshScreen::onEntry() {
|
||||
mydata.allowEditing = true;
|
||||
mydata.highlightedTag = 0;
|
||||
mydata.zAdjustment = 0;
|
||||
mydata.count = GRID_MAX_POINTS;
|
||||
@ -259,16 +260,16 @@ void BedMeshScreen::adjustHighlightedValue(float increment) {
|
||||
}
|
||||
|
||||
void BedMeshScreen::saveAdjustedHighlightedValue() {
|
||||
if(mydata.zAdjustment) {
|
||||
if (mydata.zAdjustment) {
|
||||
BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment);
|
||||
mydata.zAdjustment = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void BedMeshScreen::changeHighlightedValue(uint8_t tag) {
|
||||
saveAdjustedHighlightedValue();
|
||||
if (mydata.allowEditing) saveAdjustedHighlightedValue();
|
||||
mydata.highlightedTag = tag;
|
||||
moveToHighlightedValue();
|
||||
if (mydata.allowEditing) moveToHighlightedValue();
|
||||
}
|
||||
|
||||
void BedMeshScreen::drawHighlightedPointValue() {
|
||||
@ -277,7 +278,12 @@ void BedMeshScreen::drawHighlightedPointValue() {
|
||||
.colors(normal_btn)
|
||||
.text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z))
|
||||
.font(font_small);
|
||||
draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
||||
|
||||
if (mydata.allowEditing)
|
||||
draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
||||
else
|
||||
draw_adjuster_value(cmd, Z_VALUE_POS, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
||||
|
||||
cmd.colors(action_btn)
|
||||
.tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY))
|
||||
.tag(0);
|
||||
@ -347,6 +353,7 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) {
|
||||
void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) {
|
||||
switch (state) {
|
||||
case ExtUI::MESH_START:
|
||||
mydata.allowEditing = false;
|
||||
mydata.count = 0;
|
||||
mydata.message = mydata.MSG_NONE;
|
||||
break;
|
||||
@ -369,10 +376,16 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr
|
||||
|
||||
void BedMeshScreen::startMeshProbe() {
|
||||
GOTO_SCREEN(BedMeshScreen);
|
||||
mydata.allowEditing = false;
|
||||
mydata.count = 0;
|
||||
injectCommands_P(PSTR(BED_LEVELING_COMMANDS));
|
||||
}
|
||||
|
||||
void BedMeshScreen::showMesh() {
|
||||
GOTO_SCREEN(BedMeshScreen);
|
||||
mydata.allowEditing = false;
|
||||
}
|
||||
|
||||
void BedMeshScreen::showMeshEditor() {
|
||||
SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1"));
|
||||
// After the spinner, go to this screen.
|
||||
|
@ -33,6 +33,7 @@ struct BedMeshScreenData {
|
||||
uint8_t count;
|
||||
uint8_t highlightedTag;
|
||||
float zAdjustment;
|
||||
bool allowEditing;
|
||||
};
|
||||
|
||||
class BedMeshScreen : public BaseScreen, public CachedScreen<BED_MESH_SCREEN_CACHE> {
|
||||
@ -63,5 +64,6 @@ class BedMeshScreen : public BaseScreen, public CachedScreen<BED_MESH_SCREEN_CAC
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
|
||||
static void startMeshProbe();
|
||||
static void showMesh();
|
||||
static void showMeshEditor();
|
||||
};
|
||||
|
@ -34,27 +34,33 @@ using namespace ExtUI;
|
||||
using namespace Theme;
|
||||
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
#define GRID_ROWS 9
|
||||
#define GRID_ROWS 8
|
||||
#define GRID_COLS 2
|
||||
#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1)
|
||||
#define LEVELING_TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1)
|
||||
#define LEVEL_AXIS_POS BTN_POS(1,2), BTN_SIZE(2,1)
|
||||
#define LEVEL_BED_POS BTN_POS(1,3), BTN_SIZE(2,1)
|
||||
#define EDIT_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1)
|
||||
#define BED_MESH_TITLE_POS BTN_POS(1,3), BTN_SIZE(2,1)
|
||||
#define PROBE_BED_POS BTN_POS(1,4), BTN_SIZE(1,1)
|
||||
#define TEST_MESH_POS BTN_POS(2,4), BTN_SIZE(1,1)
|
||||
#define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(1,1)
|
||||
#define EDIT_MESH_POS BTN_POS(2,5), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1)
|
||||
#define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1)
|
||||
#define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1)
|
||||
#define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1)
|
||||
#else
|
||||
#define GRID_ROWS 7
|
||||
#define GRID_COLS 2
|
||||
#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1)
|
||||
#define LEVEL_AXIS_POS BTN_POS(1,2), BTN_SIZE(2,1)
|
||||
#define LEVEL_BED_POS BTN_POS(1,3), BTN_SIZE(2,1)
|
||||
#define EDIT_MESH_POS BTN_POS(1,4), BTN_SIZE(2,1)
|
||||
#define BLTOUCH_TITLE_POS BTN_POS(1,5), BTN_SIZE(2,1)
|
||||
#define BLTOUCH_RESET_POS BTN_POS(1,6), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_TEST_POS BTN_POS(2,6), BTN_SIZE(1,1)
|
||||
#define BACK_POS BTN_POS(1,7), BTN_SIZE(2,1)
|
||||
#define GRID_ROWS 6
|
||||
#define GRID_COLS 3
|
||||
#define LEVELING_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
|
||||
#define LEVEL_AXIS_POS BTN_POS(1,2), BTN_SIZE(3,1)
|
||||
#define BED_MESH_TITLE_POS BTN_POS(1,3), BTN_SIZE(2,1)
|
||||
#define PROBE_BED_POS BTN_POS(1,4), BTN_SIZE(1,1)
|
||||
#define TEST_MESH_POS BTN_POS(2,4), BTN_SIZE(1,1)
|
||||
#define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(1,1)
|
||||
#define EDIT_MESH_POS BTN_POS(2,5), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_TITLE_POS BTN_POS(3,3), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_RESET_POS BTN_POS(3,4), BTN_SIZE(1,1)
|
||||
#define BLTOUCH_TEST_POS BTN_POS(3,5), BTN_SIZE(1,1)
|
||||
#define BACK_POS BTN_POS(1,6), BTN_SIZE(3,1)
|
||||
#endif
|
||||
|
||||
void LevelingMenu::onRedraw(draw_mode_t what) {
|
||||
@ -69,20 +75,25 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
|
||||
CommandProcessor cmd;
|
||||
cmd.font(font_large)
|
||||
.cmd(COLOR_RGB(bg_text_enabled))
|
||||
.text(TITLE_POS, GET_TEXT_F(MSG_LEVELING))
|
||||
.text(LEVELING_TITLE_POS, GET_TEXT_F(MSG_AXIS_LEVELING))
|
||||
.text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
|
||||
#if ENABLED(BLTOUCH)
|
||||
.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
|
||||
#endif
|
||||
.font(font_medium).colors(normal_btn)
|
||||
#if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)
|
||||
.tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS))
|
||||
.tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS))
|
||||
#endif
|
||||
.tag(3).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED))
|
||||
.tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
|
||||
.enabled(ENABLED(HAS_MESH))
|
||||
.tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
|
||||
.tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH))
|
||||
.enabled(ENABLED(HAS_MESH))
|
||||
.tag(5).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
|
||||
.enabled(ENABLED(G26_MESH_VALIDATION))
|
||||
.tag(6).button(TEST_MESH_POS, GET_TEXT_F(MSG_PRINT_TEST))
|
||||
#if ENABLED(BLTOUCH)
|
||||
.tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
|
||||
.tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
|
||||
.tag(7).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
|
||||
.tag(8).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
|
||||
#endif
|
||||
.colors(action_btn)
|
||||
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
|
||||
@ -106,11 +117,18 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
|
||||
#endif
|
||||
break;
|
||||
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
||||
case 4: BedMeshScreen::showMeshEditor(); break;
|
||||
case 4: BedMeshScreen::showMesh(); break;
|
||||
case 5: BedMeshScreen::showMeshEditor(); break;
|
||||
#endif
|
||||
#if ENABLED(G26_MESH_VALIDATION)
|
||||
case 6:
|
||||
GOTO_SCREEN(StatusScreen);
|
||||
injectCommands_P(PSTR("M117 Printing Test Pattern\nG28 O\nG26 R"));
|
||||
break;
|
||||
#endif
|
||||
#if ENABLED(BLTOUCH)
|
||||
case 5: injectCommands_P(PSTR("M280 P0 S60")); break;
|
||||
case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
|
||||
case 7: injectCommands_P(PSTR("M280 P0 S60")); break;
|
||||
case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
|
||||
#endif
|
||||
default: return false;
|
||||
}
|
||||
@ -118,3 +136,4 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
|
||||
}
|
||||
|
||||
#endif // FTDI_LEVELING_MENU
|
||||
|
||||
|
@ -62,7 +62,7 @@ void TuneMenu::onRedraw(draw_mode_t what) {
|
||||
#define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1)
|
||||
#define CASE_LIGHT_POS BTN_POS(2,4), BTN_SIZE(1,1)
|
||||
#define ADVANCED_SETTINGS_POS BTN_POS(1,5), BTN_SIZE(1,1)
|
||||
#define BACK_POS BTN_POS(2,5), BTN_SIZE(2,1)
|
||||
#define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1)
|
||||
#endif
|
||||
|
||||
if (what & FOREGROUND) {
|
||||
|
@ -849,10 +849,13 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_LEVELING
|
||||
|
||||
bool getLevelingActive() { return planner.leveling_active; }
|
||||
void setLevelingActive(const bool state) { set_bed_leveling_enabled(state); }
|
||||
bool getMeshValid() { return leveling_is_valid(); }
|
||||
|
||||
#if HAS_MESH
|
||||
|
||||
bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; }
|
||||
float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); }
|
||||
void setMeshPoint(const xy_uint8_t &pos, const float &zoff) {
|
||||
@ -861,17 +864,23 @@ namespace ExtUI {
|
||||
TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate());
|
||||
}
|
||||
}
|
||||
|
||||
void moveToMeshPoint(const xy_uint8_t &pos, const float &z) {
|
||||
#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
|
||||
const feedRate_t old_feedrate = feedrate_mm_s;
|
||||
feedrate_mm_s = Z_PROBE_FEEDRATE_FAST;
|
||||
destination = current_position;
|
||||
destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;
|
||||
prepare_line_to_destination();
|
||||
feedrate_mm_s = XY_PROBE_FEEDRATE;
|
||||
destination[X_AXIS] = MESH_MIN_X + pos.x * MESH_X_DIST;
|
||||
destination[Y_AXIS] = MESH_MIN_Y + pos.y * MESH_Y_DIST;
|
||||
prepare_line_to_destination();
|
||||
const float x_target = MESH_MIN_X + pos.x * (MESH_X_DIST),
|
||||
y_target = MESH_MIN_Y + pos.y * (MESH_Y_DIST);
|
||||
if (x_target != current_position[X_AXIS] || y_target != current_position[Y_AXIS]) {
|
||||
// If moving across bed, raise nozzle to safe height over bed
|
||||
feedrate_mm_s = Z_PROBE_FEEDRATE_FAST;
|
||||
destination = current_position;
|
||||
destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;
|
||||
prepare_line_to_destination();
|
||||
feedrate_mm_s = XY_PROBE_FEEDRATE;
|
||||
destination[X_AXIS] = x_target;
|
||||
destination[Y_AXIS] = y_target;
|
||||
prepare_line_to_destination();
|
||||
}
|
||||
feedrate_mm_s = Z_PROBE_FEEDRATE_FAST;
|
||||
destination[Z_AXIS] = z;
|
||||
prepare_line_to_destination();
|
||||
@ -881,8 +890,10 @@ namespace ExtUI {
|
||||
UNUSED(z);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // HAS_MESH
|
||||
|
||||
#endif // HAS_LEVELING
|
||||
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
void setHostResponse(const uint8_t response) { host_response_handler(response); }
|
||||
|
Reference in New Issue
Block a user