mirror of
https://github.com/wled/WLED.git
synced 2025-07-16 07:16:31 +00:00
Remove numBusses, RMT idle bugfix
- experiment with std::unique_ptr
This commit is contained in:
parent
1c4ba20646
commit
a98685d89e
@ -1254,8 +1254,9 @@ void WS2812FX::finalizeInit() {
|
|||||||
digitalCount = 0;
|
digitalCount = 0;
|
||||||
for (const auto &bus : busConfigs) {
|
for (const auto &bus : busConfigs) {
|
||||||
mem += bus.memUsage(Bus::isDigital(bus.type) && !Bus::is2Pin(bus.type) ? digitalCount++ : 0); // includes global buffer
|
mem += bus.memUsage(Bus::isDigital(bus.type) && !Bus::is2Pin(bus.type) ? digitalCount++ : 0); // includes global buffer
|
||||||
if (mem <= MAX_LED_MEMORY) BusManager::add(bus);
|
if (mem <= MAX_LED_MEMORY) {
|
||||||
else DEBUG_PRINTF_P(PSTR("Out of LED memory! Bus %d (%d) #%u not created."), (int)bus.type, (int)bus.count, digitalCount);
|
if (BusManager::add(bus) == -1) break;
|
||||||
|
} else DEBUG_PRINTF_P(PSTR("Out of LED memory! Bus %d (%d) #%u not created."), (int)bus.type, (int)bus.count, digitalCount);
|
||||||
}
|
}
|
||||||
busConfigs.clear();
|
busConfigs.clear();
|
||||||
busConfigs.shrink_to_fit();
|
busConfigs.shrink_to_fit();
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "pin_manager.h"
|
#include "pin_manager.h"
|
||||||
#include "bus_manager.h"
|
#include "bus_manager.h"
|
||||||
#include "bus_wrapper.h"
|
#include "bus_wrapper.h"
|
||||||
|
#include <bits/unique_ptr.h>
|
||||||
|
|
||||||
extern bool cctICused;
|
extern bool cctICused;
|
||||||
extern bool useParallelI2S;
|
extern bool useParallelI2S;
|
||||||
@ -825,15 +826,21 @@ unsigned BusManager::memUsage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BusManager::add(const BusConfig &bc) {
|
int BusManager::add(const BusConfig &bc) {
|
||||||
DEBUGBUS_PRINTF_P(PSTR("Bus: Adding bus #%d (%d - %d >= %d)\n"), busses.size(), getNumBusses(), getNumVirtualBusses(), WLED_MAX_BUSSES);
|
DEBUGBUS_PRINTF_P(PSTR("Bus: Adding bus (%d - %d >= %d)\n"), getNumBusses(), getNumVirtualBusses(), WLED_MAX_BUSSES);
|
||||||
if (getNumBusses() - getNumVirtualBusses() >= WLED_MAX_BUSSES) return -1;
|
if (getNumBusses() - getNumVirtualBusses() >= WLED_MAX_BUSSES) return -1;
|
||||||
|
unsigned numDigital = 0;
|
||||||
|
for (const auto &bus : busses) if (bus->isDigital() && !bus->is2Pin()) numDigital++;
|
||||||
if (Bus::isVirtual(bc.type)) {
|
if (Bus::isVirtual(bc.type)) {
|
||||||
|
//busses.push_back(std::make_unique<BusNetwork>(bc)); // when C++ >11
|
||||||
busses.push_back(new BusNetwork(bc));
|
busses.push_back(new BusNetwork(bc));
|
||||||
} else if (Bus::isDigital(bc.type)) {
|
} else if (Bus::isDigital(bc.type)) {
|
||||||
busses.push_back(new BusDigital(bc, busses.size(), colorOrderMap));
|
//busses.push_back(std::make_unique<BusDigital>(bc, numDigital, colorOrderMap));
|
||||||
|
busses.push_back(new BusDigital(bc, numDigital, colorOrderMap));
|
||||||
} else if (Bus::isOnOff(bc.type)) {
|
} else if (Bus::isOnOff(bc.type)) {
|
||||||
|
//busses.push_back(std::make_unique<BusOnOff>(bc));
|
||||||
busses.push_back(new BusOnOff(bc));
|
busses.push_back(new BusOnOff(bc));
|
||||||
} else {
|
} else {
|
||||||
|
//busses.push_back(std::make_unique<BusPwm>(bc));
|
||||||
busses.push_back(new BusPwm(bc));
|
busses.push_back(new BusPwm(bc));
|
||||||
}
|
}
|
||||||
return busses.size();
|
return busses.size();
|
||||||
@ -878,7 +885,7 @@ void BusManager::removeAll() {
|
|||||||
DEBUGBUS_PRINTLN(F("Removing all."));
|
DEBUGBUS_PRINTLN(F("Removing all."));
|
||||||
//prevents crashes due to deleting busses while in use.
|
//prevents crashes due to deleting busses while in use.
|
||||||
while (!canAllShow()) yield();
|
while (!canAllShow()) yield();
|
||||||
for (auto &bus : busses) delete bus;
|
for (auto &bus : busses) delete bus; // needed when not using std::unique_ptr C++ >11
|
||||||
busses.clear();
|
busses.clear();
|
||||||
PolyBus::setParallelI2S1Output(false);
|
PolyBus::setParallelI2S1Output(false);
|
||||||
}
|
}
|
||||||
@ -890,7 +897,9 @@ void BusManager::removeAll() {
|
|||||||
void BusManager::esp32RMTInvertIdle() {
|
void BusManager::esp32RMTInvertIdle() {
|
||||||
bool idle_out;
|
bool idle_out;
|
||||||
unsigned rmt = 0;
|
unsigned rmt = 0;
|
||||||
for (unsigned u = 0; u < busses.size(); u++) {
|
unsigned u = 0;
|
||||||
|
for (auto &bus : busses) {
|
||||||
|
if (bus->getLength()==0 || !bus->isDigital() || bus->is2Pin()) continue;
|
||||||
#if defined(CONFIG_IDF_TARGET_ESP32C3) // 2 RMT, only has 1 I2S but NPB does not support it ATM
|
#if defined(CONFIG_IDF_TARGET_ESP32C3) // 2 RMT, only has 1 I2S but NPB does not support it ATM
|
||||||
if (u > 1) return;
|
if (u > 1) return;
|
||||||
rmt = u;
|
rmt = u;
|
||||||
@ -901,12 +910,11 @@ void BusManager::esp32RMTInvertIdle() {
|
|||||||
if (u > 3) return;
|
if (u > 3) return;
|
||||||
rmt = u;
|
rmt = u;
|
||||||
#else
|
#else
|
||||||
unsigned numI2S = 1 + PolyBus::isParallelI2S1Output()*7;
|
unsigned numI2S = !PolyBus::isParallelI2S1Output(); // if using parallel I2S, RMT is used 1st
|
||||||
if (u < numI2S) continue;
|
if (numI2S > u) continue;
|
||||||
if (u >= numI2S + 8) return; // only 8 RMT channels
|
if (u > 7 + numI2S) return;
|
||||||
rmt = u - numI2S;
|
rmt = u - numI2S;
|
||||||
#endif
|
#endif
|
||||||
if (busses[u]->getLength()==0 || !busses[u]->isDigital() || busses[u]->is2Pin()) continue;
|
|
||||||
//assumes that bus number to rmt channel mapping stays 1:1
|
//assumes that bus number to rmt channel mapping stays 1:1
|
||||||
rmt_channel_t ch = static_cast<rmt_channel_t>(rmt);
|
rmt_channel_t ch = static_cast<rmt_channel_t>(rmt);
|
||||||
rmt_idle_level_t lvl;
|
rmt_idle_level_t lvl;
|
||||||
@ -915,6 +923,7 @@ void BusManager::esp32RMTInvertIdle() {
|
|||||||
else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH;
|
else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH;
|
||||||
else continue;
|
else continue;
|
||||||
rmt_set_idle_level(ch, idle_out, lvl);
|
rmt_set_idle_level(ch, idle_out, lvl);
|
||||||
|
u++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1023,6 +1032,7 @@ uint8_t Bus::_gAWM = 255;
|
|||||||
|
|
||||||
uint16_t BusDigital::_milliAmpsTotal = 0;
|
uint16_t BusDigital::_milliAmpsTotal = 0;
|
||||||
|
|
||||||
|
//std::vector<std::unique_ptr<Bus>> BusManager::busses;
|
||||||
std::vector<Bus*> BusManager::busses;
|
std::vector<Bus*> BusManager::busses;
|
||||||
ColorOrderMap BusManager::colorOrderMap = {};
|
ColorOrderMap BusManager::colorOrderMap = {};
|
||||||
uint16_t BusManager::_milliAmpsUsed = 0;
|
uint16_t BusManager::_milliAmpsUsed = 0;
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "pin_manager.h"
|
#include "pin_manager.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
// enable additional debug output
|
// enable additional debug output
|
||||||
#if defined(WLED_DEBUG_HOST)
|
#if defined(WLED_DEBUG_HOST)
|
||||||
@ -455,6 +456,7 @@ class BusManager {
|
|||||||
static inline ColorOrderMap& getColorOrderMap() { return colorOrderMap; }
|
static inline ColorOrderMap& getColorOrderMap() { return colorOrderMap; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
//static std::vector<std::unique_ptr<Bus>> busses; // we'd need C++ >11
|
||||||
static std::vector<Bus*> busses;
|
static std::vector<Bus*> busses;
|
||||||
static ColorOrderMap colorOrderMap;
|
static ColorOrderMap colorOrderMap;
|
||||||
static uint16_t _milliAmpsUsed;
|
static uint16_t _milliAmpsUsed;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user