Browse Source

ALTFAN override

Alex Voinea 3 years ago
parent
commit
a95feb56d9
6 changed files with 52 additions and 5 deletions
  1. 9 1
      Firmware/Marlin_main.cpp
  2. 3 1
      Firmware/eeprom.h
  3. 24 3
      Firmware/temperature.cpp
  4. 2 0
      Firmware/temperature.h
  5. 12 0
      Firmware/ultralcd.cpp
  6. 2 0
      Firmware/ultralcd.h

+ 9 - 1
Firmware/Marlin_main.cpp

@@ -8570,7 +8570,15 @@ Sigma_Exit:
 	break;
 
     /*!
-	### M999 - Restart after being stopped <a href="https://reprap.org/wiki/G-code#M999:_Restart_after_being_stopped_by_error">M999: Restart after being stopped by error</a>
+    ### M666 - Enter experimental menu
+    Only used by Prusa
+    */
+    case 666:
+        menu_submenu(lcd_experimental_menu);
+    break;
+
+    /*!
+    ### M999 - Restart after being stopped <a href="https://reprap.org/wiki/G-code#M999:_Restart_after_being_stopped_by_error">M999: Restart after being stopped by error</a>
     @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:

+ 3 - 1
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 !!!!!
 // !!!!!

+ 24 - 3
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.

+ 2 - 0
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;

+ 12 - 0
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();
+}

+ 2 - 0
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