@@ -755,6 +755,26 @@ void BusNetwork::cleanup() {
755755}
756756
757757
758+ BusPlaceholder::BusPlaceholder (const BusConfig &bc)
759+ : Bus(bc.type, bc.start, bc.autoWhite, bc.count, bc.reversed, bc.refreshReq)
760+ , _colorOrder(bc.colorOrder)
761+ , _skipAmount(bc.skipAmount)
762+ , _frequency(bc.frequency)
763+ , _milliAmpsPerLed(bc.milliAmpsPerLed)
764+ , _milliAmpsMax(bc.milliAmpsMax)
765+ , _text(bc.text)
766+ {
767+ memcpy (_pins, bc.pins , sizeof (_pins));
768+ }
769+
770+ size_t BusPlaceholder::getPins (uint8_t * pinArray) const {
771+ size_t nPins = Bus::getNumberOfPins (_type);
772+ if (pinArray) {
773+ for (size_t i = 0 ; i < nPins; i++) pinArray[i] = _pins[i];
774+ }
775+ return nPins;
776+ }
777+
758778// utility to get the approx. memory usage of a given BusConfig
759779size_t BusConfig::memUsage (unsigned nr) const {
760780 if (Bus::isVirtual (type)) {
@@ -797,7 +817,7 @@ size_t BusManager::memUsage() {
797817 return size + maxI2S;
798818}
799819
800- int BusManager::add (const BusConfig &bc) {
820+ int BusManager::add (const BusConfig &bc, bool placeholder ) {
801821 DEBUGBUS_PRINTF_P (PSTR (" Bus: Adding bus (p:%d v:%d)\n " ), getNumBusses (), getNumVirtualBusses ());
802822 unsigned digital = 0 ;
803823 unsigned analog = 0 ;
@@ -807,8 +827,10 @@ int BusManager::add(const BusConfig &bc) {
807827 if (bus->isDigital () && !bus->is2Pin ()) digital++;
808828 if (bus->is2Pin ()) twoPin++;
809829 }
810- if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) return -1 ;
811- if (Bus::isVirtual (bc.type )) {
830+ if (digital > WLED_MAX_DIGITAL_CHANNELS || analog > WLED_MAX_ANALOG_CHANNELS) placeholder = true ;
831+ if (placeholder) {
832+ busses.push_back (make_unique<BusPlaceholder>(bc));
833+ } else if (Bus::isVirtual (bc.type )) {
812834 busses.push_back (make_unique<BusNetwork>(bc));
813835 } else if (Bus::isDigital (bc.type )) {
814836 busses.push_back (make_unique<BusDigital>(bc, Bus::is2Pin (bc.type ) ? twoPin : digital));
@@ -907,7 +929,7 @@ void BusManager::on() {
907929 if (PinManager::getPinOwner (LED_BUILTIN) == PinOwner::BusDigital) {
908930 for (auto &bus : busses) {
909931 uint8_t pins[2 ] = {255 ,255 };
910- if (bus->isDigital () && bus->getPins (pins)) {
932+ if (bus->isDigital () && bus->getPins (pins) && bus-> isOk () ) {
911933 if (pins[0 ] == LED_BUILTIN || pins[1 ] == LED_BUILTIN) {
912934 BusDigital &b = static_cast <BusDigital&>(*bus);
913935 b.begin ();
@@ -1002,7 +1024,7 @@ void BusManager::initializeABL() {
10021024 _useABL = true ; // at least one bus has ABL set
10031025 uint32_t ESPshare = MA_FOR_ESP / numABLbuses; // share of ESP current per ABL bus
10041026 for (auto &bus : busses) {
1005- if (bus->isDigital ()) {
1027+ if (bus->isDigital () && bus-> isOk () ) {
10061028 BusDigital &busd = static_cast <BusDigital&>(*bus);
10071029 uint32_t busLength = busd.getLength ();
10081030 uint32_t busDemand = busLength * busd.getLEDCurrent ();
0 commit comments