mirror of
https://github.com/wled/WLED.git
synced 2025-11-10 11:38:58 +00:00
@@ -549,8 +549,9 @@ platform_packages =
|
|||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags}
|
build_flags = ${common.build_flags}
|
||||||
-D WLED_RELEASE_NAME=\"ESP32_hub75\"
|
-D WLED_RELEASE_NAME=\"ESP32_hub75\"
|
||||||
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX -D NO_CIE1931
|
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX
|
||||||
; -D ESP32_FORUM_PINOUT ;; enable for SmartMatrix default pins
|
-D LED_TYPES=65 -D DATA_PINS=64,64,1
|
||||||
|
-D WLED_DEBUG_BUS
|
||||||
; -D WLED_DEBUG
|
; -D WLED_DEBUG
|
||||||
lib_deps = ${esp32_idf_V4.lib_deps}
|
lib_deps = ${esp32_idf_V4.lib_deps}
|
||||||
https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA.git#3.0.11
|
https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA.git#3.0.11
|
||||||
@@ -563,11 +564,14 @@ board_build.flash_mode = dio
|
|||||||
extends = env:esp32dev_hub75
|
extends = env:esp32dev_hub75
|
||||||
build_flags = ${common.build_flags}
|
build_flags = ${common.build_flags}
|
||||||
-D WLED_RELEASE_NAME=\"ESP32_hub75_forum_pinout\"
|
-D WLED_RELEASE_NAME=\"ESP32_hub75_forum_pinout\"
|
||||||
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX -D NO_CIE1931
|
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX
|
||||||
-D ESP32_FORUM_PINOUT ;; enable for SmartMatrix default pins
|
-D ESP32_FORUM_PINOUT ;; enable for SmartMatrix default pins
|
||||||
|
-D LED_TYPES=65 -D DATA_PINS=64,64,1
|
||||||
|
-D WLED_DEBUG_BUS
|
||||||
; -D WLED_DEBUG
|
; -D WLED_DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[env:adafruit_matrixportal_esp32s3]
|
[env:adafruit_matrixportal_esp32s3]
|
||||||
; ESP32-S3 processor, 8 MB flash, 2 MB of PSRAM, dedicated driver pins for HUB75
|
; ESP32-S3 processor, 8 MB flash, 2 MB of PSRAM, dedicated driver pins for HUB75
|
||||||
board = adafruit_matrixportal_esp32s3
|
board = adafruit_matrixportal_esp32s3
|
||||||
@@ -581,9 +585,12 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=
|
|||||||
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
||||||
-D WLED_WATCHDOG_TIMEOUT=0
|
-D WLED_WATCHDOG_TIMEOUT=0
|
||||||
${esp32.AR_build_flags}
|
${esp32.AR_build_flags}
|
||||||
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX -D NO_CIE1931
|
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX
|
||||||
-D S3_LCD_DIV_NUM=20 ;; Attempt to fix wifi performance issue when panel active with S3 chips
|
-D S3_LCD_DIV_NUM=20 ;; Attempt to fix wifi performance issue when panel active with S3 chips
|
||||||
-D ARDUINO_ADAFRUIT_MATRIXPORTAL_ESP32S3
|
-D ARDUINO_ADAFRUIT_MATRIXPORTAL_ESP32S3
|
||||||
|
-D LED_TYPES=65 -D DATA_PINS=64,64,1
|
||||||
|
-D WLED_DEBUG_BUS
|
||||||
|
|
||||||
|
|
||||||
lib_deps = ${esp32s3.lib_deps}
|
lib_deps = ${esp32s3.lib_deps}
|
||||||
${esp32.AR_lib_deps}
|
${esp32.AR_lib_deps}
|
||||||
@@ -607,9 +614,11 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=
|
|||||||
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
||||||
-D WLED_WATCHDOG_TIMEOUT=0
|
-D WLED_WATCHDOG_TIMEOUT=0
|
||||||
${esp32.AR_build_flags}
|
${esp32.AR_build_flags}
|
||||||
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX -D NO_CIE1931
|
-D WLED_ENABLE_HUB75MATRIX -D NO_GFX
|
||||||
-D S3_LCD_DIV_NUM=20 ;; Attempt to fix wifi performance issue when panel active with S3 chips
|
-D S3_LCD_DIV_NUM=20 ;; Attempt to fix wifi performance issue when panel active with S3 chips
|
||||||
-D MOONHUB_S3_PINOUT ;; HUB75 pinout
|
-D MOONHUB_S3_PINOUT ;; HUB75 pinout
|
||||||
|
-D LED_TYPES=65 -D DATA_PINS=64,64,1
|
||||||
|
-D WLED_DEBUG_BUS
|
||||||
|
|
||||||
lib_deps = ${esp32s3.lib_deps}
|
lib_deps = ${esp32s3.lib_deps}
|
||||||
${esp32.AR_lib_deps}
|
${esp32.AR_lib_deps}
|
||||||
|
|||||||
@@ -812,14 +812,15 @@ BusHub75Matrix::BusHub75Matrix(const BusConfig &bc) : Bus(bc.type, bc.start, bc.
|
|||||||
virtualDisp = nullptr;
|
virtualDisp = nullptr;
|
||||||
|
|
||||||
if (bc.type == TYPE_HUB75MATRIX_HS) {
|
if (bc.type == TYPE_HUB75MATRIX_HS) {
|
||||||
mxconfig.mx_width = min((u_int8_t) 64, bc.pins[0]);
|
mxconfig.mx_width = min((uint8_t) 64, bc.pins[0]);
|
||||||
mxconfig.mx_height = min((u_int8_t) 64, bc.pins[1]);
|
mxconfig.mx_height = min((uint8_t) 64, bc.pins[1]);
|
||||||
if(bc.pins[2] > 1 && bc.pins[3] > 0 && bc.pins[4]) {
|
// Disable chains of panels for now, incomplete UI changes
|
||||||
virtualDisp = new VirtualMatrixPanel((*display), bc.pins[3], bc.pins[4], mxconfig.mx_width, mxconfig.mx_height, CHAIN_BOTTOM_LEFT_UP);
|
// if(bc.pins[2] > 1 && bc.pins[3] != 0 && bc.pins[4] != 0 && bc.pins[3] != 255 && bc.pins[4] != 255) {
|
||||||
}
|
// virtualDisp = new VirtualMatrixPanel((*display), bc.pins[3], bc.pins[4], mxconfig.mx_width, mxconfig.mx_height, CHAIN_BOTTOM_LEFT_UP);
|
||||||
|
// }
|
||||||
} else if (bc.type == TYPE_HUB75MATRIX_QS) {
|
} else if (bc.type == TYPE_HUB75MATRIX_QS) {
|
||||||
mxconfig.mx_width = min((u_int8_t) 64, bc.pins[0]) * 2;
|
mxconfig.mx_width = min((uint8_t) 64, bc.pins[0]) * 2;
|
||||||
mxconfig.mx_height = min((u_int8_t) 64, bc.pins[1]) / 2;
|
mxconfig.mx_height = min((uint8_t) 64, bc.pins[1]) / 2;
|
||||||
virtualDisp = new VirtualMatrixPanel((*display), 1, 1, bc.pins[0], bc.pins[1]);
|
virtualDisp = new VirtualMatrixPanel((*display), 1, 1, bc.pins[0], bc.pins[1]);
|
||||||
virtualDisp->setRotation(0);
|
virtualDisp->setRotation(0);
|
||||||
switch(bc.pins[1]) {
|
switch(bc.pins[1]) {
|
||||||
@@ -849,7 +850,7 @@ BusHub75Matrix::BusHub75Matrix(const BusConfig &bc) : Bus(bc.type, bc.start, bc.
|
|||||||
} else mxconfig.setPixelColorDepthBits(8);
|
} else mxconfig.setPixelColorDepthBits(8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mxconfig.chain_length = max((u_int8_t) 1, min(bc.pins[2], (u_int8_t) 4)); // prevent bad data preventing boot due to low memory
|
mxconfig.chain_length = max((uint8_t) 1, min(bc.pins[2], (uint8_t) 4)); // prevent bad data preventing boot due to low memory
|
||||||
|
|
||||||
if(mxconfig.mx_height >= 64 && (mxconfig.chain_length > 1)) {
|
if(mxconfig.mx_height >= 64 && (mxconfig.chain_length > 1)) {
|
||||||
DEBUGBUS_PRINTLN("WARNING, only single panel can be used of 64 pixel boards due to memory");
|
DEBUGBUS_PRINTLN("WARNING, only single panel can be used of 64 pixel boards due to memory");
|
||||||
@@ -996,7 +997,6 @@ BusHub75Matrix::BusHub75Matrix(const BusConfig &bc) : Bus(bc.type, bc.start, bc.
|
|||||||
DEBUGBUS_PRINT(F("MatrixPanel_I2S_DMA "));
|
DEBUGBUS_PRINT(F("MatrixPanel_I2S_DMA "));
|
||||||
DEBUGBUS_PRINTF("%sstarted, width=%u, %u pixels.\n", _valid? "":"not ", _panelWidth, _len);
|
DEBUGBUS_PRINTF("%sstarted, width=%u, %u pixels.\n", _valid? "":"not ", _panelWidth, _len);
|
||||||
|
|
||||||
if (mxconfig.double_buff == true) DEBUGBUS_PRINTLN(F("MatrixPanel_I2S_DMA driver native double-buffering enabled."));
|
|
||||||
if (_ledBuffer != nullptr) DEBUGBUS_PRINTLN(F("MatrixPanel_I2S_DMA LEDS buffer enabled."));
|
if (_ledBuffer != nullptr) DEBUGBUS_PRINTLN(F("MatrixPanel_I2S_DMA LEDS buffer enabled."));
|
||||||
if (_ledsDirty != nullptr) DEBUGBUS_PRINTLN(F("MatrixPanel_I2S_DMA LEDS dirty bit optimization enabled."));
|
if (_ledsDirty != nullptr) DEBUGBUS_PRINTLN(F("MatrixPanel_I2S_DMA LEDS dirty bit optimization enabled."));
|
||||||
if ((_ledBuffer != nullptr) || (_ledsDirty != nullptr)) {
|
if ((_ledBuffer != nullptr) || (_ledsDirty != nullptr)) {
|
||||||
@@ -1021,9 +1021,6 @@ void __attribute__((hot)) BusHub75Matrix::setPixelColor(unsigned pix, uint32_t c
|
|||||||
if ((c == IS_BLACK) && (getBitFromArray(_ledsDirty, pix) == false)) return; // ignore black if pixel is already black
|
if ((c == IS_BLACK) && (getBitFromArray(_ledsDirty, pix) == false)) return; // ignore black if pixel is already black
|
||||||
setBitInArray(_ledsDirty, pix, c != IS_BLACK); // dirty = true means "color is not BLACK"
|
setBitInArray(_ledsDirty, pix, c != IS_BLACK); // dirty = true means "color is not BLACK"
|
||||||
|
|
||||||
#ifndef NO_CIE1931
|
|
||||||
c = unGamma24(c); // to use the driver linear brightness feature, we first need to undo WLED gamma correction
|
|
||||||
#endif
|
|
||||||
uint8_t r = R(c);
|
uint8_t r = R(c);
|
||||||
uint8_t g = G(c);
|
uint8_t g = G(c);
|
||||||
uint8_t b = B(c);
|
uint8_t b = B(c);
|
||||||
@@ -1069,9 +1066,6 @@ void BusHub75Matrix::show(void) {
|
|||||||
for (int y=0; y<height; y++) for (int x=0; x<width; x++) {
|
for (int y=0; y<height; y++) for (int x=0; x<width; x++) {
|
||||||
if (getBitFromArray(_ledsDirty, pix) == true) { // only repaint the "dirty" pixels
|
if (getBitFromArray(_ledsDirty, pix) == true) { // only repaint the "dirty" pixels
|
||||||
uint32_t c = uint32_t(_ledBuffer[pix]) & 0x00FFFFFF; // get RGB color, removing FastLED "alpha" component
|
uint32_t c = uint32_t(_ledBuffer[pix]) & 0x00FFFFFF; // get RGB color, removing FastLED "alpha" component
|
||||||
#ifndef NO_CIE1931
|
|
||||||
c = unGamma24(c); // to use the driver linear brightness feature, we first need to undo WLED gamma correction
|
|
||||||
#endif
|
|
||||||
uint8_t r = R(c);
|
uint8_t r = R(c);
|
||||||
uint8_t g = G(c);
|
uint8_t g = G(c);
|
||||||
uint8_t b = B(c);
|
uint8_t b = B(c);
|
||||||
@@ -1082,13 +1076,6 @@ void BusHub75Matrix::show(void) {
|
|||||||
}
|
}
|
||||||
setBitArray(_ledsDirty, _len, false); // buffer shown - reset all dirty bits
|
setBitArray(_ledsDirty, _len, false); // buffer shown - reset all dirty bits
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mxconfig.double_buff) {
|
|
||||||
display->flipDMABuffer(); // Show the back buffer, set current output buffer to the back (i.e. no longer being sent to LED panels)
|
|
||||||
// while(!previousBufferFree) delay(1); // experimental - Wait before we allow any writing to the buffer. Stop flicker.
|
|
||||||
display->clearScreen(); // Now clear the back-buffer
|
|
||||||
setBitArray(_ledsDirty, _len, false); // dislay buffer is blank - reset all dirty bits
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BusHub75Matrix::cleanup() {
|
void BusHub75Matrix::cleanup() {
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ class Bus {
|
|||||||
inline bool containsPixel(uint16_t pix) const { return pix >= _start && pix < _start + _len; }
|
inline bool containsPixel(uint16_t pix) const { return pix >= _start && pix < _start + _len; }
|
||||||
|
|
||||||
static inline std::vector<LEDType> getLEDTypes() { return {{TYPE_NONE, "", PSTR("None")}}; } // not used. just for reference for derived classes
|
static inline std::vector<LEDType> getLEDTypes() { return {{TYPE_NONE, "", PSTR("None")}}; } // not used. just for reference for derived classes
|
||||||
static constexpr size_t getNumberOfPins(uint8_t type) { return isVirtual(type) ? 4 : isPWM(type) ? numPWMPins(type) : is2Pin(type) + 1; } // credit @PaoloTK
|
static constexpr size_t getNumberOfPins(uint8_t type) { return isVirtual(type) ? 4 : isPWM(type) ? numPWMPins(type) : isHub75(type) ? 3 : is2Pin(type) + 1; } // credit @PaoloTK
|
||||||
static constexpr size_t getNumberOfChannels(uint8_t type) { return hasWhite(type) + 3*hasRGB(type) + hasCCT(type); }
|
static constexpr size_t getNumberOfChannels(uint8_t type) { return hasWhite(type) + 3*hasRGB(type) + hasCCT(type); }
|
||||||
static constexpr bool hasRGB(uint8_t type) {
|
static constexpr bool hasRGB(uint8_t type) {
|
||||||
return !((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_ANALOG_1CH || type == TYPE_ANALOG_2CH || type == TYPE_ONOFF);
|
return !((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_ANALOG_1CH || type == TYPE_ANALOG_2CH || type == TYPE_ONOFF);
|
||||||
|
|||||||
Reference in New Issue
Block a user