From 3905234b0d4a8543614e1e76b537350ca4976f11 Mon Sep 17 00:00:00 2001
From: Christian Piper <42127153+CAP1Sup@users.noreply.github.com>
Date: Thu, 21 Apr 2022 03:15:07 -0400
Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20PRINTCOUNTER=20with=20EXTR?=
 =?UTF-8?q?UDERS=200=20(#24063)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
---
 Marlin/src/gcode/gcode.cpp         |  2 +-
 Marlin/src/module/printcounter.cpp | 47 ++++++++++++++++++------------
 Marlin/src/module/printcounter.h   | 27 +++++++++--------
 buildroot/tests/mega2560           |  2 +-
 4 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 5c02cbb507b..b8668c74a85 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -210,7 +210,7 @@ void GcodeSuite::get_destination_from_command() {
   if (parser.floatval('F') > 0)
     feedrate_mm_s = parser.value_feedrate();
 
-  #if ENABLED(PRINTCOUNTER)
+  #if BOTH(PRINTCOUNTER, HAS_EXTRUDERS)
     if (!DEBUGGING(DRYRUN) && !skip_move)
       print_job_timer.incFilamentUsed(destination.e - current_position.e);
   #endif
diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp
index fbf5401d67e..619fbc137ce 100644
--- a/Marlin/src/module/printcounter.cpp
+++ b/Marlin/src/module/printcounter.cpp
@@ -80,30 +80,36 @@ millis_t PrintCounter::deltaDuration() {
   return lastDuration - tmp;
 }
 
-void PrintCounter::incFilamentUsed(float const &amount) {
-  TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("incFilamentUsed")));
+#if HAS_EXTRUDERS
+  void PrintCounter::incFilamentUsed(float const &amount) {
+    TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("incFilamentUsed")));
 
-  // Refuses to update data if object is not loaded
-  if (!isLoaded()) return;
+    // Refuses to update data if object is not loaded
+    if (!isLoaded()) return;
 
-  data.filamentUsed += amount; // mm
-}
+    data.filamentUsed += amount; // mm
+  }
+#endif
 
 void PrintCounter::initStats() {
   TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("initStats")));
 
   loaded = true;
-  data = { 0, 0, 0, 0, 0.0
-    #if HAS_SERVICE_INTERVALS
-      #if SERVICE_INTERVAL_1 > 0
-        , SERVICE_INTERVAL_SEC_1
-      #endif
-      #if SERVICE_INTERVAL_2 > 0
-        , SERVICE_INTERVAL_SEC_2
-      #endif
-      #if SERVICE_INTERVAL_3 > 0
-        , SERVICE_INTERVAL_SEC_3
-      #endif
+
+  data = {
+      .totalPrints = 0
+    , .finishedPrints = 0
+    , .printTime = 0
+    , .longestPrint = 0
+    OPTARG(HAS_EXTRUDERS, .filamentUsed = 0.0)
+    #if SERVICE_INTERVAL_1 > 0
+      , .nextService1 = SERVICE_INTERVAL_SEC_1
+    #endif
+    #if SERVICE_INTERVAL_2 > 0
+      , .nextService2 = SERVICE_INTERVAL_SEC_2
+    #endif
+    #if SERVICE_INTERVAL_3 > 0
+      , .nextService3 = SERVICE_INTERVAL_SEC_3
     #endif
   };
 
@@ -210,8 +216,11 @@ void PrintCounter::showStats() {
     SERIAL_CHAR(')');
   #endif
 
-  SERIAL_ECHOPGM("\n" STR_STATS "Filament used: ", data.filamentUsed / 1000);
-  SERIAL_CHAR('m');
+  #if HAS_EXTRUDERS
+    SERIAL_ECHOPGM("\n" STR_STATS "Filament used: ", data.filamentUsed / 1000);
+    SERIAL_CHAR('m');
+  #endif
+
   SERIAL_EOL();
 
   #if SERVICE_INTERVAL_1 > 0
diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h
index 931d14ded6d..63cc1da158e 100644
--- a/Marlin/src/module/printcounter.h
+++ b/Marlin/src/module/printcounter.h
@@ -37,7 +37,9 @@ struct printStatistics {    // 16 bytes
   uint16_t finishedPrints;  // Number of complete prints
   uint32_t printTime;       // Accumulated printing time
   uint32_t longestPrint;    // Longest successful print job
-  float    filamentUsed;    // Accumulated filament consumed in mm
+  #if HAS_EXTRUDERS
+    float  filamentUsed;    // Accumulated filament consumed in mm
+  #endif
   #if SERVICE_INTERVAL_1 > 0
     uint32_t nextService1;  // Service intervals (or placeholders)
   #endif
@@ -52,12 +54,7 @@ struct printStatistics {    // 16 bytes
 class PrintCounter: public Stopwatch {
   private:
     typedef Stopwatch super;
-
-    #if EITHER(USE_WIRED_EEPROM, CPU_32_BIT)
-      typedef uint32_t eeprom_address_t;
-    #else
-      typedef uint16_t eeprom_address_t;
-    #endif
+    typedef IF<EITHER(USE_WIRED_EEPROM, CPU_32_BIT), uint32_t, uint16_t>::type eeprom_address_t;
 
     static printStatistics data;
 
@@ -124,13 +121,15 @@ class PrintCounter: public Stopwatch {
      */
     FORCE_INLINE static bool isLoaded() { return loaded; }
 
-    /**
-     * @brief Increment the total filament used
-     * @details The total filament used counter will be incremented by "amount".
-     *
-     * @param amount The amount of filament used in mm
-     */
-    static void incFilamentUsed(float const &amount);
+    #if HAS_EXTRUDERS
+      /**
+       * @brief Increment the total filament used
+       * @details The total filament used counter will be incremented by "amount".
+       *
+       * @param amount The amount of filament used in mm
+       */
+      static void incFilamentUsed(float const &amount);
+    #endif
 
     /**
      * @brief Reset the Print Statistics
diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560
index a9ac15ecda9..3677abf60ef 100755
--- a/buildroot/tests/mega2560
+++ b/buildroot/tests/mega2560
@@ -193,7 +193,7 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_EFB EXTRUDERS 0 LCD_LANGUAGE en TEMP_SENSOR_C
         DEFAULT_MAX_ACCELERATION '{ 3000, 3000, 100 }' \
         MANUAL_FEEDRATE '{ 50*60, 50*60, 4*60 }' \
         AXIS_RELATIVE_MODES '{ false, false, false }'
-opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \
+opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT PRINTCOUNTER \
            LASER_FEATURE AIR_EVACUATION AIR_EVACUATION_PIN AIR_ASSIST AIR_ASSIST_PIN LASER_COOLANT_FLOW_METER I2C_AMMETER
 exec_test $1 $2 "MEGA2560 RAMPS | Laser Feature | Air Evacuation | Air Assist | Cooler | Flowmeter | 44780 LCD " "$3"