From 4ded6f195e5233479708338b3832615ec6a81dcd Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 26 Aug 2022 18:55:20 +0300 Subject: [PATCH 01/12] Move string to progmem flash: -52 RAM: -6 --- Firmware/cmdqueue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index 5ec79ab00..a13b344ad 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -416,7 +416,7 @@ void get_command() // Line numbers must be first in buffer - if ((strstr(cmdbuffer+bufindw+CMDHDRSIZE, "PRUSA") == NULL) && + if ((strstr_P(cmdbuffer+bufindw+CMDHDRSIZE, PSTR("PRUSA")) == NULL) && (cmdbuffer[bufindw+CMDHDRSIZE] == 'N')) { // Line number met. When sending a G-code over a serial line, each line may be stamped with its index, From 25350dfbbc9af0f2f976834298761d82f2d25f61 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 26 Aug 2022 19:14:40 +0300 Subject: [PATCH 02/12] Remove unused variable bFilamentFirstRun flash: 0 RAM: -1 --- Firmware/Marlin_main.cpp | 1 - Firmware/ultralcd.cpp | 5 ----- Firmware/ultralcd.h | 1 - 3 files changed, 7 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 42de384b9..b576a1b19 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -9746,7 +9746,6 @@ if(0) lcd_update_enable(true); */ eFilamentAction=FilamentAction::AutoLoad; - bFilamentFirstRun=false; if(target_temperature[0] >= extrude_min_temp){ bFilamentPreheatState=true; // mFilamentItem(target_temperature[0],target_temperature_bed); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 9e6920623..a61f8fdfb 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1833,7 +1833,6 @@ void lcd_set_filament_oq_meass() FilamentAction eFilamentAction=FilamentAction::None; // must be initialized as 'non-autoLoad' -bool bFilamentFirstRun; bool bFilamentPreheatState; bool bFilamentAction=false; static bool bFilamentWaitingFlag=false; @@ -2343,7 +2342,6 @@ static void lcd_menu_AutoLoadFilament() static void preheat_or_continue() { - bFilamentFirstRun = false; if (target_temperature[0] >= extrude_min_temp) { bFilamentPreheatState = true; @@ -5584,7 +5582,6 @@ static void mmu_cut_filament_menu() else { eFilamentAction=FilamentAction::MmuCut; - bFilamentFirstRun=false; if(target_temperature[0] >= extrude_min_temp) { bFilamentPreheatState=true; @@ -5983,10 +5980,8 @@ static void lcd_main_menu() else #endif //FILAMENT_SENSOR { - bFilamentFirstRun=true; MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); } - bFilamentFirstRun=true; MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); } MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index d3c94e897..e0a2e6e4c 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -182,7 +182,6 @@ enum class FilamentAction : uint_least8_t }; extern FilamentAction eFilamentAction; -extern bool bFilamentFirstRun; extern bool bFilamentPreheatState; extern bool bFilamentAction; void mFilamentItem(uint16_t nTemp,uint16_t nTempBed); From 74d6aead2f2108e5114b8ab0a3634ad4e676a7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Mon, 21 Feb 2022 22:50:07 +0000 Subject: [PATCH 03/12] Optimise if statements in lcd_tune_menu flash: -10 RAM: 0 I am basically combining two if statements if(SilentModeMenu == SILENT_MODE_NORMAL) --- Firmware/ultralcd.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a61f8fdfb..aac05a2d2 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6164,18 +6164,20 @@ static void lcd_tune_menu() #ifdef TMC2130 - if(!farm_mode) - { - if (SilentModeMenu == SILENT_MODE_NORMAL) MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_NORMAL), lcd_silent_mode_set); - else MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set); - - if (SilentModeMenu == SILENT_MODE_NORMAL) - { - if (lcd_crash_detect_enabled()) MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), _T(MSG_ON), crash_mode_switch); - else MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), _T(MSG_OFF), crash_mode_switch); - } - else MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), NULL, lcd_crash_mode_info); - } + if(!farm_mode) + { + if (SilentModeMenu == SILENT_MODE_NORMAL) { + MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_NORMAL), lcd_silent_mode_set); + if (lcd_crash_detect_enabled()) { + MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), _T(MSG_ON), crash_mode_switch); + } else { + MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), _T(MSG_OFF), crash_mode_switch); + } + } else { + MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set); + MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), NULL, lcd_crash_mode_info); + } + } #else //TMC2130 if (!farm_mode) { //dont show in menu if we are in farm mode switch (SilentModeMenu) { From c2340d3648447a973d6c337ad48c294e683c6418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sat, 19 Feb 2022 10:48:50 +0000 Subject: [PATCH 04/12] lcd_babystep_z should not start lcd_timeoutToStatus flash: -8 RAM: 0 When the menu is entered and left the function menu_lcd_lcdupdate_func() takes care of resetting the timer. Currently the firmware will reset the timer twice when the lcd_babystep_z menu is entered. This commit fixes that. --- Firmware/ultralcd.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index aac05a2d2..934b0abb8 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2682,8 +2682,6 @@ static void lcd_babystep_z() lcd_draw_update = 1; //SERIAL_ECHO("Z baby step: "); //SERIAL_ECHO(_md->babystepMem[2]); - // Wait 90 seconds before closing the live adjust dialog. - lcd_timeoutToStatus.start(); } if (lcd_encoder != 0) From 89fc9f7a62e2c54e17956e89fa28cb4ca047ba73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sat, 19 Feb 2022 09:49:32 +0000 Subject: [PATCH 05/12] Optimise lcd_menu_show_sensors_state() flash: -22 RAM: 0 menu_lcd_lcdupdate_func() takes care of starting lcd_timeoutToStatus if the knob is clicked. When the knob is clicked we only want to back out of the menu. This changes makes the menus slightly more conistant behind the scenes. --- Firmware/ultralcd.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 934b0abb8..a27515f01 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3565,11 +3565,7 @@ void lcd_menu_show_sensors_state() // NOT static due to using ins { lcd_timeoutToStatus.stop(); lcd_show_sensors_state(); - if(LCD_CLICKED) - { - lcd_timeoutToStatus.start(); - menu_back(); - } + menu_back_if_clicked(); } void prusa_statistics_err(char c){ From 22582e560efc3cbc89fcac5d0a7fbea479e7d1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Tue, 15 Feb 2022 07:10:53 +0000 Subject: [PATCH 06/12] Remove one redundant st_synchronize() call flash: -4 RAM: 0 st_synchronize() is called just before leaving gcode_G28() so we don't need to call it again just after leaving gcode_G28() --- Firmware/Marlin_main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b576a1b19..4123c6e8e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -641,7 +641,6 @@ void crashdet_detected(uint8_t mask) lcd_setstatus(msg); gcode_G28(true, true, false); //home X and Y - st_synchronize(); if (automatic_recovery_after_crash) { enquecommand_P(PSTR("CRASH_RECOVER")); From 7d86a0d1214a7f20a52f694624651092e0147a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Tue, 15 Feb 2022 06:36:49 +0000 Subject: [PATCH 07/12] Reduce a few magic numbers for FILENAME_LENGTH flash: 0 RAM: 0 --- Firmware/Marlin_main.cpp | 2 +- Firmware/SdBaseFile.cpp | 2 +- Firmware/cardreader.cpp | 2 +- Firmware/cardreader.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4123c6e8e..2875cf93e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -11313,7 +11313,7 @@ void restore_print_from_eeprom(bool mbl_was_active) { int feedmultiply_rec; uint8_t fan_speed_rec; char cmd[48]; - char filename[13]; + char filename[FILENAME_LENGTH]; uint8_t depth = 0; char dir_name[9]; diff --git a/Firmware/SdBaseFile.cpp b/Firmware/SdBaseFile.cpp index e3b1c18c8..08b55651a 100644 --- a/Firmware/SdBaseFile.cpp +++ b/Firmware/SdBaseFile.cpp @@ -1015,7 +1015,7 @@ void SdBaseFile::printFatTime( uint16_t fatTime) { * the value zero, false, is returned for failure. */ bool SdBaseFile::printName() { - char name[13]; + char name[FILENAME_LENGTH]; if (!getFilename(name)) return false; MYSERIAL.print(name); return true; diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 027281af6..ba618412a 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -304,7 +304,7 @@ void CardReader::getAbsFilename(char *t) while(*t!=0 && cnt< MAXPATHNAMELENGTH) {t++;cnt++;} //crawl counter forward. } - if(cnt Date: Tue, 15 Feb 2022 06:19:59 +0000 Subject: [PATCH 08/12] Use set_destination_to_current instead of memcpy flash: -14 RAM: 0 --- Firmware/planner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index a51dff872..0b4708c5b 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -658,7 +658,7 @@ void planner_reset_position() // Apply inverse world correction matrix. machine2world(current_position[X_AXIS], current_position[Y_AXIS]); - memcpy(destination, current_position, sizeof(destination)); + set_destination_to_current(); #ifdef LIN_ADVANCE memcpy(position_float, current_position, sizeof(position_float)); #endif From 7711969e572bd9e7c37edbda722ce4d0a0ab50ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sun, 13 Feb 2022 20:02:55 +0000 Subject: [PATCH 09/12] ftostr12ns: change xx from long to int flash: -44 RAM: 0 Largest expected number is 999 after the multiplication by 100. I measured the execution time drops from ~170us to ~73us. --- Firmware/conv2str.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/conv2str.cpp b/Firmware/conv2str.cpp index 10aa711e4..291c15848 100644 --- a/Firmware/conv2str.cpp +++ b/Firmware/conv2str.cpp @@ -104,7 +104,7 @@ char *ftostr43(const float &x, uint8_t offset) //Float to string with 1.23 format char *ftostr12ns(const float &x) { - long xx = x * 100; + int xx = x * 100; xx = abs(xx); conv[0] = (xx / 100) % 10 + '0'; From 4e798c9ed14300290586faaa3bab5769079d0a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sun, 13 Feb 2022 16:28:24 +0000 Subject: [PATCH 10/12] Remove unused variable maxlimit_status flash: 0 RAM: -1 --- Firmware/planner.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 0b4708c5b..a556918a6 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -99,8 +99,6 @@ static float previous_speed[NUM_AXIS]; // Speed of previous path line segment static float previous_nominal_speed; // Nominal speed of previous path line segment static float previous_safe_speed; // Exit speed limited by a jerk to full halt of a previous last segment. -uint8_t maxlimit_status; - #ifdef AUTOTEMP float autotemp_max=250; float autotemp_min=210; From 7d72f0ee2ec07a80107195861b9e8340e872856d Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 10 Feb 2022 23:48:22 +0100 Subject: [PATCH 11/12] better lcd printing for IP address flash: -46 RAM: 0 --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a27515f01..414f570b0 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1737,7 +1737,7 @@ static void lcd_support_menu() if (((menu_item - 1) == menu_line) && lcd_draw_update) { lcd_set_cursor(2, menu_row); ip4_to_str(_md->ip_str, (uint8_t*)(&_md->ip)); - lcd_printf_P(PSTR("%s"), _md->ip_str); + lcd_print(_md->ip_str); } } @@ -1750,7 +1750,7 @@ static void lcd_support_menu() if (((menu_item - 1) == menu_line) && lcd_draw_update) { lcd_set_cursor(2, menu_row); ip4_to_str(_md->ip_str, (uint8_t*)(&IP_address)); - lcd_printf_P(PSTR("%s"), _md->ip_str); + lcd_print(_md->ip_str); } } From 37c9dcbe5380026d474d4352db5f4bbc8cd041c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sun, 6 Feb 2022 09:30:29 +0000 Subject: [PATCH 12/12] Optimise calculations to use hypot() where possible flash: -122 RAM: 0 It is defined: hypot(x,y) = sqrtf(x*x + y*y) --- Firmware/mesh_bed_calibration.cpp | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index 4de80504f..289d2dd71 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -418,9 +418,9 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS( for (uint8_t i = 0; i < npts; ++i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0]; float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1]; - float errX = sqr(pgm_read_float(true_pts + i * 2) - x); - float errY = sqr(pgm_read_float(true_pts + i * 2 + 1) - y); - float err = sqrt(errX + errY); + float errX = pgm_read_float(true_pts + i * 2) - x; + float errY = pgm_read_float(true_pts + i * 2 + 1) - y; + float err = hypot(errX, errY); #ifdef SUPPORT_VERBOSITY if (verbosity_level >= 10) { SERIAL_ECHOPGM("point #"); @@ -434,15 +434,15 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS( if(verbosity_level >= 20) SERIAL_ECHOPGM("Point on first row"); #endif // SUPPORT_VERBOSITY float w = point_weight_y(i, measured_pts[2 * i + 1]); - if (sqrt(errX) > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_X || - (w != 0.f && sqrt(errY) > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_Y)) { + if (errX > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_X || + (w != 0.f && errY > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_Y)) { result = BED_SKEW_OFFSET_DETECTION_FITTING_FAILED; #ifdef SUPPORT_VERBOSITY if (verbosity_level >= 20) { SERIAL_ECHOPGM(", weigth Y: "); MYSERIAL.print(w); - if (sqrt(errX) > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_X) SERIAL_ECHOPGM(", error X > max. error X"); - if (w != 0.f && sqrt(errY) > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_Y) SERIAL_ECHOPGM(", error Y > max. error Y"); + if (errX > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_X) SERIAL_ECHOPGM(", error X > max. error X"); + if (w != 0.f && errY > BED_CALIBRATION_POINT_OFFSET_MAX_1ST_ROW_Y) SERIAL_ECHOPGM(", error Y > max. error Y"); } #endif // SUPPORT_VERBOSITY } @@ -477,9 +477,9 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS( SERIAL_ECHOPGM("error: "); MYSERIAL.print(err); SERIAL_ECHOPGM(", error X: "); - MYSERIAL.print(sqrt(errX)); + MYSERIAL.print(errX); SERIAL_ECHOPGM(", error Y: "); - MYSERIAL.print(sqrt(errY)); + MYSERIAL.print(errY); SERIAL_ECHOLNPGM(""); SERIAL_ECHOLNPGM(""); } @@ -645,7 +645,7 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS( SERIAL_ECHOPGM(", "); MYSERIAL.print(pgm_read_float(true_pts + i * 2 + 1), 5); SERIAL_ECHOPGM("), error: "); - MYSERIAL.print(sqrt(sqr(measured_pts[i * 2] - x) + sqr(measured_pts[i * 2 + 1] - y))); + MYSERIAL.print( hypot(measured_pts[i * 2] - x, measured_pts[i * 2 + 1] - y) ); SERIAL_ECHOLNPGM(""); } if (verbosity_level >= 20) { @@ -810,7 +810,7 @@ void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]) else { // Length of the vec_x shall be close to unity. - float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]); + float l = hypot(vec_x[0], vec_x[1]); if (l < 0.9 || l > 1.1) { #if 0 @@ -821,7 +821,7 @@ void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]) reset = true; } // Length of the vec_y shall be close to unity. - l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]); + l = hypot(vec_y[0], vec_y[1]); if (l < 0.9 || l > 1.1) { #if 0 @@ -832,7 +832,7 @@ void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]) reset = true; } // Correction of the zero point shall be reasonably small. - l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]); + l = hypot(cntr[0], cntr[1]); if (l > 15.f) { #if 0 @@ -1579,7 +1579,7 @@ inline bool improve_bed_induction_sensor_point() // Trim the vector from center_old_[x,y] to destination[x,y] by the bed dimensions. float vx = destination[X_AXIS] - center_old_x; float vy = destination[Y_AXIS] - center_old_y; - float l = sqrt(vx*vx+vy*vy); + float l = hypot(vx, vy); float t; if (destination[X_AXIS] < X_MIN_POS) { // Exiting the bed at xmin. @@ -2441,16 +2441,16 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level #ifdef SUPPORT_VERBOSITY if (verbosity_level >= 10) { // Length of the vec_x - float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]); + float l = hypot(vec_x[0], vec_x[1]); SERIAL_ECHOLNPGM("X vector length:"); MYSERIAL.println(l); // Length of the vec_y - l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]); + l = hypot(vec_y[0], vec_y[1]); SERIAL_ECHOLNPGM("Y vector length:"); MYSERIAL.println(l); // Zero point correction - l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]); + l = hypot(cntr[0], cntr[1]); SERIAL_ECHOLNPGM("Zero point correction:"); MYSERIAL.println(l);