@@ -492,7 +492,7 @@ BusNetwork::BusNetwork(BusConfig &bc, const ColorOrderMap &com) : Bus(bc.type, b
492492}
493493
494494void 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
530530uint32_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
10591060void __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
11001101uint32_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
11051106uint32_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
12391241int 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
12961299void 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
13021306void 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
13421346uint32_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
13661370uint32_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 {
0 commit comments