@@ -1105,6 +1105,26 @@ size_t BusHub75Matrix::getPins(uint8_t* pinArray) const {
11051105#endif
11061106// ***************************************************************************
11071107
1108+ BusPlaceholder::BusPlaceholder (const BusConfig &bc)
1109+ : Bus(bc.type, bc.start, bc.autoWhite, bc.count, bc.reversed, bc.refreshReq)
1110+ , _colorOrder(bc.colorOrder)
1111+ , _skipAmount(bc.skipAmount)
1112+ , _frequency(bc.frequency)
1113+ , _milliAmpsPerLed(bc.milliAmpsPerLed)
1114+ , _milliAmpsMax(bc.milliAmpsMax)
1115+ , _text(bc.text)
1116+ {
1117+ memcpy (_pins, bc.pins , sizeof (_pins));
1118+ }
1119+
1120+ size_t BusPlaceholder::getPins (uint8_t * pinArray) const {
1121+ size_t nPins = Bus::getNumberOfPins (_type);
1122+ if (pinArray) {
1123+ for (size_t i = 0 ; i < nPins; i++) pinArray[i] = _pins[i];
1124+ }
1125+ return nPins;
1126+ }
1127+
11081128// utility to get the approx. memory usage of a given BusConfig
11091129size_t BusConfig::memUsage (unsigned nr) const {
11101130 if (Bus::isVirtual (type)) {
@@ -1148,7 +1168,7 @@ size_t BusManager::memUsage() {
11481168 return size + maxI2S;
11491169}
11501170
1151- int BusManager::add (const BusConfig &bc) {
1171+ int BusManager::add (const BusConfig &bc, bool placeholder ) {
11521172 DEBUGBUS_PRINTF_P (PSTR (" Bus: Adding bus (p:%d v:%d)\n " ), getNumBusses (), getNumVirtualBusses ());
11531173 unsigned digital = 0 ;
11541174 unsigned analog = 0 ;
@@ -1158,8 +1178,12 @@ int BusManager::add(const BusConfig &bc) {
11581178 if (bus->isDigital () && !bus->is2Pin ()) digital++;
11591179 if (bus->is2Pin ()) twoPin++;
11601180 }
1161- if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) return -1 ;
1162- if (Bus::isVirtual (bc.type )) {
1181+ digital += (Bus::isDigital (bc.type ) && !Bus::is2Pin (bc.type ));
1182+ analog += (Bus::isPWM (bc.type ) ? Bus::numPWMPins (bc.type ) : 0 );
1183+ if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) placeholder = true ; // TODO: add errorFlag here
1184+ if (placeholder) {
1185+ busses.push_back (make_unique<BusPlaceholder>(bc));
1186+ } else if (Bus::isVirtual (bc.type )) {
11631187 busses.push_back (make_unique<BusNetwork>(bc));
11641188#ifdef WLED_ENABLE_HUB75MATRIX
11651189 } else if (Bus::isHub75 (bc.type )) {
@@ -1266,7 +1290,7 @@ void BusManager::on() {
12661290 if (PinManager::getPinOwner (LED_BUILTIN) == PinOwner::BusDigital) {
12671291 for (auto &bus : busses) {
12681292 uint8_t pins[2 ] = {255 ,255 };
1269- if (bus->isDigital () && bus->getPins (pins)) {
1293+ if (bus->isDigital () && bus->getPins (pins) && bus-> isOk () ) {
12701294 if (pins[0 ] == LED_BUILTIN || pins[1 ] == LED_BUILTIN) {
12711295 BusDigital &b = static_cast <BusDigital&>(*bus);
12721296 b.begin ();
@@ -1361,7 +1385,7 @@ void BusManager::initializeABL() {
13611385 _useABL = true ; // at least one bus has ABL set
13621386 uint32_t ESPshare = MA_FOR_ESP / numABLbuses; // share of ESP current per ABL bus
13631387 for (auto &bus : busses) {
1364- if (bus->isDigital ()) {
1388+ if (bus->isDigital () && bus-> isOk () ) {
13651389 BusDigital &busd = static_cast <BusDigital&>(*bus);
13661390 uint32_t busLength = busd.getLength ();
13671391 uint32_t busDemand = busLength * busd.getLEDCurrent ();
0 commit comments