Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UBL 'G29R' values overflow with valid mesh counts >127 #22129

Merged
merged 5 commits into from
Jun 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Marlin/src/feature/bedlevel/ubl/ubl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static void serial_echo_column_labels(const uint8_t sp) {
* 2: TODO: Display on Graphical LCD
* 4: Compact Human-Readable
*/
void unified_bed_leveling::display_map(const int map_type) {
void unified_bed_leveling::display_map(const uint8_t map_type) {
const bool was = gcode.set_autoreport_paused(true);

constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567]
Expand Down Expand Up @@ -263,7 +263,7 @@ bool unified_bed_leveling::sanity_check() {
void GcodeSuite::M1004() {

#define ALIGN_GCODE TERN(Z_STEPPER_AUTO_ALIGN, "G34", "")
#define PROBE_GCODE TERN(HAS_BED_PROBE, "G29P1\nG29P3", "G29P4R255")
#define PROBE_GCODE TERN(HAS_BED_PROBE, "G29P1\nG29P3", "G29P4R")

#if HAS_HOTEND
if (parser.seenval('H')) { // Handle H# parameter to set Hotend temp
Expand Down
8 changes: 4 additions & 4 deletions Marlin/src/feature/bedlevel/ubl/ubl.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ struct mesh_index_pair;

typedef struct {
bool C_seen;
int8_t V_verbosity,
int8_t KLS_storage_slot;
uint8_t R_repetition,
V_verbosity,
P_phase,
R_repetition,
KLS_storage_slot,
T_map_type;
float B_shim_thickness,
C_constant;
Expand Down Expand Up @@ -98,7 +98,7 @@ class unified_bed_leveling {
static void report_state();
static void save_ubl_active_state_and_disable();
static void restore_ubl_active_state_and_leave();
static void display_map(const int) _O0;
static void display_map(const uint8_t) _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();
Expand Down
28 changes: 14 additions & 14 deletions Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ void unified_bed_leveling::G29() {
bool probe_deployed = false;
if (G29_parse_parameters()) return; // Abort on parameter error

const int8_t p_val = parser.intval('P', -1);
const uint8_t p_val = parser.byteval('P');
const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen_test('J');
#if ENABLED(HAS_MULTI_HOTEND)
const uint8_t old_tool_index = active_extruder;
Expand All @@ -321,7 +321,7 @@ void unified_bed_leveling::G29() {

// Invalidate one or more nearby mesh points, possibly all.
if (parser.seen('I')) {
int16_t count = parser.has_value() ? parser.value_int() : 1;
uint8_t count = parser.has_value() ? parser.value_byte() : 1;
bool invalidate_all = count >= GRID_MAX_POINTS;
if (!invalidate_all) {
while (count--) {
Expand All @@ -345,7 +345,7 @@ void unified_bed_leveling::G29() {
}

if (parser.seen('Q')) {
const int test_pattern = parser.has_value() ? parser.value_int() : -99;
const int16_t test_pattern = parser.has_value() ? parser.value_int() : -99;
if (!WITHIN(test_pattern, -1, 2)) {
SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n");
return;
Expand Down Expand Up @@ -592,7 +592,7 @@ void unified_bed_leveling::G29() {
//

if (parser.seen('L')) { // Load Current Mesh Data
param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot;
param.KLS_storage_slot = parser.has_value() ? (int8_t)parser.value_int() : storage_slot;

int16_t a = settings.calc_num_meshes();

Expand All @@ -617,10 +617,10 @@ void unified_bed_leveling::G29() {
//

if (parser.seen('S')) { // Store (or Save) Current Mesh Data
param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot;
param.KLS_storage_slot = parser.has_value() ? (int8_t)parser.value_int() : storage_slot;

if (param.KLS_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the
return report_current_mesh(); // host program to be saved on the user's computer
if (param.KLS_storage_slot == -1) // Special case: 'Export' the mesh to the
return report_current_mesh(); // host so it can be saved in a file.

int16_t a = settings.calc_num_meshes();

Expand Down Expand Up @@ -673,7 +673,7 @@ void unified_bed_leveling::G29() {
*/
void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t offset) {
float sum = 0;
int n = 0;
uint8_t n = 0;
GRID_LOOP(x, y)
if (!isnan(z_values[x][y])) {
sum += z_values[x][y];
Expand Down Expand Up @@ -734,7 +734,7 @@ void unified_bed_leveling::shift_mesh_height() {
do {
if (do_ubl_mesh_map) display_map(param.T_map_type);

const int point_num = (GRID_MAX_POINTS) - count + 1;
const uint8_t point_num = (GRID_MAX_POINTS - count) + 1;
SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, ".");
TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS)));

Expand Down Expand Up @@ -1083,22 +1083,22 @@ bool unified_bed_leveling::G29_parse_parameters() {
param.R_repetition = 0;

if (parser.seen('R')) {
param.R_repetition = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS;
param.R_repetition = parser.has_value() ? parser.value_byte() : GRID_MAX_POINTS;
NOMORE(param.R_repetition, GRID_MAX_POINTS);
if (param.R_repetition < 1) {
SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n");
return UBL_ERR;
}
}

param.V_verbosity = parser.intval('V');
param.V_verbosity = parser.byteval('V');
if (!WITHIN(param.V_verbosity, 0, 4)) {
SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n");
err_flag = true;
}

if (parser.seen('P')) {
const int pv = parser.value_int();
const uint8_t pv = parser.value_byte();
#if !HAS_BED_PROBE
if (pv == 1) {
SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n");
Expand Down Expand Up @@ -1181,7 +1181,7 @@ bool unified_bed_leveling::G29_parse_parameters() {
}
#endif

param.T_map_type = parser.intval('T');
param.T_map_type = parser.byteval('T');
if (!WITHIN(param.T_map_type, 0, 2)) {
SERIAL_ECHOLNPGM("Invalid map type.\n");
return UBL_ERR;
Expand Down Expand Up @@ -1833,7 +1833,7 @@ void unified_bed_leveling::smart_fill_mesh() {
return;
}

param.KLS_storage_slot = parser.value_int();
param.KLS_storage_slot = (int8_t)parser.value_int();

float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y];
settings.load_mesh(param.KLS_storage_slot, &tmp_z_values);
Expand Down
6 changes: 3 additions & 3 deletions Marlin/src/lcd/menu/menu_ubl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ void _menu_ubl_height_adjust() {
void _lcd_ubl_edit_mesh() {
START_MENU();
BACK_ITEM(MSG_UBL_TOOLS);
GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29P4R999T"));
GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29P4RT"));
GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29P4T"));
SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust);
ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
Expand Down Expand Up @@ -594,9 +594,9 @@ void _menu_ubl_tools() {
GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G29NP1"));
GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29P3T0"));
SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29P4R999T"));
GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29P4RT"));
SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29P4R999T"));
GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29P4RT"));
ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd);
END_MENU();
}
Expand Down