kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			
							rodzic
							
								
									0af3063127
								
							
						
					
					
						commit
						d13b8c8421
					
				| 
						 | 
				
			
			@ -862,7 +862,7 @@ class WS2812FX {  // 96 bytes
 | 
			
		|||
      isMatrix;
 | 
			
		||||
 | 
			
		||||
#ifndef WLED_DISABLE_2D
 | 
			
		||||
    #define WLED_MAX_PANELS 64
 | 
			
		||||
    #define WLED_MAX_PANELS 18
 | 
			
		||||
    uint8_t
 | 
			
		||||
      panels;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -270,12 +270,6 @@ bool BusDigital::canShow() {
 | 
			
		|||
 | 
			
		||||
void BusDigital::setBrightness(uint8_t b) {
 | 
			
		||||
  if (_bri == b) return;
 | 
			
		||||
  //Fix for turning off onboard LED breaking bus
 | 
			
		||||
  #ifdef LED_BUILTIN
 | 
			
		||||
  if (_bri == 0) { // && b > 0, covered by guard if above
 | 
			
		||||
    if (_pins[0] == LED_BUILTIN || _pins[1] == LED_BUILTIN) reinit();
 | 
			
		||||
  }
 | 
			
		||||
  #endif
 | 
			
		||||
  Bus::setBrightness(b);
 | 
			
		||||
  PolyBus::setBrightness(_busPtr, _iType, b);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -707,6 +701,7 @@ int BusManager::add(BusConfig &bc) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void BusManager::useParallelOutput(void) {
 | 
			
		||||
  _parallelOutputs = 8; // hardcoded since we use NPB I2S x8 methods
 | 
			
		||||
  PolyBus::setParallelI2S1Output();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -717,9 +712,81 @@ void BusManager::removeAll() {
 | 
			
		|||
  while (!canAllShow()) yield();
 | 
			
		||||
  for (unsigned i = 0; i < numBusses; i++) delete busses[i];
 | 
			
		||||
  numBusses = 0;
 | 
			
		||||
  _parallelOutputs = 1;
 | 
			
		||||
  PolyBus::setParallelI2S1Output(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
// #2478
 | 
			
		||||
// If enabled, RMT idle level is set to HIGH when off
 | 
			
		||||
// to prevent leakage current when using an N-channel MOSFET to toggle LED power
 | 
			
		||||
void BusManager::esp32RMTInvertIdle() {
 | 
			
		||||
  bool idle_out;
 | 
			
		||||
  unsigned rmt = 0;
 | 
			
		||||
  for (unsigned u = 0; u < numBusses(); u++) {
 | 
			
		||||
    #if defined(CONFIG_IDF_TARGET_ESP32C3)    // 2 RMT, only has 1 I2S but NPB does not support it ATM
 | 
			
		||||
      if (u > 1) return;
 | 
			
		||||
      rmt = u;
 | 
			
		||||
    #elif defined(CONFIG_IDF_TARGET_ESP32S2)  // 4 RMT, only has 1 I2S bus, supported in NPB
 | 
			
		||||
      if (u > 3) return;
 | 
			
		||||
      rmt = u;
 | 
			
		||||
    #elif defined(CONFIG_IDF_TARGET_ESP32S3)  // 4 RMT, has 2 I2S but NPB does not support them ATM
 | 
			
		||||
      if (u > 3) return;
 | 
			
		||||
      rmt = u;
 | 
			
		||||
    #else
 | 
			
		||||
      if (u < _parallelOutputs) continue;
 | 
			
		||||
      if (u >= _parallelOutputs + 8) return; // only 8 RMT channels
 | 
			
		||||
      rmt = u - _parallelOutputs;
 | 
			
		||||
    #endif
 | 
			
		||||
    if (busses[u]->getLength()==0 || !IS_DIGITAL(busses[u]->getType()) || IS_2PIN(busses[u]->getType())) continue;
 | 
			
		||||
    //assumes that bus number to rmt channel mapping stays 1:1
 | 
			
		||||
    rmt_channel_t ch = static_cast<rmt_channel_t>(rmt);
 | 
			
		||||
    rmt_idle_level_t lvl;
 | 
			
		||||
    rmt_get_idle_level(ch, &idle_out, &lvl);
 | 
			
		||||
    if (lvl == RMT_IDLE_LEVEL_HIGH) lvl = RMT_IDLE_LEVEL_LOW;
 | 
			
		||||
    else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH;
 | 
			
		||||
    else continue;
 | 
			
		||||
    rmt_set_idle_level(ch, idle_out, lvl);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void BusManager::on() {
 | 
			
		||||
  #ifdef ESP8266
 | 
			
		||||
  //Fix for turning off onboard LED breaking bus
 | 
			
		||||
  if (pinManager.getPinOwner(LED_BUILTIN) == PinOwner::BusDigital) {
 | 
			
		||||
    for (unsigned i = 0; i < numBusses; i++) {
 | 
			
		||||
      uint8_t pins[2] = {255,255};
 | 
			
		||||
      if (IS_DIGITAL(busses[i]->getType()) && busses[i]->getPins(pins)) {
 | 
			
		||||
        if (pins[0] == LED_BUILTIN || pins[1] == LED_BUILTIN) {
 | 
			
		||||
          BusDigital *bus = static_cast<BusDigital*>(busses[i]);
 | 
			
		||||
          bus->reinit();
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  #endif
 | 
			
		||||
  #ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
  esp32RMTInvertIdle();
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BusManager::off() {
 | 
			
		||||
  #ifdef ESP8266
 | 
			
		||||
  // turn off built-in LED if strip is turned off
 | 
			
		||||
  // this will break digital bus so will need to be re-initialised on On
 | 
			
		||||
  if (pinManager.getPinOwner(LED_BUILTIN) == PinOwner::BusDigital) {
 | 
			
		||||
    for (unsigned i = 0; i < numBusses; i++) if (busses[i]->isOffRefreshRequired()) return;
 | 
			
		||||
    pinMode(LED_BUILTIN, OUTPUT);
 | 
			
		||||
    digitalWrite(LED_BUILTIN, HIGH);
 | 
			
		||||
  }
 | 
			
		||||
  #endif
 | 
			
		||||
  #ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
  esp32RMTInvertIdle();
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BusManager::show() {
 | 
			
		||||
  _milliAmpsUsed = 0;
 | 
			
		||||
  for (unsigned i = 0; i < numBusses; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -799,4 +866,5 @@ uint8_t       BusManager::numBusses = 0;
 | 
			
		|||
Bus*          BusManager::busses[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES];
 | 
			
		||||
ColorOrderMap BusManager::colorOrderMap = {};
 | 
			
		||||
uint16_t      BusManager::_milliAmpsUsed = 0;
 | 
			
		||||
uint16_t      BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT;
 | 
			
		||||
uint16_t      BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT;
 | 
			
		||||
uint8_t       BusManager::_parallelOutputs = 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -364,6 +364,9 @@ class BusManager {
 | 
			
		|||
    //do not call this method from system context (network callback)
 | 
			
		||||
    static void removeAll();
 | 
			
		||||
 | 
			
		||||
    static void on(void);
 | 
			
		||||
    static void off(void);
 | 
			
		||||
 | 
			
		||||
    static void show();
 | 
			
		||||
    static bool canAllShow();
 | 
			
		||||
    static void setStatusPixel(uint32_t c);
 | 
			
		||||
| 
						 | 
				
			
			@ -391,7 +394,11 @@ class BusManager {
 | 
			
		|||
    static ColorOrderMap colorOrderMap;
 | 
			
		||||
    static uint16_t _milliAmpsUsed;
 | 
			
		||||
    static uint16_t _milliAmpsMax;
 | 
			
		||||
    static uint8_t _parallelOutputs;
 | 
			
		||||
 | 
			
		||||
    #ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
    static void    esp32RMTInvertIdle();
 | 
			
		||||
    #endif
 | 
			
		||||
    static uint8_t getNumVirtualBusses() {
 | 
			
		||||
      int j = 0;
 | 
			
		||||
      for (int i=0; i<numBusses; i++) if (busses[i]->getType() >= TYPE_NET_DDP_RGB && busses[i]->getType() < 96) j++;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -358,69 +358,35 @@ void handleButton()
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If enabled, RMT idle level is set to HIGH when off
 | 
			
		||||
// to prevent leakage current when using an N-channel MOSFET to toggle LED power
 | 
			
		||||
#ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
void esp32RMTInvertIdle()
 | 
			
		||||
{
 | 
			
		||||
  bool idle_out;
 | 
			
		||||
  for (uint8_t u = 0; u < BusManager::getNumBusses(); u++)
 | 
			
		||||
  {
 | 
			
		||||
    if (u > 7) return; // only 8 RMT channels, TODO: ESP32 variants have less RMT channels
 | 
			
		||||
    Bus *bus = BusManager::getBus(u);
 | 
			
		||||
    if (!bus || bus->getLength()==0 || !IS_DIGITAL(bus->getType()) || IS_2PIN(bus->getType())) continue;
 | 
			
		||||
    //assumes that bus number to rmt channel mapping stays 1:1
 | 
			
		||||
    rmt_channel_t ch = static_cast<rmt_channel_t>(u);
 | 
			
		||||
    rmt_idle_level_t lvl;
 | 
			
		||||
    rmt_get_idle_level(ch, &idle_out, &lvl);
 | 
			
		||||
    if (lvl == RMT_IDLE_LEVEL_HIGH) lvl = RMT_IDLE_LEVEL_LOW;
 | 
			
		||||
    else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH;
 | 
			
		||||
    else continue;
 | 
			
		||||
    rmt_set_idle_level(ch, idle_out, lvl);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// handleIO() happens *after* handleTransitions() (see wled.cpp) which may change bri/briT but *before* strip.service()
 | 
			
		||||
// where actual LED painting occurrs
 | 
			
		||||
// this is important for relay control and in the event of turning off on-board LED
 | 
			
		||||
void handleIO()
 | 
			
		||||
{
 | 
			
		||||
  handleButton();
 | 
			
		||||
 | 
			
		||||
  //set relay when LEDs turn on
 | 
			
		||||
  if (strip.getBrightness())
 | 
			
		||||
  {
 | 
			
		||||
  // if we want to control on-board LED (ESP8266) or relay we have to do it here as the final show() may not happen until
 | 
			
		||||
  // next loop() cycle
 | 
			
		||||
  if (strip.getBrightness()) {
 | 
			
		||||
    lastOnTime = millis();
 | 
			
		||||
    if (offMode)
 | 
			
		||||
    {
 | 
			
		||||
      #ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
      esp32RMTInvertIdle();
 | 
			
		||||
      #endif
 | 
			
		||||
    if (offMode) {
 | 
			
		||||
      BusManager::on();
 | 
			
		||||
      if (rlyPin>=0) {
 | 
			
		||||
        pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
 | 
			
		||||
        digitalWrite(rlyPin, rlyMde);
 | 
			
		||||
      }
 | 
			
		||||
      offMode = false;
 | 
			
		||||
    }
 | 
			
		||||
  } else if (millis() - lastOnTime > 600)
 | 
			
		||||
  {
 | 
			
		||||
  } else if (millis() - lastOnTime > 600 && !strip.needsUpdate()) {
 | 
			
		||||
    // for turning LED or relay off we need to wait until strip no longer needs updates (strip.trigger())
 | 
			
		||||
    if (!offMode) {
 | 
			
		||||
      #ifdef ESP8266
 | 
			
		||||
      // turn off built-in LED if strip is turned off
 | 
			
		||||
      // this will break digital bus so will need to be re-initialised on On
 | 
			
		||||
      PinOwner ledPinOwner = pinManager.getPinOwner(LED_BUILTIN);
 | 
			
		||||
      if (!strip.isOffRefreshRequired() && (ledPinOwner == PinOwner::None || ledPinOwner == PinOwner::BusDigital)) {
 | 
			
		||||
        pinMode(LED_BUILTIN, OUTPUT);
 | 
			
		||||
        digitalWrite(LED_BUILTIN, HIGH);
 | 
			
		||||
      }
 | 
			
		||||
      #endif
 | 
			
		||||
      #ifdef ESP32_DATA_IDLE_HIGH
 | 
			
		||||
      esp32RMTInvertIdle();
 | 
			
		||||
      #endif
 | 
			
		||||
      BusManager::off();
 | 
			
		||||
      if (rlyPin>=0) {
 | 
			
		||||
        pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
 | 
			
		||||
        digitalWrite(rlyPin, !rlyMde);
 | 
			
		||||
      }
 | 
			
		||||
      offMode = true;
 | 
			
		||||
    }
 | 
			
		||||
    offMode = true;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,9 +192,9 @@
 | 
			
		|||
#define CALL_MODE_INIT           0     //no updates on init, can be used to disable updates
 | 
			
		||||
#define CALL_MODE_DIRECT_CHANGE  1
 | 
			
		||||
#define CALL_MODE_BUTTON         2     //default button actions applied to selected segments
 | 
			
		||||
#define CALL_MODE_NOTIFICATION   3
 | 
			
		||||
#define CALL_MODE_NIGHTLIGHT     4
 | 
			
		||||
#define CALL_MODE_NO_NOTIFY      5
 | 
			
		||||
#define CALL_MODE_NOTIFICATION   3     //caused by incoming notification (UDP or DMX preset)
 | 
			
		||||
#define CALL_MODE_NIGHTLIGHT     4     //nightlight progress
 | 
			
		||||
#define CALL_MODE_NO_NOTIFY      5     //change state but do not send notifications (UDP)
 | 
			
		||||
#define CALL_MODE_FX_CHANGED     6     //no longer used
 | 
			
		||||
#define CALL_MODE_HUE            7
 | 
			
		||||
#define CALL_MODE_PRESET_CYCLE   8     //no longer used
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,7 +195,7 @@ void handleTransitions()
 | 
			
		|||
      applyFinalBri();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    if (tper - tperLast < 0.004f) return;
 | 
			
		||||
    if (tper - tperLast < 0.004f) return; // less than 1 bit change (1/255)
 | 
			
		||||
    tperLast = tper;
 | 
			
		||||
    briT = briOld + ((bri - briOld) * tper);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue