Add easy segment mirroring (closes #1010)
This commit is contained in:
parent
b1c9dbd0a5
commit
39a80f8dc7
@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
### Development versions after 0.10.0 release
|
### Development versions after 0.10.0 release
|
||||||
|
|
||||||
|
#### Build 2008200
|
||||||
|
|
||||||
|
- Added segment mirroring to web UI
|
||||||
|
- Fixed segment mirroring when in reverse mode
|
||||||
|
|
||||||
#### Build 2008140
|
#### Build 2008140
|
||||||
|
|
||||||
- Removed verbose live mode info from `<ds>` in HTTP API response
|
- Removed verbose live mode info from `<ds>` in HTTP API response
|
||||||
|
@ -269,7 +269,7 @@ class WS2812FX {
|
|||||||
uint16_t groupLen = groupLength();
|
uint16_t groupLen = groupLength();
|
||||||
uint16_t vLength = (length() + groupLen - 1) / groupLen;
|
uint16_t vLength = (length() + groupLen - 1) / groupLen;
|
||||||
if (options & MIRROR)
|
if (options & MIRROR)
|
||||||
vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a signle LED
|
vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
||||||
return vLength;
|
return vLength;
|
||||||
}
|
}
|
||||||
} segment;
|
} segment;
|
||||||
@ -450,7 +450,7 @@ class WS2812FX {
|
|||||||
setRgbwPwm(void);
|
setRgbwPwm(void);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
reverseMode = false,
|
reverseMode = false, //is the entire LED strip reversed?
|
||||||
gammaCorrectBri = false,
|
gammaCorrectBri = false,
|
||||||
gammaCorrectCol = true,
|
gammaCorrectCol = true,
|
||||||
applyToAllSelected = true,
|
applyToAllSelected = true,
|
||||||
|
@ -106,20 +106,25 @@ void WS2812FX::setPixelColor(uint16_t n, uint32_t c) {
|
|||||||
setPixelColor(n, r, g, b, w);
|
setPixelColor(n, r, g, b, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define REV(i) (_length - 1 - (i))
|
||||||
|
|
||||||
|
//used to map from segment index to physical pixel, taking into account grouping, offsets, reverse and mirroring
|
||||||
uint16_t WS2812FX::realPixelIndex(uint16_t i) {
|
uint16_t WS2812FX::realPixelIndex(uint16_t i) {
|
||||||
int16_t iGroup = i * SEGMENT.groupLength();
|
int16_t iGroup = i * SEGMENT.groupLength();
|
||||||
|
|
||||||
/* reverse just an individual segment */
|
/* reverse just an individual segment */
|
||||||
int16_t realIndex = iGroup;
|
int16_t realIndex = iGroup;
|
||||||
if (IS_REVERSE)
|
if (IS_REVERSE) {
|
||||||
if (IS_MIRROR)
|
if (IS_MIRROR) {
|
||||||
realIndex = SEGMENT.length() / 2 - iGroup - 1; //only need to index half the pixels
|
realIndex = (SEGMENT.length() -1) / 2 - iGroup; //only need to index half the pixels
|
||||||
else
|
} else {
|
||||||
realIndex = SEGMENT.length() - iGroup - 1;
|
realIndex = SEGMENT.length() - iGroup - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
realIndex += SEGMENT.start;
|
realIndex += SEGMENT.start;
|
||||||
/* Reverse the whole string */
|
/* Reverse the whole string */
|
||||||
if (reverseMode) realIndex = _length - 1 - realIndex;
|
if (reverseMode) realIndex = REV(realIndex);
|
||||||
|
|
||||||
return realIndex;
|
return realIndex;
|
||||||
}
|
}
|
||||||
@ -176,18 +181,23 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
||||||
int16_t indexSet = realIndex + (reversed ? -j : j);
|
int16_t indexSet = realIndex + (reversed ? -j : j);
|
||||||
int16_t indexSetRev = indexSet;
|
int16_t indexSetRev = indexSet;
|
||||||
if (reverseMode) indexSetRev = _length - 1 - indexSet;
|
if (reverseMode) indexSetRev = REV(indexSet);
|
||||||
#ifdef WLED_CUSTOM_LED_MAPPING
|
#ifdef WLED_CUSTOM_LED_MAPPING
|
||||||
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
||||||
#endif
|
#endif
|
||||||
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) {
|
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) {
|
||||||
bus->SetPixelColor(indexSet + skip, col);
|
bus->SetPixelColor(indexSet + skip, col);
|
||||||
if (IS_MIRROR) //set the corresponding mirrored pixel
|
if (IS_MIRROR) { //set the corresponding mirrored pixel
|
||||||
bus->SetPixelColor(SEGMENT.stop - (indexSet + skip) + SEGMENT.start - 1, col);
|
if (reverseMode) {
|
||||||
|
bus->SetPixelColor(REV(SEGMENT.start) - indexSet + skip + REV(SEGMENT.stop) + 1, col);
|
||||||
|
} else {
|
||||||
|
bus->SetPixelColor(SEGMENT.stop - indexSet + skip + SEGMENT.start - 1, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { //live data, etc.
|
} else { //live data, etc.
|
||||||
if (reverseMode) i = _length - 1 - i;
|
if (reverseMode) i = REV(i);
|
||||||
#ifdef WLED_CUSTOM_LED_MAPPING
|
#ifdef WLED_CUSTOM_LED_MAPPING
|
||||||
if (i < customMappingSize) i = customMappingTable[i];
|
if (i < customMappingSize) i = customMappingTable[i];
|
||||||
#endif
|
#endif
|
||||||
|
@ -478,26 +478,6 @@ input[type=range]::-moz-range-thumb {
|
|||||||
background: var(--c-f);
|
background: var(--c-f);
|
||||||
transform: translateY(7px);
|
transform: translateY(7px);
|
||||||
}
|
}
|
||||||
input[type=range]::-ms-track {
|
|
||||||
width: 100%;
|
|
||||||
height: 30px;
|
|
||||||
background: transparent;
|
|
||||||
border-color: transparent;
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
input[type=range]::-ms-fill-lower {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
input[type=range]::-ms-fill-upper {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
input[type=range]::-ms-thumb {
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
border-radius: 16px;
|
|
||||||
background: var(--c-f);
|
|
||||||
margin-top: -12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wwrap {
|
#wwrap {
|
||||||
display: none;
|
display: none;
|
||||||
@ -1422,6 +1402,11 @@ function populateSegments(s)
|
|||||||
<input type="checkbox" id="seg${i}rev" onchange="setRev(${i})" ${inst.rev ? "checked":""}>
|
<input type="checkbox" id="seg${i}rev" onchange="setRev(${i})" ${inst.rev ? "checked":""}>
|
||||||
<span class="checkmark schk"></span>
|
<span class="checkmark schk"></span>
|
||||||
</label>
|
</label>
|
||||||
|
<label class="check revchkl">
|
||||||
|
Mirror effect
|
||||||
|
<input type="checkbox" id="seg${i}mi" onchange="setMi(${i})" ${inst.mi ? "checked":""}>
|
||||||
|
<span class="checkmark schk"></span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div><br>`;
|
</div><br>`;
|
||||||
}
|
}
|
||||||
@ -1783,6 +1768,12 @@ function setRev(s){
|
|||||||
requestJson(obj, false);
|
requestJson(obj, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMi(s){
|
||||||
|
var mi = d.getElementById(`seg${s}mi`).checked;
|
||||||
|
var obj = {"seg": {"id": s, "mi": mi}};
|
||||||
|
requestJson(obj, false);
|
||||||
|
}
|
||||||
|
|
||||||
function setSegPwr(s){
|
function setSegPwr(s){
|
||||||
var obj = {"seg": {"id": s, "on": !powered[s]}};
|
var obj = {"seg": {"id": s, "on": !powered[s]}};
|
||||||
requestJson(obj);
|
requestJson(obj);
|
||||||
|
3666
wled00/html_ui.h
3666
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// version code in format yymmddb (b = daily build)
|
// version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 2008100
|
#define VERSION 2008200
|
||||||
|
|
||||||
// ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS).
|
// ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS).
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user