Fix and simplify M214 data types and default config initialization.
This commit is contained in:
parent
02b0307307
commit
bb33c76d2b
@ -283,11 +283,11 @@ bool Config_RetrieveSettings()
|
||||
}
|
||||
}
|
||||
// Initialize arc interpolation settings if they are not already (Not sure about this bit, please review)
|
||||
if (is_uninitialized(cs.mm_per_arc_segment, sizeof(float))) cs.mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT;
|
||||
if (is_uninitialized(cs.min_mm_per_arc_segment, sizeof(float))) cs.min_mm_per_arc_segment = DEFAULT_MIN_MM_PER_ARC_SEGMENT;
|
||||
if (is_uninitialized(cs.n_arc_correction), sizeof(uint8_t)) cs.n_arc_correction = DEFAULT_N_ARC_CORRECTION;
|
||||
if (is_uninitialized(cs.min_arc_segments, sizeof(uint16_t))) cs.min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS;
|
||||
if (is_uninitialized(cs.arc_segments_per_sec, sizeof(uint16_t))) cs.arc_segments_per_sec = DEFAULT_ARC_SEGMENTS_PER_SEC;
|
||||
if (is_uninitialized(&cs.mm_per_arc_segment, sizeof(cs.mm_per_arc_segment))) cs.mm_per_arc_segment = default_conf.mm_per_arc_segment;
|
||||
if (is_uninitialized(&cs.min_mm_per_arc_segment, sizeof(cs.min_mm_per_arc_segment))) cs.min_mm_per_arc_segment = default_conf.min_mm_per_arc_segment;
|
||||
if (is_uninitialized(&cs.n_arc_correction, sizeof(cs.n_arc_correction))) cs.n_arc_correction = default_conf.n_arc_correction;
|
||||
if (is_uninitialized(&cs.min_arc_segments, sizeof(cs.min_arc_segments))) cs.min_arc_segments = default_conf.min_arc_segments;
|
||||
if (is_uninitialized(&cs.arc_segments_per_sec, sizeof(cs.arc_segments_per_sec))) cs.arc_segments_per_sec = default_conf.arc_segments_per_sec;
|
||||
|
||||
|
||||
#ifdef TMC2130
|
||||
|
@ -42,9 +42,9 @@ typedef struct
|
||||
// Arc Interpolation Settings, configurable via M214
|
||||
float mm_per_arc_segment;
|
||||
float min_mm_per_arc_segment;
|
||||
uint8_t n_arc_correction; // If equal to zero, this is disabled
|
||||
uint16_t min_arc_segments; // If equal to zero, this is disabled
|
||||
uint16_t arc_segments_per_sec; // If equal to zero, this is disabled
|
||||
unsigned char n_arc_correction; // If equal to zero, this is disabled
|
||||
unsigned short min_arc_segments; // If equal to zero, this is disabled
|
||||
unsigned short arc_segments_per_sec; // If equal to zero, this is disabled
|
||||
} M500_conf;
|
||||
|
||||
extern M500_conf cs;
|
||||
|
@ -7527,13 +7527,14 @@ Sigma_Exit:
|
||||
// Extract all possible parameters if they appear
|
||||
float p = code_seen('P') ? code_value_float() : cs.mm_per_arc_segment;
|
||||
float s = code_seen('S') ? code_value_float() : cs.min_mm_per_arc_segment;
|
||||
uint8_t n = code_seen('N') ? code_value() : cs.n_arc_correction;
|
||||
uint16_t r = code_seen('R') ? code_value() : cs.min_arc_segments;
|
||||
uint16_t f = code_seen('F') ? code_value() : cs.arc_segments_per_sec;
|
||||
unsigned char n = code_seen('N') ? code_value() : cs.n_arc_correction;
|
||||
unsigned short r = code_seen('R') ? code_value() : cs.min_arc_segments;
|
||||
unsigned short f = code_seen('F') ? code_value() : cs.arc_segments_per_sec;
|
||||
|
||||
// Ensure mm_per_arc_segment is greater than 0, and that min_mm_per_arc_segment is sero or greater than or equal to mm_per_arc_segment
|
||||
if (p <=0 || s < 0 || p < s)
|
||||
{
|
||||
// Should we display some error here?
|
||||
break;
|
||||
}
|
||||
|
||||
@ -9679,7 +9680,7 @@ void prepare_move()
|
||||
set_current_to_destination();
|
||||
}
|
||||
|
||||
void prepare_arc_move(char isclockwise) {
|
||||
void prepare_arc_move(bool isclockwise) {
|
||||
float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc
|
||||
// Trace the arc
|
||||
mc_arc(current_position, destination, offset, feedrate * feedmultiply / 60 / 100.0, r, isclockwise, active_extruder);
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
// The arc is approximated by generating a huge number of tiny, linear segments. The length of each
|
||||
// segment is configured in settings.mm_per_arc_segment.
|
||||
void mc_arc(float* position, float* target, float* offset, float feed_rate, float radius, uint8_t isclockwise, uint8_t extruder)
|
||||
void mc_arc(float* position, float* target, float* offset, float feed_rate, float radius, bool isclockwise, uint8_t extruder)
|
||||
{
|
||||
float r_axis_x = -offset[X_AXIS]; // Radius vector from center to current location
|
||||
float r_axis_y = -offset[Y_AXIS];
|
||||
@ -38,7 +38,7 @@ void mc_arc(float* position, float* target, float* offset, float feed_rate, floa
|
||||
// 20200419 - Add a variable that will be used to hold the arc segment length
|
||||
float mm_per_arc_segment = cs.mm_per_arc_segment;
|
||||
// 20210109 - Add a variable to hold the n_arc_correction value
|
||||
uint8_t n_arc_correction = cs.n_arc_correction;
|
||||
unsigned char n_arc_correction = cs.n_arc_correction;
|
||||
|
||||
// CCW angle between position and target from circle center. Only one atan2() trig computation required.
|
||||
float angular_travel_total = atan2(r_axis_x * rt_y - r_axis_y * rt_x, r_axis_x * rt_x + r_axis_y * rt_y);
|
||||
@ -88,7 +88,7 @@ void mc_arc(float* position, float* target, float* offset, float feed_rate, floa
|
||||
if (millimeters_of_travel_arc < 0.001) { return; }
|
||||
|
||||
// Calculate the number of arc segments
|
||||
uint16_t segments = static_cast<uint16_t>(ceil(millimeters_of_travel_arc / mm_per_arc_segment));
|
||||
unsigned short segments = static_cast<unsigned short>(ceil(millimeters_of_travel_arc / mm_per_arc_segment));
|
||||
|
||||
/* Vector rotation by transformation matrix: r is the original vector, r_T is the rotated vector,
|
||||
and phi is the angle of rotation. Based on the solution approach by Jens Geisler.
|
||||
|
@ -27,6 +27,6 @@
|
||||
// the direction of helical travel, radius == circle radius, isclockwise boolean. Used
|
||||
// for vector transformation direction.
|
||||
void mc_arc(float *position, float *target, float *offset, float feed_rate, float radius,
|
||||
unsigned char isclockwise, uint8_t extruder);
|
||||
bool isclockwise, uint8_t extruder);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user