PrusaSlicer-NonPlainar/xs/src/libslic3r/GCodeTimeEstimator.hpp

280 lines
8.0 KiB
C++
Raw Normal View History

#ifndef slic3r_GCodeTimeEstimator_hpp_
#define slic3r_GCodeTimeEstimator_hpp_
#include "libslic3r.h"
#include "GCodeReader.hpp"
2017-12-08 09:50:36 +00:00
#define USE_CURA_JUNCTION_VMAX 0
#define ENABLE_BLOCKS_PRE_PROCESSING 1
namespace Slic3r {
2017-12-08 09:50:36 +00:00
class GCodeTimeEstimator
2017-12-06 13:12:10 +00:00
{
public:
enum EUnits : unsigned char
{
Millimeters,
Inches
};
enum EAxis : unsigned char
{
X,
Y,
Z,
E,
Num_Axis
};
enum EDialect : unsigned char
{
Unknown,
Marlin,
Repetier,
Smoothieware,
RepRapFirmware,
Teacup,
Num_Dialects
};
enum EPositioningType
{
Absolute,
Relative
};
private:
struct Axis
{
float position; // mm
float max_feedrate; // mm/s
float max_acceleration; // mm/s^2
float max_jerk; // mm/s
};
2017-12-08 09:50:36 +00:00
struct Feedrates
{
float feedrate; // mm/s
float axis_feedrate[Num_Axis]; // mm/s
float abs_axis_feedrate[Num_Axis]; // mm/s
float safe_feedrate; // mm/s
void reset();
};
2017-12-06 13:12:10 +00:00
struct State
{
EDialect dialect;
EUnits units;
EPositioningType positioningType;
Axis axis[Num_Axis];
float feedrate; // mm/s
float acceleration; // mm/s^2
float additional_time; // s
2017-12-08 09:50:36 +00:00
float minimum_feedrate; // mm/s
2017-12-06 13:12:10 +00:00
};
public:
struct Block
{
2017-12-08 09:50:36 +00:00
struct FeedrateProfile
{
float entry; // mm/s
float cruise; // mm/s
float exit; // mm/s
};
2017-12-06 13:12:10 +00:00
struct Trapezoid
{
float distance; // mm
float accelerate_until; // mm
float decelerate_after; // mm
2017-12-08 09:50:36 +00:00
FeedrateProfile feedrate;
float acceleration_time(float acceleration) const;
float cruise_time() const;
float deceleration_time(float acceleration) const;
float cruise_distance() const;
// This function gives the time needed to accelerate from an initial speed to reach a final distance.
static float acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration);
// This function gives the final speed while accelerating at the given constant acceleration from the given initial speed along the given distance.
static float speed_from_distance(float initial_feedrate, float distance, float acceleration);
2017-12-06 13:12:10 +00:00
};
2017-12-08 09:50:36 +00:00
#if ENABLE_BLOCKS_PRE_PROCESSING
struct Flags
{
bool recalculate;
bool nominal_length;
};
Flags flags;
#endif // ENABLE_BLOCKS_PRE_PROCESSING
2017-12-06 13:12:10 +00:00
float delta_pos[Num_Axis]; // mm
float acceleration; // mm/s^2
2017-12-08 09:50:36 +00:00
#if ENABLE_BLOCKS_PRE_PROCESSING
float max_entry_speed; // mm/s
float safe_feedrate; // mm/s
#endif // ENABLE_BLOCKS_PRE_PROCESSING
2017-12-06 13:12:10 +00:00
2017-12-08 09:50:36 +00:00
FeedrateProfile feedrate;
2017-12-06 13:12:10 +00:00
Trapezoid trapezoid;
// Returns the length of the move covered by this block, in mm
float move_length() const;
2017-12-08 09:50:36 +00:00
// Returns the time spent accelerating toward cruise speed, in seconds
float acceleration_time() const;
// Returns the time spent at cruise speed, in seconds
float cruise_time() const;
// Returns the time spent decelerating from cruise speed, in seconds
float deceleration_time() const;
// Returns the distance covered at cruise speed, in mm
float cruise_distance() const;
// Calculates this block's trapezoid
2017-12-06 13:12:10 +00:00
void calculate_trapezoid();
// Calculates the maximum allowable speed at this point when you must be able to reach target_velocity using the
// acceleration within the allotted distance.
static float max_allowable_speed(float acceleration, float target_velocity, float distance);
// Calculates the distance (not time) it takes to accelerate from initial_rate to target_rate using the given acceleration:
static float estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration);
// This function gives you the point at which you must start braking (at the rate of -acceleration) if
// you started at speed initial_rate and accelerated until this point and want to end at the final_rate after
// a total travel of distance. This can be used to compute the intersection point between acceleration and
// deceleration in the cases where the trapezoid has no plateau (i.e. never reaches maximum speed)
static float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance);
};
typedef std::vector<Block> BlocksList;
private:
2017-12-08 09:50:36 +00:00
GCodeReader _parser;
2017-12-06 13:12:10 +00:00
State _state;
2017-12-08 09:50:36 +00:00
Feedrates _curr;
Feedrates _prev;
2017-12-06 13:12:10 +00:00
BlocksList _blocks;
float _time; // s
public:
2017-12-08 09:50:36 +00:00
GCodeTimeEstimator();
2017-12-06 13:12:10 +00:00
2017-12-08 09:50:36 +00:00
// Calculates the time estimate from the given gcode in string format
void calculate_time_from_text(const std::string& gcode);
2017-12-06 13:12:10 +00:00
2017-12-08 09:50:36 +00:00
// Calculates the time estimate from the gcode contained in the file with the given filename
void calculate_time_from_file(const std::string& file);
2017-12-06 13:12:10 +00:00
void set_axis_position(EAxis axis, float position);
void set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec);
void set_axis_max_acceleration(EAxis axis, float acceleration);
void set_axis_max_jerk(EAxis axis, float jerk);
float get_axis_position(EAxis axis) const;
float get_axis_max_feedrate(EAxis axis) const;
float get_axis_max_acceleration(EAxis axis) const;
float get_axis_max_jerk(EAxis axis) const;
void set_feedrate(float feedrate_mm_sec);
float get_feedrate() const;
void set_acceleration(float acceleration);
float get_acceleration() const;
2017-12-08 09:50:36 +00:00
void set_minimum_feedrate(float feedrate_mm_sec);
float get_minimum_feedrate() const;
2017-12-06 13:12:10 +00:00
void set_dialect(EDialect dialect);
EDialect get_dialect() const;
void set_units(EUnits units);
EUnits get_units() const;
void set_positioningType(EPositioningType type);
EPositioningType get_positioningType() const;
void add_additional_time(float timeSec);
2017-12-08 09:50:36 +00:00
void set_additional_time(float timeSec);
2017-12-06 13:12:10 +00:00
float get_additional_time() const;
void set_default();
2017-12-08 09:50:36 +00:00
// Returns the estimated time, in seconds
2017-12-06 13:12:10 +00:00
float get_time() const;
2017-12-08 09:50:36 +00:00
// Returns the estimated time, in format HH:MM:SS
std::string get_time_hms() const;
2017-12-06 13:12:10 +00:00
private:
void _reset();
2017-12-08 09:50:36 +00:00
// Calculates the time estimate
void _calculate_time();
2017-12-06 13:12:10 +00:00
// Processes GCode line
void _process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line);
// Move
void _processG1(const GCodeReader::GCodeLine& line);
// Dwell
void _processG4(const GCodeReader::GCodeLine& line);
// Set Units to Inches
void _processG20(const GCodeReader::GCodeLine& line);
// Set Units to Millimeters
void _processG21(const GCodeReader::GCodeLine& line);
// Move to Origin (Home)
void _processG28(const GCodeReader::GCodeLine& line);
// Set to Absolute Positioning
void _processG90(const GCodeReader::GCodeLine& line);
// Set to Relative Positioning
void _processG91(const GCodeReader::GCodeLine& line);
// Set Position
void _processG92(const GCodeReader::GCodeLine& line);
// Set Extruder Temperature and Wait
void _processM109(const GCodeReader::GCodeLine& line);
// Set maximum feedrate
void _processM203(const GCodeReader::GCodeLine& line);
// Set default acceleration
void _processM204(const GCodeReader::GCodeLine& line);
2017-12-08 09:50:36 +00:00
// Advanced settings
void _processM205(const GCodeReader::GCodeLine& line);
2017-12-06 13:12:10 +00:00
// Set allowable instantaneous speed change
void _processM566(const GCodeReader::GCodeLine& line);
2017-12-08 09:50:36 +00:00
#if ENABLE_BLOCKS_PRE_PROCESSING
void forward_pass();
void reverse_pass();
void planner_forward_pass_kernel(Block* prev, Block* curr);
void planner_reverse_pass_kernel(Block* curr, Block* next);
void recalculate_trapezoids();
#endif // ENABLE_BLOCKS_PRE_PROCESSING
2017-12-06 13:12:10 +00:00
};
} /* namespace Slic3r */
#endif /* slic3r_GCodeTimeEstimator_hpp_ */