Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FormerLurker/ArcWelderLib.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFormerLurker <hochgebe@gmail.com>2020-11-28 03:20:29 +0300
committerFormerLurker <hochgebe@gmail.com>2020-11-28 03:20:29 +0300
commit7da85eb0a6d659885b4a16fce7a0ba15ecbe0e39 (patch)
tree113b82b09851a545fd5666deab1b790cc52635d0 /ArcWelder
parent359b6e92bf252a9ab6485179aee7f3148108aa86 (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.cpp16
-rw-r--r--ArcWelder/arc_welder.h3
-rw-r--r--ArcWelder/segmented_arc.cpp41
-rw-r--r--ArcWelder/segmented_arc.h2
-rw-r--r--ArcWelder/segmented_shape.cpp35
-rw-r--r--ArcWelder/segmented_shape.h13
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,