kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			Effect buffer optimisations
setMode() fix for selecting gap UI error messagespull/3610/head^2
							rodzic
							
								
									08d9f7d967
								
							
						
					
					
						commit
						6332ee6edb
					
				| 
						 | 
				
			
			@ -5292,7 +5292,6 @@ uint16_t mode_2Dmatrix(void) {                  // Matrix2D. By Jeremy Williams.
 | 
			
		|||
  if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
 | 
			
		||||
 | 
			
		||||
  if (SEGENV.call == 0) {
 | 
			
		||||
    memset(SEGMENT.data, 0, dataSize); // no falling spawns
 | 
			
		||||
    SEGMENT.fill(BLACK);
 | 
			
		||||
    SEGENV.step = 0;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								wled00/FX.h
								
								
								
								
							
							
						
						
									
										12
									
								
								wled00/FX.h
								
								
								
								
							| 
						 | 
				
			
			@ -543,9 +543,9 @@ typedef struct Segment {
 | 
			
		|||
 | 
			
		||||
    // runtime data functions
 | 
			
		||||
    inline uint16_t dataSize(void) const { return _dataLen; }
 | 
			
		||||
    bool allocateData(size_t len);
 | 
			
		||||
    void deallocateData(void);
 | 
			
		||||
    void resetIfRequired(void);
 | 
			
		||||
    bool allocateData(size_t len);  // allocates effect data buffer in heap and clears it
 | 
			
		||||
    void deallocateData(void);      // deallocates (frees) effect data buffer from heap
 | 
			
		||||
    void resetIfRequired(void);     // sets all SEGENV variables to 0 and clears data buffer
 | 
			
		||||
    /**
 | 
			
		||||
      * Flags that before the next effect is calculated,
 | 
			
		||||
      * the internal segment state should be reset.
 | 
			
		||||
| 
						 | 
				
			
			@ -559,10 +559,10 @@ typedef struct Segment {
 | 
			
		|||
    void     stopTransition(void);
 | 
			
		||||
    void     handleTransition(void);
 | 
			
		||||
    #ifndef WLED_DISABLE_MODE_BLEND
 | 
			
		||||
    void     swapSegenv(tmpsegd_t &tmpSegD);
 | 
			
		||||
    void     restoreSegenv(tmpsegd_t &tmpSegD);
 | 
			
		||||
    void     swapSegenv(tmpsegd_t &tmpSegD);    // copies segment data into specifed buffer, if buffer is not a transition buffer, segment data is overwritten from transition buffer
 | 
			
		||||
    void     restoreSegenv(tmpsegd_t &tmpSegD); // restores segment data from buffer, if buffer is not transition buffer, changed values are copied to transition buffer
 | 
			
		||||
    #endif
 | 
			
		||||
    uint16_t progress(void); //transition progression between 0-65535
 | 
			
		||||
    uint16_t progress(void); // transition progression between 0-65535
 | 
			
		||||
    uint8_t  currentBri(bool useCct = false);
 | 
			
		||||
    uint8_t  currentMode(void);
 | 
			
		||||
    uint32_t currentColor(uint8_t slot);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,27 +143,28 @@ Segment& Segment::operator= (Segment &&orig) noexcept {
 | 
			
		|||
  return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// allocates effect data buffer on heap and initialises (erases) it
 | 
			
		||||
bool IRAM_ATTR Segment::allocateData(size_t len) {
 | 
			
		||||
  if (len == 0) return false; // nothing to do
 | 
			
		||||
  if (data && _dataLen >= len) {          // already allocated enough (reduce fragmentation)
 | 
			
		||||
    if (call == 0) memset(data, 0, len);  // erase buffer if called during effect initialisation
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  //DEBUG_PRINTF("--   Allocating data (%d): %p\n", len, this);
 | 
			
		||||
  deallocateData();
 | 
			
		||||
  if (len == 0) return false; // nothing to do
 | 
			
		||||
  deallocateData(); // if the old buffer was smaller release it first
 | 
			
		||||
  if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) {
 | 
			
		||||
    // not enough memory
 | 
			
		||||
    DEBUG_PRINT(F("!!! Effect RAM depleted: "));
 | 
			
		||||
    DEBUG_PRINTF("%d/%d !!!\n", len, Segment::getUsedSegmentData());
 | 
			
		||||
    errorFlag = ERR_NORAM;
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  // do not use SPI RAM on ESP32 since it is slow
 | 
			
		||||
  data = (byte*) malloc(len);
 | 
			
		||||
  data = (byte*)calloc(len, sizeof(byte));
 | 
			
		||||
  if (!data) { DEBUG_PRINTLN(F("!!! Allocation failed. !!!")); return false; } // allocation failed
 | 
			
		||||
  Segment::addUsedSegmentData(len);
 | 
			
		||||
  //DEBUG_PRINTF("---  Allocated data (%p): %d/%d -> %p\n", this, len, Segment::getUsedSegmentData(), data);
 | 
			
		||||
  _dataLen = len;
 | 
			
		||||
  memset(data, 0, len);
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +195,7 @@ void IRAM_ATTR Segment::deallocateData() {
 | 
			
		|||
void Segment::resetIfRequired() {
 | 
			
		||||
  if (!reset) return;
 | 
			
		||||
  //DEBUG_PRINTF("-- Segment reset: %p\n", this);
 | 
			
		||||
  deallocateData();
 | 
			
		||||
  if (data && _dataLen > 0) memset(data, 0, _dataLen);  // prevent heap fragmentation (just erase buffer instead of deallocateData())
 | 
			
		||||
  next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0;
 | 
			
		||||
  reset = false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -561,35 +562,36 @@ void Segment::setOption(uint8_t n, bool val) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void Segment::setMode(uint8_t fx, bool loadDefaults) {
 | 
			
		||||
  // skip reserved
 | 
			
		||||
  while (fx < strip.getModeCount() && strncmp_P("RSVD", strip.getModeData(fx), 4) == 0) fx++;
 | 
			
		||||
  if (fx >= strip.getModeCount()) fx = 0; // set solid mode
 | 
			
		||||
  // if we have a valid mode & is not reserved
 | 
			
		||||
  if (fx < strip.getModeCount() && strncmp_P("RSVD", strip.getModeData(fx), 4)) {
 | 
			
		||||
    if (fx != mode) {
 | 
			
		||||
  if (fx != mode) {
 | 
			
		||||
#ifndef WLED_DISABLE_MODE_BLEND
 | 
			
		||||
      if (modeBlending) startTransition(strip.getTransition()); // set effect transitions
 | 
			
		||||
    if (modeBlending) startTransition(strip.getTransition()); // set effect transitions
 | 
			
		||||
#endif
 | 
			
		||||
      mode = fx;
 | 
			
		||||
      // load default values from effect string
 | 
			
		||||
      if (loadDefaults) {
 | 
			
		||||
        int16_t sOpt;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "sx");   speed     = (sOpt >= 0) ? sOpt : DEFAULT_SPEED;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "ix");   intensity = (sOpt >= 0) ? sOpt : DEFAULT_INTENSITY;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "c1");   custom1   = (sOpt >= 0) ? sOpt : DEFAULT_C1;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "c2");   custom2   = (sOpt >= 0) ? sOpt : DEFAULT_C2;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "c3");   custom3   = (sOpt >= 0) ? sOpt : DEFAULT_C3;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "o1");   check1    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "o2");   check2    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "o3");   check3    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "m12");  if (sOpt >= 0) map1D2D   = constrain(sOpt, 0, 7); else map1D2D = M12_Pixels;  // reset mapping if not defined (2D FX may not work)
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "si");   if (sOpt >= 0) soundSim  = constrain(sOpt, 0, 3);
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "rev");  if (sOpt >= 0) reverse   = (bool)sOpt;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "mi");   if (sOpt >= 0) mirror    = (bool)sOpt; // NOTE: setting this option is a risky business
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "rY");   if (sOpt >= 0) reverse_y = (bool)sOpt;
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "mY");   if (sOpt >= 0) mirror_y  = (bool)sOpt; // NOTE: setting this option is a risky business
 | 
			
		||||
        sOpt = extractModeDefaults(fx, "pal");  if (sOpt >= 0) setPalette(sOpt); //else setPalette(0);
 | 
			
		||||
      }
 | 
			
		||||
      markForReset();
 | 
			
		||||
      stateChanged = true; // send UDP/WS broadcast
 | 
			
		||||
    mode = fx;
 | 
			
		||||
    // load default values from effect string
 | 
			
		||||
    if (loadDefaults) {
 | 
			
		||||
      int16_t sOpt;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "sx");  speed     = (sOpt >= 0) ? sOpt : DEFAULT_SPEED;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "ix");  intensity = (sOpt >= 0) ? sOpt : DEFAULT_INTENSITY;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "c1");  custom1   = (sOpt >= 0) ? sOpt : DEFAULT_C1;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "c2");  custom2   = (sOpt >= 0) ? sOpt : DEFAULT_C2;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "c3");  custom3   = (sOpt >= 0) ? sOpt : DEFAULT_C3;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "o1");  check1    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "o2");  check2    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "o3");  check3    = (sOpt >= 0) ? (bool)sOpt : false;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "m12"); if (sOpt >= 0) map1D2D   = constrain(sOpt, 0, 7); else map1D2D = M12_Pixels;  // reset mapping if not defined (2D FX may not work)
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "si");  if (sOpt >= 0) soundSim  = constrain(sOpt, 0, 3);
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) reverse   = (bool)sOpt;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "mi");  if (sOpt >= 0) mirror    = (bool)sOpt; // NOTE: setting this option is a risky business
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "rY");  if (sOpt >= 0) reverse_y = (bool)sOpt;
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "mY");  if (sOpt >= 0) mirror_y  = (bool)sOpt; // NOTE: setting this option is a risky business
 | 
			
		||||
      sOpt = extractModeDefaults(fx, "pal"); if (sOpt >= 0) setPalette(sOpt); //else setPalette(0);
 | 
			
		||||
    }
 | 
			
		||||
    markForReset();
 | 
			
		||||
    stateChanged = true; // send UDP/WS broadcast
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -258,23 +258,8 @@ void BusDigital::setBrightness(uint8_t b) {
 | 
			
		|||
    if (_pins[0] == LED_BUILTIN || _pins[1] == LED_BUILTIN) reinit();
 | 
			
		||||
  }
 | 
			
		||||
  #endif
 | 
			
		||||
  uint8_t prevBri = _bri;
 | 
			
		||||
  Bus::setBrightness(b);
 | 
			
		||||
  PolyBus::setBrightness(_busPtr, _iType, b);
 | 
			
		||||
/*
 | 
			
		||||
  if (_data) return; // use _buffering this causes ~20% FPS drop
 | 
			
		||||
 | 
			
		||||
  // must update/repaint every LED in the NeoPixelBus buffer to the new brightness
 | 
			
		||||
  // the only case where repainting is unnecessary is when all pixels are set after the brightness change but before the next show
 | 
			
		||||
  // (which we can't rely on)
 | 
			
		||||
  uint16_t hwLen = _len;
 | 
			
		||||
  if (_type == TYPE_WS2812_1CH_X3) hwLen = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus
 | 
			
		||||
  for (unsigned i = 0; i < hwLen; i++) {
 | 
			
		||||
    // use 0 as color order, actual order does not matter here as we just update the channel values as-is
 | 
			
		||||
    uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0), prevBri);
 | 
			
		||||
    PolyBus::setPixelColor(_busPtr, _iType, i, c, 0);
 | 
			
		||||
  }
 | 
			
		||||
*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//If LEDs are skipped, it is possible to use the first as a status LED.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -345,6 +345,7 @@
 | 
			
		|||
#define ERR_CONCURRENCY  2  // Conurrency (client active)
 | 
			
		||||
#define ERR_NOBUF        3  // JSON buffer was not released in time, request cannot be handled at this time
 | 
			
		||||
#define ERR_NOT_IMPL     4  // Not implemented
 | 
			
		||||
#define ERR_NORAM        8  // effect RAM depleted
 | 
			
		||||
#define ERR_JSON         9  // JSON parsing failed (input too large?)
 | 
			
		||||
#define ERR_FS_BEGIN    10  // Could not init filesystem (no partition?)
 | 
			
		||||
#define ERR_FS_QUOTA    11  // The FS is full or the maximum file size is reached
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -329,7 +329,6 @@ function openTab(tabI, force = false)
 | 
			
		|||
var timeout;
 | 
			
		||||
function showToast(text, error = false)
 | 
			
		||||
{
 | 
			
		||||
	if (error) gId('connind').style.backgroundColor = "var(--c-r)";
 | 
			
		||||
	var x = gId('toast');
 | 
			
		||||
	//if (error) text += '<i class="icons btn-icon" style="transform:rotate(45deg);position:absolute;top:10px;right:0px;" onclick="clearErrorToast(100);"></i>';
 | 
			
		||||
	x.innerHTML = text;
 | 
			
		||||
| 
						 | 
				
			
			@ -342,6 +341,7 @@ function showToast(text, error = false)
 | 
			
		|||
 | 
			
		||||
function showErrorToast()
 | 
			
		||||
{
 | 
			
		||||
	gId('connind').style.backgroundColor = "var(--c-r)";
 | 
			
		||||
	showToast('Connection to light failed!', true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1492,25 +1492,31 @@ function readState(s,command=false)
 | 
			
		|||
	gId('checkO3').checked = !(!i.o3);
 | 
			
		||||
 | 
			
		||||
	if (s.error && s.error != 0) {
 | 
			
		||||
	  var errstr = "";
 | 
			
		||||
	  switch (s.error) {
 | 
			
		||||
		case 10:
 | 
			
		||||
		  errstr = "Could not mount filesystem!";
 | 
			
		||||
		  break;
 | 
			
		||||
		case 11:
 | 
			
		||||
		  errstr = "Not enough space to save preset!";
 | 
			
		||||
		  break;
 | 
			
		||||
		case 12:
 | 
			
		||||
		  errstr = "Preset not found.";
 | 
			
		||||
		  break;
 | 
			
		||||
		case 13:
 | 
			
		||||
		  errstr = "Missing ir.json.";
 | 
			
		||||
		  break;
 | 
			
		||||
		case 19:
 | 
			
		||||
		  errstr = "A filesystem error has occured.";
 | 
			
		||||
		  break;
 | 
			
		||||
		var errstr = "";
 | 
			
		||||
		switch (s.error) {
 | 
			
		||||
			case  8:
 | 
			
		||||
				errstr = "Effect RAM depleted!";
 | 
			
		||||
				break;
 | 
			
		||||
			case  9:
 | 
			
		||||
				errstr = "JSON parsing error!";
 | 
			
		||||
				break;
 | 
			
		||||
			case 10:
 | 
			
		||||
				errstr = "Could not mount filesystem!";
 | 
			
		||||
				break;
 | 
			
		||||
			case 11:
 | 
			
		||||
				errstr = "Not enough space to save preset!";
 | 
			
		||||
				break;
 | 
			
		||||
			case 12:
 | 
			
		||||
				errstr = "Preset not found.";
 | 
			
		||||
				break;
 | 
			
		||||
			case 13:
 | 
			
		||||
				errstr = "Missing ir.json.";
 | 
			
		||||
				break;
 | 
			
		||||
			case 19:
 | 
			
		||||
				errstr = "A filesystem error has occured.";
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	  showToast('Error ' + s.error + ": " + errstr, true);
 | 
			
		||||
		showToast('Error ' + s.error + ": " + errstr, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	selectedPal = i.pal;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2742
									
								
								wled00/html_ui.h
								
								
								
								
							
							
						
						
									
										2742
									
								
								wled00/html_ui.h
								
								
								
								
							
										
											
												Plik diff jest za duży
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -8,7 +8,7 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
// version code in format yymmddb (b = daily build)
 | 
			
		||||
#define VERSION 2312190
 | 
			
		||||
#define VERSION 2312270
 | 
			
		||||
 | 
			
		||||
//uncomment this if you have a "my_config.h" file you'd like to use
 | 
			
		||||
//#define WLED_USE_MY_CONFIG
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue