Per strip skip first LED implementation (#1871)

* Per strip "skip first LED".
Moved skip first led into bus manager.

* Update cfg.cpp

* Do not display Skip 1st on analog types

Rename skipFirstLed() to clarify what it does
Remove RGBW override

Co-authored-by: Aircoookie <dev.aircoookie@gmail.com>
Co-authored-by: Aircoookie <cschwinne@gmail.com>
This commit is contained in:
Blaž Kristan 2021-05-17 16:23:46 +02:00 committed by GitHub
parent 4bcfff780a
commit 1617658bfe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 764 additions and 744 deletions

View File

@ -581,7 +581,7 @@ class WS2812FX {
} }
void void
finalizeInit(uint16_t countPixels, bool skipFirst), finalizeInit(uint16_t countPixels),
service(void), service(void),
blur(uint8_t), blur(uint8_t),
fill(uint32_t), fill(uint32_t),
@ -813,7 +813,6 @@ class WS2812FX {
void handle_palette(void); void handle_palette(void);
bool bool
_skipFirstMode,
_triggered; _triggered;
mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element

View File

@ -61,16 +61,11 @@
#endif #endif
//do not call this method from system context (network callback) //do not call this method from system context (network callback)
void WS2812FX::finalizeInit(uint16_t countPixels, bool skipFirst) void WS2812FX::finalizeInit(uint16_t countPixels)
{ {
RESET_RUNTIME; RESET_RUNTIME;
_length = countPixels; _length = countPixels;
_skipFirstMode = skipFirst;
_lengthRaw = _length; _lengthRaw = _length;
if (_skipFirstMode) {
_lengthRaw += LED_SKIP_AMOUNT;
}
//if busses failed to load, add default (FS issue...) //if busses failed to load, add default (FS issue...)
if (busses.getNumBusses() == 0) { if (busses.getNumBusses() == 0) {
@ -204,7 +199,6 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
} }
} }
uint16_t skip = _skipFirstMode ? LED_SKIP_AMOUNT : 0;
if (SEGLEN) {//from segment if (SEGLEN) {//from segment
//color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments) //color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments)
@ -216,7 +210,6 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
} }
uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b)); uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b));
/* Set all the pixels in the group, ensuring _skipFirstMode is honored */
bool reversed = IS_REVERSE; bool reversed = IS_REVERSE;
uint16_t realIndex = realPixelIndex(i); uint16_t realIndex = realPixelIndex(i);
@ -226,22 +219,17 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
if (IS_MIRROR) { //set the corresponding mirrored pixel if (IS_MIRROR) { //set the corresponding mirrored pixel
uint16_t indexMir = SEGMENT.stop - indexSet + SEGMENT.start - 1; uint16_t indexMir = SEGMENT.stop - indexSet + SEGMENT.start - 1;
if (indexMir < customMappingSize) indexMir = customMappingTable[indexMir]; if (indexMir < customMappingSize) indexMir = customMappingTable[indexMir];
busses.setPixelColor(indexMir + skip, col); busses.setPixelColor(indexMir, col);
} }
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet]; if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
busses.setPixelColor(indexSet + skip, col); busses.setPixelColor(indexSet, col);
} }
} }
} else { //live data, etc. } else { //live data, etc.
if (i < customMappingSize) i = customMappingTable[i]; if (i < customMappingSize) i = customMappingTable[i];
uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b)); uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b));
busses.setPixelColor(i + skip, col); busses.setPixelColor(i, col);
}
if (skip && i == 0) {
for (uint16_t j = 0; j < skip; j++) {
busses.setPixelColor(j, BLACK);
}
} }
} }
@ -515,8 +503,6 @@ uint32_t WS2812FX::getPixelColor(uint16_t i)
if (i < customMappingSize) i = customMappingTable[i]; if (i < customMappingSize) i = customMappingTable[i];
if (_skipFirstMode) i += LED_SKIP_AMOUNT;
if (i >= _lengthRaw) return 0; if (i >= _lengthRaw) return 0;
return busses.getPixelColor(i); return busses.getPixelColor(i);

View File

@ -17,9 +17,11 @@ struct BusConfig {
uint16_t start = 0; uint16_t start = 0;
uint8_t colorOrder = COL_ORDER_GRB; uint8_t colorOrder = COL_ORDER_GRB;
bool reversed = false; bool reversed = false;
uint8_t skipAmount;
uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255}; uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255};
BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false) { BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip=0) {
type = busType; count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; type = busType; count = len; start = pstart;
colorOrder = pcolorOrder; reversed = rev; skipAmount = skip;
uint8_t nPins = 1; uint8_t nPins = 1;
if (type > 47) nPins = 2; if (type > 47) nPins = 2;
else if (type > 41 && type < 46) nPins = NUM_PWM_PINS(type); else if (type > 41 && type < 46) nPins = NUM_PWM_PINS(type);
@ -51,11 +53,11 @@ class Bus {
virtual uint8_t getPins(uint8_t* pinArray) { return 0; } virtual uint8_t getPins(uint8_t* pinArray) { return 0; }
uint16_t getStart() { inline uint16_t getStart() {
return _start; return _start;
} }
void setStart(uint16_t start) { inline void setStart(uint16_t start) {
_start = start; _start = start;
} }
@ -69,14 +71,28 @@ class Bus {
return COL_ORDER_RGB; return COL_ORDER_RGB;
} }
uint8_t getType() { virtual bool isRgbw() {
return false;
}
virtual uint8_t skippedLeds() {
return 0;
}
inline uint8_t getType() {
return _type; return _type;
} }
bool isOk() { inline bool isOk() {
return _valid; return _valid;
} }
static bool isRgbw(uint8_t type) {
if (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true;
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true;
return false;
}
bool reversed = false; bool reversed = false;
protected: protected:
@ -99,8 +115,9 @@ class BusDigital : public Bus {
cleanup(); return; cleanup(); return;
} }
} }
_len = bc.count;
reversed = bc.reversed; reversed = bc.reversed;
_skip = bc.skipAmount; //sacrificial pixels
_len = bc.count + _skip;
_iType = PolyBus::getI(bc.type, _pins, nr); _iType = PolyBus::getI(bc.type, _pins, nr);
if (_iType == I_NONE) return; if (_iType == I_NONE) return;
_busPtr = PolyBus::create(_iType, _pins, _len); _busPtr = PolyBus::create(_iType, _pins, _len);
@ -109,11 +126,11 @@ class BusDigital : public Bus {
//Serial.printf("Successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n",nr, len, type, pins[0],pins[1],_iType); //Serial.printf("Successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n",nr, len, type, pins[0],pins[1],_iType);
}; };
void show() { inline void show() {
PolyBus::show(_busPtr, _iType); PolyBus::show(_busPtr, _iType);
} }
bool canShow() { inline bool canShow() {
return PolyBus::canShow(_busPtr, _iType); return PolyBus::canShow(_busPtr, _iType);
} }
@ -130,20 +147,22 @@ class BusDigital : public Bus {
void setPixelColor(uint16_t pix, uint32_t c) { void setPixelColor(uint16_t pix, uint32_t c) {
if (reversed) pix = _len - pix -1; if (reversed) pix = _len - pix -1;
else pix += _skip;
PolyBus::setPixelColor(_busPtr, _iType, pix, c, _colorOrder); PolyBus::setPixelColor(_busPtr, _iType, pix, c, _colorOrder);
} }
uint32_t getPixelColor(uint16_t pix) { uint32_t getPixelColor(uint16_t pix) {
if (reversed) pix = _len - pix -1; if (reversed) pix = _len - pix -1;
else pix += _skip;
return PolyBus::getPixelColor(_busPtr, _iType, pix, _colorOrder); return PolyBus::getPixelColor(_busPtr, _iType, pix, _colorOrder);
} }
uint8_t getColorOrder() { inline uint8_t getColorOrder() {
return _colorOrder; return _colorOrder;
} }
uint16_t getLength() { inline uint16_t getLength() {
return _len; return _len - _skip;
} }
uint8_t getPins(uint8_t* pinArray) { uint8_t getPins(uint8_t* pinArray) {
@ -157,7 +176,15 @@ class BusDigital : public Bus {
_colorOrder = colorOrder; _colorOrder = colorOrder;
} }
void reinit() { inline bool isRgbw() {
return (_type == TYPE_SK6812_RGBW || _type == TYPE_TM1814);
}
inline uint8_t skippedLeds() {
return _skip;
}
inline void reinit() {
PolyBus::begin(_busPtr, _iType, _pins); PolyBus::begin(_busPtr, _iType, _pins);
} }
@ -180,6 +207,7 @@ class BusDigital : public Bus {
uint8_t _pins[2] = {255, 255}; uint8_t _pins[2] = {255, 255};
uint8_t _iType = I_NONE; uint8_t _iType = I_NONE;
uint16_t _len = 0; uint16_t _len = 0;
uint8_t _skip = 0;
void * _busPtr = nullptr; void * _busPtr = nullptr;
}; };
@ -255,7 +283,7 @@ class BusPwm : public Bus {
} }
} }
void setBrightness(uint8_t b) { inline void setBrightness(uint8_t b) {
_bri = b; _bri = b;
} }
@ -265,7 +293,11 @@ class BusPwm : public Bus {
return numPins; return numPins;
} }
void cleanup() { bool isRgbw() {
return (_type > TYPE_ONOFF && _type <= TYPE_ANALOG_5CH && _type != TYPE_ANALOG_3CH);
}
inline void cleanup() {
deallocatePins(); deallocatePins();
} }
@ -304,7 +336,7 @@ class BusManager {
}; };
//utility to get the approx. memory usage of a given BusConfig //utility to get the approx. memory usage of a given BusConfig
uint32_t memUsage(BusConfig &bc) { static uint32_t memUsage(BusConfig &bc) {
uint8_t type = bc.type; uint8_t type = bc.type;
uint16_t len = bc.count; uint16_t len = bc.count;
if (type < 32) { if (type < 32) {
@ -333,8 +365,7 @@ class BusManager {
} else { } else {
busses[numBusses] = new BusPwm(bc); busses[numBusses] = new BusPwm(bc);
} }
numBusses++; return numBusses++;
return numBusses -1;
} }
//do not call this method from system context (network callback) //do not call this method from system context (network callback)
@ -358,6 +389,7 @@ class BusManager {
uint16_t bstart = b->getStart(); uint16_t bstart = b->getStart();
if (pix < bstart || pix >= bstart + b->getLength()) continue; if (pix < bstart || pix >= bstart + b->getLength()) continue;
busses[i]->setPixelColor(pix - bstart, c); busses[i]->setPixelColor(pix - bstart, c);
break;
} }
} }
@ -389,14 +421,18 @@ class BusManager {
return busses[busNr]; return busses[busNr];
} }
uint8_t getNumBusses() { inline uint8_t getNumBusses() {
return numBusses; return numBusses;
} }
static bool isRgbw(uint8_t type) { uint16_t getTotalLength() {
if (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true; uint16_t len = 0;
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; for (uint8_t i=0; i<numBusses; i++ ) len += busses[i]->getLength();
return false; return len;
}
static inline bool isRgbw(uint8_t type) {
return Bus::isRgbw(type);
} }
//Return true if the strip requires a refresh to stay off. //Return true if the strip requires a refresh to stay off.

View File

@ -837,7 +837,7 @@ class PolyBus {
} }
//gives back the internal type index (I_XX_XXX_X above) for the input //gives back the internal type index (I_XX_XXX_X above) for the input
static uint8_t getI(uint8_t busType, uint8_t* pins, uint8_t num = 0) { static uint8_t getI(uint8_t busType, uint8_t* pins, uint8_t num = 0, bool rgbwOverride = false) {
if (!IS_DIGITAL(busType)) return I_NONE; if (!IS_DIGITAL(busType)) return I_NONE;
if (IS_2PIN(busType)) { //SPI LED chips if (IS_2PIN(busType)) { //SPI LED chips
bool isHSPI = false; bool isHSPI = false;
@ -863,7 +863,7 @@ class PolyBus {
switch (busType) { switch (busType) {
case TYPE_WS2812_RGB: case TYPE_WS2812_RGB:
case TYPE_WS2812_WWA: case TYPE_WS2812_WWA:
return I_8266_U0_NEO_3 + offset; return (rgbwOverride ? I_8266_U0_NEO_4 : I_8266_U0_NEO_3) + offset;
case TYPE_SK6812_RGBW: case TYPE_SK6812_RGBW:
return I_8266_U0_NEO_4 + offset; return I_8266_U0_NEO_4 + offset;
case TYPE_WS2811_400KHZ: case TYPE_WS2811_400KHZ:
@ -877,7 +877,7 @@ class PolyBus {
switch (busType) { switch (busType) {
case TYPE_WS2812_RGB: case TYPE_WS2812_RGB:
case TYPE_WS2812_WWA: case TYPE_WS2812_WWA:
return I_32_R0_NEO_3 + offset; return (rgbwOverride ? I_32_R0_NEO_3 : I_32_R0_NEO_4) + offset;
case TYPE_SK6812_RGBW: case TYPE_SK6812_RGBW:
return I_32_R0_NEO_4 + offset; return I_32_R0_NEO_4 + offset;
case TYPE_WS2811_400KHZ: case TYPE_WS2811_400KHZ:

View File

@ -103,7 +103,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
if (length==0) continue; if (length==0) continue;
uint8_t colorOrder = (int)elm[F("order")]; uint8_t colorOrder = (int)elm[F("order")];
//only use skip from the first strip (this shouldn't have been in ins obj. but remains here for compatibility) //only use skip from the first strip (this shouldn't have been in ins obj. but remains here for compatibility)
if (s==0) skipFirstLed = elm[F("skip")]; uint8_t skipFirst = elm[F("skip")];
uint16_t start = elm[F("start")] | 0; uint16_t start = elm[F("start")] | 0;
if (start >= ledCount) continue; if (start >= ledCount) continue;
//limit length of strip if it would exceed total configured LEDs //limit length of strip if it would exceed total configured LEDs
@ -115,11 +115,11 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
//refresh is required to remain off if at least one of the strips requires the refresh. //refresh is required to remain off if at least one of the strips requires the refresh.
strip.isOffRefreshRequred |= BusManager::isOffRefreshRequred(ledType); strip.isOffRefreshRequred |= BusManager::isOffRefreshRequred(ledType);
s++; s++;
BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed); BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst);
mem += busses.memUsage(bc); mem += busses.memUsage(bc);
if (mem <= MAX_LED_MEMORY) busses.add(bc); if (mem <= MAX_LED_MEMORY) busses.add(bc);
} }
strip.finalizeInit(ledCount, skipFirstLed); strip.finalizeInit(ledCount);
} }
if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus
@ -488,7 +488,7 @@ void serializeConfig() {
for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]); for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]);
ins[F("order")] = bus->getColorOrder(); ins[F("order")] = bus->getColorOrder();
ins["rev"] = bus->reversed; ins["rev"] = bus->reversed;
ins[F("skip")] = (skipFirstLed && s == 0) ? 1 : 0; ins[F("skip")] = bus->skippedLeds();
ins["type"] = bus->getType(); ins["type"] = bus->getType();
} }

View File

@ -235,7 +235,9 @@
<br> <br>
<span id="psd${i}">Start:</span> <input type="number" name="LS${i}" min="0" max="8191" value="${lastEnd(i)}" required />&nbsp; <span id="psd${i}">Start:</span> <input type="number" name="LS${i}" min="0" max="8191" value="${lastEnd(i)}" required />&nbsp;
<div id="dig${i}" style="display:inline"> <div id="dig${i}" style="display:inline">
Count: <input type="number" name="LC${i}" min="0" max="${maxPB}" value="1" required oninput="UI()" /><br></div> Count: <input type="number" name="LC${i}" min="0" max="${maxPB}" value="1" required oninput="UI()" /><br>
Skip 1<sup>st</sup> LED: <input id="sl${i}" type="checkbox" name="SL${i}">&nbsp;
</div>
Reverse: <input type="checkbox" name="CV${i}"><br> Reverse: <input type="checkbox" name="CV${i}"><br>
</div>`; </div>`;
f.insertAdjacentHTML("beforeend", cn); f.insertAdjacentHTML("beforeend", cn);
@ -338,7 +340,6 @@
<option value="2">Linear (never wrap)</option> <option value="2">Linear (never wrap)</option>
<option value="3">None (not recommended)</option> <option value="3">None (not recommended)</option>
</select><br> </select><br>
Skip first LED: <input type="checkbox" name="SL"><br>
<span class="wc"> <span class="wc">
Auto-calculate white channel from RGB:<br> Auto-calculate white channel from RGB:<br>
<select name="AW"> <select name="AW">

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -85,7 +85,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
//TODO remove all busses, but not in this system call //TODO remove all busses, but not in this system call
//busses->removeAll(); //busses->removeAll();
uint8_t colorOrder, type; strip.isRgbw = false;
uint8_t colorOrder, type, skip;
uint16_t length, start; uint16_t length, start;
uint8_t pins[5] = {255, 255, 255, 255, 255}; uint8_t pins[5] = {255, 255, 255, 255, 255};
@ -96,6 +97,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
char lt[4] = "LT"; lt[2] = 48+s; lt[3] = 0; //strip type char lt[4] = "LT"; lt[2] = 48+s; lt[3] = 0; //strip type
char ls[4] = "LS"; ls[2] = 48+s; ls[3] = 0; //strip start LED char ls[4] = "LS"; ls[2] = 48+s; ls[3] = 0; //strip start LED
char cv[4] = "CV"; cv[2] = 48+s; cv[3] = 0; //strip reverse char cv[4] = "CV"; cv[2] = 48+s; cv[3] = 0; //strip reverse
char sl[4] = "SL"; sl[2] = 48+s; sl[3] = 0; //skip 1st LED
if (!request->hasArg(lp)) { if (!request->hasArg(lp)) {
DEBUG_PRINTLN("No data."); break; DEBUG_PRINTLN("No data."); break;
} }
@ -105,8 +107,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
pins[i] = (request->arg(lp).length() > 0) ? request->arg(lp).toInt() : 255; pins[i] = (request->arg(lp).length() > 0) ? request->arg(lp).toInt() : 255;
} }
type = request->arg(lt).toInt(); type = request->arg(lt).toInt();
//if (isRgbw(type)) strip.isRgbw = true; //30fps strip.isRgbw = strip.isRgbw || BusManager::isRgbw(type);
//strip.isRgbw = true; skip = request->hasArg(sl) ? LED_SKIP_AMOUNT : 0;
if (request->hasArg(lc) && request->arg(lc).toInt() > 0) { if (request->hasArg(lc) && request->arg(lc).toInt() > 0) {
length = request->arg(lc).toInt(); length = request->arg(lc).toInt();
@ -118,9 +120,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
start = (request->hasArg(ls)) ? request->arg(ls).toInt() : 0; start = (request->hasArg(ls)) ? request->arg(ls).toInt() : 0;
if (busConfigs[s] != nullptr) delete busConfigs[s]; if (busConfigs[s] != nullptr) delete busConfigs[s];
busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder, request->hasArg(cv)); busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder, request->hasArg(cv), skip);
//if (BusManager::isRgbw(type)) strip.isRgbw = true; //20fps
//strip.isRgbw = true;
doInitBusses = true; doInitBusses = true;
} }
@ -181,7 +181,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
t = request->arg(F("PB")).toInt(); t = request->arg(F("PB")).toInt();
if (t >= 0 && t < 4) strip.paletteBlend = t; if (t >= 0 && t < 4) strip.paletteBlend = t;
skipFirstLed = request->hasArg(F("SL"));
t = request->arg(F("BF")).toInt(); t = request->arg(F("BF")).toInt();
if (t > 0) briMultiplier = t; if (t > 0) briMultiplier = t;
} }

View File

@ -256,7 +256,7 @@ void WLED::loop()
strip.isRgbw = (strip.isRgbw || BusManager::isRgbw(busConfigs[i]->type)); strip.isRgbw = (strip.isRgbw || BusManager::isRgbw(busConfigs[i]->type));
delete busConfigs[i]; busConfigs[i] = nullptr; delete busConfigs[i]; busConfigs[i] = nullptr;
} }
strip.finalizeInit(ledCount, skipFirstLed); strip.finalizeInit(ledCount);
yield(); yield();
serializeConfig(); serializeConfig();
} }
@ -405,7 +405,7 @@ void WLED::beginStrip()
if (ledCount > MAX_LEDS || ledCount == 0) if (ledCount > MAX_LEDS || ledCount == 0)
ledCount = 30; ledCount = 30;
strip.finalizeInit(ledCount, skipFirstLed); strip.finalizeInit(ledCount);
strip.setBrightness(0); strip.setBrightness(0);
strip.setShowCallback(handleOverlayDraw); strip.setShowCallback(handleOverlayDraw);

View File

@ -248,7 +248,6 @@ WLED_GLOBAL byte nightlightMode _INIT(NL_MODE_FADE); // See const.h for ava
WLED_GLOBAL bool fadeTransition _INIT(true); // enable crossfading color transition WLED_GLOBAL bool fadeTransition _INIT(true); // enable crossfading color transition
WLED_GLOBAL uint16_t transitionDelay _INIT(750); // default crossfade duration in ms WLED_GLOBAL uint16_t transitionDelay _INIT(750); // default crossfade duration in ms
WLED_GLOBAL bool skipFirstLed _INIT(false); // ignore first LED in strip (useful if you need the LED as signal repeater)
WLED_GLOBAL byte briMultiplier _INIT(100); // % of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127) WLED_GLOBAL byte briMultiplier _INIT(100); // % of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
// User Interface CONFIG // User Interface CONFIG

View File

@ -317,7 +317,7 @@ void loadSettingsFromEEPROM()
notifyMacro = EEPROM.read(2201); notifyMacro = EEPROM.read(2201);
strip.rgbwMode = EEPROM.read(2203); strip.rgbwMode = EEPROM.read(2203);
skipFirstLed = EEPROM.read(2204); //skipFirstLed = EEPROM.read(2204);
if (EEPROM.read(2210) || EEPROM.read(2211) || EEPROM.read(2212)) if (EEPROM.read(2210) || EEPROM.read(2211) || EEPROM.read(2212))
{ {

View File

@ -294,6 +294,7 @@ void getSettingsJS(byte subPage, char* dest)
char lt[4] = "LT"; lt[2] = 48+s; lt[3] = 0; //strip type char lt[4] = "LT"; lt[2] = 48+s; lt[3] = 0; //strip type
char ls[4] = "LS"; ls[2] = 48+s; ls[3] = 0; //strip start LED char ls[4] = "LS"; ls[2] = 48+s; ls[3] = 0; //strip start LED
char cv[4] = "CV"; cv[2] = 48+s; cv[3] = 0; //strip reverse char cv[4] = "CV"; cv[2] = 48+s; cv[3] = 0; //strip reverse
char sl[4] = "SL"; sl[2] = 48+s; sl[3] = 0; //skip 1st LED
oappend(SET_F("addLEDs(1);")); oappend(SET_F("addLEDs(1);"));
uint8_t pins[5]; uint8_t pins[5];
uint8_t nPins = bus->getPins(pins); uint8_t nPins = bus->getPins(pins);
@ -306,6 +307,7 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',co,bus->getColorOrder()); sappend('v',co,bus->getColorOrder());
sappend('v',ls,bus->getStart()); sappend('v',ls,bus->getStart());
sappend('c',cv,bus->reversed); sappend('c',cv,bus->reversed);
sappend('c',sl,bus->skippedLeds());
} }
sappend('v',SET_F("MA"),strip.ablMilliampsMax); sappend('v',SET_F("MA"),strip.ablMilliampsMax);
sappend('v',SET_F("LA"),strip.milliampsPerLed); sappend('v',SET_F("LA"),strip.milliampsPerLed);
@ -334,7 +336,6 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',SET_F("TL"),nightlightDelayMinsDefault); sappend('v',SET_F("TL"),nightlightDelayMinsDefault);
sappend('v',SET_F("TW"),nightlightMode); sappend('v',SET_F("TW"),nightlightMode);
sappend('i',SET_F("PB"),strip.paletteBlend); sappend('i',SET_F("PB"),strip.paletteBlend);
sappend('c',SET_F("SL"),skipFirstLed);
sappend('v',SET_F("RL"),rlyPin); sappend('v',SET_F("RL"),rlyPin);
sappend('c',SET_F("RM"),rlyMde); sappend('c',SET_F("RM"),rlyMde);
sappend('v',SET_F("BT"),btnPin); sappend('v',SET_F("BT"),btnPin);