SPE-1872: Corrections into GCodeProcessor::process_G2_G3() to match firmware code

This commit is contained in:
enricoturri1966 2024-02-14 15:29:47 +01:00 committed by Lukas Matena
parent 07b653cb22
commit ebc7444a20
2 changed files with 30 additions and 0 deletions

View File

@ -3268,7 +3268,11 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]); arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]);
// radii // radii
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
if (std::abs(arc.end_radius() - arc.start_radius()) > 0.001) {
#else
if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) { if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) {
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
// what to do ??? // what to do ???
} }
@ -3356,8 +3360,14 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
const double z_per_segment = arc.delta_z() * inv_segment; const double z_per_segment = arc.delta_z() * inv_segment;
const double extruder_per_segment = (extrusion.has_value()) ? *extrusion * inv_segment : 0.0; const double extruder_per_segment = (extrusion.has_value()) ? *extrusion * inv_segment : 0.0;
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
const double sq_theta_per_segment = sqr(theta_per_segment);
const double cos_T = 1.0 - 0.5 * sq_theta_per_segment;
const double sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6.0f;
#else
const double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation const double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation
const double sin_T = theta_per_segment; const double sin_T = theta_per_segment;
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
AxisCoords prev_target = m_start_position; AxisCoords prev_target = m_start_position;
AxisCoords arc_target; AxisCoords arc_target;
@ -3370,9 +3380,27 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
static const size_t N_ARC_CORRECTION = 25; static const size_t N_ARC_CORRECTION = 25;
Vec3d curr_rel_arc_start = arc.relative_start(); Vec3d curr_rel_arc_start = arc.relative_start();
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
size_t count = N_ARC_CORRECTION;
#else
size_t count = 0; size_t count = 0;
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
for (size_t i = 1; i < segments; ++i) { for (size_t i = 1; i < segments; ++i) {
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
if (count-- == 0) {
const double cos_Ti = ::cos(i * theta_per_segment);
const double sin_Ti = ::sin(i * theta_per_segment);
curr_rel_arc_start.x() = -double(rel_center.x()) * cos_Ti + double(rel_center.y()) * sin_Ti;
curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti;
count = N_ARC_CORRECTION;
}
else {
const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T;
curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T;
curr_rel_arc_start.y() = r_axisi;
}
#else
if (count < N_ARC_CORRECTION) { if (count < N_ARC_CORRECTION) {
// Apply vector rotation matrix // Apply vector rotation matrix
const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T; const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T;
@ -3389,6 +3417,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti; curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti;
count = 0; count = 0;
} }
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
// Update arc_target location // Update arc_target location
arc_target[X] = arc.center.x() + curr_rel_arc_start.x(); arc_target[X] = arc.center.x() + curr_rel_arc_start.x();

View File

@ -65,6 +65,7 @@
// requires VGCODE_ENABLE_ET_SPE1872 set to 1 in libvgcode (Types.hpp) // requires VGCODE_ENABLE_ET_SPE1872 set to 1 in libvgcode (Types.hpp)
#define ENABLE_ET_SPE1872 (1 && ENABLE_NEW_GCODE_VIEWER) #define ENABLE_ET_SPE1872 (1 && ENABLE_NEW_GCODE_VIEWER)
#define ENABLE_ET_SPE1872_FIRMWARE_BUDDY (1 && ENABLE_ET_SPE1872) #define ENABLE_ET_SPE1872_FIRMWARE_BUDDY (1 && ENABLE_ET_SPE1872)
#define ENABLE_ET_SPE1872_FIRMWARE_G2G3 (1 && ENABLE_ET_SPE1872)
#define ENABLE_ET_SPE1872_DEBUG (1 && ENABLE_ET_SPE1872) #define ENABLE_ET_SPE1872_DEBUG (1 && ENABLE_ET_SPE1872)
// Enable G-Code viewer statistics imgui dialog // Enable G-Code viewer statistics imgui dialog