Browse Source

Merge pull request #5212 from thinkyhead/rc_mixing_faster

Store mix factors as reciprocals and multiply
Scott Lahteine 7 years ago
parent
commit
665b7f3893
3 changed files with 18 additions and 17 deletions
  1. 15
    16
      Marlin/Marlin_main.cpp
  2. 2
    0
      Marlin/macros.h
  3. 1
    1
      Marlin/planner.cpp

+ 15
- 16
Marlin/Marlin_main.cpp View File

@@ -593,7 +593,7 @@ float cartes[XYZ] = { 0 };
593 593
 #endif
594 594
 
595 595
 #if ENABLED(MIXING_EXTRUDER)
596
-  float mixing_factor[MIXING_STEPPERS];
596
+  float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0.
597 597
   #if MIXING_VIRTUAL_TOOLS > 1
598 598
     float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
599 599
   #endif
@@ -2662,17 +2662,11 @@ static void homeaxis(AxisEnum axis) {
2662 2662
 
2663 2663
   void normalize_mix() {
2664 2664
     float mix_total = 0.0;
2665
-    for (int i = 0; i < MIXING_STEPPERS; i++) {
2666
-      float v = mixing_factor[i];
2667
-      if (v < 0) v = mixing_factor[i] = 0;
2668
-      mix_total += v;
2669
-    }
2665
+    for (int i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]);
2670 2666
     // Scale all values if they don't add up to ~1.0
2671
-    if (mix_total < 0.9999 || mix_total > 1.0001) {
2667
+    if (!NEAR(mix_total, 1.0)) {
2672 2668
       SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling.");
2673
-      float mix_scale = 1.0 / mix_total;
2674
-      for (int i = 0; i < MIXING_STEPPERS; i++)
2675
-        mixing_factor[i] *= mix_scale;
2669
+      for (int i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total;
2676 2670
     }
2677 2671
   }
2678 2672
 
@@ -2682,9 +2676,11 @@ static void homeaxis(AxisEnum axis) {
2682 2676
     // The total "must" be 1.0 (but it will be normalized)
2683 2677
     void gcode_get_mix() {
2684 2678
       const char* mixing_codes = "ABCDHI";
2685
-      for (int i = 0; i < MIXING_STEPPERS; i++)
2686
-        mixing_factor[i] = code_seen(mixing_codes[i]) ? code_value_float() : 0;
2687
-
2679
+      for (int i = 0; i < MIXING_STEPPERS; i++) {
2680
+        float v = code_seen(mixing_codes[i]) ? code_value_float() : 0.0;
2681
+        NOLESS(v, 0.0);
2682
+        mixing_factor[i] = RECIPROCAL(v);
2683
+      }
2688 2684
       normalize_mix();
2689 2685
     }
2690 2686
   #endif
@@ -7240,8 +7236,11 @@ inline void gcode_M907() {
7240 7236
    */
7241 7237
   inline void gcode_M163() {
7242 7238
     int mix_index = code_seen('S') ? code_value_int() : 0;
7243
-    float mix_value = code_seen('P') ? code_value_float() : 0.0;
7244
-    if (mix_index < MIXING_STEPPERS) mixing_factor[mix_index] = mix_value;
7239
+    if (mix_index < MIXING_STEPPERS) {
7240
+      float mix_value = code_seen('P') ? code_value_float() : 0.0;
7241
+      NOLESS(mix_value, 0.0);
7242
+      mixing_factor[mix_index] = RECIPROCAL(mix_value);
7243
+    }
7245 7244
   }
7246 7245
 
7247 7246
   #if MIXING_VIRTUAL_TOOLS > 1
@@ -9991,7 +9990,7 @@ void setup() {
9991 9990
   #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1
9992 9991
     // Initialize mixing to 100% color 1
9993 9992
     for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
9994
-      mixing_factor[i] = (i == 0) ? 1 : 0;
9993
+      mixing_factor[i] = (i == 0) ? 1.0 : 0.0;
9995 9994
     for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++)
9996 9995
       for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
9997 9996
         mixing_virtual_tool_mix[t][i] = mixing_factor[i];

+ 2
- 0
Marlin/macros.h View File

@@ -133,4 +133,6 @@
133 133
 #define NEAR_ZERO(x) ((x) > -0.000001 && (x) < 0.000001)
134 134
 #define NEAR(x,y) NEAR_ZERO((x)-(y))
135 135
 
136
+#define RECIPROCAL(x) (NEAR_ZERO(x) ? 0.0 : 1.0 / (x))
137
+
136 138
 #endif //__MACROS_H

+ 1
- 1
Marlin/planner.cpp View File

@@ -750,7 +750,7 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const
750 750
   // For a mixing extruder, get a magnified step_event_count for each
751 751
   #if ENABLED(MIXING_EXTRUDER)
752 752
     for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
753
-      block->mix_event_count[i] = UNEAR_ZERO(mixing_factor[i]) ? 0 : block->step_event_count / mixing_factor[i];
753
+      block->mix_event_count[i] = mixing_factor[i] * block->step_event_count;
754 754
   #endif
755 755
 
756 756
   #if FAN_COUNT > 0

Loading…
Cancel
Save