Move M163-M165 MIXING_EXTRUDER to cpp

This commit is contained in:
Scott Lahteine 2017-09-18 00:06:16 -05:00
parent 8ca0b2fd68
commit 1a37ebc76d
10 changed files with 166 additions and 84 deletions

View File

@ -62,6 +62,10 @@
#include "feature/digipot/digipot.h" #include "feature/digipot/digipot.h"
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
#include "feature/mixing.h"
#endif
#if ENABLED(BEZIER_CURVE_SUPPORT) #if ENABLED(BEZIER_CURVE_SUPPORT)
#include "module/planner_bezier.h" #include "module/planner_bezier.h"
#endif #endif
@ -186,13 +190,6 @@ millis_t max_inactive_time = 0,
AdvancedPauseMenuResponse advanced_pause_menu_response; AdvancedPauseMenuResponse advanced_pause_menu_response;
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0.
#if MIXING_VIRTUAL_TOOLS > 1
float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
#endif
#endif
#ifdef CHDK #ifdef CHDK
millis_t chdkHigh = 0; millis_t chdkHigh = 0;
bool chdkActive = false; bool chdkActive = false;
@ -302,45 +299,6 @@ void suicide() {
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
void normalize_mix() {
float mix_total = 0.0;
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]);
// Scale all values if they don't add up to ~1.0
if (!NEAR(mix_total, 1.0)) {
SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling.");
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total;
}
}
#if ENABLED(DIRECT_MIXING_IN_G1)
// Get mixing parameters from the GCode
// The total "must" be 1.0 (but it will be normalized)
// If no mix factors are given, the old mix is preserved
void gcode_get_mix() {
const char* mixing_codes = "ABCDHI";
byte mix_bits = 0;
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) {
if (parser.seenval(mixing_codes[i])) {
SBI(mix_bits, i);
float v = parser.value_float();
NOLESS(v, 0.0);
mixing_factor[i] = RECIPROCAL(v);
}
}
// If any mixing factors were included, clear the rest
// If none were included, preserve the last mix
if (mix_bits) {
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
if (!TEST(mix_bits, i)) mixing_factor[i] = 0.0;
normalize_mix();
}
}
#endif
#endif
/************************************************** /**************************************************
***************** GCode Handlers ***************** ***************** GCode Handlers *****************
**************************************************/ **************************************************/
@ -362,16 +320,6 @@ void quickstop_stepper() {
SYNC_PLAN_POSITION_KINEMATIC(); SYNC_PLAN_POSITION_KINEMATIC();
} }
#if ENABLED(MIXING_EXTRUDER)
#include "gcode/feature/mixing/M163.h"
#if MIXING_VIRTUAL_TOOLS > 1
#include "gcode/feature/mixing/M164.h"
#endif
#if ENABLED(DIRECT_MIXING_IN_G1)
#include "gcode/feature/mixing/M165.h"
#endif
#endif
#include "gcode/control/M999.h" #include "gcode/control/M999.h"
#include "gcode/control/T.h" #include "gcode/control/T.h"
@ -957,12 +905,7 @@ void setup() {
#endif #endif
#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1
// Initialize mixing to 100% color 1 mixing_tools_init();
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
mixing_factor[i] = (i == 0) ? 1.0 : 0.0;
for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++)
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
mixing_virtual_tool_mix[t][i] = mixing_factor[i];
#endif #endif
#if ENABLED(BLTOUCH) #if ENABLED(BLTOUCH)

View File

@ -223,13 +223,6 @@ extern millis_t max_inactive_time, stepper_inactive_time;
extern int lpq_len; extern int lpq_len;
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
extern float mixing_factor[MIXING_STEPPERS];
#if MIXING_VIRTUAL_TOOLS > 1
extern float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
#endif
#endif
void calculate_volumetric_multipliers(); void calculate_volumetric_multipliers();
bool pin_is_protected(const int8_t pin); bool pin_is_protected(const int8_t pin);

View File

@ -0,0 +1,79 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "../inc/MarlinConfig.h"
#if ENABLED(MIXING_EXTRUDER)
float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0.
#if MIXING_VIRTUAL_TOOLS > 1
float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
void mixing_tools_init() {
// Initialize mixing to 100% color 1
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
mixing_factor[i] = (i == 0) ? 1.0 : 0.0;
for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++)
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
mixing_virtual_tool_mix[t][i] = mixing_factor[i];
}
#endif // MIXING_VIRTUAL_TOOLS > 1
void normalize_mix() {
float mix_total = 0.0;
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]);
// Scale all values if they don't add up to ~1.0
if (!NEAR(mix_total, 1.0)) {
SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling.");
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total;
}
}
#if ENABLED(DIRECT_MIXING_IN_G1)
// Get mixing parameters from the GCode
// The total "must" be 1.0 (but it will be normalized)
// If no mix factors are given, the old mix is preserved
void gcode_get_mix() {
const char mixing_codes[] = { 'A', 'B', 'C', 'D', 'H', 'I' };
byte mix_bits = 0;
for (uint8_t i = 0; i < MIXING_STEPPERS; i++) {
if (parser.seenval(mixing_codes[i])) {
SBI(mix_bits, i);
float v = parser.value_float();
NOLESS(v, 0.0);
mixing_factor[i] = RECIPROCAL(v);
}
}
// If any mixing factors were included, clear the rest
// If none were included, preserve the last mix
if (mix_bits) {
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
if (!TEST(mix_bits, i)) mixing_factor[i] = 0.0;
normalize_mix();
}
}
#endif
#endif // MIXING_EXTRUDER

View File

@ -0,0 +1,41 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef __MIXING_H__
#define __MIXING_H__
#include "../inc/MarlinConfig.h"
extern float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0.
#if MIXING_VIRTUAL_TOOLS > 1
extern float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS];
void mixing_tools_init();
#endif
void normalize_mix();
#if ENABLED(DIRECT_MIXING_IN_G1)
void gcode_get_mix();
#endif
#endif // __MIXING_H__

View File

@ -20,6 +20,13 @@
* *
*/ */
#include "../../../inc/MarlinConfig.h"
#if ENABLED(MIXING_EXTRUDER)
#include "../../gcode.h"
#include "../../../feature/mixing.h"
/** /**
* M163: Set a single mix factor for a mixing extruder * M163: Set a single mix factor for a mixing extruder
* This is called "weight" by some systems. * This is called "weight" by some systems.
@ -28,7 +35,7 @@
* P[float] The mix value * P[float] The mix value
* *
*/ */
void gcode_M163() { void GcodeSuite::M163() {
const int mix_index = parser.intval('S'); const int mix_index = parser.intval('S');
if (mix_index < MIXING_STEPPERS) { if (mix_index < MIXING_STEPPERS) {
float mix_value = parser.floatval('P'); float mix_value = parser.floatval('P');
@ -36,3 +43,5 @@ void gcode_M163() {
mixing_factor[mix_index] = RECIPROCAL(mix_value); mixing_factor[mix_index] = RECIPROCAL(mix_value);
} }
} }
#endif // MIXING_EXTRUDER

View File

@ -20,13 +20,20 @@
* *
*/ */
#include "../../../inc/MarlinConfig.h"
#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1
#include "../../gcode.h"
#include "../../../feature/mixing.h"
/** /**
* M164: Store the current mix factors as a virtual tool. * M164: Store the current mix factors as a virtual tool.
* *
* S[index] The virtual tool to store * S[index] The virtual tool to store
* *
*/ */
void gcode_M164() { void GcodeSuite::M164() {
const int tool_index = parser.intval('S'); const int tool_index = parser.intval('S');
if (tool_index < MIXING_VIRTUAL_TOOLS) { if (tool_index < MIXING_VIRTUAL_TOOLS) {
normalize_mix(); normalize_mix();
@ -34,3 +41,5 @@ void gcode_M164() {
mixing_virtual_tool_mix[tool_index][i] = mixing_factor[i]; mixing_virtual_tool_mix[tool_index][i] = mixing_factor[i];
} }
} }
#endif // MIXING_EXTRUDER && MIXING_VIRTUAL_TOOLS > 1

View File

@ -20,6 +20,13 @@
* *
*/ */
#include "../../../inc/MarlinConfig.h"
#if ENABLED(DIRECT_MIXING_IN_G1)
#include "../../gcode.h"
#include "../../../feature/mixing.h"
/** /**
* M165: Set multiple mix factors for a mixing extruder. * M165: Set multiple mix factors for a mixing extruder.
* Factors that are left out will be set to 0. * Factors that are left out will be set to 0.
@ -33,4 +40,6 @@
* I[factor] Mix factor for extruder stepper 6 * I[factor] Mix factor for extruder stepper 6
* *
*/ */
void gcode_M165() { gcode_get_mix(); } void GcodeSuite::M165() { gcode_get_mix(); }
#endif // DIRECT_MIXING_IN_G1

View File

@ -116,9 +116,6 @@ void GcodeSuite::dwell(millis_t time) {
// //
// Placeholders for non-migrated codes // Placeholders for non-migrated codes
// //
extern void gcode_M163();
extern void gcode_M164();
extern void gcode_M165();
extern void gcode_M999(); extern void gcode_M999();
extern void gcode_T(uint8_t tmp_extruder); extern void gcode_T(uint8_t tmp_extruder);
@ -462,18 +459,12 @@ void GcodeSuite::process_next_command() {
#endif #endif
#if ENABLED(MIXING_EXTRUDER) #if ENABLED(MIXING_EXTRUDER)
case 163: // M163: Set a component weight for mixing extruder case 163: M163(); break; // M163: Set a component weight for mixing extruder
gcode_M163();
break;
#if MIXING_VIRTUAL_TOOLS > 1 #if MIXING_VIRTUAL_TOOLS > 1
case 164: // M164: Save current mix as a virtual extruder case 164: M164(); break; // M164: Save current mix as a virtual extruder
gcode_M164();
break;
#endif #endif
#if ENABLED(DIRECT_MIXING_IN_G1) #if ENABLED(DIRECT_MIXING_IN_G1)
case 165: // M165: Set multiple mix weights case 165: M165(); break; // M165: Set multiple mix weights
gcode_M165();
break;
#endif #endif
#endif #endif

View File

@ -80,6 +80,10 @@
#include "../feature/baricuda.h" #include "../feature/baricuda.h"
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
#include "../feature/mixing.h"
#endif
Planner planner; Planner planner;
// public: // public:

View File

@ -42,6 +42,10 @@
#include "../feature/snmm.h" #include "../feature/snmm.h"
#endif #endif
#if ENABLED(MIXING_EXTRUDER)
#include "../feature/mixing.h"
#endif
#if ENABLED(SWITCHING_EXTRUDER) #if ENABLED(SWITCHING_EXTRUDER)
#if EXTRUDERS > 3 #if EXTRUDERS > 3