|
@ -55,7 +55,7 @@ |
|
|
#include "ultralcd.h" |
|
|
#include "ultralcd.h" |
|
|
#include "language.h" |
|
|
#include "language.h" |
|
|
|
|
|
|
|
|
#ifdef MESH_BED_LEVELING |
|
|
#if ENABLED(MESH_BED_LEVELING) |
|
|
#include "mesh_bed_leveling.h" |
|
|
#include "mesh_bed_leveling.h" |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
@ -77,7 +77,7 @@ float max_e_jerk; |
|
|
float mintravelfeedrate; |
|
|
float mintravelfeedrate; |
|
|
unsigned long axis_steps_per_sqr_second[NUM_AXIS]; |
|
|
unsigned long axis_steps_per_sqr_second[NUM_AXIS]; |
|
|
|
|
|
|
|
|
#ifdef ENABLE_AUTO_BED_LEVELING |
|
|
#if ENABLED(ENABLE_AUTO_BED_LEVELING) |
|
|
// Transform required to compensate for bed level
|
|
|
// Transform required to compensate for bed level
|
|
|
matrix_3x3 plan_bed_level_matrix = { |
|
|
matrix_3x3 plan_bed_level_matrix = { |
|
|
1.0, 0.0, 0.0, |
|
|
1.0, 0.0, 0.0, |
|
@ -86,7 +86,7 @@ unsigned long axis_steps_per_sqr_second[NUM_AXIS]; |
|
|
}; |
|
|
}; |
|
|
#endif // ENABLE_AUTO_BED_LEVELING
|
|
|
#endif // ENABLE_AUTO_BED_LEVELING
|
|
|
|
|
|
|
|
|
#ifdef AUTOTEMP |
|
|
#if ENABLED(AUTOTEMP) |
|
|
float autotemp_max = 250; |
|
|
float autotemp_max = 250; |
|
|
float autotemp_min = 210; |
|
|
float autotemp_min = 210; |
|
|
float autotemp_factor = 0.1; |
|
|
float autotemp_factor = 0.1; |
|
@ -121,7 +121,7 @@ unsigned char g_uc_extruder_last_move[4] = {0,0,0,0}; |
|
|
static long axis_segment_time[2][3] = { {MAX_FREQ_TIME+1,0,0}, {MAX_FREQ_TIME+1,0,0} }; |
|
|
static long axis_segment_time[2][3] = { {MAX_FREQ_TIME+1,0,0}, {MAX_FREQ_TIME+1,0,0} }; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef FILAMENT_SENSOR |
|
|
#if ENABLED(FILAMENT_SENSOR) |
|
|
static char meas_sample; //temporary variable to hold filament measurement sample
|
|
|
static char meas_sample; //temporary variable to hold filament measurement sample
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
@ -178,7 +178,7 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi |
|
|
plateau_steps = 0; |
|
|
plateau_steps = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifdef ADVANCE |
|
|
#if ENABLED(ADVANCE) |
|
|
volatile long initial_advance = block->advance * entry_factor * entry_factor; |
|
|
volatile long initial_advance = block->advance * entry_factor * entry_factor; |
|
|
volatile long final_advance = block->advance * exit_factor * exit_factor; |
|
|
volatile long final_advance = block->advance * exit_factor * exit_factor; |
|
|
#endif // ADVANCE
|
|
|
#endif // ADVANCE
|
|
@ -191,7 +191,7 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi |
|
|
block->decelerate_after = accelerate_steps+plateau_steps; |
|
|
block->decelerate_after = accelerate_steps+plateau_steps; |
|
|
block->initial_rate = initial_rate; |
|
|
block->initial_rate = initial_rate; |
|
|
block->final_rate = final_rate; |
|
|
block->final_rate = final_rate; |
|
|
#ifdef ADVANCE |
|
|
#if ENABLED(ADVANCE) |
|
|
block->initial_advance = initial_advance; |
|
|
block->initial_advance = initial_advance; |
|
|
block->final_advance = final_advance; |
|
|
block->final_advance = final_advance; |
|
|
#endif |
|
|
#endif |
|
@ -361,7 +361,7 @@ void plan_init() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef AUTOTEMP |
|
|
#if ENABLED(AUTOTEMP) |
|
|
void getHighESpeed() { |
|
|
void getHighESpeed() { |
|
|
static float oldt = 0; |
|
|
static float oldt = 0; |
|
|
|
|
|
|
|
@ -394,7 +394,7 @@ void plan_init() { |
|
|
void check_axes_activity() { |
|
|
void check_axes_activity() { |
|
|
unsigned char axis_active[NUM_AXIS] = { 0 }, |
|
|
unsigned char axis_active[NUM_AXIS] = { 0 }, |
|
|
tail_fan_speed = fanSpeed; |
|
|
tail_fan_speed = fanSpeed; |
|
|
#ifdef BARICUDA |
|
|
#if ENABLED(BARICUDA) |
|
|
unsigned char tail_valve_pressure = ValvePressure, |
|
|
unsigned char tail_valve_pressure = ValvePressure, |
|
|
tail_e_to_p_pressure = EtoPPressure; |
|
|
tail_e_to_p_pressure = EtoPPressure; |
|
|
#endif |
|
|
#endif |
|
@ -404,7 +404,7 @@ void check_axes_activity() { |
|
|
if (blocks_queued()) { |
|
|
if (blocks_queued()) { |
|
|
uint8_t block_index = block_buffer_tail; |
|
|
uint8_t block_index = block_buffer_tail; |
|
|
tail_fan_speed = block_buffer[block_index].fan_speed; |
|
|
tail_fan_speed = block_buffer[block_index].fan_speed; |
|
|
#ifdef BARICUDA |
|
|
#if ENABLED(BARICUDA) |
|
|
block = &block_buffer[block_index]; |
|
|
block = &block_buffer[block_index]; |
|
|
tail_valve_pressure = block->valve_pressure; |
|
|
tail_valve_pressure = block->valve_pressure; |
|
|
tail_e_to_p_pressure = block->e_to_p_pressure; |
|
|
tail_e_to_p_pressure = block->e_to_p_pressure; |
|
@ -441,23 +441,23 @@ void check_axes_activity() { |
|
|
fan_kick_end = 0; |
|
|
fan_kick_end = 0; |
|
|
} |
|
|
} |
|
|
#endif //FAN_KICKSTART_TIME
|
|
|
#endif //FAN_KICKSTART_TIME
|
|
|
#ifdef FAN_MIN_PWM |
|
|
#if ENABLED(FAN_MIN_PWM) |
|
|
#define CALC_FAN_SPEED (tail_fan_speed ? ( FAN_MIN_PWM + (tail_fan_speed * (255 - FAN_MIN_PWM)) / 255 ) : 0) |
|
|
#define CALC_FAN_SPEED (tail_fan_speed ? ( FAN_MIN_PWM + (tail_fan_speed * (255 - FAN_MIN_PWM)) / 255 ) : 0) |
|
|
#else |
|
|
#else |
|
|
#define CALC_FAN_SPEED tail_fan_speed |
|
|
#define CALC_FAN_SPEED tail_fan_speed |
|
|
#endif // FAN_MIN_PWM
|
|
|
#endif // FAN_MIN_PWM
|
|
|
#ifdef FAN_SOFT_PWM |
|
|
#if ENABLED(FAN_SOFT_PWM) |
|
|
fanSpeedSoftPwm = CALC_FAN_SPEED; |
|
|
fanSpeedSoftPwm = CALC_FAN_SPEED; |
|
|
#else |
|
|
#else |
|
|
analogWrite(FAN_PIN, CALC_FAN_SPEED); |
|
|
analogWrite(FAN_PIN, CALC_FAN_SPEED); |
|
|
#endif // FAN_SOFT_PWM
|
|
|
#endif // FAN_SOFT_PWM
|
|
|
#endif // HAS_FAN
|
|
|
#endif // HAS_FAN
|
|
|
|
|
|
|
|
|
#ifdef AUTOTEMP |
|
|
#if ENABLED(AUTOTEMP) |
|
|
getHighESpeed(); |
|
|
getHighESpeed(); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef BARICUDA |
|
|
#if ENABLED(BARICUDA) |
|
|
#if HAS_HEATER_1 |
|
|
#if HAS_HEATER_1 |
|
|
analogWrite(HEATER_1_PIN,tail_valve_pressure); |
|
|
analogWrite(HEATER_1_PIN,tail_valve_pressure); |
|
|
#endif |
|
|
#endif |
|
@ -472,7 +472,7 @@ float junction_deviation = 0.1; |
|
|
// Add a new linear movement to the buffer. steps[X_AXIS], _y and _z is the absolute position in
|
|
|
// Add a new linear movement to the buffer. steps[X_AXIS], _y and _z is the absolute position in
|
|
|
// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
|
|
|
// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
|
|
|
// calculation the caller must also provide the physical length of the line in millimeters.
|
|
|
// calculation the caller must also provide the physical length of the line in millimeters.
|
|
|
#if defined(ENABLE_AUTO_BED_LEVELING) || defined(MESH_BED_LEVELING) |
|
|
#if ENABLED(ENABLE_AUTO_BED_LEVELING) || ENABLED(MESH_BED_LEVELING) |
|
|
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t extruder) |
|
|
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t extruder) |
|
|
#else |
|
|
#else |
|
|
void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t extruder) |
|
|
void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t extruder) |
|
@ -485,9 +485,9 @@ float junction_deviation = 0.1; |
|
|
// Rest here until there is room in the buffer.
|
|
|
// Rest here until there is room in the buffer.
|
|
|
while (block_buffer_tail == next_buffer_head) idle(); |
|
|
while (block_buffer_tail == next_buffer_head) idle(); |
|
|
|
|
|
|
|
|
#ifdef MESH_BED_LEVELING |
|
|
#if ENABLED(MESH_BED_LEVELING) |
|
|
if (mbl.active) z += mbl.get_z(x, y); |
|
|
if (mbl.active) z += mbl.get_z(x, y); |
|
|
#elif defined(ENABLE_AUTO_BED_LEVELING) |
|
|
#elif ENABLED(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 |
|
|
#endif |
|
|
|
|
|
|
|
@ -510,7 +510,7 @@ float junction_deviation = 0.1; |
|
|
|
|
|
|
|
|
float de = target[E_AXIS] - position[E_AXIS]; |
|
|
float de = target[E_AXIS] - position[E_AXIS]; |
|
|
|
|
|
|
|
|
#ifdef PREVENT_DANGEROUS_EXTRUDE |
|
|
#if ENABLED(PREVENT_DANGEROUS_EXTRUDE) |
|
|
if (de) { |
|
|
if (de) { |
|
|
if (degHotend(extruder) < extrude_min_temp) { |
|
|
if (degHotend(extruder) < extrude_min_temp) { |
|
|
position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part
|
|
|
position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part
|
|
@ -518,7 +518,7 @@ float junction_deviation = 0.1; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); |
|
|
SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); |
|
|
} |
|
|
} |
|
|
#ifdef PREVENT_LENGTHY_EXTRUDE |
|
|
#if ENABLED(PREVENT_LENGTHY_EXTRUDE) |
|
|
if (labs(de) > axis_steps_per_unit[E_AXIS] * EXTRUDE_MAXLENGTH) { |
|
|
if (labs(de) > axis_steps_per_unit[E_AXIS] * EXTRUDE_MAXLENGTH) { |
|
|
position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part
|
|
|
position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part
|
|
|
de = 0; // no difference
|
|
|
de = 0; // no difference
|
|
@ -536,7 +536,7 @@ float junction_deviation = 0.1; |
|
|
block->busy = false; |
|
|
block->busy = false; |
|
|
|
|
|
|
|
|
// Number of steps for each axis
|
|
|
// Number of steps for each axis
|
|
|
#ifdef COREXY |
|
|
#if ENABLED(COREXY) |
|
|
// corexy planning
|
|
|
// corexy planning
|
|
|
// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html
|
|
|
// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html
|
|
|
block->steps[A_AXIS] = labs(dx + dy); |
|
|
block->steps[A_AXIS] = labs(dx + dy); |
|
@ -564,14 +564,14 @@ float junction_deviation = 0.1; |
|
|
if (block->step_event_count <= dropsegments) return; |
|
|
if (block->step_event_count <= dropsegments) return; |
|
|
|
|
|
|
|
|
block->fan_speed = fanSpeed; |
|
|
block->fan_speed = fanSpeed; |
|
|
#ifdef BARICUDA |
|
|
#if ENABLED(BARICUDA) |
|
|
block->valve_pressure = ValvePressure; |
|
|
block->valve_pressure = ValvePressure; |
|
|
block->e_to_p_pressure = EtoPPressure; |
|
|
block->e_to_p_pressure = EtoPPressure; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
// Compute direction bits for this block
|
|
|
// Compute direction bits for this block
|
|
|
uint8_t db = 0; |
|
|
uint8_t db = 0; |
|
|
#ifdef COREXY |
|
|
#if ENABLED(COREXY) |
|
|
if (dx < 0) db |= BIT(X_HEAD); // Save the real Extruder (head) direction in X Axis
|
|
|
if (dx < 0) db |= BIT(X_HEAD); // Save the real Extruder (head) direction in X Axis
|
|
|
if (dy < 0) db |= BIT(Y_HEAD); // ...and Y
|
|
|
if (dy < 0) db |= BIT(Y_HEAD); // ...and Y
|
|
|
if (dz < 0) db |= BIT(Z_AXIS); |
|
|
if (dz < 0) db |= BIT(Z_AXIS); |
|
@ -594,7 +594,7 @@ float junction_deviation = 0.1; |
|
|
block->active_extruder = extruder; |
|
|
block->active_extruder = extruder; |
|
|
|
|
|
|
|
|
//enable active axes
|
|
|
//enable active axes
|
|
|
#ifdef COREXY |
|
|
#if ENABLED(COREXY) |
|
|
if (block->steps[A_AXIS] || block->steps[B_AXIS]) { |
|
|
if (block->steps[A_AXIS] || block->steps[B_AXIS]) { |
|
|
enable_x(); |
|
|
enable_x(); |
|
|
enable_y(); |
|
|
enable_y(); |
|
@ -693,7 +693,7 @@ float junction_deviation = 0.1; |
|
|
* So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. |
|
|
* So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. |
|
|
* Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. |
|
|
* Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. |
|
|
*/ |
|
|
*/ |
|
|
#ifdef COREXY |
|
|
#if ENABLED(COREXY) |
|
|
float delta_mm[6]; |
|
|
float delta_mm[6]; |
|
|
delta_mm[X_HEAD] = dx / axis_steps_per_unit[A_AXIS]; |
|
|
delta_mm[X_HEAD] = dx / axis_steps_per_unit[A_AXIS]; |
|
|
delta_mm[Y_HEAD] = dy / axis_steps_per_unit[B_AXIS]; |
|
|
delta_mm[Y_HEAD] = dy / axis_steps_per_unit[B_AXIS]; |
|
@ -720,9 +720,9 @@ float junction_deviation = 0.1; |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
block->millimeters = sqrt( |
|
|
block->millimeters = sqrt( |
|
|
#ifdef COREXY |
|
|
#if ENABLED(COREXY) |
|
|
square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS]) |
|
|
square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS]) |
|
|
#elif defined(COREXZ) |
|
|
#elif ENABLED(COREXZ) |
|
|
square(delta_mm[X_HEAD]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_HEAD]) |
|
|
square(delta_mm[X_HEAD]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_HEAD]) |
|
|
#else |
|
|
#else |
|
|
square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS]) |
|
|
square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS]) |
|
@ -737,12 +737,12 @@ float junction_deviation = 0.1; |
|
|
int moves_queued = movesplanned(); |
|
|
int moves_queued = movesplanned(); |
|
|
|
|
|
|
|
|
// Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill
|
|
|
// Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill
|
|
|
#if defined(OLD_SLOWDOWN) || defined(SLOWDOWN) |
|
|
#if ENABLED(OLD_SLOWDOWN) || ENABLED(SLOWDOWN) |
|
|
bool mq = moves_queued > 1 && moves_queued < BLOCK_BUFFER_SIZE / 2; |
|
|
bool mq = moves_queued > 1 && moves_queued < BLOCK_BUFFER_SIZE / 2; |
|
|
#ifdef OLD_SLOWDOWN |
|
|
#if ENABLED(OLD_SLOWDOWN) |
|
|
if (mq) feed_rate *= 2.0 * moves_queued / BLOCK_BUFFER_SIZE; |
|
|
if (mq) feed_rate *= 2.0 * moves_queued / BLOCK_BUFFER_SIZE; |
|
|
#endif |
|
|
#endif |
|
|
#ifdef SLOWDOWN |
|
|
#if ENABLED(SLOWDOWN) |
|
|
// segment time im micro seconds
|
|
|
// segment time im micro seconds
|
|
|
unsigned long segment_time = lround(1000000.0/inverse_second); |
|
|
unsigned long segment_time = lround(1000000.0/inverse_second); |
|
|
if (mq) { |
|
|
if (mq) { |
|
@ -760,7 +760,7 @@ float junction_deviation = 0.1; |
|
|
block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0
|
|
|
block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0
|
|
|
block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
|
|
|
block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
|
|
|
|
|
|
|
|
|
#ifdef FILAMENT_SENSOR |
|
|
#if ENABLED(FILAMENT_SENSOR) |
|
|
//FMM update ring buffer used for delay with filament measurements
|
|
|
//FMM update ring buffer used for delay with filament measurements
|
|
|
|
|
|
|
|
|
if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && delay_index2 > -1) { //only for extruder with filament sensor and if ring buffer is initialized
|
|
|
if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && delay_index2 > -1) { //only for extruder with filament sensor and if ring buffer is initialized
|
|
@ -956,7 +956,7 @@ float junction_deviation = 0.1; |
|
|
for (int i = 0; i < NUM_AXIS; i++) previous_speed[i] = current_speed[i]; |
|
|
for (int i = 0; i < NUM_AXIS; i++) previous_speed[i] = current_speed[i]; |
|
|
previous_nominal_speed = block->nominal_speed; |
|
|
previous_nominal_speed = block->nominal_speed; |
|
|
|
|
|
|
|
|
#ifdef ADVANCE |
|
|
#if ENABLED(ADVANCE) |
|
|
// Calculate advance rate
|
|
|
// Calculate advance rate
|
|
|
if (!bse || (!bsx && !bsy && !bsz)) { |
|
|
if (!bse || (!bsx && !bsy && !bsz)) { |
|
|
block->advance_rate = 0; |
|
|
block->advance_rate = 0; |
|
@ -991,7 +991,7 @@ float junction_deviation = 0.1; |
|
|
|
|
|
|
|
|
} // plan_buffer_line()
|
|
|
} // plan_buffer_line()
|
|
|
|
|
|
|
|
|
#if defined(ENABLE_AUTO_BED_LEVELING) && !defined(DELTA) |
|
|
#if ENABLED(ENABLE_AUTO_BED_LEVELING) && DISABLED(DELTA) |
|
|
vector_3 plan_get_position() { |
|
|
vector_3 plan_get_position() { |
|
|
vector_3 position = vector_3(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS), st_get_position_mm(Z_AXIS)); |
|
|
vector_3 position = vector_3(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS), st_get_position_mm(Z_AXIS)); |
|
|
|
|
|
|
|
@ -1006,15 +1006,15 @@ float junction_deviation = 0.1; |
|
|
} |
|
|
} |
|
|
#endif // ENABLE_AUTO_BED_LEVELING && !DELTA
|
|
|
#endif // ENABLE_AUTO_BED_LEVELING && !DELTA
|
|
|
|
|
|
|
|
|
#if defined(ENABLE_AUTO_BED_LEVELING) || defined(MESH_BED_LEVELING) |
|
|
#if ENABLED(ENABLE_AUTO_BED_LEVELING) || ENABLED(MESH_BED_LEVELING) |
|
|
void plan_set_position(float x, float y, float z, const float &e) |
|
|
void plan_set_position(float x, float y, float z, const float &e) |
|
|
#else |
|
|
#else |
|
|
void plan_set_position(const float &x, const float &y, const float &z, const float &e) |
|
|
void plan_set_position(const float &x, const float &y, const float &z, const float &e) |
|
|
#endif // ENABLE_AUTO_BED_LEVELING || MESH_BED_LEVELING
|
|
|
#endif // ENABLE_AUTO_BED_LEVELING || MESH_BED_LEVELING
|
|
|
{ |
|
|
{ |
|
|
#ifdef MESH_BED_LEVELING |
|
|
#if ENABLED(MESH_BED_LEVELING) |
|
|
if (mbl.active) z += mbl.get_z(x, y); |
|
|
if (mbl.active) z += mbl.get_z(x, y); |
|
|
#elif defined(ENABLE_AUTO_BED_LEVELING) |
|
|
#elif ENABLED(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 |
|
|
#endif |
|
|
|
|
|
|
|
|