From d31e4c7815cc2997fb983682d434fa430db6bc5c Mon Sep 17 00:00:00 2001 From: cschwinne Date: Wed, 17 Nov 2021 11:13:07 +0100 Subject: [PATCH] Added getPinOwner Only disable builtin LED if bus to avoid breaking other things on the pin --- wled00/button.cpp | 7 +++++-- wled00/pin_manager.cpp | 5 +++++ wled00/pin_manager.h | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/wled00/button.cpp b/wled00/button.cpp index 39c1e4f7f..aef18c77e 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -299,8 +299,11 @@ void handleIO() #ifdef ESP8266 // turn off built-in LED if strip is turned off // this will break digital bus so will need to be reinitialised on On - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, HIGH); + PinOwner ledPinOwner = pinManager.getPinOwner(LED_BUILTIN); + if (!strip.isOffRefreshRequred && (ledPinOwner == PinOwner::None || ledPinOwner == PinOwner::BusDigital)) { + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); + } #endif if (rlyPin>=0) { pinMode(rlyPin, OUTPUT); diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index 38e6e1621..ece48c248 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -125,6 +125,11 @@ bool PinManagerClass::isPinOk(byte gpio, bool output) return false; } +PinOwner PinManagerClass::getPinOwner(byte gpio) { + if (!isPinOk(gpio, false)) return PinOwner::None; + return ownerTag[gpio]; +} + #ifdef ARDUINO_ARCH_ESP32 byte PinManagerClass::allocateLedc(byte channels) { diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index 63f6d95e8..65d319664 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -92,6 +92,8 @@ class PinManagerClass { bool isPinAllocated(byte gpio, PinOwner tag = PinOwner::None); bool isPinOk(byte gpio, bool output = true); + PinOwner getPinOwner(byte gpio); + #ifdef ARDUINO_ARCH_ESP32 byte allocateLedc(byte channels); void deallocateLedc(byte pos, byte channels);