Separated travel and print acceleration control

This commit is contained in:
Lukas Matena 2023-03-09 09:14:54 +01:00
parent cf226f8eab
commit 3ff600bed0
3 changed files with 46 additions and 26 deletions

View File

@ -2547,7 +2547,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view descr
} }
// reset acceleration // reset acceleration
gcode += m_writer.set_acceleration((unsigned int)(m_config.default_acceleration.value + 0.5)); gcode += m_writer.set_print_acceleration((unsigned int)(m_config.default_acceleration.value + 0.5));
if (m_wipe.enable) { if (m_wipe.enable) {
m_wipe.path = paths.front().polyline; m_wipe.path = paths.front().polyline;
@ -2633,7 +2633,7 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::s
} }
} }
// reset acceleration // reset acceleration
gcode += m_writer.set_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); gcode += m_writer.set_print_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5));
return gcode; return gcode;
} }
@ -2659,7 +2659,7 @@ std::string GCode::extrude_path(ExtrusionPath path, std::string_view description
m_wipe.path.reverse(); m_wipe.path.reverse();
} }
// reset acceleration // reset acceleration
gcode += m_writer.set_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); gcode += m_writer.set_print_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5));
return gcode; return gcode;
} }
@ -2802,7 +2802,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de
} else { } else {
acceleration = m_config.default_acceleration.value; acceleration = m_config.default_acceleration.value;
} }
gcode += m_writer.set_acceleration((unsigned int)floor(acceleration + 0.5)); gcode += m_writer.set_print_acceleration((unsigned int)floor(acceleration + 0.5));
} }
// calculate extrusion length per distance unit // calculate extrusion length per distance unit
@ -3071,8 +3071,18 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string
// use G1 because we rely on paths being straight (G0 may make round paths) // use G1 because we rely on paths being straight (G0 may make round paths)
if (travel.size() >= 2) { if (travel.size() >= 2) {
gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5));
for (size_t i = 1; i < travel.size(); ++ i) for (size_t i = 1; i < travel.size(); ++ i)
gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment);
if (! m_writer.supports_PT()) {
// In case that this flavor does not support separate print and travel acceleration,
// reset acceleration to default.
gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5));
}
this->set_last_pos(travel.points.back()); this->set_last_pos(travel.points.back());
} }
return gcode; return gcode;

View File

@ -15,6 +15,11 @@
namespace Slic3r { namespace Slic3r {
bool GCodeWriter::supports_PT() const
{
return (FLAVOR_IS(gcfRepetier) || FLAVOR_IS(gcfMarlinFirmware) || FLAVOR_IS(gcfRepRapFirmware));
}
void GCodeWriter::apply_print_config(const PrintConfig &print_config) void GCodeWriter::apply_print_config(const PrintConfig &print_config)
{ {
this->config.apply(print_config, true); this->config.apply(print_config, true);
@ -154,36 +159,30 @@ std::string GCodeWriter::set_bed_temperature(unsigned int temperature, bool wait
return gcode.str(); return gcode.str();
} }
std::string GCodeWriter::set_acceleration(unsigned int acceleration) std::string GCodeWriter::set_acceleration_internal(Acceleration type, unsigned int acceleration)
{ {
// Clamp the acceleration to the allowed maximum. // Clamp the acceleration to the allowed maximum.
// TODO: What about max travel acceleration ? Currently it is clamped by the extruding acceleration !!!
if (m_max_acceleration > 0 && acceleration > m_max_acceleration) if (m_max_acceleration > 0 && acceleration > m_max_acceleration)
acceleration = m_max_acceleration; acceleration = m_max_acceleration;
if (acceleration == 0 || acceleration == m_last_acceleration) // Are we setting travel acceleration for a flavour that supports separate travel and print acc?
bool separate_travel = (type == Acceleration::Travel && supports_PT());
auto& last_value = separate_travel ? m_last_travel_acceleration : m_last_acceleration ;
if (acceleration == 0 || acceleration == last_value)
return std::string(); return std::string();
m_last_acceleration = acceleration; last_value = acceleration;
std::ostringstream gcode; std::ostringstream gcode;
if (FLAVOR_IS(gcfRepetier)) { if (FLAVOR_IS(gcfRepetier))
// M201: Set max printing acceleration gcode << (separate_travel ? "M202 X" : "M201 X") << acceleration << " Y" << acceleration;
gcode << "M201 X" << acceleration << " Y" << acceleration; else if (FLAVOR_IS(gcfRepRapFirmware) || FLAVOR_IS(gcfMarlinFirmware))
if (this->config.gcode_comments) gcode << " ; adjust acceleration"; gcode << (separate_travel ? "M204 T" : "M204 P") << acceleration;
gcode << "\n"; else
// M202: Set max travel acceleration
gcode << "M202 X" << acceleration << " Y" << acceleration;
} else if (FLAVOR_IS(gcfRepRapFirmware)) {
// M204: Set default acceleration
gcode << "M204 P" << acceleration;
} else if (FLAVOR_IS(gcfMarlinFirmware)) {
// This is new MarlinFirmware with separated print/retraction/travel acceleration.
// Use M204 P, we don't want to override travel acc by M204 S (which is deprecated anyway).
gcode << "M204 P" << acceleration;
} else {
// M204: Set default acceleration
gcode << "M204 S" << acceleration; gcode << "M204 S" << acceleration;
}
if (this->config.gcode_comments) gcode << " ; adjust acceleration"; if (this->config.gcode_comments) gcode << " ; adjust acceleration";
gcode << "\n"; gcode << "\n";

View File

@ -43,7 +43,8 @@ public:
std::string postamble() const; std::string postamble() const;
std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1) const; std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1) const;
std::string set_bed_temperature(unsigned int temperature, bool wait = false); std::string set_bed_temperature(unsigned int temperature, bool wait = false);
std::string set_acceleration(unsigned int acceleration); std::string set_print_acceleration(unsigned int acceleration) { return set_acceleration_internal(Acceleration::Print, acceleration); }
std::string set_travel_acceleration(unsigned int acceleration) { return set_acceleration_internal(Acceleration::Travel, acceleration); }
std::string reset_e(bool force = false); std::string reset_e(bool force = false);
std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const;
// return false if this extruder was already selected // return false if this extruder was already selected
@ -69,6 +70,9 @@ public:
std::string unlift(); std::string unlift();
Vec3d get_position() const { return m_pos; } Vec3d get_position() const { return m_pos; }
// Returns whether this flavor supports separate print and travel acceleration.
bool supports_PT() const;
// To be called by the CoolingBuffer from another thread. // To be called by the CoolingBuffer from another thread.
static std::string set_fan(const GCodeFlavor gcode_flavor, bool gcode_comments, unsigned int speed); static std::string set_fan(const GCodeFlavor gcode_flavor, bool gcode_comments, unsigned int speed);
// To be called by the main thread. It always emits the G-code, it does not remember the previous state. // To be called by the main thread. It always emits the G-code, it does not remember the previous state.
@ -81,7 +85,8 @@ private:
std::string m_extrusion_axis; std::string m_extrusion_axis;
bool m_single_extruder_multi_material; bool m_single_extruder_multi_material;
Extruder* m_extruder; Extruder* m_extruder;
unsigned int m_last_acceleration; unsigned int m_last_acceleration = (unsigned int)(-1);
unsigned int m_last_travel_acceleration = (unsigned int)(-1); // only used for flavors supporting separate print/travel acc
// Limit for setting the acceleration, to respect the machine limits set for the Marlin firmware. // Limit for setting the acceleration, to respect the machine limits set for the Marlin firmware.
// If set to zero, the limit is not in action. // If set to zero, the limit is not in action.
unsigned int m_max_acceleration; unsigned int m_max_acceleration;
@ -90,8 +95,14 @@ private:
double m_lifted; double m_lifted;
Vec3d m_pos = Vec3d::Zero(); Vec3d m_pos = Vec3d::Zero();
enum class Acceleration {
Travel,
Print
};
std::string _travel_to_z(double z, const std::string &comment); std::string _travel_to_z(double z, const std::string &comment);
std::string _retract(double length, double restart_extra, const std::string &comment); std::string _retract(double length, double restart_extra, const std::string &comment);
std::string set_acceleration_internal(Acceleration type, unsigned int acceleration);
}; };
class GCodeFormatter { class GCodeFormatter {