From 9b2d9fb01a9f5189041c07fba8a419ad424e3c0b Mon Sep 17 00:00:00 2001
From: enricoturri1966 <enricoturri@seznam.cz>
Date: Wed, 31 Mar 2021 15:20:11 +0200
Subject: [PATCH] GCodeProcessor added travel acceleration

---
 src/libslic3r/GCode/GCodeProcessor.cpp | 39 +++++++++++++++++++++-----
 src/libslic3r/GCode/GCodeProcessor.hpp |  7 ++++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp
index 0a10ec4cc..74831e36e 100644
--- a/src/libslic3r/GCode/GCodeProcessor.cpp
+++ b/src/libslic3r/GCode/GCodeProcessor.cpp
@@ -26,6 +26,7 @@
 static const float INCHES_TO_MM = 25.4f;
 static const float MMMIN_TO_MMSEC = 1.0f / 60.0f;
 static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2
+static const float DEFAULT_TRAVEL_ACCELERATION = 1250.0f;
 
 namespace Slic3r {
 
@@ -190,6 +191,8 @@ void GCodeProcessor::TimeMachine::reset()
     enabled = false;
     acceleration = 0.0f;
     max_acceleration = 0.0f;
+    travel_acceleration = 0.0f;
+    max_travel_acceleration = 0.0f;
     extrude_factor_override_percentage = 1.0f;
     time = 0.0f;
 #if ENABLE_EXTENDED_M73_LINES
@@ -842,6 +845,9 @@ void GCodeProcessor::apply_config(const PrintConfig& config)
         float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i);
         m_time_processor.machines[i].max_acceleration = max_acceleration;
         m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION;
+        float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i);
+        m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration;
+        m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION;
     }
 
     m_time_processor.export_remaining_time_enabled = config.remaining_times.value;
@@ -1008,6 +1014,9 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
         float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i);
         m_time_processor.machines[i].max_acceleration = max_acceleration;
         m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION;
+        float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i);
+        m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration;
+        m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION;
     }
 
     if (m_time_processor.machine_limits.machine_max_acceleration_x.values.size() > 1)
@@ -2230,9 +2239,11 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
         }
 
         // calculates block acceleration
-        float acceleration = is_extrusion_only_move(delta_pos) ?
-            get_retract_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i)) :
-            get_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i));
+        float acceleration = 
+            (type == EMoveType::Travel) ? get_travel_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i)) :
+            (is_extrusion_only_move(delta_pos) ?
+                get_retract_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i)) :
+                get_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i)));
 
         for (unsigned char a = X; a <= E; ++a) {
             float axis_max_acceleration = get_axis_max_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), static_cast<Axis>(a));
@@ -2619,11 +2630,9 @@ void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line)
                     set_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), value);
                 if (line.has_value('R', value))
                     set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value);
-                if (line.has_value('T', value)) {
+                if (line.has_value('T', value))
                     // Interpret the T value as the travel acceleration in the new Marlin format.
-                    //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value.
-                    // set_travel_acceleration(value);
-                }
+                    set_travel_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), value);
             }
         }
     }
@@ -2894,6 +2903,22 @@ void GCodeProcessor::set_acceleration(PrintEstimatedTimeStatistics::ETimeMode mo
     }
 }
 
+float GCodeProcessor::get_travel_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+    size_t id = static_cast<size_t>(mode);
+    return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].travel_acceleration : DEFAULT_TRAVEL_ACCELERATION;
+}
+
+void GCodeProcessor::set_travel_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value)
+{
+    size_t id = static_cast<size_t>(mode);
+    if (id < m_time_processor.machines.size()) {
+        m_time_processor.machines[id].travel_acceleration = (m_time_processor.machines[id].max_travel_acceleration == 0.0f) ? value :
+            // Clamp the acceleration with the maximum.
+            std::min(value, m_time_processor.machines[id].max_travel_acceleration);
+    }
+}
+
 float GCodeProcessor::get_filament_load_time(size_t extruder_id)
 {
     return (m_time_processor.filament_load_times.empty() || m_time_processor.extruder_unloaded) ?
diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp
index 96e216020..cf55bf86e 100644
--- a/src/libslic3r/GCode/GCodeProcessor.hpp
+++ b/src/libslic3r/GCode/GCodeProcessor.hpp
@@ -251,6 +251,9 @@ namespace Slic3r {
             float acceleration; // mm/s^2
             // hard limit for the acceleration, to which the firmware will clamp.
             float max_acceleration; // mm/s^2
+            float travel_acceleration; // mm/s^2
+            // hard limit for the travel acceleration, to which the firmware will clamp.
+            float max_travel_acceleration; // mm/s^2
             float extrude_factor_override_percentage;
             float time; // s
 #if ENABLE_EXTENDED_M73_LINES
@@ -668,7 +671,9 @@ namespace Slic3r {
         float get_axis_max_jerk(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const;
         float get_retract_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const;
         float get_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const;
-        void set_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value);
+        void  set_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value);
+        float get_travel_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+        void  set_travel_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value);
         float get_filament_load_time(size_t extruder_id);
         float get_filament_unload_time(size_t extruder_id);