2020#include " pin_manager.h"
2121#include " bus_manager.h"
2222#include " bus_wrapper.h"
23+ #include < bits/unique_ptr.h>
2324
2425extern bool cctICused;
2526extern bool useParallelI2S;
@@ -825,15 +826,21 @@ unsigned BusManager::memUsage() {
825826}
826827
827828int 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() {
890897void 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
10241033uint16_t BusDigital::_milliAmpsTotal = 0 ;
10251034
1035+ // std::vector<std::unique_ptr<Bus>> BusManager::busses;
10261036std::vector<Bus*> BusManager::busses;
10271037ColorOrderMap BusManager::colorOrderMap = {};
10281038uint16_t BusManager::_milliAmpsUsed = 0 ;
0 commit comments