Skip to content

Commit a98685d

Browse files
committed
Remove numBusses, RMT idle bugfix
- experiment with std::unique_ptr
1 parent 1c4ba20 commit a98685d

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

wled00/FX_fcn.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,8 +1254,9 @@ void WS2812FX::finalizeInit() {
12541254
digitalCount = 0;
12551255
for (const auto &bus : busConfigs) {
12561256
mem += bus.memUsage(Bus::isDigital(bus.type) && !Bus::is2Pin(bus.type) ? digitalCount++ : 0); // includes global buffer
1257-
if (mem <= MAX_LED_MEMORY) BusManager::add(bus);
1258-
else DEBUG_PRINTF_P(PSTR("Out of LED memory! Bus %d (%d) #%u not created."), (int)bus.type, (int)bus.count, digitalCount);
1257+
if (mem <= MAX_LED_MEMORY) {
1258+
if (BusManager::add(bus) == -1) break;
1259+
} else DEBUG_PRINTF_P(PSTR("Out of LED memory! Bus %d (%d) #%u not created."), (int)bus.type, (int)bus.count, digitalCount);
12591260
}
12601261
busConfigs.clear();
12611262
busConfigs.shrink_to_fit();

wled00/bus_manager.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "pin_manager.h"
2121
#include "bus_manager.h"
2222
#include "bus_wrapper.h"
23+
#include <bits/unique_ptr.h>
2324

2425
extern bool cctICused;
2526
extern bool useParallelI2S;
@@ -825,15 +826,21 @@ unsigned BusManager::memUsage() {
825826
}
826827

827828
int BusManager::add(const BusConfig &bc) {
828-
DEBUGBUS_PRINTF_P(PSTR("Bus: Adding bus #%d (%d - %d >= %d)\n"), busses.size(), getNumBusses(), getNumVirtualBusses(), WLED_MAX_BUSSES);
829+
DEBUGBUS_PRINTF_P(PSTR("Bus: Adding bus (%d - %d >= %d)\n"), getNumBusses(), getNumVirtualBusses(), WLED_MAX_BUSSES);
829830
if (getNumBusses() - getNumVirtualBusses() >= WLED_MAX_BUSSES) return -1;
831+
unsigned numDigital = 0;
832+
for (const auto &bus : busses) if (bus->isDigital() && !bus->is2Pin()) numDigital++;
830833
if (Bus::isVirtual(bc.type)) {
834+
//busses.push_back(std::make_unique<BusNetwork>(bc)); // when C++ >11
831835
busses.push_back(new BusNetwork(bc));
832836
} else if (Bus::isDigital(bc.type)) {
833-
busses.push_back(new BusDigital(bc, busses.size(), colorOrderMap));
837+
//busses.push_back(std::make_unique<BusDigital>(bc, numDigital, colorOrderMap));
838+
busses.push_back(new BusDigital(bc, numDigital, colorOrderMap));
834839
} else if (Bus::isOnOff(bc.type)) {
840+
//busses.push_back(std::make_unique<BusOnOff>(bc));
835841
busses.push_back(new BusOnOff(bc));
836842
} else {
843+
//busses.push_back(std::make_unique<BusPwm>(bc));
837844
busses.push_back(new BusPwm(bc));
838845
}
839846
return busses.size();
@@ -878,7 +885,7 @@ void BusManager::removeAll() {
878885
DEBUGBUS_PRINTLN(F("Removing all."));
879886
//prevents crashes due to deleting busses while in use.
880887
while (!canAllShow()) yield();
881-
for (auto &bus : busses) delete bus;
888+
for (auto &bus : busses) delete bus; // needed when not using std::unique_ptr C++ >11
882889
busses.clear();
883890
PolyBus::setParallelI2S1Output(false);
884891
}
@@ -890,7 +897,9 @@ void BusManager::removeAll() {
890897
void BusManager::esp32RMTInvertIdle() {
891898
bool idle_out;
892899
unsigned rmt = 0;
893-
for (unsigned u = 0; u < busses.size(); u++) {
900+
unsigned u = 0;
901+
for (auto &bus : busses) {
902+
if (bus->getLength()==0 || !bus->isDigital() || bus->is2Pin()) continue;
894903
#if defined(CONFIG_IDF_TARGET_ESP32C3) // 2 RMT, only has 1 I2S but NPB does not support it ATM
895904
if (u > 1) return;
896905
rmt = u;
@@ -901,12 +910,11 @@ void BusManager::esp32RMTInvertIdle() {
901910
if (u > 3) return;
902911
rmt = u;
903912
#else
904-
unsigned numI2S = 1 + PolyBus::isParallelI2S1Output()*7;
905-
if (u < numI2S) continue;
906-
if (u >= numI2S + 8) return; // only 8 RMT channels
913+
unsigned numI2S = !PolyBus::isParallelI2S1Output(); // if using parallel I2S, RMT is used 1st
914+
if (numI2S > u) continue;
915+
if (u > 7 + numI2S) return;
907916
rmt = u - numI2S;
908917
#endif
909-
if (busses[u]->getLength()==0 || !busses[u]->isDigital() || busses[u]->is2Pin()) continue;
910918
//assumes that bus number to rmt channel mapping stays 1:1
911919
rmt_channel_t ch = static_cast<rmt_channel_t>(rmt);
912920
rmt_idle_level_t lvl;
@@ -915,6 +923,7 @@ void BusManager::esp32RMTInvertIdle() {
915923
else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH;
916924
else continue;
917925
rmt_set_idle_level(ch, idle_out, lvl);
926+
u++
918927
}
919928
}
920929
#endif
@@ -1023,6 +1032,7 @@ uint8_t Bus::_gAWM = 255;
10231032

10241033
uint16_t BusDigital::_milliAmpsTotal = 0;
10251034

1035+
//std::vector<std::unique_ptr<Bus>> BusManager::busses;
10261036
std::vector<Bus*> BusManager::busses;
10271037
ColorOrderMap BusManager::colorOrderMap = {};
10281038
uint16_t BusManager::_milliAmpsUsed = 0;

wled00/bus_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "const.h"
1010
#include "pin_manager.h"
1111
#include <vector>
12+
#include <memory>
1213

1314
// enable additional debug output
1415
#if defined(WLED_DEBUG_HOST)
@@ -455,6 +456,7 @@ class BusManager {
455456
static inline ColorOrderMap& getColorOrderMap() { return colorOrderMap; }
456457

457458
private:
459+
//static std::vector<std::unique_ptr<Bus>> busses; // we'd need C++ >11
458460
static std::vector<Bus*> busses;
459461
static ColorOrderMap colorOrderMap;
460462
static uint16_t _milliAmpsUsed;

0 commit comments

Comments
 (0)