🐛 Fix and improve Polargraph (#24847)
Co-Authored-By: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
parent
b3e7d1e91e
commit
031ff2d024
@ -111,20 +111,29 @@ void HostUI::action(FSTR_P const fstr, const bool eol) {
|
||||
if (eol) SERIAL_EOL();
|
||||
}
|
||||
|
||||
void HostUI::prompt_plus(FSTR_P const ptype, FSTR_P const fstr, const char extra_char/*='\0'*/) {
|
||||
void HostUI::prompt_plus(const bool pgm, FSTR_P const ptype, const char * const str, const char extra_char/*='\0'*/) {
|
||||
prompt(ptype, false);
|
||||
PORT_REDIRECT(SerialMask::All);
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHOF(fstr);
|
||||
if (pgm)
|
||||
SERIAL_ECHOPGM_P(str);
|
||||
else
|
||||
SERIAL_ECHO(str);
|
||||
if (extra_char != '\0') SERIAL_CHAR(extra_char);
|
||||
SERIAL_EOL();
|
||||
}
|
||||
|
||||
void HostUI::prompt_begin(const PromptReason reason, FSTR_P const fstr, const char extra_char/*='\0'*/) {
|
||||
prompt_end();
|
||||
host_prompt_reason = reason;
|
||||
prompt_plus(F("begin"), fstr, extra_char);
|
||||
}
|
||||
void HostUI::prompt_button(FSTR_P const fstr) { prompt_plus(F("button"), fstr); }
|
||||
void HostUI::prompt_begin(const PromptReason reason, const char * const cstr, const char extra_char/*='\0'*/) {
|
||||
prompt_end();
|
||||
host_prompt_reason = reason;
|
||||
prompt_plus(F("begin"), cstr, extra_char);
|
||||
}
|
||||
|
||||
void HostUI::prompt_end() { prompt(F("end")); }
|
||||
void HostUI::prompt_show() { prompt(F("show")); }
|
||||
|
||||
@ -133,14 +142,26 @@ void HostUI::action(FSTR_P const fstr, const bool eol) {
|
||||
if (btn2) prompt_button(btn2);
|
||||
prompt_show();
|
||||
}
|
||||
|
||||
void HostUI::prompt_button(FSTR_P const fstr) { prompt_plus(F("button"), fstr); }
|
||||
void HostUI::prompt_button(const char * const cstr) { prompt_plus(F("button"), cstr); }
|
||||
|
||||
void HostUI::prompt_do(const PromptReason reason, FSTR_P const fstr, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
|
||||
prompt_begin(reason, fstr);
|
||||
_prompt_show(btn1, btn2);
|
||||
}
|
||||
void HostUI::prompt_do(const PromptReason reason, const char * const cstr, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
|
||||
prompt_begin(reason, cstr);
|
||||
_prompt_show(btn1, btn2);
|
||||
}
|
||||
void HostUI::prompt_do(const PromptReason reason, FSTR_P const fstr, const char extra_char, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
|
||||
prompt_begin(reason, fstr, extra_char);
|
||||
_prompt_show(btn1, btn2);
|
||||
}
|
||||
void HostUI::prompt_do(const PromptReason reason, const char * const cstr, const char extra_char, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
|
||||
prompt_begin(reason, cstr, extra_char);
|
||||
_prompt_show(btn1, btn2);
|
||||
}
|
||||
|
||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||
void HostUI::filament_load_prompt() {
|
||||
|
@ -79,7 +79,14 @@ class HostUI {
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
private:
|
||||
static void prompt(FSTR_P const ptype, const bool eol=true);
|
||||
static void prompt_plus(FSTR_P const ptype, FSTR_P const fstr, const char extra_char='\0');
|
||||
static void prompt_plus(const bool pgm, FSTR_P const ptype, const char * const str, const char extra_char='\0');
|
||||
static void prompt_plus(FSTR_P const ptype, FSTR_P const fstr, const char extra_char='\0') {
|
||||
prompt_plus(true, ptype, FTOP(fstr), extra_char);
|
||||
}
|
||||
static void prompt_plus(FSTR_P const ptype, const char * const cstr, const char extra_char='\0') {
|
||||
prompt_plus(false, ptype, cstr, extra_char);
|
||||
}
|
||||
|
||||
static void prompt_show();
|
||||
static void _prompt_show(FSTR_P const btn1, FSTR_P const btn2);
|
||||
|
||||
@ -93,10 +100,17 @@ class HostUI {
|
||||
static void notify(const char * const message);
|
||||
|
||||
static void prompt_begin(const PromptReason reason, FSTR_P const fstr, const char extra_char='\0');
|
||||
static void prompt_button(FSTR_P const fstr);
|
||||
static void prompt_begin(const PromptReason reason, const char * const cstr, const char extra_char='\0');
|
||||
static void prompt_end();
|
||||
|
||||
static void prompt_button(FSTR_P const fstr);
|
||||
static void prompt_button(const char * const cstr);
|
||||
|
||||
static void prompt_do(const PromptReason reason, FSTR_P const pstr, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
|
||||
static void prompt_do(const PromptReason reason, const char * const cstr, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
|
||||
static void prompt_do(const PromptReason reason, FSTR_P const pstr, const char extra_char, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
|
||||
static void prompt_do(const PromptReason reason, const char * const cstr, const char extra_char, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
|
||||
|
||||
static void prompt_open(const PromptReason reason, FSTR_P const pstr, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr) {
|
||||
if (host_prompt_reason == PROMPT_NOT_DEFINED) prompt_do(reason, pstr, btn1, btn2);
|
||||
}
|
||||
|
@ -167,8 +167,6 @@
|
||||
if (parser.seenval('T')) draw_area_max.y = parser.value_linear_units();
|
||||
if (parser.seenval('B')) draw_area_min.y = parser.value_linear_units();
|
||||
if (parser.seenval('H')) polargraph_max_belt_len = parser.value_linear_units();
|
||||
draw_area_size.x = draw_area_max.x - draw_area_min.x;
|
||||
draw_area_size.y = draw_area_max.y - draw_area_min.y;
|
||||
}
|
||||
|
||||
void GcodeSuite::M665_report(const bool forReplay/*=true*/) {
|
||||
|
@ -85,7 +85,12 @@ void GcodeSuite::M0_M1() {
|
||||
|
||||
#endif
|
||||
|
||||
TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? F("M1 Stop") : F("M0 Stop"), FPSTR(CONTINUE_STR)));
|
||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||
if (parser.string_arg)
|
||||
hostui.prompt_do(PROMPT_USER_CONTINUE, parser.string_arg, FPSTR(CONTINUE_STR));
|
||||
else
|
||||
hostui.prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? F("M1 Stop") : F("M0 Stop"), FPSTR(CONTINUE_STR));
|
||||
#endif
|
||||
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(ms));
|
||||
|
||||
|
@ -155,7 +155,7 @@
|
||||
#define W_BED_SIZE W_MAX_LENGTH
|
||||
#endif
|
||||
|
||||
// Require 0,0 bed center for Delta and SCARA
|
||||
// Require 0,0 bed center for Delta, SCARA, and Polargraph
|
||||
#if IS_KINEMATIC
|
||||
#define BED_CENTER_AT_0_0
|
||||
#endif
|
||||
|
@ -829,7 +829,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
/**
|
||||
* Granular software endstops (Marlin >= 1.1.7)
|
||||
*/
|
||||
#if ENABLED(MIN_SOFTWARE_ENDSTOPS) && DISABLED(MIN_SOFTWARE_ENDSTOP_Z)
|
||||
#if ENABLED(MIN_SOFTWARE_ENDSTOPS) && NONE(MIN_SOFTWARE_ENDSTOP_Z, POLARGRAPH)
|
||||
#if IS_KINEMATIC
|
||||
#error "MIN_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MIN_SOFTWARE_ENDSTOP_Z."
|
||||
#elif NONE(MIN_SOFTWARE_ENDSTOP_X, MIN_SOFTWARE_ENDSTOP_Y)
|
||||
@ -837,7 +837,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(MAX_SOFTWARE_ENDSTOPS) && DISABLED(MAX_SOFTWARE_ENDSTOP_Z)
|
||||
#if ENABLED(MAX_SOFTWARE_ENDSTOPS) && NONE(MAX_SOFTWARE_ENDSTOP_Z, POLARGRAPH)
|
||||
#if IS_KINEMATIC
|
||||
#error "MAX_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MAX_SOFTWARE_ENDSTOP_Z."
|
||||
#elif NONE(MAX_SOFTWARE_ENDSTOP_X, MAX_SOFTWARE_ENDSTOP_Y)
|
||||
|
@ -418,6 +418,12 @@ namespace Language_en {
|
||||
LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
|
||||
LSTR MSG_FILAMENT_UNLOAD = _UxGT("Unload mm");
|
||||
LSTR MSG_FILAMENT_LOAD = _UxGT("Load mm");
|
||||
LSTR MSG_SEGMENTS_PER_SECOND = _UxGT("Segments/Sec");
|
||||
LSTR MSG_DRAW_MIN_X = _UxGT("Draw Min X");
|
||||
LSTR MSG_DRAW_MAX_X = _UxGT("Draw Max X");
|
||||
LSTR MSG_DRAW_MIN_Y = _UxGT("Draw Min Y");
|
||||
LSTR MSG_DRAW_MAX_Y = _UxGT("Draw Max Y");
|
||||
LSTR MSG_MAX_BELT_LEN = _UxGT("Max Belt Len");
|
||||
LSTR MSG_ADVANCE_K = _UxGT("Advance K");
|
||||
LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
|
||||
LSTR MSG_CONTRAST = _UxGT("LCD Contrast");
|
||||
|
@ -632,10 +632,20 @@ void menu_advanced_settings() {
|
||||
|
||||
#if DISABLED(SLIM_LCD_MENUS)
|
||||
|
||||
#if ENABLED(POLARGRAPH)
|
||||
// M665 - Polargraph Settings
|
||||
if (!is_busy) {
|
||||
EDIT_ITEM_FAST(float4, MSG_SEGMENTS_PER_SECOND, &segments_per_second, 100, 9999); // M665 S
|
||||
EDIT_ITEM_FAST(float51sign, MSG_DRAW_MIN_X, &draw_area_min.x, X_MIN_POS, draw_area_max.x - 10); // M665 L
|
||||
EDIT_ITEM_FAST(float51sign, MSG_DRAW_MAX_X, &draw_area_max.x, draw_area_min.x + 10, X_MAX_POS); // M665 R
|
||||
EDIT_ITEM_FAST(float51sign, MSG_DRAW_MIN_Y, &draw_area_min.y, Y_MIN_POS, draw_area_max.y - 10); // M665 T
|
||||
EDIT_ITEM_FAST(float51sign, MSG_DRAW_MAX_Y, &draw_area_max.y, draw_area_min.y + 10, Y_MAX_POS); // M665 B
|
||||
EDIT_ITEM_FAST(float51sign, MSG_MAX_BELT_LEN, &polargraph_max_belt_len, 500, 2000); // M665 H
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAS_M206_COMMAND
|
||||
//
|
||||
// Set Home Offsets
|
||||
//
|
||||
// M428 - Set Home Offsets
|
||||
ACTION_ITEM(MSG_SET_HOME_OFFSETS, []{ queue.inject(F("M428")); ui.return_to_status(); });
|
||||
#endif
|
||||
|
||||
|
@ -341,7 +341,6 @@ void report_current_position_projected() {
|
||||
can_reach = (
|
||||
a < polargraph_max_belt_len + 1
|
||||
&& b < polargraph_max_belt_len + 1
|
||||
&& (a + b) > _MIN(draw_area_size.x, draw_area_size.y)
|
||||
);
|
||||
|
||||
#endif
|
||||
@ -562,7 +561,8 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const float), const_feedRate_t fr_mm_s/*=
|
||||
const feedRate_t w_feedrate = fr_mm_s ?: homing_feedrate(W_AXIS)
|
||||
);
|
||||
|
||||
#if IS_KINEMATIC
|
||||
#if IS_KINEMATIC && DISABLED(POLARGRAPH)
|
||||
// kinematic machines are expected to home to a point 1.5x their range? never reachable.
|
||||
if (!position_is_reachable(x, y)) return;
|
||||
destination = current_position; // sync destination at the start
|
||||
#endif
|
||||
@ -919,11 +919,16 @@ void restore_feedrate_and_scaling() {
|
||||
constexpr xy_pos_t offs{0};
|
||||
#endif
|
||||
|
||||
if (TERN1(IS_SCARA, axis_was_homed(X_AXIS) && axis_was_homed(Y_AXIS))) {
|
||||
const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y);
|
||||
if (dist_2 > delta_max_radius_2)
|
||||
target *= float(delta_max_radius / SQRT(dist_2)); // 200 / 300 = 0.66
|
||||
}
|
||||
#if ENABLED(POLARGRAPH)
|
||||
LIMIT(target.x, draw_area_min.x, draw_area_max.x);
|
||||
LIMIT(target.y, draw_area_min.y, draw_area_max.y);
|
||||
#else
|
||||
if (TERN1(IS_SCARA, axis_was_homed(X_AXIS) && axis_was_homed(Y_AXIS))) {
|
||||
const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y);
|
||||
if (dist_2 > delta_max_radius_2)
|
||||
target *= float(delta_max_radius / SQRT(dist_2)); // 200 / 300 = 0.66
|
||||
}
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
|
@ -2244,7 +2244,6 @@ bool Planner::_populate_block(
|
||||
|
||||
TERN_(MIXING_EXTRUDER, mixer.populate_block(block->b_color));
|
||||
|
||||
|
||||
#if HAS_FAN
|
||||
FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i];
|
||||
#endif
|
||||
|
@ -37,17 +37,12 @@
|
||||
#include "../lcd/marlinui.h"
|
||||
#include "../MarlinCore.h"
|
||||
|
||||
float segments_per_second; // Initialized by settings.load()
|
||||
|
||||
xy_pos_t draw_area_min = { X_MIN_POS, Y_MIN_POS },
|
||||
draw_area_max = { X_MAX_POS, Y_MAX_POS };
|
||||
|
||||
xy_float_t draw_area_size = { X_MAX_POS - X_MIN_POS, Y_MAX_POS - Y_MIN_POS };
|
||||
|
||||
float polargraph_max_belt_len = HYPOT(draw_area_size.x, draw_area_size.y);
|
||||
// Initialized by settings.load()
|
||||
float segments_per_second, polargraph_max_belt_len;
|
||||
xy_pos_t draw_area_min, draw_area_max;
|
||||
|
||||
void inverse_kinematics(const xyz_pos_t &raw) {
|
||||
const float x1 = raw.x - (draw_area_min.x), x2 = (draw_area_max.x) - raw.x, y = raw.y - (draw_area_max.y);
|
||||
const float x1 = raw.x - draw_area_min.x, x2 = draw_area_max.x - raw.x, y = raw.y - draw_area_max.y;
|
||||
delta.set(HYPOT(x1, y), HYPOT(x2, y), raw.z);
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,6 @@
|
||||
|
||||
extern float segments_per_second;
|
||||
extern xy_pos_t draw_area_min, draw_area_max;
|
||||
extern xy_float_t draw_area_size;
|
||||
extern float polargraph_max_belt_len;
|
||||
|
||||
void inverse_kinematics(const xyz_pos_t &raw);
|
||||
|
@ -257,7 +257,7 @@ typedef struct SettingsDataStruct {
|
||||
// HAS_BED_PROBE
|
||||
//
|
||||
|
||||
xyz_pos_t probe_offset;
|
||||
xyz_pos_t probe_offset; // M851 X Y Z
|
||||
|
||||
//
|
||||
// ABL_PLANAR
|
||||
@ -319,7 +319,7 @@ typedef struct SettingsDataStruct {
|
||||
#endif
|
||||
|
||||
//
|
||||
// Kinematic Settings
|
||||
// Kinematic Settings (Delta, SCARA, TPARA, Polargraph...)
|
||||
//
|
||||
#if IS_KINEMATIC
|
||||
float segments_per_second; // M665 S
|
||||
@ -330,7 +330,11 @@ typedef struct SettingsDataStruct {
|
||||
delta_diagonal_rod; // M665 L
|
||||
abc_float_t delta_tower_angle_trim, // M665 X Y Z
|
||||
delta_diagonal_rod_trim; // M665 A B C
|
||||
#elif ENABLED(POLARGRAPH)
|
||||
xy_pos_t draw_area_min, draw_area_max; // M665 L R T B
|
||||
float polargraph_max_belt_len; // M665 H
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
@ -468,7 +472,7 @@ typedef struct SettingsDataStruct {
|
||||
//
|
||||
// SKEW_CORRECTION
|
||||
//
|
||||
skew_factor_t planner_skew_factor; // M852 I J K planner.skew_factor
|
||||
skew_factor_t planner_skew_factor; // M852 I J K
|
||||
|
||||
//
|
||||
// ADVANCED_PAUSE_FEATURE
|
||||
@ -988,7 +992,7 @@ void MarlinSettings::postprocess() {
|
||||
}
|
||||
|
||||
//
|
||||
// Kinematic Settings
|
||||
// Kinematic Settings (Delta, SCARA, TPARA, Polargraph...)
|
||||
//
|
||||
#if IS_KINEMATIC
|
||||
{
|
||||
@ -1001,6 +1005,11 @@ void MarlinSettings::postprocess() {
|
||||
EEPROM_WRITE(delta_diagonal_rod); // 1 float
|
||||
EEPROM_WRITE(delta_tower_angle_trim); // 3 floats
|
||||
EEPROM_WRITE(delta_diagonal_rod_trim); // 3 floats
|
||||
#elif ENABLED(POLARGRAPH)
|
||||
_FIELD_TEST(draw_area_min);
|
||||
EEPROM_WRITE(draw_area_min); // 2 floats
|
||||
EEPROM_WRITE(draw_area_max); // 2 floats
|
||||
EEPROM_WRITE(polargraph_max_belt_len); // 1 float
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@ -1923,7 +1932,7 @@ void MarlinSettings::postprocess() {
|
||||
}
|
||||
|
||||
//
|
||||
// Kinematic Segments-per-second
|
||||
// Kinematic Settings (Delta, SCARA, TPARA, Polargraph...)
|
||||
//
|
||||
#if IS_KINEMATIC
|
||||
{
|
||||
@ -1936,6 +1945,11 @@ void MarlinSettings::postprocess() {
|
||||
EEPROM_READ(delta_diagonal_rod); // 1 float
|
||||
EEPROM_READ(delta_tower_angle_trim); // 3 floats
|
||||
EEPROM_READ(delta_diagonal_rod_trim); // 3 floats
|
||||
#elif ENABLED(POLARGRAPH)
|
||||
_FIELD_TEST(draw_area_min);
|
||||
EEPROM_READ(draw_area_min); // 2 floats
|
||||
EEPROM_READ(draw_area_max); // 2 floats
|
||||
EEPROM_READ(polargraph_max_belt_len); // 1 float
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@ -2979,7 +2993,7 @@ void MarlinSettings::reset() {
|
||||
#endif
|
||||
|
||||
//
|
||||
// Kinematic settings
|
||||
// Kinematic Settings (Delta, SCARA, TPARA, Polargraph...)
|
||||
//
|
||||
|
||||
#if IS_KINEMATIC
|
||||
@ -2996,6 +3010,10 @@ void MarlinSettings::reset() {
|
||||
delta_diagonal_rod = DELTA_DIAGONAL_ROD;
|
||||
delta_tower_angle_trim = dta;
|
||||
delta_diagonal_rod_trim = ddr;
|
||||
#elif ENABLED(POLARGRAPH)
|
||||
draw_area_min.set(X_MIN_POS, Y_MIN_POS);
|
||||
draw_area_max.set(X_MAX_POS, Y_MAX_POS);
|
||||
polargraph_max_belt_len = POLARGRAPH_MAX_BELT_LEN;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -3492,9 +3510,7 @@ void MarlinSettings::reset() {
|
||||
//
|
||||
// LCD Preheat Settings
|
||||
//
|
||||
#if HAS_PREHEAT
|
||||
gcode.M145_report(forReplay);
|
||||
#endif
|
||||
TERN_(HAS_PREHEAT, gcode.M145_report(forReplay));
|
||||
|
||||
//
|
||||
// PID
|
||||
|
Loading…
Reference in New Issue
Block a user