From a95feb56d9cc9bccc185d989272c2c6e258fc553 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Mon, 20 Jul 2020 19:35:25 +0300 Subject: [PATCH 1/5] ALTFAN override --- Firmware/Marlin_main.cpp | 10 +++++++++- Firmware/eeprom.h | 4 +++- Firmware/temperature.cpp | 27 ++++++++++++++++++++++++--- Firmware/temperature.h | 2 ++ Firmware/ultralcd.cpp | 12 ++++++++++++ Firmware/ultralcd.h | 2 ++ 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8dbc0d840..f3528ca9e 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8570,7 +8570,15 @@ Sigma_Exit: break; /*! - ### M999 - Restart after being stopped M999: Restart after being stopped by error + ### M666 - Enter experimental menu + Only used by Prusa + */ + case 666: + menu_submenu(lcd_experimental_menu); + break; + + /*! + ### 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..bfc81d82d 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -561,8 +561,10 @@ 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 + //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_ALTFAN_OVERRIDE // !!!!! // !!!!! 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 6e9b6985a..084ed2720 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -153,6 +153,7 @@ uint8_t fanSpeedBckp = 255; uint8_t fanState = 0; #ifdef EXTRUDER_ALTFAN_DETECT bool extruderFanIsAltfan = false; //set to Noctua + uint8_t altfanOverride = 0; #endif //EXTRUDER_ALTFAN_DETECT #endif @@ -224,6 +225,14 @@ bool extruder_altfan_detect() setExtruderAutoFanState(3); SET_INPUT(TACH_0); + + altfanOverride = eeprom_read_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE); + if (altfanOverride == EEPROM_EMPTY_VALUE) + { + altfanOverride = 0; + eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanOverride); + } + CRITICAL_SECTION_START; EICRB &= ~(1 << ISC61); EICRB |= (1 << ISC60); @@ -241,6 +250,18 @@ bool extruder_altfan_detect() setExtruderAutoFanState(1); return extruderFanIsAltfan; } + +void altfanOverride_toggle() +{ + altfanOverride = !altfanOverride; + eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanOverride); +} + +bool altfanOverride_get() +{ + return altfanOverride; +} + #endif //EXTRUDER_ALTFAN_DETECT // return "false", if all extruder-heaters are 'off' (ie. "true", if any heater is 'on') @@ -494,7 +515,7 @@ void setExtruderAutoFanState(uint8_t state) if (fanState & 0x01) { #ifdef EXTRUDER_ALTFAN_DETECT - if (extruderFanIsAltfan) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT; + if (extruderFanIsAltfan && !altfanOverride) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT; else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #else //EXTRUDER_ALTFAN_DETECT newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; @@ -1356,7 +1377,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 + altfanOverride = true; //full speed #endif //EXTRUDER_ALTFAN_DETECT setExtruderAutoFanState(3); SET_OUTPUT(FAN_PIN); @@ -1446,7 +1467,7 @@ void max_temp_error(uint8_t e) { WRITE(FAN_PIN, 1); WRITE(BEEPER, 1); #ifdef EXTRUDER_ALTFAN_DETECT - extruderFanIsAltfan = false; //full speed + altfanOverride = true; //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 87266914f..bb1d2c716 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -9160,3 +9160,15 @@ void lcd_crash_detect_disable() eeprom_update_byte((uint8_t*)EEPROM_CRASH_DET, 0x00); } #endif + +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 844c7c7d3..971c07b6b 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -257,4 +257,6 @@ enum class WizState : uint8_t void lcd_wizard(WizState state); +extern void lcd_experimental_menu(); + #endif //ULTRALCD_H From ec6a20971e495ea4a97049434ac3e247c7391501 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 29 Jul 2020 11:23:24 +0300 Subject: [PATCH 2/5] Add experimental menu to HW_setup --- Firmware/Marlin_main.cpp | 8 -------- Firmware/eeprom.h | 5 ++++- Firmware/ultralcd.cpp | 32 ++++++++++++++++++++++++++++++++ Firmware/ultralcd.h | 1 + 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f3528ca9e..2a261db2a 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8569,14 +8569,6 @@ Sigma_Exit: } break; - /*! - ### M666 - Enter experimental menu - Only used by Prusa - */ - case 666: - menu_submenu(lcd_experimental_menu); - break; - /*! ### 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. diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index bfc81d82d..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 @@ -562,9 +564,10 @@ 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_ALTFAN_OVERRIDE +#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/ultralcd.cpp b/Firmware/ultralcd.cpp index bb1d2c716..24e331680 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2113,6 +2113,7 @@ static void lcd_support_menu() bool is_flash_air; // 1byte uint8_t ip[4]; // 4bytes char ip_str[3*4+3+1]; // 16bytes + uint8_t experimental_menu_visibility; } _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 +2127,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 +2219,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 */ @@ -8997,6 +9012,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 @@ -9161,6 +9183,16 @@ void lcd_crash_detect_disable() } #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(); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 971c07b6b..95a3cec1a 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -257,6 +257,7 @@ enum class WizState : uint8_t void lcd_wizard(WizState state); +extern void lcd_experimental_toggle(); extern void lcd_experimental_menu(); #endif //ULTRALCD_H From 773c6997efcbb947c5eeca5c3daf387c83ef4743 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 29 Jul 2020 17:36:03 +0300 Subject: [PATCH 3/5] Add comments --- Firmware/ultralcd.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 24e331680..c2a3a8907 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,12 +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; + 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]); From e0bf92cd4e7b98fe0628c8584a8f263aadf0405b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 4 Aug 2020 09:54:57 +0300 Subject: [PATCH 4/5] Change bool literal to int --- Firmware/temperature.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 084ed2720..854a884aa 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -1377,7 +1377,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 - altfanOverride = true; //full speed + altfanOverride = 1; //full speed #endif //EXTRUDER_ALTFAN_DETECT setExtruderAutoFanState(3); SET_OUTPUT(FAN_PIN); @@ -1467,7 +1467,7 @@ void max_temp_error(uint8_t e) { WRITE(FAN_PIN, 1); WRITE(BEEPER, 1); #ifdef EXTRUDER_ALTFAN_DETECT - altfanOverride = true; //full speed + altfanOverride = 1; //full speed #endif //EXTRUDER_ALTFAN_DETECT setExtruderAutoFanState(3); // fanSpeed will consumed by the check_axes_activity() routine. From 654a3a0d7942c03107f293fde033ef502d9601d4 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 4 Aug 2020 10:43:30 +0300 Subject: [PATCH 5/5] Other requested changes --- Firmware/temperature.cpp | 32 ++++++++++++++++++-------------- Firmware/ultralcd.cpp | 2 +- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 854a884aa..f08c682aa 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -152,8 +152,11 @@ uint8_t fanSpeedBckp = 255; bool fan_measuring = false; uint8_t fanState = 0; #ifdef EXTRUDER_ALTFAN_DETECT - bool extruderFanIsAltfan = false; //set to Noctua - uint8_t altfanOverride = 0; + struct + { + uint8_t isAltfan : 1; + uint8_t altfanOverride : 1; + } altfanStatus; #endif //EXTRUDER_ALTFAN_DETECT #endif @@ -226,12 +229,13 @@ bool extruder_altfan_detect() SET_INPUT(TACH_0); - altfanOverride = eeprom_read_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE); - if (altfanOverride == EEPROM_EMPTY_VALUE) + uint8_t overrideVal = eeprom_read_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE); + if (overrideVal == EEPROM_EMPTY_VALUE) { - altfanOverride = 0; - eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanOverride); + overrideVal = 0; + eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, overrideVal); } + altfanStatus.altfanOverride = overrideVal; CRITICAL_SECTION_START; EICRB &= ~(1 << ISC61); @@ -246,20 +250,20 @@ 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() { - altfanOverride = !altfanOverride; - eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanOverride); + altfanStatus.altfanOverride = !altfanStatus.altfanOverride; + eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanStatus.altfanOverride); } bool altfanOverride_get() { - return altfanOverride; + return altfanStatus.altfanOverride; } #endif //EXTRUDER_ALTFAN_DETECT @@ -515,7 +519,7 @@ void setExtruderAutoFanState(uint8_t state) if (fanState & 0x01) { #ifdef EXTRUDER_ALTFAN_DETECT - if (extruderFanIsAltfan && !altfanOverride) 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; @@ -1377,7 +1381,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 - altfanOverride = 1; //full speed + altfanStatus.altfanOverride = 1; //full speed #endif //EXTRUDER_ALTFAN_DETECT setExtruderAutoFanState(3); SET_OUTPUT(FAN_PIN); @@ -1467,7 +1471,7 @@ void max_temp_error(uint8_t e) { WRITE(FAN_PIN, 1); WRITE(BEEPER, 1); #ifdef EXTRUDER_ALTFAN_DETECT - altfanOverride = 1; //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/ultralcd.cpp b/Firmware/ultralcd.cpp index c2a3a8907..3207389d9 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2116,7 +2116,7 @@ static void lcd_support_menu() bool is_flash_air; // 1byte uint8_t ip[4]; // 4bytes char ip_str[3*4+3+1]; // 16bytes - uint8_t experimental_menu_visibility; //1byte + 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]);