Merge pull request #4419 from gudnimg/reduce-stack-m600-opt

M600: reduce stack usage
This commit is contained in:
3d-gussner 2023-11-24 05:39:26 +01:00 committed by GitHub
commit 9f9bb12eeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 29 deletions

View File

@ -445,8 +445,8 @@ void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex);
void M600_load_filament(); void M600_load_filament();
void M600_load_filament_movements(); void M600_load_filament_movements();
void M600_wait_for_user(float HotendTempBckp); void M600_wait_for_user();
void M600_check_state(float nozzle_temp); void M600_check_state();
void load_filament_final_feed(); void load_filament_final_feed();
void marlin_wait_for_click(); void marlin_wait_for_click();
float raise_z(float delta); float raise_z(float delta);

View File

@ -3384,7 +3384,7 @@ static void mmu_M600_unload_filament() {
/// @brief load filament for mmu v2 /// @brief load filament for mmu v2
/// @par nozzle_temp nozzle temperature to load filament /// @par nozzle_temp nozzle temperature to load filament
static void mmu_M600_load_filament(bool automatic, float nozzle_temp) { static void mmu_M600_load_filament(bool automatic) {
uint8_t slot; uint8_t slot;
if (automatic) { if (automatic) {
slot = SpoolJoin::spooljoin.nextSlot(); slot = SpoolJoin::spooljoin.nextSlot();
@ -3393,7 +3393,7 @@ static void mmu_M600_load_filament(bool automatic, float nozzle_temp) {
slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), _T(MSG_FILAMENT)); slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), _T(MSG_FILAMENT));
} }
setTargetHotend(nozzle_temp); setTargetHotend(saved_extruder_temperature);
MMU2::mmu2.load_filament_to_nozzle(slot); MMU2::mmu2.load_filament_to_nozzle(slot);
@ -3403,7 +3403,6 @@ static void mmu_M600_load_filament(bool automatic, float nozzle_temp) {
static void gcode_M600(const bool automatic, const float x_position, const float y_position, const float z_shift, const float e_shift, const float e_shift_late) { static void gcode_M600(const bool automatic, const float x_position, const float y_position, const float z_shift, const float e_shift, const float e_shift_late) {
st_synchronize(); st_synchronize();
float lastpos[4];
// When using an MMU, save the currently use slot number // When using an MMU, save the currently use slot number
// so the firmware can know which slot to eject after the filament // so the firmware can know which slot to eject after the filament
@ -3412,13 +3411,6 @@ static void gcode_M600(const bool automatic, const float x_position, const float
prusa_statistics(22); prusa_statistics(22);
//First backup current position and settings
int feedmultiplyBckp = feedmultiply;
float HotendTempBckp = saved_extruder_temperature;
uint8_t fanSpeedBckp = fanSpeed;
memcpy(lastpos, current_position, sizeof(lastpos));
// Turn off the fan // Turn off the fan
fanSpeed = 0; fanSpeed = 0;
@ -3449,7 +3441,7 @@ static void gcode_M600(const bool automatic, const float x_position, const float
mmu_M600_unload_filament(); mmu_M600_unload_filament();
} else { } else {
// Beep, manage nozzle heater and wait for user to start unload filament // Beep, manage nozzle heater and wait for user to start unload filament
M600_wait_for_user(HotendTempBckp); M600_wait_for_user();
unload_filament(e_shift_late); unload_filament(e_shift_late);
} }
st_synchronize(); // finish moves st_synchronize(); // finish moves
@ -3474,15 +3466,15 @@ static void gcode_M600(const bool automatic, const float x_position, const float
else // MMU is enabled else // MMU is enabled
{ {
if (!automatic) mmu_M600_filament_change_screen(eject_slot); if (!automatic) mmu_M600_filament_change_screen(eject_slot);
mmu_M600_load_filament(automatic, HotendTempBckp); mmu_M600_load_filament(automatic);
} }
if (!automatic) if (!automatic)
M600_check_state(HotendTempBckp); M600_check_state();
lcd_update_enable(true); lcd_update_enable(true);
// Not let's go back to print // Not let's go back to print
fanSpeed = fanSpeedBckp; fanSpeed = saved_fan_speed;
// Feed a little of filament to stabilize pressure // Feed a little of filament to stabilize pressure
if (!automatic) { if (!automatic) {
@ -3505,22 +3497,22 @@ static void gcode_M600(const bool automatic, const float x_position, const float
} }
// Move XY back // Move XY back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED); plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED);
st_synchronize(); st_synchronize();
// Move Z back // Move Z back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED); plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED);
st_synchronize(); st_synchronize();
// Set E position to original // Set E position to original
plan_set_e_position(lastpos[E_AXIS]); plan_set_e_position(saved_pos[E_AXIS]);
memcpy(current_position, lastpos, sizeof(lastpos)); memcpy(current_position, saved_pos, sizeof(saved_pos));
set_destination_to_current(); set_destination_to_current();
// Recover feed rate // Recover feed rate
feedmultiply = feedmultiplyBckp; feedmultiply = saved_feedmultiply2;
enquecommandf_P(MSG_M220, feedmultiplyBckp); enquecommandf_P(MSG_M220, saved_feedmultiply2);
} }
if (print_job_timer.isPaused()) lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); if (print_job_timer.isPaused()) lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
else lcd_setstatuspgm(MSG_WELCOME); else lcd_setstatuspgm(MSG_WELCOME);
@ -10978,8 +10970,7 @@ void load_filament_final_feed()
} }
//! @brief Wait for user to check the state //! @brief Wait for user to check the state
//! @par nozzle_temp nozzle temperature to load filament void M600_check_state()
void M600_check_state(float nozzle_temp)
{ {
uint8_t lcd_change_filament_state = 0; uint8_t lcd_change_filament_state = 0;
while (lcd_change_filament_state != 1) while (lcd_change_filament_state != 1)
@ -11001,7 +10992,7 @@ void M600_check_state(float nozzle_temp)
mmu_M600_filament_change_screen(eject_slot); mmu_M600_filament_change_screen(eject_slot);
// After user clicks knob, MMU will load the filament // After user clicks knob, MMU will load the filament
mmu_M600_load_filament(false, nozzle_temp); mmu_M600_load_filament(false);
} else { } else {
M600_load_filament_movements(); M600_load_filament_movements();
} }
@ -11027,9 +11018,7 @@ void M600_check_state(float nozzle_temp)
//! //!
//! Beep, manage nozzle heater and wait for user to start unload filament //! Beep, manage nozzle heater and wait for user to start unload filament
//! If times out, active extruder temperature is set to 0. //! If times out, active extruder temperature is set to 0.
//! void M600_wait_for_user() {
//! @param HotendTempBckp Temperature to be restored for active extruder, after user resolves MMU problem.
void M600_wait_for_user(float HotendTempBckp) {
KEEPALIVE_STATE(PAUSED_FOR_USER); KEEPALIVE_STATE(PAUSED_FOR_USER);
@ -11058,7 +11047,7 @@ void M600_wait_for_user(float HotendTempBckp) {
delay_keep_alive(4); delay_keep_alive(4);
if (lcd_clicked()) { if (lcd_clicked()) {
setTargetHotend(HotendTempBckp); setTargetHotend(saved_extruder_temperature);
lcd_wait_for_heater(); lcd_wait_for_heater();
wait_for_user_state = 2; wait_for_user_state = 2;
} }