Add POWER_OFF_DELAY option (#19987)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
		| @@ -344,9 +344,10 @@ | ||||
|     #define AUTO_POWER_E_FANS | ||||
|     #define AUTO_POWER_CONTROLLERFAN | ||||
|     #define AUTO_POWER_CHAMBER_FAN | ||||
|     //#define AUTO_POWER_E_TEMP        50 // (°C) Turn on PSU over this temperature | ||||
|     //#define AUTO_POWER_CHAMBER_TEMP  30 // (°C) Turn on PSU over this temperature | ||||
|     #define POWER_TIMEOUT 30 | ||||
|     //#define AUTO_POWER_E_TEMP        50 // (°C) Turn on PSU if any extruder is over this temperature | ||||
|     //#define AUTO_POWER_CHAMBER_TEMP  30 // (°C) Turn on PSU if the chamber is over this temperature | ||||
|     #define POWER_TIMEOUT              30 // (s) Turn off power if the machine is idle for this duration | ||||
|     //#define POWER_OFF_DELAY          60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -92,11 +92,13 @@ extern bool wait_for_heatup; | ||||
|   #define PSU_PIN_ON()  do{ OUT_WRITE(PS_ON_PIN,  PSU_ACTIVE_STATE); powersupply_on = true;  }while(0) | ||||
|   #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); powersupply_on = false; }while(0) | ||||
|   #if ENABLED(AUTO_POWER_CONTROL) | ||||
|     #define PSU_ON()  powerManager.power_on() | ||||
|     #define PSU_OFF() powerManager.power_off() | ||||
|     #define PSU_ON()       powerManager.power_on() | ||||
|     #define PSU_OFF()      powerManager.power_off() | ||||
|     #define PSU_OFF_SOON() powerManager.power_off_soon() | ||||
|   #else | ||||
|     #define PSU_ON()  PSU_PIN_ON() | ||||
|     #define PSU_OFF() PSU_PIN_OFF() | ||||
|     #define PSU_ON()     PSU_PIN_ON() | ||||
|     #define PSU_OFF()    PSU_PIN_OFF() | ||||
|     #define PSU_OFF_SOON PSU_OFF | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -126,4 +126,12 @@ void Power::power_off() { | ||||
|   } | ||||
| } | ||||
|  | ||||
| void Power::power_off_soon() { | ||||
|   #if POWER_OFF_DELAY | ||||
|     lastPowerOn = millis() - SEC_TO_MS(POWER_TIMEOUT) + SEC_TO_MS(POWER_OFF_DELAY); | ||||
|   #else | ||||
|     power_off(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| #endif // AUTO_POWER_CONTROL | ||||
|   | ||||
| @@ -32,6 +32,7 @@ class Power { | ||||
|     static void check(); | ||||
|     static void power_on(); | ||||
|     static void power_off(); | ||||
|     static void power_off_soon(); | ||||
|   private: | ||||
|     static millis_t lastPowerOn; | ||||
|     static bool is_power_needed(); | ||||
|   | ||||
| @@ -105,7 +105,7 @@ void GcodeSuite::M81() { | ||||
|   #if HAS_SUICIDE | ||||
|     suicide(); | ||||
|   #elif ENABLED(PSU_CONTROL) | ||||
|     PSU_OFF(); | ||||
|     PSU_OFF_SOON(); | ||||
|   #endif | ||||
|  | ||||
|   LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); | ||||
|   | ||||
| @@ -416,8 +416,13 @@ | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #if !defined(PSU_POWERUP_DELAY) && ENABLED(PSU_CONTROL) | ||||
|   #define PSU_POWERUP_DELAY 250 | ||||
| #if ENABLED(PSU_CONTROL) | ||||
|   #ifndef PSU_POWERUP_DELAY | ||||
|     #define PSU_POWERUP_DELAY 250 | ||||
|   #endif | ||||
|   #ifndef POWER_OFF_DELAY | ||||
|     #define POWER_OFF_DELAY   0 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -3016,9 +3016,9 @@ static_assert(   _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) | ||||
|     #error "PSU_CONTROL requires PSU_ACTIVE_STATE to be defined as 'HIGH' or 'LOW'." | ||||
|   #elif !PIN_EXISTS(PS_ON) | ||||
|     #error "PSU_CONTROL requires PS_ON_PIN." | ||||
|   #elif POWER_OFF_DELAY < 0 | ||||
|     #error "POWER_OFF_DELAY must be a positive value." | ||||
|   #endif | ||||
| #elif ENABLED(AUTO_POWER_CONTROL) | ||||
|   #error "AUTO_POWER_CONTROL requires PSU_CONTROL." | ||||
| #endif | ||||
|  | ||||
| #if HAS_CUTTER | ||||
|   | ||||
		Reference in New Issue
	
	Block a user