From 9e3c41f9e8c7b579ef221d9ae401651826db5e1b Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Tue, 21 Nov 2017 19:04:09 -0600
Subject: [PATCH] Tweak fan kickstart / speed code

---
 .travis.yml                   |   2 +-
 Marlin/src/module/planner.cpp | 142 ++++++++++++++++++----------------
 2 files changed, 77 insertions(+), 67 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 0033c774f2..22578e6a77 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -188,7 +188,7 @@ script:
   - opt_set_adv FAN_MIN_PWM 50
   - opt_set_adv FAN_KICKSTART_TIME 100
   - opt_set_adv XY_FREQUENCY_LIMIT  15
-  - opt_enable_adv SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER
+  - opt_enable_adv SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER FAN_KICKSTART_TIME
   - opt_enable_adv ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED ADVANCED_OK
   - opt_enable_adv VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS ACTION_ON_KILL
   - opt_enable_adv EXTRA_FAN_SPEED FWERETRACT Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index e88935e5eb..5b8f0d30ca 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -421,24 +421,77 @@ void Planner::check_axes_activity() {
   unsigned char axis_active[NUM_AXIS] = { 0 },
                 tail_fan_speed[FAN_COUNT];
 
-  #if FAN_COUNT > 0
-    for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = fanSpeeds[i];
-  #endif
-
   #if ENABLED(BARICUDA)
     #if HAS_HEATER_1
-      uint8_t tail_valve_pressure = baricuda_valve_pressure;
+      uint8_t tail_valve_pressure;
     #endif
     #if HAS_HEATER_2
-      uint8_t tail_e_to_p_pressure = baricuda_e_to_p_pressure;
+      uint8_t tail_e_to_p_pressure;
     #endif
   #endif
 
   if (blocks_queued()) {
 
     #if FAN_COUNT > 0
-      for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = block_buffer[block_buffer_tail].fan_speed[i];
-    #endif
+
+      for (uint8_t i = 0; i < FAN_COUNT; i++)
+        tail_fan_speed[i] = block_buffer[block_buffer_tail].fan_speed[i];
+
+      #ifdef FAN_KICKSTART_TIME
+
+        static millis_t fan_kick_end[FAN_COUNT] = { 0 };
+
+        #define KICKSTART_FAN(f)                         \
+          if (tail_fan_speed[f]) {                       \ // is the fan turned on?
+            millis_t ms = millis();                      \
+            if (fan_kick_end[f] == 0) {                  \ // not yet kickstarted?
+              fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ // kickstart until this time
+              tail_fan_speed[f] = 255;                   \ // full speed
+            } else if (PENDING(ms, fan_kick_end[f]))     \ // kickstart in progress?
+              tail_fan_speed[f] = 255;                   \ // keep full speed going
+          } else fan_kick_end[f] = 0                       // fan off? kick next time
+
+        #if HAS_FAN0
+          KICKSTART_FAN(0);
+        #endif
+        #if HAS_FAN1
+          KICKSTART_FAN(1);
+        #endif
+        #if HAS_FAN2
+          KICKSTART_FAN(2);
+        #endif
+
+      #endif // FAN_KICKSTART_TIME
+
+      #ifdef FAN_MIN_PWM
+        #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? ( FAN_MIN_PWM + (tail_fan_speed[f] * (255 - FAN_MIN_PWM)) / 255 ) : 0)
+      #else
+        #define CALC_FAN_SPEED(f) tail_fan_speed[f]
+      #endif
+
+      #if ENABLED(FAN_SOFT_PWM)
+        #if HAS_FAN0
+          thermalManager.soft_pwm_amount_fan[0] = CALC_FAN_SPEED(0);
+        #endif
+        #if HAS_FAN1
+          thermalManager.soft_pwm_amount_fan[1] = CALC_FAN_SPEED(1);
+        #endif
+        #if HAS_FAN2
+          thermalManager.soft_pwm_amount_fan[2] = CALC_FAN_SPEED(2);
+        #endif
+      #else
+        #if HAS_FAN0
+          analogWrite(FAN_PIN, CALC_FAN_SPEED(0));
+        #endif
+        #if HAS_FAN1
+          analogWrite(FAN1_PIN, CALC_FAN_SPEED(1));
+        #endif
+        #if HAS_FAN2
+          analogWrite(FAN2_PIN, CALC_FAN_SPEED(2));
+        #endif
+      #endif
+
+    #endif // FAN_COUNT > 0
 
     block_t* block;
 
@@ -457,6 +510,21 @@ void Planner::check_axes_activity() {
       LOOP_XYZE(i) if (block->steps[i]) axis_active[i]++;
     }
   }
+  else {
+    #if FAN_COUNT > 0
+      for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = fanSpeeds[i];
+    #endif
+
+    #if ENABLED(BARICUDA)
+      #if HAS_HEATER_1
+        tail_valve_pressure = baricuda_valve_pressure;
+      #endif
+      #if HAS_HEATER_2
+        tail_e_to_p_pressure = baricuda_e_to_p_pressure;
+      #endif
+    #endif
+  }
+
   #if ENABLED(DISABLE_X)
     if (!axis_active[X_AXIS]) disable_X();
   #endif
@@ -470,64 +538,6 @@ void Planner::check_axes_activity() {
     if (!axis_active[E_AXIS]) disable_e_steppers();
   #endif
 
-  #if FAN_COUNT > 0
-
-    #ifdef FAN_MIN_PWM
-      #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? ( FAN_MIN_PWM + (tail_fan_speed[f] * (255 - FAN_MIN_PWM)) / 255 ) : 0)
-    #else
-      #define CALC_FAN_SPEED(f) tail_fan_speed[f]
-    #endif
-
-    #ifdef FAN_KICKSTART_TIME
-
-      static millis_t fan_kick_end[FAN_COUNT] = { 0 };
-
-      #define KICKSTART_FAN(f) \
-        if (tail_fan_speed[f]) { \
-          millis_t ms = millis(); \
-          if (fan_kick_end[f] == 0) { \
-            fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \
-            tail_fan_speed[f] = 255; \
-          } else if (PENDING(ms, fan_kick_end[f])) \
-            tail_fan_speed[f] = 255; \
-        } else fan_kick_end[f] = 0
-
-      #if HAS_FAN0
-        KICKSTART_FAN(0);
-      #endif
-      #if HAS_FAN1
-        KICKSTART_FAN(1);
-      #endif
-      #if HAS_FAN2
-        KICKSTART_FAN(2);
-      #endif
-
-    #endif // FAN_KICKSTART_TIME
-
-    #if ENABLED(FAN_SOFT_PWM)
-      #if HAS_FAN0
-        thermalManager.soft_pwm_amount_fan[0] = CALC_FAN_SPEED(0);
-      #endif
-      #if HAS_FAN1
-        thermalManager.soft_pwm_amount_fan[1] = CALC_FAN_SPEED(1);
-      #endif
-      #if HAS_FAN2
-        thermalManager.soft_pwm_amount_fan[2] = CALC_FAN_SPEED(2);
-      #endif
-    #else
-      #if HAS_FAN0
-        analogWrite(FAN_PIN, CALC_FAN_SPEED(0));
-      #endif
-      #if HAS_FAN1
-        analogWrite(FAN1_PIN, CALC_FAN_SPEED(1));
-      #endif
-      #if HAS_FAN2
-        analogWrite(FAN2_PIN, CALC_FAN_SPEED(2));
-      #endif
-    #endif
-
-  #endif // FAN_COUNT > 0
-
   #if ENABLED(AUTOTEMP)
     getHighESpeed();
   #endif
-- 
GitLab