diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 8dbc0d840..2a261db2a 100755
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -8570,7 +8570,7 @@ Sigma_Exit:
break;
/*!
- ### M999 - Restart after being stopped M999: Restart after being stopped by error
+ ### M999 - Restart after being stopped M999: Restart after being stopped by error
@todo Usually doesn't work. Should be fixed or removed. Most of the time, if `Stopped` it set, the print fails and is unrecoverable.
*/
case 999:
diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h
index 89d7e7f99..ee7fa39ef 100644
--- a/Firmware/eeprom.h
+++ b/Firmware/eeprom.h
@@ -359,6 +359,8 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
| ^ | ^ | ^ | 00h 0 | ^ | LCD backlight mode: __Dim__ | ^ | ^
| 0x0D30 3376 | uint16 | EEPROM_BACKLIGHT_TIMEOUT | 01 00 - ff ff | 0a 00h 65535 | LCD backlight timeout: __10__ seconds | LCD menu | D3 Ax0d30 C2
| 0x0D2C 3372 | float | EEPROM_UVLO_LA_K | ??? | ff ff ff ffh | Power panic saved Linear Advanced K value | ??? | D3 Ax0d2c C4
+| 0x0D2B 3371 | uint8 | EEPROM_ALTFAN_OVERRIDE | 0-1 | 00h | ALTFAN override | LCD menu | D3 Ax0d2b C1
+| 0x0D2A 3370 | uint8 | EEPROM_EXPERIMENTAL_VISIBILITY | 0-1 | 00h | Experimental menu visibility | LCD menu | D3 Ax0d2a C1
| Address begin | Bit/Type | Name | Valid values | Default/FactoryReset | Description | Gcode/Function| Debug code
@@ -561,8 +563,11 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
#define EEPROM_UVLO_LA_K (EEPROM_BACKLIGHT_TIMEOUT-4) // float
+#define EEPROM_ALTFAN_OVERRIDE (EEPROM_UVLO_LA_K-1) //uint8
+#define EEPROM_EXPERIMENTAL_VISIBILITY (EEPROM_ALTFAN_OVERRIDE-1) //uint8
+
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
-#define EEPROM_LAST_ITEM EEPROM_UVLO_LA_K
+#define EEPROM_LAST_ITEM EEPROM_EXPERIMENTAL_VISIBILITY
// !!!!!
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
// !!!!!
diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp
index 2d09f8e0f..5ad3f9bb9 100755
--- a/Firmware/temperature.cpp
+++ b/Firmware/temperature.cpp
@@ -152,7 +152,11 @@ uint8_t fanSpeedBckp = 255;
bool fan_measuring = false;
uint8_t fanState = 0;
#ifdef EXTRUDER_ALTFAN_DETECT
- bool extruderFanIsAltfan = false; //set to Noctua
+ struct
+ {
+ uint8_t isAltfan : 1;
+ uint8_t altfanOverride : 1;
+ } altfanStatus;
#endif //EXTRUDER_ALTFAN_DETECT
#endif
@@ -230,6 +234,15 @@ bool extruder_altfan_detect()
setExtruderAutoFanState(3);
SET_INPUT(TACH_0);
+
+ uint8_t overrideVal = eeprom_read_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE);
+ if (overrideVal == EEPROM_EMPTY_VALUE)
+ {
+ overrideVal = 0;
+ eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, overrideVal);
+ }
+ altfanStatus.altfanOverride = overrideVal;
+
CRITICAL_SECTION_START;
EICRB &= ~(1 << ISC61);
EICRB |= (1 << ISC60);
@@ -243,10 +256,22 @@ bool extruder_altfan_detect()
EIMSK &= ~(1 << INT6);
countFanSpeed();
- extruderFanIsAltfan = fan_speed[0] > 100;
+ altfanStatus.isAltfan = fan_speed[0] > 100;
setExtruderAutoFanState(1);
- return extruderFanIsAltfan;
+ return altfanStatus.isAltfan;
}
+
+void altfanOverride_toggle()
+{
+ altfanStatus.altfanOverride = !altfanStatus.altfanOverride;
+ eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanStatus.altfanOverride);
+}
+
+bool altfanOverride_get()
+{
+ return altfanStatus.altfanOverride;
+}
+
#endif //EXTRUDER_ALTFAN_DETECT
// return "false", if all extruder-heaters are 'off' (ie. "true", if any heater is 'on')
@@ -500,7 +525,7 @@ void setExtruderAutoFanState(uint8_t state)
if (fanState & 0x01)
{
#ifdef EXTRUDER_ALTFAN_DETECT
- if (extruderFanIsAltfan) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT;
+ if (altfanStatus.isAltfan && !altfanStatus.altfanOverride) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT;
else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
#else //EXTRUDER_ALTFAN_DETECT
newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
@@ -1380,7 +1405,7 @@ void temp_runaway_stop(bool isPreheat, bool isBed)
SERIAL_ERROR_START;
isBed ? SERIAL_ERRORLNPGM(" THERMAL RUNAWAY ( PREHEAT HEATBED)") : SERIAL_ERRORLNPGM(" THERMAL RUNAWAY ( PREHEAT HOTEND)");
#ifdef EXTRUDER_ALTFAN_DETECT
- extruderFanIsAltfan = false; //full speed
+ altfanStatus.altfanOverride = 1; //full speed
#endif //EXTRUDER_ALTFAN_DETECT
setExtruderAutoFanState(3);
SET_OUTPUT(FAN_PIN);
@@ -1497,7 +1522,7 @@ void max_temp_error(uint8_t e) {
WRITE(FAN_PIN, 1);
WRITE(BEEPER, 1);
#ifdef EXTRUDER_ALTFAN_DETECT
- extruderFanIsAltfan = false; //full speed
+ altfanStatus.altfanOverride = 1; //full speed
#endif //EXTRUDER_ALTFAN_DETECT
setExtruderAutoFanState(3);
// fanSpeed will consumed by the check_axes_activity() routine.
diff --git a/Firmware/temperature.h b/Firmware/temperature.h
index 32ff6961a..da88a53c0 100755
--- a/Firmware/temperature.h
+++ b/Firmware/temperature.h
@@ -273,6 +273,8 @@ void check_max_temp();
#ifdef EXTRUDER_ALTFAN_DETECT
extern bool extruder_altfan_detect();
+ extern void altfanOverride_toggle();
+ extern bool altfanOverride_get();
#endif //EXTRUDER_ALTFAN_DETECT
extern unsigned long extruder_autofan_last_check;
diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp
index a08f8a365..b6efc39c8 100755
--- a/Firmware/ultralcd.cpp
+++ b/Firmware/ultralcd.cpp
@@ -2096,6 +2096,9 @@ static void lcd_preheat_menu()
//! @code{.unparsed}
//! | Voltages | MSG_MENU_VOLTAGES
//! @endcode
+//!
+//!
+//! | Experimental | c=18 r=1
//!
//!
//! If DEBUG_BUILD is defined
@@ -2108,11 +2111,12 @@ static void lcd_preheat_menu()
static void lcd_support_menu()
{
typedef struct
- { // 22bytes total
+ { // 23bytes total
int8_t status; // 1byte
bool is_flash_air; // 1byte
uint8_t ip[4]; // 4bytes
char ip_str[3*4+3+1]; // 16bytes
+ uint8_t experimental_menu_visibility; // 1byte
} _menu_data_t;
static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
@@ -2126,6 +2130,14 @@ static void lcd_support_menu()
sprintf_P(_md->ip_str, PSTR("%d.%d.%d.%d"),
_md->ip[0], _md->ip[1],
_md->ip[2], _md->ip[3]);
+
+ _md->experimental_menu_visibility = eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY);
+ if (_md->experimental_menu_visibility == EEPROM_EMPTY_VALUE)
+ {
+ _md->experimental_menu_visibility = 0;
+ eeprom_update_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, _md->experimental_menu_visibility);
+ }
+
} else if (_md->is_flash_air &&
_md->ip[0] == 0 && _md->ip[1] == 0 &&
_md->ip[2] == 0 && _md->ip[3] == 0 &&
@@ -2210,6 +2222,12 @@ static void lcd_support_menu()
MENU_ITEM_SUBMENU_P(_i("Voltages"), lcd_menu_voltages);////MSG_MENU_VOLTAGES c=18 r=1
#endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
+ if (_md->experimental_menu_visibility)
+ {
+ MENU_ITEM_SUBMENU_P(PSTR("Experimental"), lcd_experimental_menu);
+ }
+
+
#ifdef DEBUG_BUILD
MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////c=18 r=1
#endif /* DEBUG_BUILD */
@@ -9015,6 +9033,13 @@ void menu_lcd_longpress_func(void)
lcd_quick_feedback();
return;
}
+ if (menu_menu == lcd_hw_setup_menu)
+ {
+ // only toggle the experimental menu visibility flag
+ lcd_quick_feedback();
+ lcd_experimental_toggle();
+ return;
+ }
// explicitely listed menus which are allowed to rise the move-z or live-adj-z functions
// The lists are not the same for both functions, so first decide which function is to be performed
@@ -9178,3 +9203,25 @@ void lcd_crash_detect_disable()
eeprom_update_byte((uint8_t*)EEPROM_CRASH_DET, 0x00);
}
#endif
+
+void lcd_experimental_toggle()
+{
+ uint8_t oldVal = eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY);
+ if (oldVal == EEPROM_EMPTY_VALUE)
+ oldVal = 0;
+ else
+ oldVal = !oldVal;
+ eeprom_update_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, oldVal);
+}
+
+void lcd_experimental_menu()
+{
+ MENU_BEGIN();
+ MENU_ITEM_BACK_P(_T(MSG_BACK));
+
+#ifdef EXTRUDER_ALTFAN_DETECT
+ MENU_ITEM_TOGGLE_P(_N("ALTFAN det."), altfanOverride_get()?_T(MSG_OFF):_T(MSG_ON), altfanOverride_toggle);
+#endif //EXTRUDER_ALTFAN_DETECT
+
+ MENU_END();
+}
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index a5f07673f..7c3613328 100755
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -259,4 +259,7 @@ enum class WizState : uint8_t
void lcd_wizard(WizState state);
+extern void lcd_experimental_toggle();
+extern void lcd_experimental_menu();
+
#endif //ULTRALCD_H