Fix and simplify M214 data types and default config initialization.

This commit is contained in:
FormerLurker 2022-04-25 09:41:35 -05:00 committed by Alex Voinea
parent 02b0307307
commit bb33c76d2b
5 changed files with 17 additions and 16 deletions

View File

@ -283,11 +283,11 @@ bool Config_RetrieveSettings()
} }
} }
// Initialize arc interpolation settings if they are not already (Not sure about this bit, please review) // 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.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(float))) cs.min_mm_per_arc_segment = DEFAULT_MIN_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(uint8_t)) cs.n_arc_correction = DEFAULT_N_ARC_CORRECTION; 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(uint16_t))) cs.min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS; 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(uint16_t))) cs.arc_segments_per_sec = DEFAULT_ARC_SEGMENTS_PER_SEC; 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 #ifdef TMC2130

View File

@ -42,9 +42,9 @@ typedef struct
// Arc Interpolation Settings, configurable via M214 // Arc Interpolation Settings, configurable via M214
float mm_per_arc_segment; float mm_per_arc_segment;
float min_mm_per_arc_segment; float min_mm_per_arc_segment;
uint8_t n_arc_correction; // If equal to zero, this is disabled unsigned char n_arc_correction; // If equal to zero, this is disabled
uint16_t min_arc_segments; // If equal to zero, this is disabled unsigned short min_arc_segments; // If equal to zero, this is disabled
uint16_t arc_segments_per_sec; // If equal to zero, this is disabled unsigned short arc_segments_per_sec; // If equal to zero, this is disabled
} M500_conf; } M500_conf;
extern M500_conf cs; extern M500_conf cs;

View File

@ -7527,13 +7527,14 @@ Sigma_Exit:
// Extract all possible parameters if they appear // Extract all possible parameters if they appear
float p = code_seen('P') ? code_value_float() : cs.mm_per_arc_segment; 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; 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; unsigned char n = code_seen('N') ? code_value() : cs.n_arc_correction;
uint16_t r = code_seen('R') ? code_value() : cs.min_arc_segments; unsigned short r = code_seen('R') ? code_value() : cs.min_arc_segments;
uint16_t f = code_seen('F') ? code_value() : cs.arc_segments_per_sec; 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 // 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) if (p <=0 || s < 0 || p < s)
{ {
// Should we display some error here?
break; break;
} }
@ -9679,7 +9680,7 @@ void prepare_move()
set_current_to_destination(); 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 float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc
// Trace the arc // Trace the arc
mc_arc(current_position, destination, offset, feedrate * feedmultiply / 60 / 100.0, r, isclockwise, active_extruder); mc_arc(current_position, destination, offset, feedrate * feedmultiply / 60 / 100.0, r, isclockwise, active_extruder);

View File

@ -26,7 +26,7 @@
// The arc is approximated by generating a huge number of tiny, linear segments. The length of each // 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. // 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_x = -offset[X_AXIS]; // Radius vector from center to current location
float r_axis_y = -offset[Y_AXIS]; 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 // 20200419 - Add a variable that will be used to hold the arc segment length
float mm_per_arc_segment = cs.mm_per_arc_segment; float mm_per_arc_segment = cs.mm_per_arc_segment;
// 20210109 - Add a variable to hold the n_arc_correction value // 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. // 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); 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; } if (millimeters_of_travel_arc < 0.001) { return; }
// Calculate the number of arc segments // 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, /* 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. and phi is the angle of rotation. Based on the solution approach by Jens Geisler.

View File

@ -27,6 +27,6 @@
// the direction of helical travel, radius == circle radius, isclockwise boolean. Used // the direction of helical travel, radius == circle radius, isclockwise boolean. Used
// for vector transformation direction. // for vector transformation direction.
void mc_arc(float *position, float *target, float *offset, float feed_rate, float radius, 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 #endif