PressureEqualizer - fixed compiler warnings, documented.

This commit is contained in:
bubnikv 2016-09-26 12:44:03 +02:00
parent 4a13efd081
commit 758458e5a0
2 changed files with 20 additions and 8 deletions

View File

@ -49,9 +49,9 @@ void GCodePressureEqualizer::reset()
// Volumetric rate of a 0.45mm x 0.2mm extrusion at 20mm/s XY movement: 0.45*0.2*20*60=1.8*60 = 108 mm^3/min // Volumetric rate of a 0.45mm x 0.2mm extrusion at 20mm/s XY movement: 0.45*0.2*20*60=1.8*60 = 108 mm^3/min
// Slope of the volumetric rate, changing from 20mm/s to 60mm/s over 2 seconds: (5.4-1.8)*60*60/2=60*60*1.8 = 6480 mm^3/min^2 = 1.8 mm^3/s^2 // Slope of the volumetric rate, changing from 20mm/s to 60mm/s over 2 seconds: (5.4-1.8)*60*60/2=60*60*1.8 = 6480 mm^3/min^2 = 1.8 mm^3/s^2
m_max_volumetric_extrusion_rate_slope_positive = (this->m_config == NULL) ? 6480.f : m_max_volumetric_extrusion_rate_slope_positive = (this->m_config == NULL) ? 6480.f :
this->m_config->max_volumetric_extrusion_rate_slope_positive.value * 60. * 60.; this->m_config->max_volumetric_extrusion_rate_slope_positive.value * 60.f * 60.f;
m_max_volumetric_extrusion_rate_slope_negative = (this->m_config == NULL) ? 6480.f : m_max_volumetric_extrusion_rate_slope_negative = (this->m_config == NULL) ? 6480.f :
this->m_config->max_volumetric_extrusion_rate_slope_negative.value * 60. * 60.; this->m_config->max_volumetric_extrusion_rate_slope_negative.value * 60.f * 60.f;
for (size_t i = 0; i < numExtrusionRoles; ++ i) { for (size_t i = 0; i < numExtrusionRoles; ++ i) {
m_max_volumetric_extrusion_rate_slopes[i].negative = m_max_volumetric_extrusion_rate_slope_negative; m_max_volumetric_extrusion_rate_slopes[i].negative = m_max_volumetric_extrusion_rate_slope_negative;
@ -66,6 +66,7 @@ void GCodePressureEqualizer::reset()
m_max_volumetric_extrusion_rate_slopes[erGapFill].positive = 0; m_max_volumetric_extrusion_rate_slopes[erGapFill].positive = 0;
m_stat.reset(); m_stat.reset();
line_idx = 0;
} }
const char* GCodePressureEqualizer::process(const char *szGCode, bool flush) const char* GCodePressureEqualizer::process(const char *szGCode, bool flush)
@ -112,7 +113,7 @@ const char* GCodePressureEqualizer::process(const char *szGCode, bool flush)
circular_buffer_pos = 0; circular_buffer_pos = 0;
#if 1 #if 1
printf("Statistics: \n"); printf("Statistics: \n");
printf("Minimum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_min); printf("Minimum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_min);
printf("Maximum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_max); printf("Maximum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_max);
if (m_stat.extrusion_length > 0) if (m_stat.extrusion_length > 0)
@ -170,6 +171,7 @@ bool GCodePressureEqualizer::process_line(const char *line, const size_t len, GC
line += strlen(EXTRUSION_ROLE_TAG); line += strlen(EXTRUSION_ROLE_TAG);
int role = atoi(line); int role = atoi(line);
this->m_current_extrusion_role = ExtrusionRole(role); this->m_current_extrusion_role = ExtrusionRole(role);
++ line_idx;
return false; return false;
} }
@ -259,8 +261,13 @@ bool GCodePressureEqualizer::process_line(const char *line, const size_t len, GC
buf.volumetric_extrusion_rate_start = rate; buf.volumetric_extrusion_rate_start = rate;
buf.volumetric_extrusion_rate_end = rate; buf.volumetric_extrusion_rate_end = rate;
m_stat.update(rate, sqrt(len2)); m_stat.update(rate, sqrt(len2));
if (rate < 10.f) { if (rate < 40.f) {
printf("Extremely low flow rate: %f\n", rate); printf("Extremely low flow rate: %f. Line %d, Length: %f, extrusion: %f Old position: (%f, %f, %f), new position: (%f, %f, %f)\n",
rate,
line_idx,
sqrt(len2), sqrt((diff[3]*diff[3])/len2),
m_current_pos[0], m_current_pos[1], m_current_pos[2],
new_pos[0], new_pos[1], new_pos[2]);
} }
} }
} else if (changed[0] || changed[1] || changed[2]) { } else if (changed[0] || changed[1] || changed[2]) {
@ -270,7 +277,7 @@ bool GCodePressureEqualizer::process_line(const char *line, const size_t len, GC
memcpy(m_current_pos, new_pos, sizeof(float) * 5); memcpy(m_current_pos, new_pos, sizeof(float) * 5);
break; break;
} }
case 92: case 92:
{ {
// G92 : Set Position // G92 : Set Position
// Set a logical coordinate position to a new value without actually moving the machine motors. // Set a logical coordinate position to a new value without actually moving the machine motors.
@ -344,6 +351,7 @@ bool GCodePressureEqualizer::process_line(const char *line, const size_t len, GC
memcpy(buf.pos_end, m_current_pos, sizeof(float)*5); memcpy(buf.pos_end, m_current_pos, sizeof(float)*5);
adjust_volumetric_rate(); adjust_volumetric_rate();
++ line_idx;
return true; return true;
} }
@ -365,7 +373,6 @@ void GCodePressureEqualizer::output_gcode_line(GCodeLine &line)
float l2 = line.dist_xyz2(); float l2 = line.dist_xyz2();
float l = sqrt(l2); float l = sqrt(l2);
size_t nSegments = size_t(ceil(l / m_max_segment_length)); size_t nSegments = size_t(ceil(l / m_max_segment_length));
char text[2048];
if (nSegments == 1) { if (nSegments == 1) {
// Just update this segment. // Just update this segment.
push_line_to_output(line, line.feedrate() * line.volumetric_correction_avg(), comment); push_line_to_output(line, line.feedrate() * line.volumetric_correction_avg(), comment);
@ -470,6 +477,7 @@ void GCodePressureEqualizer::adjust_volumetric_rate()
for (; ! circular_buffer[idx_prev].extruding() && idx_prev != idx_head; idx_prev = circular_buffer_idx_prev(idx_prev)) ; for (; ! circular_buffer[idx_prev].extruding() && idx_prev != idx_head; idx_prev = circular_buffer_idx_prev(idx_prev)) ;
if (! circular_buffer[idx_prev].extruding()) if (! circular_buffer[idx_prev].extruding())
break; break;
// Volumetric extrusion rate at the start of the succeding segment.
float rate_succ = circular_buffer[idx].volumetric_extrusion_rate_start; float rate_succ = circular_buffer[idx].volumetric_extrusion_rate_start;
// What is the gradient of the extrusion rate between idx_prev and idx? // What is the gradient of the extrusion rate between idx_prev and idx?
idx = idx_prev; idx = idx_prev;
@ -481,6 +489,7 @@ void GCodePressureEqualizer::adjust_volumetric_rate()
continue; continue;
float rate_end = feedrate_per_extrusion_role[iRole]; float rate_end = feedrate_per_extrusion_role[iRole];
if (iRole == line.extrusion_role && rate_succ < rate_end) if (iRole == line.extrusion_role && rate_succ < rate_end)
// Limit by the succeeding volumetric flow rate.
rate_end = rate_succ; rate_end = rate_succ;
if (line.volumetric_extrusion_rate_end > rate_end) { if (line.volumetric_extrusion_rate_end > rate_end) {
line.volumetric_extrusion_rate_end = rate_end; line.volumetric_extrusion_rate_end = rate_end;
@ -598,7 +607,7 @@ void GCodePressureEqualizer::push_to_output(const char *text, const size_t len,
void GCodePressureEqualizer::push_line_to_output(const GCodeLine &line, const float new_feedrate, const char *comment) void GCodePressureEqualizer::push_line_to_output(const GCodeLine &line, const float new_feedrate, const char *comment)
{ {
push_to_output("G1", 2, false); push_to_output("G1", 2, false);
for (size_t i = 0; i < 3; ++ i) for (char i = 0; i < 3; ++ i)
if (line.pos_provided[i]) if (line.pos_provided[i])
push_axis_to_output('X'+i, line.pos_end[i]); push_axis_to_output('X'+i, line.pos_end[i]);
push_axis_to_output('E', m_config->use_relative_e_distances.value ? (line.pos_end[3] - line.pos_start[3]) : line.pos_end[3]); push_axis_to_output('E', m_config->use_relative_e_distances.value ? (line.pos_end[3] - line.pos_start[3]) : line.pos_end[3]);

View File

@ -167,6 +167,9 @@ private:
std::vector<char> output_buffer; std::vector<char> output_buffer;
size_t output_buffer_length; size_t output_buffer_length;
// For debugging purposes. Index of the G-code line processed.
size_t line_idx;
bool process_line(const char *line, const size_t len, GCodeLine &buf); bool process_line(const char *line, const size_t len, GCodeLine &buf);
void output_gcode_line(GCodeLine &buf); void output_gcode_line(GCodeLine &buf);