|  |  | @ -590,7 +590,7 @@ float cartes[XYZ] = { 0 }; | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if ENABLED(MIXING_EXTRUDER) |  |  |  | #if ENABLED(MIXING_EXTRUDER) | 
			
		
	
		
		
			
				
					
					|  |  |  |   float mixing_factor[MIXING_STEPPERS]; |  |  |  |   float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   #if MIXING_VIRTUAL_TOOLS > 1 |  |  |  |   #if MIXING_VIRTUAL_TOOLS > 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |     float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; |  |  |  |     float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif |  |  |  |   #endif | 
			
		
	
	
		
		
			
				
					|  |  | @ -2650,17 +2650,11 @@ static void homeaxis(AxisEnum axis) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   void normalize_mix() { |  |  |  |   void normalize_mix() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     float mix_total = 0.0; |  |  |  |     float mix_total = 0.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (int i = 0; i < MIXING_STEPPERS; i++) { |  |  |  |     for (int i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       float v = mixing_factor[i]; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (v < 0) v = mixing_factor[i] = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       mix_total += v; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     // Scale all values if they don't add up to ~1.0
 |  |  |  |     // Scale all values if they don't add up to ~1.0
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (mix_total < 0.9999 || mix_total > 1.0001) { |  |  |  |     if (!NEAR(mix_total, 1.0)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); |  |  |  |       SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); | 
			
		
	
		
		
			
				
					
					|  |  |  |       float mix_scale = 1.0 / mix_total; |  |  |  |       for (int i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       for (int i = 0; i < MIXING_STEPPERS; i++) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         mixing_factor[i] *= mix_scale; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -2670,9 +2664,11 @@ static void homeaxis(AxisEnum axis) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     // The total "must" be 1.0 (but it will be normalized)
 |  |  |  |     // The total "must" be 1.0 (but it will be normalized)
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     void gcode_get_mix() { |  |  |  |     void gcode_get_mix() { | 
			
		
	
		
		
			
				
					
					|  |  |  |       const char* mixing_codes = "ABCDHI"; |  |  |  |       const char* mixing_codes = "ABCDHI"; | 
			
		
	
		
		
			
				
					
					|  |  |  |       for (int i = 0; i < MIXING_STEPPERS; i++) |  |  |  |       for (int i = 0; i < MIXING_STEPPERS; i++) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         mixing_factor[i] = code_seen(mixing_codes[i]) ? code_value_float() : 0; |  |  |  |         float v = code_seen(mixing_codes[i]) ? code_value_float() : 0.0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |         NOLESS(v, 0.0); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         mixing_factor[i] = RECIPROCAL(v); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |       normalize_mix(); |  |  |  |       normalize_mix(); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif |  |  |  |   #endif | 
			
		
	
	
		
		
			
				
					|  |  | @ -7142,8 +7138,11 @@ inline void gcode_M907() { | 
			
		
	
		
		
			
				
					
					|  |  |  |    */ |  |  |  |    */ | 
			
		
	
		
		
			
				
					
					|  |  |  |   inline void gcode_M163() { |  |  |  |   inline void gcode_M163() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     int mix_index = code_seen('S') ? code_value_int() : 0; |  |  |  |     int mix_index = code_seen('S') ? code_value_int() : 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |     float mix_value = code_seen('P') ? code_value_float() : 0.0; |  |  |  |     if (mix_index < MIXING_STEPPERS) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if (mix_index < MIXING_STEPPERS) mixing_factor[mix_index] = mix_value; |  |  |  |       float mix_value = code_seen('P') ? code_value_float() : 0.0; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       NOLESS(mix_value, 0.0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       mixing_factor[mix_index] = RECIPROCAL(mix_value); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   #if MIXING_VIRTUAL_TOOLS > 1 |  |  |  |   #if MIXING_VIRTUAL_TOOLS > 1 | 
			
		
	
	
		
		
			
				
					|  |  | @ -9881,7 +9880,7 @@ void setup() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 |  |  |  |   #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Initialize mixing to 100% color 1
 |  |  |  |     // Initialize mixing to 100% color 1
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (uint8_t i = 0; i < MIXING_STEPPERS; i++) |  |  |  |     for (uint8_t i = 0; i < MIXING_STEPPERS; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |       mixing_factor[i] = (i == 0) ? 1 : 0; |  |  |  |       mixing_factor[i] = (i == 0) ? 1.0 : 0.0; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++) |  |  |  |     for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++) | 
			
		
	
		
		
			
				
					
					|  |  |  |       for (uint8_t i = 0; i < MIXING_STEPPERS; i++) |  |  |  |       for (uint8_t i = 0; i < MIXING_STEPPERS; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         mixing_virtual_tool_mix[t][i] = mixing_factor[i]; |  |  |  |         mixing_virtual_tool_mix[t][i] = mixing_factor[i]; | 
			
		
	
	
		
		
			
				
					|  |  | 
 |