Skip to content

Commit 4221ed1

Browse files
committed
LEDs driver: slowmode optimization
* isValid() -> isOk() * removed unneeded "lastBus != nullptr" checks * re-enable lastBus optimization in getPixelColor() and getPixelColorRestored() * remove duplicate checks for _valid== true from busses (already done at BusManager level)
1 parent db2d50e commit 4221ed1

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

wled00/bus_manager.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ BusNetwork::BusNetwork(BusConfig &bc, const ColorOrderMap &com) : Bus(bc.type, b
492492
}
493493

494494
void IRAM_ATTR_YN BusNetwork::setPixelColor(uint16_t pix, uint32_t c) {
495-
if (!_valid || pix >= _len) return;
495+
if (pix >= _len) return;
496496
if (_rgbw) c = autoWhiteCalc(c);
497497
if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); // color correction from CCT
498498

@@ -528,7 +528,7 @@ void IRAM_ATTR_YN BusNetwork::setPixelColor(uint16_t pix, uint32_t c) {
528528
}
529529

530530
uint32_t IRAM_ATTR_YN BusNetwork::getPixelColor(uint16_t pix) const {
531-
if (!_valid || pix >= _len) return 0;
531+
if (pix >= _len) return 0;
532532
uint16_t offset = pix * _UDPchannels;
533533
uint8_t co = _colorOrderMap.getPixelColorOrder(pix + _start, _colorOrder);
534534

@@ -567,6 +567,7 @@ void BusNetwork::cleanup() {
567567
_valid = false;
568568
if (_data != nullptr) free(_data);
569569
_data = nullptr;
570+
_len = 0;
570571
}
571572

572573
// ***************************************************************************
@@ -1057,7 +1058,7 @@ BusHub75Matrix::BusHub75Matrix(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWh
10571058
}
10581059

10591060
void __attribute__((hot)) IRAM_ATTR BusHub75Matrix::setPixelColor(uint16_t pix, uint32_t c) {
1060-
if (!_valid || pix >= _len) return;
1061+
if ( pix >= _len) return;
10611062
// if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT
10621063

10631064
if (_ledBuffer) {
@@ -1098,12 +1099,12 @@ void __attribute__((hot)) IRAM_ATTR BusHub75Matrix::setPixelColor(uint16_t pix,
10981099
}
10991100

11001101
uint32_t IRAM_ATTR BusHub75Matrix::getPixelColor(uint16_t pix) const {
1101-
if (!_valid || pix >= _len || !_ledBuffer) return BLACK;
1102+
if (pix >= _len || !_ledBuffer) return BLACK;
11021103
return uint32_t(_ledBuffer[pix].scale8(_bri)) & 0x00FFFFFF; // scale8() is needed to mimic NeoPixelBus, which returns scaled-down colours
11031104
}
11041105

11051106
uint32_t __attribute__((hot)) IRAM_ATTR BusHub75Matrix::getPixelColorRestored(uint16_t pix) const {
1106-
if (!_valid || pix >= _len || !_ledBuffer) return BLACK;
1107+
if (pix >= _len || !_ledBuffer) return BLACK;
11071108
return uint32_t(_ledBuffer[pix]) & 0x00FFFFFF;
11081109
}
11091110

@@ -1176,6 +1177,7 @@ void BusHub75Matrix::cleanup() {
11761177

11771178
_valid = false;
11781179
deallocatePins();
1180+
_len = 0;
11791181
//if (fourScanPanel != nullptr) delete fourScanPanel; // warning: deleting object of polymorphic class type 'VirtualMatrixPanel' which has non-virtual destructor might cause undefined behavior
11801182
#if !defined(CONFIG_IDF_TARGET_ESP32S3) // S3: don't delete, as we want to re-use the driver later
11811183
if (display) delete display;
@@ -1238,6 +1240,12 @@ uint32_t BusManager::memUsage(BusConfig &bc) {
12381240

12391241
int BusManager::add(BusConfig &bc) {
12401242
if (getNumBusses() - getNumVirtualBusses() >= WLED_MAX_BUSSES) return -1;
1243+
// WLEDMM clear cached Bus info first
1244+
lastend = 0;
1245+
laststart = 0;
1246+
lastBus = nullptr;
1247+
slowMode = false;
1248+
12411249
DEBUG_PRINTF("BusManager::add(bc.type=%u)\n", bc.type);
12421250
if (bc.type >= TYPE_NET_DDP_RGB && bc.type < 96) {
12431251
busses[numBusses] = new BusNetwork(bc, colorOrderMap);
@@ -1257,11 +1265,6 @@ int BusManager::add(BusConfig &bc) {
12571265
} else {
12581266
busses[numBusses] = new BusPwm(bc);
12591267
}
1260-
// WLEDMM clear cached Bus info
1261-
lastBus = nullptr;
1262-
laststart = 0;
1263-
lastend = 0;
1264-
slowMode = false;
12651268
return numBusses++;
12661269
}
12671270

@@ -1295,20 +1298,21 @@ void __attribute__((hot)) BusManager::show() {
12951298

12961299
void BusManager::setStatusPixel(uint32_t c) {
12971300
for (uint8_t i = 0; i < numBusses; i++) {
1301+
if (busses[i]->isOk() == false) continue; // WLEDMM ignore invalid (=not ready) busses
12981302
busses[i]->setStatusPixel(c);
12991303
}
13001304
}
13011305

13021306
void IRAM_ATTR __attribute__((hot)) BusManager::setPixelColor(uint16_t pix, uint32_t c, int16_t cct) {
1303-
if ( !slowMode && (pix >= laststart) && (pix < lastend ) && (lastBus != nullptr)) {
1307+
if (!slowMode && (pix >= laststart) && (pix < lastend ) && lastBus->isOk()) {
13041308
// WLEDMM same bus as last time - no need to search again
13051309
lastBus->setPixelColor(pix - laststart, c);
13061310
return;
13071311
}
13081312

13091313
for (uint_fast8_t i = 0; i < numBusses; i++) { // WLEDMM use fast native types
13101314
Bus* b = busses[i];
1311-
if (b->isValid() == false) continue; // WLEDMM ignore invalid (=not ready) busses
1315+
if (b->isOk() == false) continue; // WLEDMM ignore invalid (=not ready) busses
13121316
uint_fast16_t bstart = b->getStart();
13131317
if (pix < bstart || pix >= bstart + b->getLength()) continue;
13141318
else {
@@ -1340,14 +1344,14 @@ void __attribute__((cold)) BusManager::setSegmentCCT(int16_t cct, bool allowWBCo
13401344
}
13411345

13421346
uint32_t IRAM_ATTR __attribute__((hot)) BusManager::getPixelColor(uint_fast16_t pix) { // WLEDMM use fast native types, IRAM_ATTR
1343-
if ( !slowMode && (pix >= laststart) && (pix < lastend ) && (lastBus != nullptr)) {
1347+
if ((pix >= laststart) && (pix < lastend ) && (lastBus != nullptr) && lastBus->isOk()) {
13441348
// WLEDMM same bus as last time - no need to search again
13451349
return lastBus->getPixelColor(pix - laststart);
13461350
}
13471351

13481352
for (uint_fast8_t i = 0; i < numBusses; i++) {
13491353
Bus* b = busses[i];
1350-
if (b->isValid() == false) continue; // WLEDMM ignore invalid (=not ready) busses
1354+
if (b->isOk() == false) continue; // WLEDMM ignore invalid (=not ready) busses
13511355
uint_fast16_t bstart = b->getStart();
13521356
if (pix < bstart || pix >= bstart + b->getLength()) continue;
13531357
else {
@@ -1364,14 +1368,14 @@ uint32_t IRAM_ATTR __attribute__((hot)) BusManager::getPixelColor(uint_fast16_t
13641368
}
13651369

13661370
uint32_t IRAM_ATTR __attribute__((hot)) BusManager::getPixelColorRestored(uint_fast16_t pix) { // WLEDMM uses bus::getPixelColorRestored()
1367-
if ( !slowMode && (pix >= laststart) && (pix < lastend ) && (lastBus != nullptr)) {
1371+
if ((pix >= laststart) && (pix < lastend ) && (lastBus != nullptr) && lastBus->isOk()) {
13681372
// WLEDMM same bus as last time - no need to search again
13691373
return lastBus->getPixelColorRestored(pix - laststart);
13701374
}
13711375

13721376
for (uint_fast8_t i = 0; i < numBusses; i++) {
13731377
Bus* b = busses[i];
1374-
if (b->isValid() == false) continue; // WLEDMM ignore invalid (=not ready) busses
1378+
if (b->isOk() == false) continue; // WLEDMM ignore invalid (=not ready) busses
13751379
uint_fast16_t bstart = b->getStart();
13761380
if (pix < bstart || pix >= bstart + b->getLength()) continue;
13771381
else {

wled00/bus_manager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ class Bus {
190190
inline uint8_t getAutoWhiteMode() const { return _autoWhiteMode; }
191191
inline static void setGlobalAWMode(uint8_t m) { if (m < 5) _gAWM = m; else _gAWM = AW_GLOBAL_DISABLED; }
192192
inline static uint8_t getGlobalAWMode() { return _gAWM; }
193-
inline bool isValid() const {return _valid;}
194193

195194
inline static uint32_t restore_Color_Lossy(uint32_t c, uint8_t restoreBri) { // shamelessly grabbed from upstream, who grabbed from NPB, who ..
196195
if (restoreBri < 255) {

0 commit comments

Comments
 (0)