Merge pull request #2416 from wavexx/fix_G92_e_reset
Fix incorrect usage of plan_set_e_position() in G92 E*
This commit is contained in:
commit
27f6807bd5
4 changed files with 91 additions and 16 deletions
|
@ -3356,6 +3356,49 @@ static void gcode_PRUSA_BadRAMBoFanTest(){
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// G92 - Set current position to coordinates given
|
||||||
|
static void gcode_G92()
|
||||||
|
{
|
||||||
|
bool codes[NUM_AXIS];
|
||||||
|
float values[NUM_AXIS];
|
||||||
|
|
||||||
|
// Check which axes need to be set
|
||||||
|
for(uint8_t i = 0; i < NUM_AXIS; ++i)
|
||||||
|
{
|
||||||
|
codes[i] = code_seen(axis_codes[i]);
|
||||||
|
if(codes[i])
|
||||||
|
values[i] = code_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if((codes[E_AXIS] && values[E_AXIS] == 0) &&
|
||||||
|
(!codes[X_AXIS] && !codes[Y_AXIS] && !codes[Z_AXIS]))
|
||||||
|
{
|
||||||
|
// As a special optimization, when _just_ clearing the E position
|
||||||
|
// we schedule a flag asynchronously along with the next block to
|
||||||
|
// reset the starting E position instead of stopping the planner
|
||||||
|
current_position[E_AXIS] = 0;
|
||||||
|
plan_reset_next_e();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// In any other case we're forced to synchronize
|
||||||
|
st_synchronize();
|
||||||
|
for(uint8_t i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
if(codes[i])
|
||||||
|
current_position[i] = values[i] + cs.add_homing[i];
|
||||||
|
}
|
||||||
|
if(codes[E_AXIS])
|
||||||
|
current_position[E_AXIS] = values[E_AXIS];
|
||||||
|
|
||||||
|
// Set all at once
|
||||||
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS],
|
||||||
|
current_position[Z_AXIS], current_position[E_AXIS]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef BACKLASH_X
|
#ifdef BACKLASH_X
|
||||||
extern uint8_t st_backlash_x;
|
extern uint8_t st_backlash_x;
|
||||||
#endif //BACKLASH_X
|
#endif //BACKLASH_X
|
||||||
|
@ -5217,22 +5260,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
|
||||||
|
|
||||||
//! ### G92 - Set position
|
//! ### G92 - Set position
|
||||||
// -----------------------------
|
// -----------------------------
|
||||||
case 92:
|
case 92: {
|
||||||
if(!code_seen(axis_codes[E_AXIS]))
|
gcode_G92();
|
||||||
st_synchronize();
|
}
|
||||||
for(int8_t i=0; i < NUM_AXIS; i++) {
|
break;
|
||||||
if(code_seen(axis_codes[i])) {
|
|
||||||
if(i == E_AXIS) {
|
|
||||||
current_position[i] = code_value();
|
|
||||||
plan_set_e_position(current_position[E_AXIS]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
current_position[i] = code_value()+cs.add_homing[i];
|
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
//! ### G98 - Activate farm mode
|
//! ### G98 - Activate farm mode
|
||||||
|
|
|
@ -130,6 +130,10 @@ float extruder_advance_K = LIN_ADVANCE_K;
|
||||||
float position_float[NUM_AXIS];
|
float position_float[NUM_AXIS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Request the next block to start at zero E count
|
||||||
|
static bool plan_reset_next_e_queue;
|
||||||
|
static bool plan_reset_next_e_sched;
|
||||||
|
|
||||||
// Returns the index of the next block in the ring buffer
|
// Returns the index of the next block in the ring buffer
|
||||||
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
|
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
|
||||||
static inline int8_t next_block_index(int8_t block_index) {
|
static inline int8_t next_block_index(int8_t block_index) {
|
||||||
|
@ -441,6 +445,8 @@ void plan_init() {
|
||||||
previous_speed[2] = 0.0;
|
previous_speed[2] = 0.0;
|
||||||
previous_speed[3] = 0.0;
|
previous_speed[3] = 0.0;
|
||||||
previous_nominal_speed = 0.0;
|
previous_nominal_speed = 0.0;
|
||||||
|
plan_reset_next_e_queue = false;
|
||||||
|
plan_reset_next_e_sched = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -658,6 +664,9 @@ void planner_abort_hard()
|
||||||
previous_speed[2] = 0.0;
|
previous_speed[2] = 0.0;
|
||||||
previous_speed[3] = 0.0;
|
previous_speed[3] = 0.0;
|
||||||
|
|
||||||
|
plan_reset_next_e_queue = false;
|
||||||
|
plan_reset_next_e_sched = false;
|
||||||
|
|
||||||
// Relay to planner wait routine, that the current line shall be canceled.
|
// Relay to planner wait routine, that the current line shall be canceled.
|
||||||
waiting_inside_plan_buffer_line_print_aborted = true;
|
waiting_inside_plan_buffer_line_print_aborted = true;
|
||||||
}
|
}
|
||||||
|
@ -721,6 +730,20 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
|
||||||
// Save the global feedrate at scheduling time
|
// Save the global feedrate at scheduling time
|
||||||
block->gcode_feedrate = feedrate;
|
block->gcode_feedrate = feedrate;
|
||||||
|
|
||||||
|
// Reset the starting E position when requested
|
||||||
|
if (plan_reset_next_e_queue)
|
||||||
|
{
|
||||||
|
position[E_AXIS] = 0;
|
||||||
|
#ifdef LIN_ADVANCE
|
||||||
|
position_float[E_AXIS] = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// the block might still be discarded later, but we need to ensure the lower-level
|
||||||
|
// count_position is also reset correctly for consistent results!
|
||||||
|
plan_reset_next_e_queue = false;
|
||||||
|
plan_reset_next_e_sched = true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_AUTO_BED_LEVELING
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
||||||
apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
|
apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
|
||||||
#endif // ENABLE_AUTO_BED_LEVELING
|
#endif // ENABLE_AUTO_BED_LEVELING
|
||||||
|
@ -1165,6 +1188,13 @@ Having the real displacement of the head, we can calculate the total movement le
|
||||||
// Reset the block flag.
|
// Reset the block flag.
|
||||||
block->flag = 0;
|
block->flag = 0;
|
||||||
|
|
||||||
|
if (plan_reset_next_e_sched)
|
||||||
|
{
|
||||||
|
// finally propagate a pending reset
|
||||||
|
block->flag |= BLOCK_FLAG_E_RESET;
|
||||||
|
plan_reset_next_e_sched = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Initial limit on the segment entry velocity.
|
// Initial limit on the segment entry velocity.
|
||||||
float vmax_junction;
|
float vmax_junction;
|
||||||
|
|
||||||
|
@ -1367,6 +1397,11 @@ void plan_set_e_position(const float &e)
|
||||||
st_set_e_position(position[E_AXIS]);
|
st_set_e_position(position[E_AXIS]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void plan_reset_next_e()
|
||||||
|
{
|
||||||
|
plan_reset_next_e_queue = true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PREVENT_DANGEROUS_EXTRUDE
|
#ifdef PREVENT_DANGEROUS_EXTRUDE
|
||||||
void set_extrude_min_temp(float temp)
|
void set_extrude_min_temp(float temp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,6 +44,8 @@ enum BlockFlag {
|
||||||
// than 32767, therefore the DDA algorithm may run with 16bit resolution only.
|
// than 32767, therefore the DDA algorithm may run with 16bit resolution only.
|
||||||
// In addition, the stepper routine will not do any end stop checking for higher performance.
|
// In addition, the stepper routine will not do any end stop checking for higher performance.
|
||||||
BLOCK_FLAG_DDA_LOWRES = 8,
|
BLOCK_FLAG_DDA_LOWRES = 8,
|
||||||
|
// Block starts with Zeroed E counter
|
||||||
|
BLOCK_FLAG_E_RESET = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
union dda_isteps_t
|
union dda_isteps_t
|
||||||
|
@ -168,6 +170,9 @@ void plan_set_position(float x, float y, float z, const float &e);
|
||||||
void plan_set_z_position(const float &z);
|
void plan_set_z_position(const float &z);
|
||||||
void plan_set_e_position(const float &e);
|
void plan_set_e_position(const float &e);
|
||||||
|
|
||||||
|
// Reset the E position to zero at the start of the next segment
|
||||||
|
void plan_reset_next_e();
|
||||||
|
|
||||||
extern bool e_active();
|
extern bool e_active();
|
||||||
|
|
||||||
void check_axes_activity();
|
void check_axes_activity();
|
||||||
|
|
|
@ -362,6 +362,10 @@ FORCE_INLINE void stepper_next_block()
|
||||||
LA_phase = -1;
|
LA_phase = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (current_block->flag & BLOCK_FLAG_E_RESET) {
|
||||||
|
count_position[E_AXIS] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) {
|
if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) {
|
||||||
counter_x.lo = -(current_block->step_event_count.lo >> 1);
|
counter_x.lo = -(current_block->step_event_count.lo >> 1);
|
||||||
counter_y.lo = counter_x.lo;
|
counter_y.lo = counter_x.lo;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue