From 001f26b642e2957371b1eb988c0c14a3c6dc61ee Mon Sep 17 00:00:00 2001
From: AnoNymous <dgdanielf@gmail.com>
Date: Wed, 3 Oct 2018 18:01:21 +0200
Subject: [PATCH] Template struct simplification for serial (#11990)

---
 Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp     | 16 +++----
 Marlin/src/HAL/HAL_AVR/MarlinSerial.h       | 29 +++--------
 Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp |  8 ++--
 Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h   | 53 ++++++++-------------
 4 files changed, 38 insertions(+), 68 deletions(-)

diff --git a/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp
index c0181296eaf..ea5c489f65d 100644
--- a/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp
+++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp
@@ -705,35 +705,35 @@
 
   // Hookup ISR handlers
   ISR(SERIAL_REGNAME(USART,SERIAL_PORT,_RX_vect)) {
-    MarlinSerial<MarlinSerialCfg1>::store_rxd_char();
+    MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::store_rxd_char();
   }
 
   ISR(SERIAL_REGNAME(USART,SERIAL_PORT,_UDRE_vect)) {
-    MarlinSerial<MarlinSerialCfg1>::_tx_udr_empty_irq();
+    MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::_tx_udr_empty_irq();
   }
 
   // Preinstantiate
-  template class MarlinSerial<MarlinSerialCfg1>;
+  template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>;
 
   // Instantiate
-  MarlinSerial<MarlinSerialCfg1> customizedSerial1;
+  MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
 
   #ifdef SERIAL_PORT_2
 
     // Hookup ISR handlers
     ISR(SERIAL_REGNAME(USART,SERIAL_PORT_2,_RX_vect)) {
-      MarlinSerial<MarlinSerialCfg2>::store_rxd_char();
+      MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::store_rxd_char();
     }
 
     ISR(SERIAL_REGNAME(USART,SERIAL_PORT_2,_UDRE_vect)) {
-      MarlinSerial<MarlinSerialCfg2>::_tx_udr_empty_irq();
+      MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::_tx_udr_empty_irq();
     }
 
     // Preinstantiate
-    template class MarlinSerial<MarlinSerialCfg2>;
+    template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>;
 
     // Instantiate
-    MarlinSerial<MarlinSerialCfg2> customizedSerial2;
+    MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
 
   #endif
 
diff --git a/Marlin/src/HAL/HAL_AVR/MarlinSerial.h b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h
index 399bed97cb4..4ddab4d6fca 100644
--- a/Marlin/src/HAL/HAL_AVR/MarlinSerial.h
+++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h
@@ -254,10 +254,10 @@
       static void printNumber(unsigned long, const uint8_t);
       static void printFloat(double, uint8_t);
   };
-
-  // Serial port configuration
-  struct MarlinSerialCfg1 {
-    static constexpr int PORT               = SERIAL_PORT;
+  
+  template <uint8_t serial>
+  struct MarlinSerialCfg {
+    static constexpr int PORT               = serial;
     static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE;
     static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE;
     static constexpr bool XONOFF            = bSERIAL_XON_XOFF;
@@ -267,29 +267,14 @@
     static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS;
     static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED;
   };
-
-  extern MarlinSerial<MarlinSerialCfg1> customizedSerial1;
+  extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
 
   #ifdef SERIAL_PORT_2
 
-    // Serial port configuration
-    struct MarlinSerialCfg2 {
-      static constexpr int PORT               = SERIAL_PORT_2;
-      static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE;
-      static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE;
-      static constexpr bool XONOFF            = bSERIAL_XON_XOFF;
-      static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER;
-      static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX;
-      static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS;
-      static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS;
-      static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED;
-    };
-
-    extern MarlinSerial<MarlinSerialCfg2> customizedSerial2;
-
+    extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
+    
   #endif
 
-
 #endif // !USBCON
 
 // Use the UART for Bluetooth in AT90USB configurations
diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp
index 853cc60f36a..cbcd9dcd3fa 100644
--- a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp
+++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp
@@ -631,20 +631,20 @@ void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
 #if SERIAL_PORT >= 0
 
   // Preinstantiate
-  template class MarlinSerial<MarlinSerialCfg1>;
+  template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>;
 
   // Instantiate
-  MarlinSerial<MarlinSerialCfg1> customizedSerial1;
+  MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
 
 #endif
 
 #ifdef SERIAL_PORT_2
 
   // Preinstantiate
-  template class MarlinSerial<MarlinSerialCfg2>;
+  template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>;
 
   // Instantiate
-  MarlinSerial<MarlinSerialCfg2> customizedSerial2;
+  MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
 
 #endif
 
diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h
index 609d4ab5699..6a95897b9c7 100644
--- a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h
+++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h
@@ -19,6 +19,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
+#pragma once
 
 /**
  * MarlinSerial_Due.h - Hardware serial library for Arduino DUE
@@ -26,9 +27,6 @@
  * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti.  All right reserved.
  */
 
-#ifndef MARLINSERIAL_DUE_H
-#define MARLINSERIAL_DUE_H
-
 #include "../shared/MarlinSerial.h"
 
 #include <WString.h>
@@ -159,42 +157,29 @@ private:
   static void printFloat(double, uint8_t);
 };
 
+// Serial port configuration
+template <uint8_t serial>
+struct MarlinSerialCfg {
+  static constexpr int PORT               = serial;
+  static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE;
+  static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE;
+  static constexpr bool XONOFF            = bSERIAL_XON_XOFF;
+  static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER;
+  static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX;
+  static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS;
+  static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS;
+  static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED;
+};
+  
 #if SERIAL_PORT >= 0
 
-  // Serial port configuration
-  struct MarlinSerialCfg1 {
-    static constexpr int PORT               = SERIAL_PORT;
-    static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE;
-    static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE;
-    static constexpr bool XONOFF            = bSERIAL_XON_XOFF;
-    static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER;
-    static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX;
-    static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS;
-    static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS;
-    static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED;
-  };
-
-  extern MarlinSerial<MarlinSerialCfg1> customizedSerial1;
-
+  extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
+  
 #endif // SERIAL_PORT >= 0
 
 #ifdef SERIAL_PORT_2
 
-  // Serial port configuration
-  struct MarlinSerialCfg2 {
-    static constexpr int PORT               = SERIAL_PORT_2;
-    static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE;
-    static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE;
-    static constexpr bool XONOFF            = bSERIAL_XON_XOFF;
-    static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER;
-    static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX;
-    static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS;
-    static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS;
-    static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED;
-  };
-
-  extern MarlinSerial<MarlinSerialCfg2> customizedSerial2;
-
+  extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
+  
 #endif
 
-#endif // MARLINSERIAL_DUE_H