From a0f7f0e9e21b23577695609519d7216dd2f37c43 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 20 Jun 2021 22:49:57 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20compact=20sensitive=20pins?= =?UTF-8?q?=20array=20(#22184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/MarlinCore.cpp | 21 ++++++++++++--------- Marlin/src/pins/sensitive_pins.h | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 404f36c79f..f77f3b2f0b 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -282,19 +282,22 @@ bool wait_for_heatup = true; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnarrowing" -#ifdef RUNTIME_ONLY_ANALOG_TO_DIGITAL - static const pin_t sensitive_pins[] PROGMEM = { SENSITIVE_PINS }; -#else +#ifndef RUNTIME_ONLY_ANALOG_TO_DIGITAL template - constexpr pin_t OnlyPins<-2, D...>::table[sizeof...(D)]; - #define sensitive_pins OnlyPins::table + constexpr pin_t OnlyPins<_SP_END, D...>::table[sizeof...(D)]; #endif bool pin_is_protected(const pin_t pin) { - LOOP_L_N(i, COUNT(sensitive_pins)) { - pin_t sensitive_pin; - memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); - if (pin == sensitive_pin) return true; + #ifdef RUNTIME_ONLY_ANALOG_TO_DIGITAL + static const pin_t sensitive_pins[] PROGMEM = { SENSITIVE_PINS }; + const size_t pincount = COUNT(sensitive_pins); + #else + static constexpr size_t pincount = OnlyPins::size; + static const pin_t (&sensitive_pins)[pincount] PROGMEM = OnlyPins::table; + #endif + LOOP_L_N(i, pincount) { + const pin_t * const pptr = &sensitive_pins[i]; + if (pin == (sizeof(pin_t) == 2 ? (pin_t)pgm_read_word(pptr) : (pin_t)pgm_read_byte(pptr))) return true; } return false; } diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index 9102bbab7b..7ccb0339b2 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -882,7 +882,7 @@ // Remove -2 from the front, emit the rest, cease propagation template - struct OnlyPins<_SP_END, D...> { static constexpr pin_t table[sizeof...(D)] PROGMEM = { D... }; }; + struct OnlyPins<_SP_END, D...> { static constexpr size_t size = sizeof...(D); static constexpr pin_t table[sizeof...(D)] PROGMEM = { D... }; }; #endif #define SENSITIVE_PINS \