Fix for cfg exceeding LED limit (#4939)
* Safety Checks for UI, fix for cfg exceeding LED limit * improvements to low heap check * add `isPlaceholder()` to bus, some fixes * remove `disableForceReconnect` for better future implementation * add "glitch gating" for C3 and check heapy every 5 seconds instead of every secondd * replace magic number with the correct define, more robust bus defer by look-ahead In the event that a Bus fails to initialize, or the memory validation fails, keep the configuration around so the settings contents don't change out from under the user. --------- Co-authored-by: Will Miles <will@willmiles.net>
This commit is contained in:
@@ -1105,6 +1105,26 @@ size_t BusHub75Matrix::getPins(uint8_t* pinArray) const {
|
||||
#endif
|
||||
// ***************************************************************************
|
||||
|
||||
BusPlaceholder::BusPlaceholder(const BusConfig &bc)
|
||||
: Bus(bc.type, bc.start, bc.autoWhite, bc.count, bc.reversed, bc.refreshReq)
|
||||
, _colorOrder(bc.colorOrder)
|
||||
, _skipAmount(bc.skipAmount)
|
||||
, _frequency(bc.frequency)
|
||||
, _milliAmpsPerLed(bc.milliAmpsPerLed)
|
||||
, _milliAmpsMax(bc.milliAmpsMax)
|
||||
, _text(bc.text)
|
||||
{
|
||||
memcpy(_pins, bc.pins, sizeof(_pins));
|
||||
}
|
||||
|
||||
size_t BusPlaceholder::getPins(uint8_t* pinArray) const {
|
||||
size_t nPins = Bus::getNumberOfPins(_type);
|
||||
if (pinArray) {
|
||||
for (size_t i = 0; i < nPins; i++) pinArray[i] = _pins[i];
|
||||
}
|
||||
return nPins;
|
||||
}
|
||||
|
||||
//utility to get the approx. memory usage of a given BusConfig
|
||||
size_t BusConfig::memUsage(unsigned nr) const {
|
||||
if (Bus::isVirtual(type)) {
|
||||
@@ -1148,7 +1168,7 @@ size_t BusManager::memUsage() {
|
||||
return size + maxI2S;
|
||||
}
|
||||
|
||||
int BusManager::add(const BusConfig &bc) {
|
||||
int BusManager::add(const BusConfig &bc, bool placeholder) {
|
||||
DEBUGBUS_PRINTF_P(PSTR("Bus: Adding bus (p:%d v:%d)\n"), getNumBusses(), getNumVirtualBusses());
|
||||
unsigned digital = 0;
|
||||
unsigned analog = 0;
|
||||
@@ -1158,8 +1178,12 @@ int BusManager::add(const BusConfig &bc) {
|
||||
if (bus->isDigital() && !bus->is2Pin()) digital++;
|
||||
if (bus->is2Pin()) twoPin++;
|
||||
}
|
||||
if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) return -1;
|
||||
if (Bus::isVirtual(bc.type)) {
|
||||
digital += (Bus::isDigital(bc.type) && !Bus::is2Pin(bc.type));
|
||||
analog += (Bus::isPWM(bc.type) ? Bus::numPWMPins(bc.type) : 0);
|
||||
if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) placeholder = true; // TODO: add errorFlag here
|
||||
if (placeholder) {
|
||||
busses.push_back(make_unique<BusPlaceholder>(bc));
|
||||
} else if (Bus::isVirtual(bc.type)) {
|
||||
busses.push_back(make_unique<BusNetwork>(bc));
|
||||
#ifdef WLED_ENABLE_HUB75MATRIX
|
||||
} else if (Bus::isHub75(bc.type)) {
|
||||
@@ -1266,7 +1290,7 @@ void BusManager::on() {
|
||||
if (PinManager::getPinOwner(LED_BUILTIN) == PinOwner::BusDigital) {
|
||||
for (auto &bus : busses) {
|
||||
uint8_t pins[2] = {255,255};
|
||||
if (bus->isDigital() && bus->getPins(pins)) {
|
||||
if (bus->isDigital() && bus->getPins(pins) && bus->isOk()) {
|
||||
if (pins[0] == LED_BUILTIN || pins[1] == LED_BUILTIN) {
|
||||
BusDigital &b = static_cast<BusDigital&>(*bus);
|
||||
b.begin();
|
||||
@@ -1361,7 +1385,7 @@ void BusManager::initializeABL() {
|
||||
_useABL = true; // at least one bus has ABL set
|
||||
uint32_t ESPshare = MA_FOR_ESP / numABLbuses; // share of ESP current per ABL bus
|
||||
for (auto &bus : busses) {
|
||||
if (bus->isDigital()) {
|
||||
if (bus->isDigital() && bus->isOk()) {
|
||||
BusDigital &busd = static_cast<BusDigital&>(*bus);
|
||||
uint32_t busLength = busd.getLength();
|
||||
uint32_t busDemand = busLength * busd.getLEDCurrent();
|
||||
|
||||
Reference in New Issue
Block a user