More "zero extruders" changes (#15213)

This commit is contained in:
Scott Lahteine 2019-09-10 02:20:49 -05:00 committed by GitHub
parent 54abf3aeba
commit 584c86bed1
Signed by: GitHub
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 1068 additions and 841 deletions

View file

@ -175,7 +175,9 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*=
info.active_extruder = active_extruder; info.active_extruder = active_extruder;
#endif #endif
#if EXTRUDERS
HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target; HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target;
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
info.target_temperature_bed = thermalManager.temp_bed.target; info.target_temperature_bed = thermalManager.temp_bed.target;
@ -297,6 +299,7 @@ void PrintJobRecovery::resume() {
#endif #endif
// Restore all hotend temperatures // Restore all hotend temperatures
#if HOTENDS
HOTEND_LOOP() { HOTEND_LOOP() {
const int16_t et = info.target_temperature[e]; const int16_t et = info.target_temperature[e];
if (et) { if (et) {
@ -308,6 +311,7 @@ void PrintJobRecovery::resume() {
gcode.process_subcommands_now(cmd); gcode.process_subcommands_now(cmd);
} }
} }
#endif
// Restore print cooling fan speeds // Restore print cooling fan speeds
FANS_LOOP(i) { FANS_LOOP(i) {
@ -452,12 +456,14 @@ void PrintJobRecovery::resume() {
DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder)); DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder));
#endif #endif
#if HOTENDS
DEBUG_ECHOPGM("target_temperature: "); DEBUG_ECHOPGM("target_temperature: ");
HOTEND_LOOP() { HOTEND_LOOP() {
DEBUG_ECHO(info.target_temperature[e]); DEBUG_ECHO(info.target_temperature[e]);
if (e < HOTENDS - 1) DEBUG_CHAR(','); if (e < HOTENDS - 1) DEBUG_CHAR(',');
} }
DEBUG_EOL(); DEBUG_EOL();
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
DEBUG_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed); DEBUG_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed);

View file

@ -59,7 +59,9 @@ typedef struct {
uint8_t active_extruder; uint8_t active_extruder;
#endif #endif
#if HOTENDS
int16_t target_temperature[HOTENDS]; int16_t target_temperature[HOTENDS];
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
int16_t target_temperature_bed; int16_t target_temperature_bed;

View file

@ -23,6 +23,8 @@
#include "../gcode.h" #include "../gcode.h"
#include "../../module/planner.h" #include "../../module/planner.h"
#if EXTRUDERS
/** /**
* M221: Set extrusion percentage (M221 T0 S95) * M221: Set extrusion percentage (M221 T0 S95)
*/ */
@ -44,3 +46,5 @@ void GcodeSuite::M221() {
SERIAL_EOL(); SERIAL_EOL();
} }
} }
#endif // EXTRUDERS

View file

@ -400,8 +400,18 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 100: M100(); break; // M100: Free Memory Report case 100: M100(); break; // M100: Free Memory Report
#endif #endif
#if EXTRUDERS
case 104: M104(); break; // M104: Set hot end temperature case 104: M104(); break; // M104: Set hot end temperature
case 109: M109(); break; // M109: Wait for hotend temperature to reach target case 109: M109(); break; // M109: Wait for hotend temperature to reach target
#endif
case 105: M105(); return; // M105: Report Temperatures (and say "ok")
#if FAN_COUNT > 0
case 106: M106(); break; // M106: Fan On
case 107: M107(); break; // M107: Fan Off
#endif
case 110: M110(); break; // M110: Set Current Line Number case 110: M110(); break; // M110: Set Current Line Number
case 111: M111(); break; // M111: Set debug level case 111: M111(); break; // M111: Set debug level
@ -434,17 +444,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
//case 191: M191(); break; // M191: Wait for chamber temperature to reach target //case 191: M191(); break; // M191: Wait for chamber temperature to reach target
#endif #endif
case 105: M105(); return; // M105: Report Temperatures (and say "ok")
#if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR
case 155: M155(); break; // M155: Set temperature auto-report interval case 155: M155(); break; // M155: Set temperature auto-report interval
#endif #endif
#if FAN_COUNT > 0
case 106: M106(); break; // M106: Fan On
case 107: M107(); break; // M107: Fan Off
#endif
#if ENABLED(PARK_HEAD_ON_PAUSE) #if ENABLED(PARK_HEAD_ON_PAUSE)
case 125: M125(); break; // M125: Store current position and move to filament change position case 125: M125(); break; // M125: Store current position and move to filament change position
#endif #endif
@ -481,7 +484,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 120: M120(); break; // M120: Enable endstops case 120: M120(); break; // M120: Enable endstops
case 121: M121(); break; // M121: Disable endstops case 121: M121(); break; // M121: Disable endstops
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
case 145: M145(); break; // M145: Set material heatup parameters case 145: M145(); break; // M145: Set material heatup parameters
#endif #endif
@ -553,7 +556,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
#endif #endif
case 220: M220(); break; // M220: Set Feedrate Percentage: S<percent> ("FR" on your LCD) case 220: M220(); break; // M220: Set Feedrate Percentage: S<percent> ("FR" on your LCD)
#if EXTRUDERS
case 221: M221(); break; // M221: Set Flow Percentage case 221: M221(); break; // M221: Set Flow Percentage
#endif
case 226: M226(); break; // M226: Wait until a pin reaches a state case 226: M226(); break; // M226: Wait until a pin reaches a state
#if HAS_SERVOS #if HAS_SERVOS

View file

@ -543,10 +543,17 @@ private:
static void M100(); static void M100();
#endif #endif
#if EXTRUDERS
static void M104(); static void M104();
static void M109();
#endif
static void M105(); static void M105();
#if FAN_COUNT > 0
static void M106(); static void M106();
static void M107(); static void M107();
#endif
#if DISABLED(EMERGENCY_PARSER) #if DISABLED(EMERGENCY_PARSER)
static void M108(); static void M108();
@ -557,8 +564,6 @@ private:
#endif #endif
#endif #endif
static void M109();
static void M110(); static void M110();
static void M111(); static void M111();
@ -599,7 +604,7 @@ private:
//static void M191(); //static void M191();
#endif #endif
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
static void M145(); static void M145();
#endif #endif
@ -660,7 +665,11 @@ private:
#endif #endif
static void M220(); static void M220();
#if EXTRUDERS
static void M221(); static void M221();
#endif
static void M226(); static void M226();
#if ENABLED(PHOTO_GCODE) #if ENABLED(PHOTO_GCODE)

View file

@ -22,7 +22,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
#include "../gcode.h" #include "../gcode.h"
#include "../../lcd/ultralcd.h" #include "../../lcd/ultralcd.h"
@ -58,4 +58,4 @@ void GcodeSuite::M145() {
} }
} }
#endif // HAS_LCD_MENU #endif // HOTENDS && HAS_LCD_MENU

View file

@ -20,6 +20,10 @@
* *
*/ */
#include "../../inc/MarlinConfigPre.h"
#if EXTRUDERS
#include "../gcode.h" #include "../gcode.h"
#include "../../module/temperature.h" #include "../../module/temperature.h"
#include "../../module/motion.h" #include "../../module/motion.h"
@ -138,3 +142,5 @@ void GcodeSuite::M109() {
if (set_temp) if (set_temp)
(void)thermalManager.wait_for_hotend(target_extruder, no_wait_for_cooling); (void)thermalManager.wait_for_hotend(target_extruder, no_wait_for_cooling);
} }
#endif // EXTRUDERS

View file

@ -26,6 +26,34 @@
* Defines that depend on advanced configuration. * Defines that depend on advanced configuration.
*/ */
#if EXTRUDERS == 0
#define NO_VOLUMETRICS
#undef TEMP_SENSOR_0
#undef TEMP_SENSOR_1
#undef TEMP_SENSOR_2
#undef TEMP_SENSOR_3
#undef TEMP_SENSOR_4
#undef TEMP_SENSOR_5
#undef FWRETRACT
#undef PIDTEMP
#undef AUTOTEMP
#undef PID_EXTRUSION_SCALING
#undef LIN_ADVANCE
#undef FILAMENT_RUNOUT_SENSOR
#undef ADVANCED_PAUSE_FEATURE
#undef FILAMENT_RUNOUT_DISTANCE_MM
#undef FILAMENT_LOAD_UNLOAD_GCODES
#undef DISABLE_INACTIVE_EXTRUDER
#undef FILAMENT_LOAD_UNLOAD_GCODES
#undef EXTRUDER_RUNOUT_PREVENT
#undef PREVENT_COLD_EXTRUSION
#undef PREVENT_LENGTHY_EXTRUDE
#undef THERMAL_PROTECTION_HOTENDS
#undef THERMAL_PROTECTION_PERIOD
#undef WATCH_TEMP_PERIOD
#undef SHOW_TEMP_ADC_VALUES
#endif
#define HAS_CUTTER EITHER(SPINDLE_FEATURE, LASER_FEATURE) #define HAS_CUTTER EITHER(SPINDLE_FEATURE, LASER_FEATURE)
#if !defined(__AVR__) || !defined(USBCON) #if !defined(__AVR__) || !defined(USBCON)

View file

@ -43,16 +43,6 @@
#define NOT_A_PIN 0 // For PINS_DEBUGGING #define NOT_A_PIN 0 // For PINS_DEBUGGING
#endif #endif
#if EXTRUDERS == 0
#define NO_VOLUMETRICS
#undef FWRETRACT
#undef LIN_ADVANCE
#undef ADVANCED_PAUSE_FEATURE
#undef DISABLE_INACTIVE_EXTRUDER
#undef EXTRUDER_RUNOUT_PREVENT
#undef FILAMENT_LOAD_UNLOAD_GCODES
#endif
#define HAS_CLASSIC_JERK (IS_KINEMATIC || DISABLED(JUNCTION_DEVIATION)) #define HAS_CLASSIC_JERK (IS_KINEMATIC || DISABLED(JUNCTION_DEVIATION))
/** /**
@ -1047,6 +1037,10 @@
#define BED_OR_CHAMBER (HAS_HEATED_BED || HAS_TEMP_CHAMBER) #define BED_OR_CHAMBER (HAS_HEATED_BED || HAS_TEMP_CHAMBER)
#define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || BED_OR_CHAMBER) #define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || BED_OR_CHAMBER)
#if !HAS_TEMP_SENSOR
#undef AUTO_REPORT_TEMPERATURES
#endif
// PID heating // PID heating
#if !HAS_HEATED_BED #if !HAS_HEATED_BED
#undef PIDTEMPBED #undef PIDTEMPBED

View file

@ -1476,8 +1476,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board."
#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PIN_EXISTS(E0_STEP, E0_DIR) || !HAS_E0_ENABLE)) #elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PIN_EXISTS(E0_STEP, E0_DIR) || !HAS_E0_ENABLE))
#error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
#elif TEMP_SENSOR_0 == 0 #elif EXTRUDERS && TEMP_SENSOR_0 == 0
#error "TEMP_SENSOR_0 is required." #error "TEMP_SENSOR_0 is required with any extruders."
#endif #endif
// Pins are required for heaters // Pins are required for heaters

View file

@ -866,7 +866,11 @@ void MarlinUI::draw_status_screen() {
char c; char c;
uint16_t per; uint16_t per;
#if HAS_FAN0 #if HAS_FAN0
if (blink || thermalManager.fan_speed_scaler[0] < 128) { if (true
#if EXTRUDERS
&& (blink || thermalManager.fan_speed_scaler[0] < 128)
#endif
) {
uint16_t spd = thermalManager.fan_speed[0]; uint16_t spd = thermalManager.fan_speed[0];
if (blink) c = 'F'; if (blink) c = 'F';
#if ENABLED(ADAPTIVE_FAN_SLOWING) #if ENABLED(ADAPTIVE_FAN_SLOWING)
@ -877,8 +881,10 @@ void MarlinUI::draw_status_screen() {
else else
#endif #endif
{ {
#if EXTRUDERS
c = 'E'; c = 'E';
per = planner.flow_percentage[0]; per = planner.flow_percentage[0];
#endif
} }
lcd_put_wchar(c); lcd_put_wchar(c);
lcd_put_u8str(i16tostr3(per)); lcd_put_u8str(i16tostr3(per));

View file

@ -69,10 +69,28 @@
// //
#if HAS_HEATED_BED && HOTENDS <= 4 #if HAS_HEATED_BED && HOTENDS <= 4
#if HOTENDS == 1 #if HOTENDS == 0
#define STATUS_HEATERS_WIDTH 96
const unsigned char status_heaters_bmp[] PROGMEM = {
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000
};
#elif HOTENDS == 1
#define STATUS_HEATERS_WIDTH 96 #define STATUS_HEATERS_WIDTH 96
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
const unsigned char status_heaters_bmp[] PROGMEM = { const unsigned char status_heaters_bmp[] PROGMEM = {
B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
@ -92,7 +110,6 @@
#elif HOTENDS == 2 #elif HOTENDS == 2
#define STATUS_HEATERS_WIDTH 96 #define STATUS_HEATERS_WIDTH 96
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
const unsigned char status_heaters_bmp[] PROGMEM = { const unsigned char status_heaters_bmp[] PROGMEM = {
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
@ -112,7 +129,6 @@
#elif HOTENDS == 3 #elif HOTENDS == 3
#define STATUS_HEATERS_WIDTH 96 #define STATUS_HEATERS_WIDTH 96
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
const unsigned char status_heaters_bmp[] PROGMEM = { const unsigned char status_heaters_bmp[] PROGMEM = {
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
@ -132,7 +148,6 @@
#else // HOTENDS > 3 #else // HOTENDS > 3
#define STATUS_HEATERS_WIDTH 120 #define STATUS_HEATERS_WIDTH 120
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
const unsigned char status_heaters_bmp[] PROGMEM = { const unsigned char status_heaters_bmp[] PROGMEM = {
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
@ -151,9 +166,15 @@
#endif // HOTENDS #endif // HOTENDS
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
#else // !HAS_HEATED_BED || HOTENDS > 3 #else // !HAS_HEATED_BED || HOTENDS > 3
#if HOTENDS == 1 #if HOTENDS == 0
#define STATUS_HEATERS_WIDTH 0
#elif HOTENDS == 1
#define STATUS_HEATERS_WIDTH 12 #define STATUS_HEATERS_WIDTH 12
@ -229,7 +250,7 @@
B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000
}; };
#elif HOTENDS > 4 #else // HOTENDS > 4
#define STATUS_HEATERS_WIDTH 108 #define STATUS_HEATERS_WIDTH 108
@ -304,9 +325,7 @@
#endif #endif
#else #elif HOTENDS >= 2
#if HOTENDS >= 2
#ifdef STATUS_HOTEND_ANIM #ifdef STATUS_HOTEND_ANIM
@ -404,8 +423,6 @@
#endif #endif
#endif
#if STATUS_HOTEND_BITMAPS >= 3 #if STATUS_HOTEND_BITMAPS >= 3
#ifdef STATUS_HOTEND_ANIM #ifdef STATUS_HOTEND_ANIM
@ -573,6 +590,8 @@
#endif #endif
#else
#define STATUS_HEATERS_HEIGHT 20
#endif #endif
#endif #endif
@ -1431,6 +1450,10 @@
"Status heaters bitmap (status_heaters_bmp) dimensions don't match data." "Status heaters bitmap (status_heaters_bmp) dimensions don't match data."
); );
#else // HOTENDS == 0
//#error "Incomplete status header"
#endif #endif
// //

View file

@ -93,7 +93,10 @@
#define CHAMBER_ALT() false #define CHAMBER_ALT() false
#endif #endif
#if HOTENDS
#define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE)))
#endif
#define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1)
#if ENABLED(MARLIN_DEV_MODE) #if ENABLED(MARLIN_DEV_MODE)
@ -127,6 +130,11 @@ FORCE_INLINE void _draw_heater_status(const heater_ind_t heater, const bool blin
const bool isHeat = IFBED(BED_ALT(), HOTEND_ALT(heater)); const bool isHeat = IFBED(BED_ALT(), HOTEND_ALT(heater));
#endif #endif
#ifndef STATUS_HOTEND_TEXT_X
#define STATUS_HOTEND_TEXT_X(N) 0
#define STATUS_HEATERS_Y 0
#endif
const uint8_t tx = IFBED(STATUS_BED_TEXT_X, STATUS_HOTEND_TEXT_X(heater)); const uint8_t tx = IFBED(STATUS_BED_TEXT_X, STATUS_HOTEND_TEXT_X(heater));
#if ENABLED(MARLIN_DEV_MODE) #if ENABLED(MARLIN_DEV_MODE)
@ -424,8 +432,10 @@ void MarlinUI::draw_status_screen() {
// //
if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) { if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) {
// Extruders // Extruders
#if HOTENDS
for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e) for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e)
_draw_heater_status((heater_ind_t)e, blink); _draw_heater_status((heater_ind_t)e, blink);
#endif
// Heated bed // Heated bed
#if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) || (HAS_HEATED_BED && ENABLED(STATUS_COMBINE_HEATERS) && HOTENDS <= 4) #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) || (HAS_HEATED_BED && ENABLED(STATUS_COMBINE_HEATERS) && HOTENDS <= 4)

View file

@ -497,6 +497,7 @@ void DGUSScreenVariableHandler::HandleTemperatureChanged(DGUS_VP_Variable &var,
} }
void DGUSScreenVariableHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenVariableHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) {
#if EXTRUDERS
uint16_t newvalue = swap16(*(uint16_t*)val_ptr); uint16_t newvalue = swap16(*(uint16_t*)val_ptr);
uint8_t target_extruder; uint8_t target_extruder;
switch (var.VP) { switch (var.VP) {
@ -512,6 +513,9 @@ void DGUSScreenVariableHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, voi
planner.flow_percentage[target_extruder] = newvalue; planner.flow_percentage[target_extruder] = newvalue;
planner.refresh_e_factor(target_extruder); planner.refresh_e_factor(target_extruder);
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
#else
UNUSED(var); UNUSED(val_ptr);
#endif
} }
void DGUSScreenVariableHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenVariableHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) {

View file

@ -168,7 +168,7 @@ namespace ExtUI {
} }
void enableHeater(const extruder_t extruder) { void enableHeater(const extruder_t extruder) {
#if HEATER_IDLE_HANDLER #if HOTENDS && HEATER_IDLE_HANDLER
thermalManager.reset_heater_idle_timer(extruder - E0); thermalManager.reset_heater_idle_timer(extruder - E0);
#endif #endif
} }
@ -184,14 +184,18 @@ namespace ExtUI {
#if HAS_HEATED_CHAMBER #if HAS_HEATED_CHAMBER
case CHAMBER: return; // Chamber has no idle timer case CHAMBER: return; // Chamber has no idle timer
#endif #endif
default: thermalManager.reset_heater_idle_timer(heater - H0); default:
#if HOTENDS
thermalManager.reset_heater_idle_timer(heater - H0);
#endif
break;
} }
#endif #endif
} }
bool isHeaterIdle(const extruder_t extruder) { bool isHeaterIdle(const extruder_t extruder) {
return false return false
#if HEATER_IDLE_HANDLER #if HOTENDS && HEATER_IDLE_HANDLER
|| thermalManager.hotend_idle[extruder - E0].timed_out || thermalManager.hotend_idle[extruder - E0].timed_out
#endif #endif
; ;
@ -206,7 +210,12 @@ namespace ExtUI {
#if HAS_HEATED_CHAMBER #if HAS_HEATED_CHAMBER
case CHAMBER: return false; // Chamber has no idle timer case CHAMBER: return false; // Chamber has no idle timer
#endif #endif
default: return thermalManager.hotend_idle[heater - H0].timed_out; default:
#if HOTENDS
return thermalManager.hotend_idle[heater - H0].timed_out;
#else
return false;
#endif
} }
#else #else
return false; return false;
@ -841,22 +850,28 @@ namespace ExtUI {
} }
void setTargetTemp_celsius(float value, const heater_t heater) { void setTargetTemp_celsius(float value, const heater_t heater) {
constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP);
const int16_t e = heater - H0;
enableHeater(heater); enableHeater(heater);
#if HAS_HEATED_BED #if HAS_HEATED_BED
if (heater == BED) if (heater == BED)
thermalManager.setTargetBed(clamp(value, 0, BED_MAXTEMP - 10)); thermalManager.setTargetBed(clamp(value, 0, BED_MAXTEMP - 10));
else else
#endif #endif
{
#if HOTENDS
static constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP);
const int16_t e = heater - H0;
thermalManager.setTargetHotend(clamp(value, 0, heater_maxtemp[e] - 15), e); thermalManager.setTargetHotend(clamp(value, 0, heater_maxtemp[e] - 15), e);
#endif
}
} }
void setTargetTemp_celsius(float value, const extruder_t extruder) { void setTargetTemp_celsius(float value, const extruder_t extruder) {
#if HOTENDS
constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP);
const int16_t e = extruder - E0; const int16_t e = extruder - E0;
enableHeater(extruder); enableHeater(extruder);
thermalManager.setTargetHotend(clamp(value, 0, heater_maxtemp[e] - 15), e); thermalManager.setTargetHotend(clamp(value, 0, heater_maxtemp[e] - 15), e);
#endif
} }
void setTargetFan_percent(const float value, const fan_t fan) { void setTargetFan_percent(const float value, const fan_t fan) {

View file

@ -30,7 +30,9 @@
extern int8_t encoderLine, encoderTopLine, screen_items; extern int8_t encoderLine, encoderTopLine, screen_items;
extern bool screen_changed; extern bool screen_changed;
#if HOTENDS
constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP);
#endif
void scroll_screen(const uint8_t limit, const bool is_menu); void scroll_screen(const uint8_t limit, const bool is_menu);
bool printer_busy(); bool printer_busy();

View file

@ -43,7 +43,7 @@
#include "../../module/temperature.h" #include "../../module/temperature.h"
#endif #endif
#ifdef FILAMENT_RUNOUT_DISTANCE_MM #if ENABLED(FILAMENT_RUNOUT_SENSOR) && FILAMENT_RUNOUT_DISTANCE_MM
#include "../../feature/runout.h" #include "../../feature/runout.h"
float lcd_runout_distance_mm; float lcd_runout_distance_mm;
#endif #endif
@ -178,7 +178,7 @@ void menu_backlash();
#if EXTRUDERS == 1 #if EXTRUDERS == 1
MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[0].unload_length, 0, extrude_maxlength); MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[0].unload_length, 0, extrude_maxlength);
#else // EXTRUDERS > 1 #elif EXTRUDERS > 1
#define EDIT_FIL_UNLOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E##N, &fc_settings[N-1].unload_length, 0, extrude_maxlength) #define EDIT_FIL_UNLOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E##N, &fc_settings[N-1].unload_length, 0, extrude_maxlength)
MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength);
EDIT_FIL_UNLOAD(1); EDIT_FIL_UNLOAD(1);
@ -199,7 +199,7 @@ void menu_backlash();
#if EXTRUDERS == 1 #if EXTRUDERS == 1
MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[0].load_length, 0, extrude_maxlength); MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[0].load_length, 0, extrude_maxlength);
#else // EXTRUDERS > 1 #elif EXTRUDERS > 1
#define EDIT_FIL_LOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E##N, &fc_settings[N-1].load_length, 0, extrude_maxlength) #define EDIT_FIL_LOAD(N) MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E##N, &fc_settings[N-1].load_length, 0, extrude_maxlength)
MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength);
EDIT_FIL_LOAD(1); EDIT_FIL_LOAD(1);
@ -219,7 +219,7 @@ void menu_backlash();
#endif // EXTRUDERS > 1 #endif // EXTRUDERS > 1
#endif #endif
#ifdef FILAMENT_RUNOUT_DISTANCE_MM #if ENABLED(FILAMENT_RUNOUT_SENSOR) && FILAMENT_RUNOUT_DISTANCE_MM
MENU_ITEM_EDIT_CALLBACK(float3, MSG_RUNOUT_DISTANCE_MM, &lcd_runout_distance_mm, 1, 30, []{ MENU_ITEM_EDIT_CALLBACK(float3, MSG_RUNOUT_DISTANCE_MM, &lcd_runout_distance_mm, 1, 30, []{
runout.set_runout_distance(lcd_runout_distance_mm); runout.set_runout_distance(lcd_runout_distance_mm);
}); });
@ -620,7 +620,7 @@ void menu_backlash();
#endif // !SLIM_LCD_MENUS #endif // !SLIM_LCD_MENUS
void menu_advanced_settings() { void menu_advanced_settings() {
#ifdef FILAMENT_RUNOUT_DISTANCE_MM #if ENABLED(FILAMENT_RUNOUT_SENSOR) && FILAMENT_RUNOUT_DISTANCE_MM
lcd_runout_distance_mm = runout.runout_distance(); lcd_runout_distance_mm = runout.runout_distance();
#endif #endif
START_MENU(); START_MENU();

View file

@ -158,6 +158,9 @@ static void _lcd_move_xyz(PGM_P name, AxisEnum axis) {
void lcd_move_x() { _lcd_move_xyz(PSTR(MSG_MOVE_X), X_AXIS); } void lcd_move_x() { _lcd_move_xyz(PSTR(MSG_MOVE_X), X_AXIS); }
void lcd_move_y() { _lcd_move_xyz(PSTR(MSG_MOVE_Y), Y_AXIS); } void lcd_move_y() { _lcd_move_xyz(PSTR(MSG_MOVE_Y), Y_AXIS); }
void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); }
#if E_MANUAL
static void _lcd_move_e( static void _lcd_move_e(
#if E_MANUAL > 1 #if E_MANUAL > 1
const int8_t eindex=-1 const int8_t eindex=-1
@ -233,6 +236,8 @@ inline void lcd_move_e() { _lcd_move_e(); }
#endif // E_MANUAL > 2 #endif // E_MANUAL > 2
#endif // E_MANUAL > 1 #endif // E_MANUAL > 1
#endif // E_MANUAL
// //
// "Motion" > "Move Xmm" > "Move XYZ" submenu // "Motion" > "Move Xmm" > "Move XYZ" submenu
// //
@ -295,6 +300,8 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int
void lcd_move_get_x_amount() { _menu_move_distance(X_AXIS, lcd_move_x); } void lcd_move_get_x_amount() { _menu_move_distance(X_AXIS, lcd_move_x); }
void lcd_move_get_y_amount() { _menu_move_distance(Y_AXIS, lcd_move_y); } void lcd_move_get_y_amount() { _menu_move_distance(Y_AXIS, lcd_move_y); }
void lcd_move_get_z_amount() { _menu_move_distance(Z_AXIS, lcd_move_z); } void lcd_move_get_z_amount() { _menu_move_distance(Z_AXIS, lcd_move_z); }
#if E_MANUAL
void lcd_move_get_e_amount() { _menu_move_distance(E_AXIS, lcd_move_e, -1); } void lcd_move_get_e_amount() { _menu_move_distance(E_AXIS, lcd_move_e, -1); }
#if E_MANUAL > 1 #if E_MANUAL > 1
void lcd_move_get_e0_amount() { _menu_move_distance(E_AXIS, lcd_move_e0, 0); } void lcd_move_get_e0_amount() { _menu_move_distance(E_AXIS, lcd_move_e0, 0); }
@ -312,6 +319,7 @@ void lcd_move_get_e_amount() { _menu_move_distance(E_AXIS, lcd_move_e, -1); }
#endif // E_MANUAL > 3 #endif // E_MANUAL > 3
#endif // E_MANUAL > 2 #endif // E_MANUAL > 2
#endif // E_MANUAL > 1 #endif // E_MANUAL > 1
#endif // E_MANUAL
#if ENABLED(DELTA) #if ENABLED(DELTA)
void lcd_lower_z_to_clip_height() { void lcd_lower_z_to_clip_height() {
@ -396,6 +404,8 @@ void menu_move() {
#endif #endif
#if E_MANUAL
#if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) #if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE)
// Only the current... // Only the current...
@ -430,6 +440,8 @@ void menu_move() {
#endif #endif
#endif // E_MANUAL
END_MENU(); END_MENU();
} }

View file

@ -48,7 +48,9 @@ uint8_t MarlinUI::preheat_fan_speed[2];
// //
void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb, const uint8_t fan) { void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb, const uint8_t fan) {
#if HOTENDS
if (temph > 0) thermalManager.setTargetHotend(_MIN(heater_maxtemp[endnum] - 15, temph), endnum); if (temph > 0) thermalManager.setTargetHotend(_MIN(heater_maxtemp[endnum] - 15, temph), endnum);
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
if (tempb >= 0) thermalManager.setTargetBed(tempb); if (tempb >= 0) thermalManager.setTargetBed(tempb);
#else #else
@ -165,12 +167,16 @@ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb
#if HAS_TEMP_HOTEND || HAS_HEATED_BED #if HAS_TEMP_HOTEND || HAS_HEATED_BED
#if HOTENDS
void lcd_preheat_m1_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); } void lcd_preheat_m1_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[0], -1, ui.preheat_fan_speed[0]); }
void lcd_preheat_m2_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); } void lcd_preheat_m2_e0_only() { _lcd_preheat(0, ui.preheat_hotend_temp[1], -1, ui.preheat_fan_speed[1]); }
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
#if HOTENDS
void lcd_preheat_m1_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } void lcd_preheat_m1_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[0], ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); }
void lcd_preheat_m2_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } void lcd_preheat_m2_e0() { _lcd_preheat(0, ui.preheat_hotend_temp[1], ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); }
#endif
void lcd_preheat_m1_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); } void lcd_preheat_m1_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[0], ui.preheat_fan_speed[0]); }
void lcd_preheat_m2_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); } void lcd_preheat_m2_bedonly() { _lcd_preheat(0, 0, ui.preheat_bed_temp[1], ui.preheat_fan_speed[1]); }
#endif #endif
@ -313,7 +319,7 @@ void menu_temperature() {
// //
#if HOTENDS == 1 #if HOTENDS == 1
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0);
#else // HOTENDS > 1 #elif HOTENDS > 1
#define EDIT_TARGET(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N) #define EDIT_TARGET(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N)
EDIT_TARGET(0); EDIT_TARGET(0);
EDIT_TARGET(1); EDIT_TARGET(1);

View file

@ -144,7 +144,7 @@ void menu_tune() {
// //
#if HOTENDS == 1 #if HOTENDS == 1
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - 15, thermalManager.start_watching_E0);
#else // HOTENDS > 1 #elif HOTENDS > 1
#define EDIT_NOZZLE(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N) #define EDIT_NOZZLE(N) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_LCD_N##N, &thermalManager.temp_hotend[N].target, 0, HEATER_##N##_MAXTEMP - 15, thermalManager.start_watching_E##N)
EDIT_NOZZLE(0); EDIT_NOZZLE(0);
EDIT_NOZZLE(1); EDIT_NOZZLE(1);

View file

@ -309,7 +309,9 @@ typedef struct SettingsDataStruct {
// //
// ADVANCED_PAUSE_FEATURE // ADVANCED_PAUSE_FEATURE
// //
#if EXTRUDERS
fil_change_settings_t fc_settings[EXTRUDERS]; // M603 T U L fil_change_settings_t fc_settings[EXTRUDERS]; // M603 T U L
#endif
// //
// Tool-change settings // Tool-change settings
@ -367,7 +369,7 @@ void MarlinSettings::postprocess() {
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)
planner.calculate_volumetric_multipliers(); planner.calculate_volumetric_multipliers();
#else #elif EXTRUDERS
for (uint8_t i = COUNT(planner.e_factor); i--;) for (uint8_t i = COUNT(planner.e_factor); i--;)
planner.refresh_e_factor(i); planner.refresh_e_factor(i);
#endif #endif
@ -759,7 +761,7 @@ void MarlinSettings::postprocess() {
{ {
_FIELD_TEST(ui_preheat_hotend_temp); _FIELD_TEST(ui_preheat_hotend_temp);
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
const int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp, const int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp,
(&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp; (&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp;
const uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed; const uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed;
@ -1164,6 +1166,7 @@ void MarlinSettings::postprocess() {
// //
// Advanced Pause filament load & unload lengths // Advanced Pause filament load & unload lengths
// //
#if EXTRUDERS
{ {
#if DISABLED(ADVANCED_PAUSE_FEATURE) #if DISABLED(ADVANCED_PAUSE_FEATURE)
const fil_change_settings_t fc_settings[EXTRUDERS] = { 0, 0 }; const fil_change_settings_t fc_settings[EXTRUDERS] = { 0, 0 };
@ -1171,6 +1174,7 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(fc_settings); _FIELD_TEST(fc_settings);
EEPROM_WRITE(fc_settings); EEPROM_WRITE(fc_settings);
} }
#endif
// //
// Multiple Extruders // Multiple Extruders
@ -1560,7 +1564,7 @@ void MarlinSettings::postprocess() {
{ {
_FIELD_TEST(ui_preheat_hotend_temp); _FIELD_TEST(ui_preheat_hotend_temp);
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp, int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp,
(&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp; (&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp;
uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed; uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed;
@ -1968,6 +1972,7 @@ void MarlinSettings::postprocess() {
// //
// Advanced Pause filament load & unload lengths // Advanced Pause filament load & unload lengths
// //
#if EXTRUDERS
{ {
#if DISABLED(ADVANCED_PAUSE_FEATURE) #if DISABLED(ADVANCED_PAUSE_FEATURE)
fil_change_settings_t fc_settings[EXTRUDERS]; fil_change_settings_t fc_settings[EXTRUDERS];
@ -1975,6 +1980,7 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(fc_settings); _FIELD_TEST(fc_settings);
EEPROM_READ(fc_settings); EEPROM_READ(fc_settings);
} }
#endif
// //
// Tool-change settings // Tool-change settings
@ -2410,7 +2416,7 @@ void MarlinSettings::reset() {
// Preheat parameters // Preheat parameters
// //
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
ui.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND; ui.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND;
ui.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND; ui.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND;
ui.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED; ui.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED;
@ -2956,7 +2962,7 @@ void MarlinSettings::reset() {
#endif // [XYZ]_DUAL_ENDSTOPS #endif // [XYZ]_DUAL_ENDSTOPS
#if HAS_LCD_MENU #if HOTENDS && HAS_LCD_MENU
CONFIG_ECHO_HEADING("Material heatup parameters:"); CONFIG_ECHO_HEADING("Material heatup parameters:");
for (uint8_t i = 0; i < COUNT(ui.preheat_hotend_temp); i++) { for (uint8_t i = 0; i < COUNT(ui.preheat_hotend_temp); i++) {

View file

@ -124,8 +124,10 @@ XYZ_DEFS(signed char, home_dir, HOME_DIR);
#if HAS_HOTEND_OFFSET #if HAS_HOTEND_OFFSET
extern float hotend_offset[XYZ][HOTENDS]; extern float hotend_offset[XYZ][HOTENDS];
void reset_hotend_offsets(); void reset_hotend_offsets();
#else #elif HOTENDS > 0
constexpr float hotend_offset[XYZ][HOTENDS] = { { 0 }, { 0 }, { 0 } }; constexpr float hotend_offset[XYZ][HOTENDS] = { { 0 }, { 0 }, { 0 } };
#else
constexpr float hotend_offset[XYZ][1] = { { 0 }, { 0 }, { 0 } };
#endif #endif
typedef struct { float min, max; } axis_limits_t; typedef struct { float min, max; } axis_limits_t;

View file

@ -147,9 +147,10 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step
uint8_t Planner::last_extruder = 0; // Respond to extruder change uint8_t Planner::last_extruder = 0; // Respond to extruder change
#endif #endif
#if EXTRUDERS
int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder
float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow percentage and volumetric multiplier combine to scale E movement float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow percentage and volumetric multiplier combine to scale E movement
#endif
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)
float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
@ -1632,7 +1633,11 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
db = target[B_AXIS] - position[B_AXIS], db = target[B_AXIS] - position[B_AXIS],
dc = target[C_AXIS] - position[C_AXIS]; dc = target[C_AXIS] - position[C_AXIS];
#if EXTRUDERS
int32_t de = target[E_AXIS] - position[E_AXIS]; int32_t de = target[E_AXIS] - position[E_AXIS];
#else
constexpr int32_t de = 0;
#endif
/* <-- add a slash to enable /* <-- add a slash to enable
SERIAL_ECHOPAIR(" _populate_block FR:", fr_mm_s); SERIAL_ECHOPAIR(" _populate_block FR:", fr_mm_s);
@ -1642,8 +1647,10 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
SERIAL_ECHOPAIR(" (", db); SERIAL_ECHOPAIR(" (", db);
SERIAL_ECHOPAIR(" steps) C:", target[C_AXIS]); SERIAL_ECHOPAIR(" steps) C:", target[C_AXIS]);
SERIAL_ECHOPAIR(" (", dc); SERIAL_ECHOPAIR(" (", dc);
#if EXTRUDERS
SERIAL_ECHOPAIR(" steps) E:", target[E_AXIS]); SERIAL_ECHOPAIR(" steps) E:", target[E_AXIS]);
SERIAL_ECHOPAIR(" (", de); SERIAL_ECHOPAIR(" (", de);
#endif
SERIAL_ECHOLNPGM(" steps)"); SERIAL_ECHOLNPGM(" steps)");
//*/ //*/
@ -1712,8 +1719,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#endif #endif
if (de < 0) SBI(dm, E_AXIS); if (de < 0) SBI(dm, E_AXIS);
#if EXTRUDERS
const float esteps_float = de * e_factor[extruder]; const float esteps_float = de * e_factor[extruder];
const uint32_t esteps = ABS(esteps_float) + 0.5f; const uint32_t esteps = ABS(esteps_float) + 0.5f;
#else
constexpr uint32_t esteps = 0;
#endif
// Clear all flags, including the "busy" bit // Clear all flags, including the "busy" bit
block->flag = 0x00; block->flag = 0x00;
@ -1781,10 +1792,17 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
delta_mm[B_AXIS] = db * steps_to_mm[B_AXIS]; delta_mm[B_AXIS] = db * steps_to_mm[B_AXIS];
delta_mm[C_AXIS] = dc * steps_to_mm[C_AXIS]; delta_mm[C_AXIS] = dc * steps_to_mm[C_AXIS];
#endif #endif
#if EXTRUDERS
delta_mm[E_AXIS] = esteps_float * steps_to_mm[E_AXIS_N(extruder)]; delta_mm[E_AXIS] = esteps_float * steps_to_mm[E_AXIS_N(extruder)];
#endif
if (block->steps[A_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[B_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[C_AXIS] < MIN_STEPS_PER_SEGMENT) { if (block->steps[A_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[B_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[C_AXIS] < MIN_STEPS_PER_SEGMENT) {
block->millimeters = ABS(delta_mm[E_AXIS]); block->millimeters = (0
#if EXTRUDERS
+ ABS(delta_mm[E_AXIS])
#endif
);
} }
else { else {
if (millimeters) if (millimeters)
@ -1816,7 +1834,10 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#endif #endif
} }
#if EXTRUDERS
block->steps[E_AXIS] = esteps; block->steps[E_AXIS] = esteps;
#endif
block->step_event_count = _MAX(block->steps[A_AXIS], block->steps[B_AXIS], block->steps[C_AXIS], esteps); block->step_event_count = _MAX(block->steps[A_AXIS], block->steps[B_AXIS], block->steps[C_AXIS], esteps);
// Bail if this is a zero-length block // Bail if this is a zero-length block
@ -1874,6 +1895,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#endif #endif
// Enable extruder(s) // Enable extruder(s)
#if EXTRUDERS
if (esteps) { if (esteps) {
#if ENABLED(AUTO_POWER_CONTROL) #if ENABLED(AUTO_POWER_CONTROL)
powerManager.power_on(); powerManager.power_on();
@ -1997,6 +2019,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
enable_E5(); enable_E5();
#endif #endif
} }
#endif // EXTRUDERS
if (esteps) if (esteps)
NOLESS(fr_mm_s, settings.min_feedrate_mm_s); NOLESS(fr_mm_s, settings.min_feedrate_mm_s);

View file

@ -226,9 +226,10 @@ class Planner {
static uint8_t last_extruder; // Respond to extruder change static uint8_t last_extruder; // Respond to extruder change
#endif #endif
#if EXTRUDERS
static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder
static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement
#endif
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)
static float filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder static float filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
@ -357,6 +358,7 @@ class Planner {
static void reset_acceleration_rates(); static void reset_acceleration_rates();
static void refresh_positioning(); static void refresh_positioning();
#if EXTRUDERS
FORCE_INLINE static void refresh_e_factor(const uint8_t e) { FORCE_INLINE static void refresh_e_factor(const uint8_t e) {
e_factor[e] = (flow_percentage[e] * 0.01f e_factor[e] = (flow_percentage[e] * 0.01f
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)
@ -364,6 +366,7 @@ class Planner {
#endif #endif
); );
} }
#endif
// Manage fans, paste pressure, etc. // Manage fans, paste pressure, etc.
static void check_axes_activity(); static void check_axes_activity();

View file

@ -112,11 +112,9 @@ Temperature thermalManager;
bool Temperature::adaptive_fan_slowing = true; bool Temperature::adaptive_fan_slowing = true;
#endif #endif
hotend_info_t Temperature::temp_hotend[HOTENDS #if HOTENDS
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 }
+ 1
#endif #endif
]; // = { 0 }
#if ENABLED(AUTO_POWER_E_FANS) #if ENABLED(AUTO_POWER_E_FANS)
uint8_t Temperature::autofan_speed[HOTENDS]; // = { 0 } uint8_t Temperature::autofan_speed[HOTENDS]; // = { 0 }
@ -283,6 +281,7 @@ volatile bool Temperature::temp_meas_ready = false;
#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) < (HEATER_##N##_RAW_HI_TEMP) ? 1 : -1) #define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) < (HEATER_##N##_RAW_HI_TEMP) ? 1 : -1)
#if HOTENDS
// Init mintemp and maxtemp with extreme values to prevent false errors during startup // Init mintemp and maxtemp with extreme values to prevent false errors during startup
constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_TEMP, 0, 16383 }, constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_TEMP, 0, 16383 },
sensor_heater_1 { HEATER_1_RAW_LO_TEMP, HEATER_1_RAW_HI_TEMP, 0, 16383 }, sensor_heater_1 { HEATER_1_RAW_LO_TEMP, HEATER_1_RAW_HI_TEMP, 0, 16383 },
@ -292,6 +291,7 @@ constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_T
sensor_heater_5 { HEATER_5_RAW_LO_TEMP, HEATER_5_RAW_HI_TEMP, 0, 16383 }; sensor_heater_5 { HEATER_5_RAW_LO_TEMP, HEATER_5_RAW_HI_TEMP, 0, 16383 };
temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5); temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5);
#endif
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED
uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 };
@ -627,17 +627,20 @@ temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0
* Class and Instance Methods * Class and Instance Methods
*/ */
Temperature::Temperature() { }
int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) { int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) {
switch (heater_id) { switch (heater_id) {
default: return temp_hotend[heater_id].soft_pwm_amount;
#if HAS_HEATED_BED #if HAS_HEATED_BED
case H_BED: return temp_bed.soft_pwm_amount; case H_BED: return temp_bed.soft_pwm_amount;
#endif #endif
#if HAS_HEATED_CHAMBER #if HAS_HEATED_CHAMBER
case H_CHAMBER: return temp_chamber.soft_pwm_amount; case H_CHAMBER: return temp_chamber.soft_pwm_amount;
#endif #endif
default:
#if HOTENDS
return temp_hotend[heater_id].soft_pwm_amount;
#else
return 0;
#endif
} }
} }
@ -816,6 +819,8 @@ void Temperature::min_temp_error(const heater_ind_t heater) {
_temp_error(heater, PSTR(MSG_T_MINTEMP), TEMP_ERR_PSTR(MSG_ERR_MINTEMP, heater)); _temp_error(heater, PSTR(MSG_T_MINTEMP), TEMP_ERR_PSTR(MSG_ERR_MINTEMP, heater));
} }
#if HOTENDS
float Temperature::get_pid_output_hotend(const uint8_t e) { float Temperature::get_pid_output_hotend(const uint8_t e) {
#if HOTENDS == 1 #if HOTENDS == 1
#define _HOTEND_TEST true #define _HOTEND_TEST true
@ -925,6 +930,8 @@ float Temperature::get_pid_output_hotend(const uint8_t e) {
return pid_output; return pid_output;
} }
#endif // HOTENDS
#if ENABLED(PIDTEMPBED) #if ENABLED(PIDTEMPBED)
float Temperature::get_pid_output_bed() { float Temperature::get_pid_output_bed() {
@ -1025,9 +1032,9 @@ void Temperature::manage_heater() {
if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1);
#endif #endif
#if HAS_THERMAL_PROTECTION || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER
millis_t ms = millis(); millis_t ms = millis();
#endif
#if HOTENDS
HOTEND_LOOP() { HOTEND_LOOP() {
#if ENABLED(THERMAL_PROTECTION_HOTENDS) #if ENABLED(THERMAL_PROTECTION_HOTENDS)
@ -1064,6 +1071,8 @@ void Temperature::manage_heater() {
} // HOTEND_LOOP } // HOTEND_LOOP
#endif // HOTENDS
#if HAS_AUTO_FAN #if HAS_AUTO_FAN
if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently
checkExtruderAutoFans(); checkExtruderAutoFans();
@ -1206,6 +1215,8 @@ void Temperature::manage_heater() {
//temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; //temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0;
#endif // HAS_HEATED_CHAMBER #endif // HAS_HEATED_CHAMBER
UNUSED(ms);
} }
#define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) #define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET)
@ -1358,6 +1369,7 @@ void Temperature::manage_heater() {
} }
#endif #endif
#if HOTENDS
// Derived from RepRap FiveD extruder::getTemperature() // Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement. // For hot end temperature measurement.
float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) {
@ -1450,6 +1462,7 @@ float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) {
return 0; return 0;
} }
#endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
// Derived from RepRap FiveD extruder::getTemperature() // Derived from RepRap FiveD extruder::getTemperature()
@ -1500,7 +1513,9 @@ void Temperature::updateTemperaturesFromRawValues() {
#if ENABLED(HEATER_1_USES_MAX6675) #if ENABLED(HEATER_1_USES_MAX6675)
temp_hotend[1].raw = READ_MAX6675(1); temp_hotend[1].raw = READ_MAX6675(1);
#endif #endif
#if HOTENDS
HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e);
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw); temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw);
#endif #endif
@ -1802,7 +1817,7 @@ void Temperature::init() {
#endif // HOTENDS > 2 #endif // HOTENDS > 2
#endif // HOTENDS > 1 #endif // HOTENDS > 1
#endif // HOTENDS > 1 #endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
#ifdef BED_MINTEMP #ifdef BED_MINTEMP
@ -1976,7 +1991,9 @@ void Temperature::disable_all_heaters() {
planner.autotemp_enabled = false; planner.autotemp_enabled = false;
#endif #endif
#if HOTENDS
HOTEND_LOOP() setTargetHotend(0, e); HOTEND_LOOP() setTargetHotend(0, e);
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
setTargetBed(0); setTargetBed(0);
@ -2238,10 +2255,12 @@ void Temperature::readings_ready() {
current_raw_filwidth = raw_filwidth_value >> 10; // Divide to get to 0-16384 range since we used 1/128 IIR filter approach current_raw_filwidth = raw_filwidth_value >> 10; // Divide to get to 0-16384 range since we used 1/128 IIR filter approach
#endif #endif
#if HOTENDS
HOTEND_LOOP() temp_hotend[e].reset(); HOTEND_LOOP() temp_hotend[e].reset();
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
temp_hotend[1].reset(); temp_hotend[1].reset();
#endif #endif
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
temp_bed.reset(); temp_bed.reset();
@ -2261,6 +2280,8 @@ void Temperature::readings_ready() {
joystick.z.reset(); joystick.z.reset();
#endif #endif
#if HOTENDS
static constexpr int8_t temp_dir[] = { static constexpr int8_t temp_dir[] = {
#if ENABLED(HEATER_0_USES_MAX6675) #if ENABLED(HEATER_0_USES_MAX6675)
0 0
@ -2311,6 +2332,8 @@ void Temperature::readings_ready() {
} }
} }
#endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
#if TEMPDIR(BED) < 0 #if TEMPDIR(BED) < 0
#define BEDCMP(A,B) ((A)<=(B)) #define BEDCMP(A,B) ((A)<=(B))
@ -2399,11 +2422,9 @@ void Temperature::isr() {
static bool ADCKey_pressed = false; static bool ADCKey_pressed = false;
#endif #endif
#if ENABLED(SLOW_PWM_HEATERS) #if HOTENDS
static uint8_t slow_pwm_count = 0;
#endif
static SoftPWM soft_pwm_hotend[HOTENDS]; static SoftPWM soft_pwm_hotend[HOTENDS];
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
static SoftPWM soft_pwm_bed; static SoftPWM soft_pwm_bed;
@ -2414,6 +2435,8 @@ void Temperature::isr() {
#endif #endif
#if DISABLED(SLOW_PWM_HEATERS) #if DISABLED(SLOW_PWM_HEATERS)
#if HOTENDS || HAS_HEATED_BED || HAS_HEATED_CHAMBER
constexpr uint8_t pwm_mask = constexpr uint8_t pwm_mask =
#if ENABLED(SOFT_PWM_DITHER) #if ENABLED(SOFT_PWM_DITHER)
_BV(SOFT_PWM_SCALE) - 1 _BV(SOFT_PWM_SCALE) - 1
@ -2421,16 +2444,19 @@ void Temperature::isr() {
0 0
#endif #endif
; ;
#define _PWM_MOD(N,S,T) do{ \
const bool on = S.add(pwm_mask, T.soft_pwm_amount); \
WRITE_HEATER_##N(on); \
}while(0)
#endif
/** /**
* Standard heater PWM modulation * Standard heater PWM modulation
*/ */
if (pwm_count_tmp >= 127) { if (pwm_count_tmp >= 127) {
pwm_count_tmp -= 127; pwm_count_tmp -= 127;
#define _PWM_MOD(N,S,T) do{ \
const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ #if HOTENDS
WRITE_HEATER_##N(on); \
}while(0)
#define _PWM_MOD_E(N) _PWM_MOD(N,soft_pwm_hotend[N],temp_hotend[N]) #define _PWM_MOD_E(N) _PWM_MOD(N,soft_pwm_hotend[N],temp_hotend[N])
_PWM_MOD_E(0); _PWM_MOD_E(0);
#if HOTENDS > 1 #if HOTENDS > 1
@ -2448,6 +2474,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3 #endif // HOTENDS > 3
#endif // HOTENDS > 2 #endif // HOTENDS > 2
#endif // HOTENDS > 1 #endif // HOTENDS > 1
#endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
_PWM_MOD(BED,soft_pwm_bed,temp_bed); _PWM_MOD(BED,soft_pwm_bed,temp_bed);
@ -2538,6 +2565,8 @@ void Temperature::isr() {
#define _SLOW_PWM(NR,PWM,SRC) do{ PWM.count = SRC.soft_pwm_amount; _SLOW_SET(NR,PWM,(PWM.count > 0)); }while(0) #define _SLOW_PWM(NR,PWM,SRC) do{ PWM.count = SRC.soft_pwm_amount; _SLOW_SET(NR,PWM,(PWM.count > 0)); }while(0)
#define _PWM_OFF(NR,PWM) do{ if (PWM.count < slow_pwm_count) _SLOW_SET(NR,PWM,0); }while(0) #define _PWM_OFF(NR,PWM) do{ if (PWM.count < slow_pwm_count) _SLOW_SET(NR,PWM,0); }while(0)
static uint8_t slow_pwm_count = 0;
if (slow_pwm_count == 0) { if (slow_pwm_count == 0) {
#if HOTENDS #if HOTENDS
@ -2634,6 +2663,7 @@ void Temperature::isr() {
slow_pwm_count++; slow_pwm_count++;
slow_pwm_count &= 0x7F; slow_pwm_count &= 0x7F;
#if HOTENDS
soft_pwm_hotend[0].dec(); soft_pwm_hotend[0].dec();
#if HOTENDS > 1 #if HOTENDS > 1
soft_pwm_hotend[1].dec(); soft_pwm_hotend[1].dec();
@ -2650,6 +2680,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3 #endif // HOTENDS > 3
#endif // HOTENDS > 2 #endif // HOTENDS > 2
#endif // HOTENDS > 1 #endif // HOTENDS > 1
#endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
soft_pwm_bed.dec(); soft_pwm_bed.dec();
#endif #endif
@ -2940,7 +2971,7 @@ void Temperature::isr() {
#endif // AUTO_REPORT_TEMPERATURES #endif // AUTO_REPORT_TEMPERATURES
#if HAS_DISPLAY #if HOTENDS && HAS_DISPLAY
void Temperature::set_heating_message(const uint8_t e) { void Temperature::set_heating_message(const uint8_t e) {
const bool heating = isHeatingHotend(e); const bool heating = isHeatingHotend(e);
#if HOTENDS > 1 #if HOTENDS > 1

View file

@ -270,11 +270,14 @@ class Temperature {
static volatile bool in_temp_isr; static volatile bool in_temp_isr;
static hotend_info_t temp_hotend[HOTENDS #if HOTENDS
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
+ 1 #define HOTEND_TEMPS (HOTENDS + 1)
#else
#define HOTEND_TEMPS HOTENDS
#endif
static hotend_info_t temp_hotend[HOTEND_TEMPS];
#endif #endif
];
#if HAS_HEATED_BED #if HAS_HEATED_BED
static bed_info_t temp_bed; static bed_info_t temp_bed;
@ -349,7 +352,9 @@ class Temperature {
static lpq_ptr_t lpq_ptr; static lpq_ptr_t lpq_ptr;
#endif #endif
#if HOTENDS
static temp_range_t temp_range[HOTENDS]; static temp_range_t temp_range[HOTENDS];
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
#if WATCH_BED #if WATCH_BED
@ -417,8 +422,6 @@ class Temperature {
* Instance Methods * Instance Methods
*/ */
Temperature();
void init(); void init();
/** /**
@ -456,7 +459,9 @@ class Temperature {
} }
#endif #endif
#if HOTENDS
static float analog_to_celsius_hotend(const int raw, const uint8_t e); static float analog_to_celsius_hotend(const int raw, const uint8_t e);
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
static float analog_to_celsius_bed(const int raw); static float analog_to_celsius_bed(const int raw);
@ -577,19 +582,31 @@ class Temperature {
FORCE_INLINE static float degHotend(const uint8_t e) { FORCE_INLINE static float degHotend(const uint8_t e) {
E_UNUSED(); E_UNUSED();
#if HOTENDS
return temp_hotend[HOTEND_INDEX].celsius; return temp_hotend[HOTEND_INDEX].celsius;
#else
return 0;
#endif
} }
#if ENABLED(SHOW_TEMP_ADC_VALUES) #if ENABLED(SHOW_TEMP_ADC_VALUES)
FORCE_INLINE static int16_t rawHotendTemp(const uint8_t e) { FORCE_INLINE static int16_t rawHotendTemp(const uint8_t e) {
E_UNUSED(); E_UNUSED();
#if HOTENDS
return temp_hotend[HOTEND_INDEX].raw; return temp_hotend[HOTEND_INDEX].raw;
#else
return 0;
#endif
} }
#endif #endif
FORCE_INLINE static int16_t degTargetHotend(const uint8_t e) { FORCE_INLINE static int16_t degTargetHotend(const uint8_t e) {
E_UNUSED(); E_UNUSED();
#if HOTENDS
return temp_hotend[HOTEND_INDEX].target; return temp_hotend[HOTEND_INDEX].target;
#else
return 0;
#endif
} }
#if WATCH_HOTENDS #if WATCH_HOTENDS
@ -598,6 +615,8 @@ class Temperature {
static inline void start_watching_hotend(const uint8_t e=0) { UNUSED(e); } static inline void start_watching_hotend(const uint8_t e=0) { UNUSED(e); }
#endif #endif
#if HOTENDS
#if HAS_LCD_MENU #if HAS_LCD_MENU
static inline void start_watching_E0() { start_watching_hotend(0); } static inline void start_watching_E0() { start_watching_hotend(0); }
static inline void start_watching_E1() { start_watching_hotend(1); } static inline void start_watching_E1() { start_watching_hotend(1); }
@ -645,6 +664,8 @@ class Temperature {
return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS;
} }
#endif // HOTENDS
#if HAS_HEATED_BED #if HAS_HEATED_BED
#if ENABLED(SHOW_TEMP_ADC_VALUES) #if ENABLED(SHOW_TEMP_ADC_VALUES)

View file

@ -695,11 +695,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
#endif // ELECTROMAGNETIC_SWITCHING_TOOLHEAD #endif // ELECTROMAGNETIC_SWITCHING_TOOLHEAD
#if EXTRUDERS
inline void invalid_extruder_error(const uint8_t e) { inline void invalid_extruder_error(const uint8_t e) {
SERIAL_ECHO_START(); SERIAL_ECHO_START();
SERIAL_CHAR('T'); SERIAL_ECHO(int(e)); SERIAL_CHAR('T'); SERIAL_ECHO(int(e));
SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(MSG_INVALID_EXTRUDER); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(MSG_INVALID_EXTRUDER);
} }
#endif
#if ENABLED(DUAL_X_CARRIAGE) #if ENABLED(DUAL_X_CARRIAGE)
@ -788,6 +790,11 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
mmu2.tool_change(new_tool); mmu2.tool_change(new_tool);
#elif EXTRUDERS == 0
// Nothing to do
UNUSED(new_tool); UNUSED(no_move);
#elif EXTRUDERS < 2 #elif EXTRUDERS < 2
UNUSED(no_move); UNUSED(no_move);