From 2065d9ca2efe82d3b19b71b0a6ca5a1a8288053c Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Thu, 22 Feb 2024 10:46:56 +0000 Subject: [PATCH] Allocate pins using pinManager --- wled00/bus_manager.cpp | 38 ++++++++++++++++++++++++++++++++++++++ wled00/bus_manager.h | 8 +++++++- wled00/pin_manager.h | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index d9043136..603fcec6 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -561,6 +561,23 @@ BusHub75Matrix::BusHub75Matrix(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWh // OK, now we can create our matrix object display = new MatrixPanel_I2S_DMA(mxconfig); + pinManager.allocatePin(mxconfig.gpio.r1, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.g1, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.b1, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.r2, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.g2, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.b2, true, PinOwner::HUB75); + + pinManager.allocatePin(mxconfig.gpio.lat, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.oe, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.clk, true, PinOwner::HUB75); + + pinManager.allocatePin(mxconfig.gpio.a, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.b, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.c, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.d, true, PinOwner::HUB75); + pinManager.allocatePin(mxconfig.gpio.e, true, PinOwner::HUB75); + // display->setLatBlanking(4); USER_PRINTLN("MatrixPanel_I2S_DMA created"); @@ -590,6 +607,27 @@ void BusHub75Matrix::setPixelColor(uint16_t pix, uint32_t c) { void BusHub75Matrix::setBrightness(uint8_t b, bool immediate) { this->display->setBrightness(b); } + +void BusHub75Matrix::deallocatePins() { + + pinManager.deallocatePin(mxconfig.gpio.r1, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.g1, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.b1, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.r2, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.g2, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.b2, PinOwner::HUB75); + + pinManager.deallocatePin(mxconfig.gpio.lat, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.oe, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.clk, PinOwner::HUB75); + + pinManager.deallocatePin(mxconfig.gpio.a, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.b, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.c, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.d, PinOwner::HUB75); + pinManager.deallocatePin(mxconfig.gpio.e, PinOwner::HUB75); + +} #endif // *************************************************************************** diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index a823cea2..4161cc93 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -351,7 +351,13 @@ class BusHub75Matrix : public Bus { uint8_t getPins(uint8_t* pinArray) { return 1; } // Fake value due to keep finaliseInit happy - void cleanup() {} + void deallocatePins(); + + void cleanup() { + deallocatePins(); + delete display; + _valid = false; + } ~BusHub75Matrix() { cleanup(); diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index e70d94b1..968b1791 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -35,6 +35,7 @@ enum struct PinOwner : uint8_t { DMX = 0x8A, // 'DMX' == hard-coded to IO2 HW_I2C = 0x8B, // 'I2C' == hardware I2C pins (4&5 on ESP8266, 21&22 on ESP32) HW_SPI = 0x8C, // 'SPI' == hardware (V)SPI pins (13,14&15 on ESP8266, 5,18&23 on ESP32) + HUB75 = 0x8D, // 'Hub75' == Hub75 driver // Use UserMod IDs from const.h here UM_Unspecified = USERMOD_ID_UNSPECIFIED, // 0x01 UM_Example = USERMOD_ID_EXAMPLE, // 0x02 // Usermod "usermod_v2_example.h"