|
@@ -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];
|