From de2ee57c0ce72d22638efe7edfb88c5377f562d1 Mon Sep 17 00:00:00 2001 From: Jim Morris Date: Tue, 21 Jun 2016 13:36:52 -0700 Subject: [PATCH] FIx suspend/pause and saving/restoring Extruder state, this is complex due to possible scaling of E parameter in the actuator --- src/libs/StepperMotor.cpp | 9 ++++++++- src/libs/StepperMotor.h | 2 ++ src/modules/robot/Robot.cpp | 10 ++++++++-- src/modules/robot/Robot.h | 1 + src/modules/tools/extruder/Extruder.cpp | 25 ++++++++++++++----------- src/modules/tools/extruder/Extruder.h | 6 ++++++ src/modules/utils/player/Player.h | 2 +- 7 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/libs/StepperMotor.cpp b/src/libs/StepperMotor.cpp index 83d7971d..f257d774 100644 --- a/src/libs/StepperMotor.cpp +++ b/src/libs/StepperMotor.cpp @@ -65,9 +65,16 @@ void StepperMotor::change_last_milestone(float new_milestone) current_position_steps = last_milestone_steps; } +void StepperMotor::set_last_milestones(float mm, int32_t steps) +{ + last_milestone_mm= mm; + last_milestone_steps= steps; + current_position_steps= last_milestone_steps; +} + int StepperMotor::steps_to_target(float target) { - int target_steps = lroundf(target * steps_per_mm); + int32_t target_steps = lroundf(target * steps_per_mm); return target_steps - last_milestone_steps; } diff --git a/src/libs/StepperMotor.h b/src/libs/StepperMotor.h index 5d758a03..5f357944 100644 --- a/src/libs/StepperMotor.h +++ b/src/libs/StepperMotor.h @@ -35,7 +35,9 @@ class StepperMotor : public Module { float get_steps_per_mm() const { return steps_per_mm; } void change_steps_per_mm(float); void change_last_milestone(float); + void set_last_milestones(float, int32_t); float get_last_milestone(void) const { return last_milestone_mm; } + int32_t get_last_milestone_steps(void) const { return last_milestone_steps; } float get_current_position(void) const { return (float)current_position_steps/steps_per_mm; } uint32_t get_current_step(void) const { return current_position_steps; } float get_max_rate(void) const { return max_rate; } diff --git a/src/modules/robot/Robot.cpp b/src/modules/robot/Robot.cpp index 2265b870..e8d6d44b 100644 --- a/src/modules/robot/Robot.cpp +++ b/src/modules/robot/Robot.cpp @@ -471,6 +471,7 @@ void Robot::on_gcode_received(void *argument) if(gcode->subcode == 0 && (gcode->has_letter('E') || gcode->get_num_args() == 0)){ // reset the E position, legacy for 3d Printers to be reprap compatible // find the selected extruder + // NOTE this will only work when E is 0 if volumetric and/or scaling is used as the actuator last milestone will be different if it was scaled for (int i = E_AXIS; i < n_motors; ++i) { if(actuators[i]->is_selected()) { float e= gcode->has_letter('E') ? gcode->get_value('E') : 0; @@ -848,11 +849,16 @@ void Robot::reset_axis_position(float x, float y, float z) actuators[i]->change_last_milestone(actuator_pos[i]); } -// Reset the position for an axis (used in homing) +// Reset the position for an axis (used in homing, and to reset extruder after suspend) void Robot::reset_axis_position(float position, int axis) { last_milestone[axis] = position; - reset_axis_position(last_milestone[X_AXIS], last_milestone[Y_AXIS], last_milestone[Z_AXIS]); + if(axis <= Z_AXIS) { + reset_axis_position(last_milestone[X_AXIS], last_milestone[Y_AXIS], last_milestone[Z_AXIS]); + }else{ + // extruders need to be set not calculated + last_machine_position[axis]= position; + } } // similar to reset_axis_position but directly sets the actuator positions in actuators units (eg mm for cartesian, degrees for rotary delta) diff --git a/src/modules/robot/Robot.h b/src/modules/robot/Robot.h index 6433276c..89354408 100644 --- a/src/modules/robot/Robot.h +++ b/src/modules/robot/Robot.h @@ -48,6 +48,7 @@ class Robot : public Module { void check_max_actuator_speeds(); float to_millimeters( float value ) const { return this->inch_mode ? value * 25.4F : value; } float from_millimeters( float value) const { return this->inch_mode ? value/25.4F : value; } + float get_axis_position(int axis) const { return(this->last_milestone[axis]); } void get_axis_position(float position[], size_t n= N_PRIMARY_AXIS) const { memcpy(position, this->last_milestone, n*sizeof(float)); } wcs_t get_axis_position() const { return wcs_t(last_milestone[X_AXIS], last_milestone[Y_AXIS], last_milestone[Z_AXIS]); } int print_position(uint8_t subcode, char *buf, size_t bufsize) const; diff --git a/src/modules/tools/extruder/Extruder.cpp b/src/modules/tools/extruder/Extruder.cpp index 1a1428e5..9770816d 100644 --- a/src/modules/tools/extruder/Extruder.cpp +++ b/src/modules/tools/extruder/Extruder.cpp @@ -204,17 +204,20 @@ void Extruder::on_set_public_data(void *argument) return; } - // // save or restore state - // if(pdr->second_element_is(save_state_checksum)) { - // this->saved_current_position = this->current_position; - // this->saved_absolute_mode = this->absolute_mode; - // pdr->set_taken(); - // } else if(pdr->second_element_is(restore_state_checksum)) { - // // NOTE this only gets called when the queue is empty so the milestones will be the same - // this->milestone_last_position= this->current_position = this->saved_current_position; - // this->milestone_absolute_mode= this->absolute_mode = this->saved_absolute_mode; - // pdr->set_taken(); - // } + // save or restore extruder state + if(pdr->second_element_is(save_state_checksum)) { + // we need to save these separately as they may have been scaled + this->saved_position= std::make_tuple(THEROBOT->get_axis_position(motor_id), stepper_motor->get_last_milestone(), stepper_motor->get_last_milestone_steps()); + this->saved_selected= this->selected; + pdr->set_taken(); + + } else if(pdr->second_element_is(restore_state_checksum)) { + this->selected= this->saved_selected; + // NOTE this only gets called when the queue is empty so the milestones will be the same + THEROBOT->reset_axis_position(std::get<0>(this->saved_position), motor_id); + stepper_motor->set_last_milestones(std::get<1>(this->saved_position), std::get<2>(this->saved_position)); + pdr->set_taken(); + } } void Extruder::on_gcode_received(void *argument) diff --git a/src/modules/tools/extruder/Extruder.h b/src/modules/tools/extruder/Extruder.h index 46b71404..9bddf930 100644 --- a/src/modules/tools/extruder/Extruder.h +++ b/src/modules/tools/extruder/Extruder.h @@ -12,6 +12,8 @@ #include "Tool.h" #include "Pin.h" +#include + class StepperMotor; // NOTE Tool is also a module, no need for multiple inheritance here @@ -51,10 +53,14 @@ class Extruder : public Tool { float retract_zlift_length; float retract_zlift_feedrate; + // for saving and restoring extruder position + std::tuple saved_position; + struct { uint8_t motor_id:8; bool retracted:1; bool cancel_zlift_restore:1; // hack to stop a G11 zlift restore from overring an absolute Z setting bool selected:1; + bool saved_selected:1; }; }; diff --git a/src/modules/utils/player/Player.h b/src/modules/utils/player/Player.h index cbcfb489..47d0223b 100644 --- a/src/modules/utils/player/Player.h +++ b/src/modules/utils/player/Player.h @@ -51,7 +51,7 @@ class Player : public Module { long file_size; unsigned long played_cnt; unsigned long elapsed_secs; - float saved_position[3]; + float saved_position[3]; // only saves XYZ std::map saved_temperatures; struct { bool on_boot_gcode_enable:1; -- 2.20.1