Make suggested corrections.

This commit is contained in:
FormerLurker 2020-05-07 15:49:44 -05:00 committed by Alex Voinea
parent 4aa5a75301
commit 58d9916d54
4 changed files with 38 additions and 62 deletions

View File

@ -171,7 +171,7 @@ void Config_PrintSettings(uint8_t level)
}
// Arc Interpolation Settings
printf_P(PSTR(
"%SArc Settings: N=Arc segment length max (mm) S=Arc segment length Min (mm), R=Min arc segments, F=Arc segments per second.\n%S M214 N%.2f S%.2f R%d F%d\n"),
"%SArc Settings: P=Arc segment length max (mm) S=Arc segment length Min (mm), R=Min arc segments, F=Arc segments per second.\n%S M214 P%.2f S%.2f R%d F%d\n"),
echomagic, echomagic, cs.mm_per_arc_segment, cs.min_mm_per_arc_segment, cs.min_arc_segments, cs.arc_segments_per_sec);
}
#endif
@ -282,10 +282,11 @@ bool Config_RetrieveSettings()
}
}
// Initialize arc interpolation settings if they are not already (Not sure about this bit, please review)
if (0xff == cs.mm_per_arc_segment) cs.mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT;
if (0xff == cs.min_mm_per_arc_segment) cs.min_mm_per_arc_segment = DEFAULT_MIN_MM_PER_ARC_SEGMENT;
if (0xff == cs.min_arc_segments) cs.min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS;
if (0xff == cs.arc_segments_per_sec) cs.arc_segments_per_sec = DEFAULT_ARC_SEGMENTS_PER_SEC;
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.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;
#ifdef TMC2130
for (uint8_t j = X_AXIS; j <= Y_AXIS; j++)
@ -357,3 +358,4 @@ SERIAL_ECHO_START;
SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded");
}

View File

@ -42,8 +42,8 @@ typedef struct
// Arc Interpolation Settings, configurable via M214
float mm_per_arc_segment;
float min_mm_per_arc_segment;
int min_arc_segments; // If less than or equal to zero, this is disabled
int arc_segments_per_sec; // If less than or equal to zero, this is disabled
uint16_t min_arc_segments; // If less than or equal to zero, this is disabled
uint16_t arc_segments_per_sec; // If less than or equal to zero, this is disabled
} M500_conf;
extern M500_conf cs;
@ -67,5 +67,4 @@ FORCE_INLINE void Config_RetrieveSettings() { Config_ResetDefault(); Config_Prin
inline uint8_t calibration_status() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS); }
inline void calibration_status_store(uint8_t status) { eeprom_update_byte((uint8_t*)EEPROM_CALIBRATION_STATUS, status); }
inline bool calibration_status_pinda() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA); }
#endif//CONFIG_STORE_H

View File

@ -4162,6 +4162,7 @@ extern uint8_t st_backlash_y;
//!@n M207 - set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop], stays in mm regardless of M200 setting
//!@n M208 - set recover=unretract length S[positive mm surplus to the M207 S*] F[feedrate mm/sec]
//!@n M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.
//!@n M214 - Set Arc Parameters (Use M500 to store in eeprom) P<MM_PER_ARC_SEGMENT> S<MIN_MM_PER_ARC_SEGMENT> R<MIN_ARC_SEGMENTS> F<ARC_SEGMENTS_PER_SEC>
//!@n M218 - set hotend offset (in mm): T<extruder_number> X<offset_on_X> Y<offset_on_Y>
//!@n M220 S<factor in percent>- set speed factor override percentage
//!@n M221 S<factor in percent>- set extrude factor override percentage
@ -7508,10 +7509,10 @@ Sigma_Exit:
#### Usage
M214 [N] [S] [R] [F]
M214 [P] [S] [R] [F]
#### Parameters
- `N` - A float representing the max and default millimeters per arc segment. Must be greater than 0.
- `P` - A float representing the max and default millimeters per arc segment. Must be greater than 0.
- `S` - A float representing the minimum allowable millimeters per arc segment. Set to 0 to disable
- `R` - An int representing the minimum number of segments per arcs of any radius,
except when the results in segment lengths greater than or less than the minimum
@ -7519,36 +7520,29 @@ Sigma_Exit:
- 'F' - An int representing the number of segments per second, unless this results in segment lengths
greater than or less than the minimum and maximum segment length. Set to 0 to disable.
*/
case 214: //!@n M214 - Set Arc Parameters (Use M500 to store in eeprom) N<MM_PER_ARC_SEGMENT> S<MIN_MM_PER_ARC_SEGMENT> R<MIN_ARC_SEGMENTS> F<ARC_SEGMENTS_PER_SEC>
case 214: //!@n M214 - Set Arc Parameters (Use M500 to store in eeprom) P<MM_PER_ARC_SEGMENT> S<MIN_MM_PER_ARC_SEGMENT> R<MIN_ARC_SEGMENTS> F<ARC_SEGMENTS_PER_SEC>
{
// Extract N
float n = cs.mm_per_arc_segment;
float p = cs.mm_per_arc_segment;
float s = cs.min_mm_per_arc_segment;
int r = cs.min_arc_segments;
int f = cs.arc_segments_per_sec;
uint16_t r = cs.min_arc_segments;
uint16_t f = cs.arc_segments_per_sec;
// Extract N
if (code_seen('N'))
if (code_seen('P'))
{
n = code_value();
if (n <= 0 || (s != 0 && n <= s))
p = code_value_float();
if (p <= 0 || (s != 0 && p <= s))
{
SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
SERIAL_ECHOLNPGM("\"(1)");
break;
}
}
// Extract S
if (code_seen('S'))
{
s = code_value();
if (s < 0 || s >= n)
s = code_value_float();
if (s < 0 || s >= p)
{
SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
SERIAL_ECHOLNPGM("\"(1)");
break;
}
}
@ -7559,10 +7553,6 @@ Sigma_Exit:
r = code_value();
if (r < 0)
{
SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
SERIAL_ECHOLNPGM("\"(1)");
break;
}
}
@ -7572,14 +7562,10 @@ Sigma_Exit:
f = code_value();
if (f < 0)
{
SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
SERIAL_ECHOLNPGM("\"(1)");
break;
}
}
cs.mm_per_arc_segment = n;
cs.mm_per_arc_segment = p;
cs.min_mm_per_arc_segment = s;
cs.min_arc_segments = r;
cs.arc_segments_per_sec = f;

View File

@ -28,26 +28,15 @@
// 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)
{
// Extract the position to reduce indexing at the cost of a few bytes of mem
float p_x = position[X_AXIS];
float p_y = position[Y_AXIS];
float p_z = position[Z_AXIS];
float p_e = position[E_AXIS];
float t_x = target[X_AXIS];
float t_y = target[Y_AXIS];
float t_z = target[Z_AXIS];
float t_e = target[E_AXIS];
float r_axis_x = -offset[X_AXIS]; // Radius vector from center to current location
float r_axis_y = -offset[Y_AXIS];
float center_axis_x = p_x - r_axis_x;
float center_axis_y = p_y - r_axis_y;
float travel_z = t_z - p_z;
float extruder_travel_total = t_e - p_e;
float center_axis_x = position[X_AXIS] - r_axis_x;
float center_axis_y = position[Y_AXIS] - r_axis_y;
float travel_z = target[Z_AXIS] - position[Z_AXIS];
float extruder_travel_total = target[E_AXIS] - position[E_AXIS];
float rt_x = t_x - center_axis_x;
float rt_y = t_y - center_axis_y;
float rt_x = target[X_AXIS] - center_axis_x;
float rt_y = target[Y_AXIS] - center_axis_y;
// 20200419 - Add a variable that will be used to hold the arc segment length
float mm_per_arc_segment = cs.mm_per_arc_segment;
@ -90,7 +79,7 @@ void mc_arc(float* position, float* target, float* offset, float feed_rate, floa
//20141002:full circle for G03 did not work, e.g. G03 X80 Y80 I20 J0 F2000 is giving an Angle of zero so head is not moving
//to compensate when start pos = target pos && angle is zero -> angle = 2Pi
if (p_x == t_x && p_y == t_y && angular_travel_total == 0)
if (position[X_AXIS] == target[X_AXIS] && position[Y_AXIS] == target[Y_AXIS] && angular_travel_total == 0)
{
angular_travel_total += 2 * M_PI;
}
@ -148,18 +137,18 @@ void mc_arc(float* position, float* target, float* offset, float feed_rate, floa
r_axis_y = r_axisi;
// Update arc_target location
p_x = center_axis_x + r_axis_x;
p_y = center_axis_y + r_axis_y;
p_z += linear_per_segment;
p_e += segment_extruder_travel;
position[X_AXIS] = center_axis_x + r_axis_x;
position[Y_AXIS] = center_axis_y + r_axis_y;
position[Z_AXIS] += linear_per_segment;
position[E_AXIS] += segment_extruder_travel;
// We can't clamp to the target because we are interpolating! We would need to update a position, clamp to it
// after updating from calculated values.
//clamp_to_software_endstops(position);
plan_buffer_line(p_x, p_y, p_z, p_e, feed_rate, extruder);
clamp_to_software_endstops(position);
plan_buffer_line(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS], feed_rate, extruder);
}
}
// Ensure last segment arrives at target location.
// Here we could clamp, but why bother. We would need to update our current position, clamp to it
//clamp_to_software_endstops(target);
plan_buffer_line(t_x, t_y, t_z, t_e, feed_rate, extruder);
clamp_to_software_endstops(target);
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feed_rate, extruder);
}