diff options
author | FormerLurker <hochgebe@gmail.com> | 2020-11-28 03:20:29 +0300 |
---|---|---|
committer | FormerLurker <hochgebe@gmail.com> | 2020-11-28 03:20:29 +0300 |
commit | 7da85eb0a6d659885b4a16fce7a0ba15ecbe0e39 (patch) | |
tree | 113b82b09851a545fd5666deab1b790cc52635d0 /ArcWelder | |
parent | 359b6e92bf252a9ab6485179aee7f3148108aa86 (diff) |
Fix Python unicode logging issues. Add sin approximation to inverse processor. Fix log levels and progress output. Add firmware compensation statistics.
Diffstat (limited to 'ArcWelder')
-rw-r--r-- | ArcWelder/arc_welder.cpp | 16 | ||||
-rw-r--r-- | ArcWelder/arc_welder.h | 3 | ||||
-rw-r--r-- | ArcWelder/segmented_arc.cpp | 41 | ||||
-rw-r--r-- | ArcWelder/segmented_arc.h | 2 | ||||
-rw-r--r-- | ArcWelder/segmented_shape.cpp | 35 | ||||
-rw-r--r-- | ArcWelder/segmented_shape.h | 13 |
6 files changed, 48 insertions, 62 deletions
diff --git a/ArcWelder/arc_welder.cpp b/ArcWelder/arc_welder.cpp index 981eeec..9fe02d0 100644 --- a/ArcWelder/arc_welder.cpp +++ b/ArcWelder/arc_welder.cpp @@ -205,7 +205,7 @@ arc_welder_results results; bool continue_processing = true; p_logger_->log(logger_type_, DEBUG, "Configuring progress updates."); - int read_lines_before_clock_check = 5000; + int read_lines_before_clock_check = 1000; double next_update_time = get_next_update_time(); const clock_t start_clock = clock(); p_logger_->log(logger_type_, DEBUG, "Getting source file size."); @@ -247,6 +247,8 @@ arc_welder_results results; parsed_command cmd; // Communicate every second + p_logger_->log(logger_type_, DEBUG, "Sending initial progress update."); + continue_processing = on_progress_(get_progress_(static_cast<long>(gcodeFile.tellg()), static_cast<double>(start_clock))); p_logger_->log(logger_type_, DEBUG, "Processing source file."); while (std::getline(gcodeFile, line) && continue_processing) { @@ -278,7 +280,7 @@ arc_welder_results results; process_gcode(cmd, false, false); // Only continue to process if we've found a command and either a progress_callback_ is supplied, or debug loggin is enabled. - if (has_gcode && (progress_callback_ != NULL || info_logging_enabled_)) + if (has_gcode) { if ((lines_processed_ % read_lines_before_clock_check) == 0 && next_update_time < clock()) { @@ -302,12 +304,12 @@ arc_welder_results results; p_logger_->log(logger_type_, DEBUG, "Fetching the final progress struct."); arc_welder_progress final_progress = get_progress_(static_cast<long>(file_size_), static_cast<double>(start_clock)); - if (progress_callback_ != NULL || info_logging_enabled_) + if (debug_logging_enabled_) { - // Sending final progress update message - p_logger_->log(logger_type_, VERBOSE, "Sending final progress update message."); - on_progress_(arc_welder_progress(final_progress)); + p_logger_->log(logger_type_, DEBUG, "Sending final progress update message."); } + on_progress_(arc_welder_progress(final_progress)); + p_logger_->log(logger_type_, DEBUG, "Processing complete, closing source and target file."); output_file_.close(); gcodeFile.close(); @@ -355,7 +357,7 @@ arc_welder_progress arc_welder::get_progress_(long source_file_position, double progress.compression_ratio = (static_cast<float>(source_file_position) / static_cast<float>(progress.target_file_size)); progress.compression_percent = (1.0 - (static_cast<float>(progress.target_file_size) / static_cast<float>(source_file_position))) * 100.0f; } - + progress.num_firmware_compensations = current_arc_.get_num_firmware_compensations(); progress.segment_statistics = segment_statistics_; return progress; diff --git a/ArcWelder/arc_welder.h b/ArcWelder/arc_welder.h index 22cf4b6..0e6bb81 100644 --- a/ArcWelder/arc_welder.h +++ b/ArcWelder/arc_welder.h @@ -352,6 +352,7 @@ struct arc_welder_progress { lines_processed = 0; points_compressed = 0; arcs_created = 0; + num_firmware_compensations = 0; source_file_size = 0; source_file_position = 0; target_file_size = 0; @@ -365,6 +366,7 @@ struct arc_welder_progress { int lines_processed; int points_compressed; int arcs_created; + int num_firmware_compensations; double compression_ratio; double compression_percent; long source_file_position; @@ -381,6 +383,7 @@ struct arc_welder_progress { stream << ", current_file_line: " << lines_processed; stream << ", points_compressed: " << points_compressed; stream << ", arcs_created: " << arcs_created; + stream << ", num_firmware_compensations: " << num_firmware_compensations; stream << ", compression_ratio: " << compression_ratio; stream << ", size_reduction: " << compression_percent << "% "; return stream.str(); diff --git a/ArcWelder/segmented_arc.cpp b/ArcWelder/segmented_arc.cpp index bd4b964..9f02049 100644 --- a/ArcWelder/segmented_arc.cpp +++ b/ArcWelder/segmented_arc.cpp @@ -36,6 +36,7 @@ segmented_arc::segmented_arc() : segmented_shape(DEFAULT_MIN_SEGMENTS, DEFAULT_M max_radius_mm_ = DEFAULT_MAX_RADIUS_MM; min_arc_segments_ = DEFAULT_MIN_ARC_SEGMENTS, allow_3d_arcs_ = DEFAULT_allow_3d_arcs; + num_firmware_compensations_ = 0; } segmented_arc::segmented_arc( @@ -64,6 +65,7 @@ segmented_arc::segmented_arc( min_arc_segments_ = 0; } allow_3d_arcs_ = allow_3d_arcs; + num_firmware_compensations_ = 0; } segmented_arc::~segmented_arc() @@ -98,6 +100,11 @@ int segmented_arc::get_min_arc_segments() const return min_arc_segments_; } +int segmented_arc::get_num_firmware_compensations() const +{ + return num_firmware_compensations_; +} + double segmented_arc::get_mm_per_arc_segment() const { return mm_per_arc_segment_; @@ -149,15 +156,6 @@ bool segmented_arc::try_add_point(point p, double e_relative) point_added = true; points_.push_back(p); original_shape_length_ += distance; - if (points_.count() == get_min_segments()) - { - if (!arc::try_create_arc(points_, current_arc_, original_shape_length_, max_radius_mm_, resolution_mm_, path_tolerance_percent_, min_arc_segments_, mm_per_arc_segment_, xyz_precision_, allow_3d_arcs_)) - { - point_added = false; - points_.pop_back(); - original_shape_length_ -= distance; - } - } } else { @@ -214,11 +212,30 @@ bool segmented_arc::try_add_point_internal_(point p, double pd) if (arc::try_create_arc(points_, current_arc_, original_shape_length_, max_radius_mm_, resolution_mm_, path_tolerance_percent_, min_arc_segments_, mm_per_arc_segment_, xyz_precision_, allow_3d_arcs_)) { - if (!is_shape()) + // See how many arcs will be interpolated + bool firmware_corrected = false; + if (min_arc_segments_ > 0 && mm_per_arc_segment_ > 0) { - set_is_shape(true); + double circumference = 2.0 * PI_DOUBLE * current_arc_.radius; + int num_segments = (int)std::floor(circumference / min_arc_segments_); + if (num_segments < min_arc_segments_) { + //num_segments = (int)std::ceil(circumference/approximate_length) * (int)std::ceil(approximate_length / mm_per_arc_segment); + num_segments = (int)std::floor(circumference / original_shape_length_); + if (num_segments < min_arc_segments_) { + firmware_corrected = true; + num_firmware_compensations_++; + } + } + } + + if (!firmware_corrected) + { + if (!is_shape()) + { + set_is_shape(true); + } + return true; } - return true; } // Can't create the arc. Remove the point and remove the previous segment length. points_.pop_back(); diff --git a/ArcWelder/segmented_arc.h b/ArcWelder/segmented_arc.h index 10ad7f0..a51cbbd 100644 --- a/ArcWelder/segmented_arc.h +++ b/ArcWelder/segmented_arc.h @@ -56,6 +56,7 @@ public: double get_max_radius() const; int get_min_arc_segments() const; double get_mm_per_arc_segment() const; + int get_num_firmware_compensations() const; private: bool try_add_point_internal_(point p, double pd); @@ -67,6 +68,7 @@ private: double max_radius_mm_; int min_arc_segments_; double mm_per_arc_segment_; + int num_firmware_compensations_; bool allow_3d_arcs_; }; diff --git a/ArcWelder/segmented_shape.cpp b/ArcWelder/segmented_shape.cpp index 945c912..d9041eb 100644 --- a/ArcWelder/segmented_shape.cpp +++ b/ArcWelder/segmented_shape.cpp @@ -332,8 +332,6 @@ bool arc::try_create_arc( double approximate_length, double resolution, double path_tolerance_percent, - int min_arc_segments, - double mm_per_arc_segment, bool allow_3d_arcs) { double polar_start_theta = c.get_polar_radians(start_point); @@ -439,20 +437,6 @@ bool arc::try_create_arc( angle_radians *= -1.0; } - // See how many arcs will be interpolated - if (min_arc_segments > 0 && mm_per_arc_segment > 0) - { - double circumference = 2.0*PI_DOUBLE*c.radius; - int num_segments = (int)std::ceil(circumference/mm_per_arc_segment); - if (num_segments < min_arc_segments) { - // We might be able to salvage this. See if there would be enough segments if we use an arc of the current size - num_segments = (int)std::ceil(circumference / arc_length); - if (num_segments < min_arc_segments) { - return false; - } - } - } - target_arc.center.x = c.center.x; target_arc.center.y = c.center.y; target_arc.center.z = c.center.z; @@ -469,20 +453,6 @@ bool arc::try_create_arc( } bool arc::try_create_arc( - const circle& c, - const array_list<point>& points, - arc& target_arc, - double approximate_length, - double resolution, - double path_tolerance_percent, - int min_arc_segments, - double mm_per_arc_segment, - bool allow_3d_arcs) -{ - int mid_point_index = ((points.count() - 2) / 2) + 1; - return arc::try_create_arc(c, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution, path_tolerance_percent, min_arc_segments, mm_per_arc_segment, allow_3d_arcs); -} -bool arc::try_create_arc( const array_list<point>& points, arc& target_arc, double approximate_length, @@ -497,11 +467,14 @@ bool arc::try_create_arc( circle test_circle; if (circle::try_create_circle(points, max_radius_mm, resolution_mm, xyz_precision, allow_3d_arcs, false, test_circle)) { + // We could save a bit of processing power and do our firmware compensation here, but we won't be able to track statistics for this easily. + // moved check to segmented_arc.cpp int mid_point_index = ((points.count() - 2) / 2) + 1; - return arc::try_create_arc(test_circle, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution_mm, path_tolerance_percent, min_arc_segments, mm_per_arc_segment, allow_3d_arcs); + return arc::try_create_arc(test_circle, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution_mm, path_tolerance_percent, allow_3d_arcs); } return false; } + #pragma endregion segmented_shape::segmented_shape(int min_segments, int max_segments, double resolution_mm, double path_tolerance_percnet) : points_(max_segments) diff --git a/ArcWelder/segmented_shape.h b/ArcWelder/segmented_shape.h index 7e57c54..eda6a7c 100644 --- a/ArcWelder/segmented_shape.h +++ b/ArcWelder/segmented_shape.h @@ -163,19 +163,8 @@ struct arc : circle double approximate_length, double resolution = DEFAULT_RESOLUTION_MM, double path_tolerance_percent = ARC_LENGTH_PERCENT_TOLERANCE_DEFAULT, - int min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS, - double mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT, - bool allow_3d_arcs = DEFAULT_allow_3d_arcs); - static bool try_create_arc( - const circle& c, - const array_list<point>& points, - arc& target_arc, - double approximate_length, - double resolution = DEFAULT_RESOLUTION_MM, - double path_tolerance_percent = ARC_LENGTH_PERCENT_TOLERANCE_DEFAULT, - int min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS, - double mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT, bool allow_3d_arcs = DEFAULT_allow_3d_arcs); + static bool try_create_arc( const array_list<point>& points, arc& target_arc, |