M600: use partial backup in RAM
To handle power panic in M600 we started saving relevant data at the start of M600 gcode. We are currently also saving the same data within gcode_M600 which is saved on the stack. I propose we just use the data already saved in SRAM to reduce stack usage. Change in memory: Flash: -64 bytes SRAM: 0 bytes
This commit is contained in:
parent
7e0df7f9d3
commit
cf0e0f3718
|
|
@ -449,8 +449,8 @@ void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex);
|
|||
|
||||
void M600_load_filament();
|
||||
void M600_load_filament_movements();
|
||||
void M600_wait_for_user(float HotendTempBckp);
|
||||
void M600_check_state(float nozzle_temp);
|
||||
void M600_wait_for_user();
|
||||
void M600_check_state();
|
||||
void load_filament_final_feed();
|
||||
void marlin_wait_for_click();
|
||||
float raise_z(float delta);
|
||||
|
|
|
|||
|
|
@ -3385,7 +3385,7 @@ static void mmu_M600_unload_filament() {
|
|||
|
||||
/// @brief load filament for mmu v2
|
||||
/// @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;
|
||||
if (automatic) {
|
||||
slot = SpoolJoin::spooljoin.nextSlot();
|
||||
|
|
@ -3394,7 +3394,7 @@ static void mmu_M600_load_filament(bool automatic, float nozzle_temp) {
|
|||
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);
|
||||
|
||||
|
|
@ -3404,7 +3404,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) {
|
||||
st_synchronize();
|
||||
float lastpos[4];
|
||||
|
||||
// When using an MMU, save the currently use slot number
|
||||
// so the firmware can know which slot to eject after the filament
|
||||
|
|
@ -3413,13 +3412,6 @@ static void gcode_M600(const bool automatic, const float x_position, const float
|
|||
|
||||
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
|
||||
fanSpeed = 0;
|
||||
|
||||
|
|
@ -3450,7 +3442,7 @@ static void gcode_M600(const bool automatic, const float x_position, const float
|
|||
mmu_M600_unload_filament();
|
||||
} else {
|
||||
// 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);
|
||||
}
|
||||
st_synchronize(); // finish moves
|
||||
|
|
@ -3475,15 +3467,15 @@ static void gcode_M600(const bool automatic, const float x_position, const float
|
|||
else // MMU is enabled
|
||||
{
|
||||
if (!automatic) mmu_M600_filament_change_screen(eject_slot);
|
||||
mmu_M600_load_filament(automatic, HotendTempBckp);
|
||||
mmu_M600_load_filament(automatic);
|
||||
}
|
||||
if (!automatic)
|
||||
M600_check_state(HotendTempBckp);
|
||||
M600_check_state();
|
||||
|
||||
lcd_update_enable(true);
|
||||
|
||||
// Not let's go back to print
|
||||
fanSpeed = fanSpeedBckp;
|
||||
fanSpeed = saved_fan_speed;
|
||||
|
||||
// Feed a little of filament to stabilize pressure
|
||||
if (!automatic) {
|
||||
|
|
@ -3506,22 +3498,22 @@ static void gcode_M600(const bool automatic, const float x_position, const float
|
|||
}
|
||||
|
||||
// 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();
|
||||
|
||||
// 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();
|
||||
|
||||
// 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();
|
||||
|
||||
// Recover feed rate
|
||||
feedmultiply = feedmultiplyBckp;
|
||||
enquecommandf_P(MSG_M220, feedmultiplyBckp);
|
||||
feedmultiply = saved_feedmultiply2;
|
||||
enquecommandf_P(MSG_M220, saved_feedmultiply2);
|
||||
}
|
||||
if (isPrintPaused) lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
|
||||
else lcd_setstatuspgm(MSG_WELCOME);
|
||||
|
|
@ -10832,8 +10824,7 @@ void load_filament_final_feed()
|
|||
}
|
||||
|
||||
//! @brief Wait for user to check the state
|
||||
//! @par nozzle_temp nozzle temperature to load filament
|
||||
void M600_check_state(float nozzle_temp)
|
||||
void M600_check_state()
|
||||
{
|
||||
uint8_t lcd_change_filament_state = 0;
|
||||
while (lcd_change_filament_state != 1)
|
||||
|
|
@ -10855,7 +10846,7 @@ void M600_check_state(float nozzle_temp)
|
|||
mmu_M600_filament_change_screen(eject_slot);
|
||||
|
||||
// After user clicks knob, MMU will load the filament
|
||||
mmu_M600_load_filament(false, nozzle_temp);
|
||||
mmu_M600_load_filament(false);
|
||||
} else {
|
||||
M600_load_filament_movements();
|
||||
}
|
||||
|
|
@ -10881,9 +10872,7 @@ void M600_check_state(float nozzle_temp)
|
|||
//!
|
||||
//! Beep, manage nozzle heater and wait for user to start unload filament
|
||||
//! If times out, active extruder temperature is set to 0.
|
||||
//!
|
||||
//! @param HotendTempBckp Temperature to be restored for active extruder, after user resolves MMU problem.
|
||||
void M600_wait_for_user(float HotendTempBckp) {
|
||||
void M600_wait_for_user() {
|
||||
|
||||
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
||||
|
||||
|
|
@ -10912,7 +10901,7 @@ void M600_wait_for_user(float HotendTempBckp) {
|
|||
delay_keep_alive(4);
|
||||
|
||||
if (lcd_clicked()) {
|
||||
setTargetHotend(HotendTempBckp);
|
||||
setTargetHotend(saved_extruder_temperature);
|
||||
lcd_wait_for_heater();
|
||||
wait_for_user_state = 2;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue