Transpose fix for XY()
Slight internal API change. Renamed c1x,c2x,c3x to custom1, custom2, custom3 to be in line with SR.
This commit is contained in:
parent
62abc63f7a
commit
e003ec39fb
@ -277,6 +277,9 @@ class WS2812FX {
|
||||
|
||||
static WS2812FX* instance;
|
||||
|
||||
// mode (effect) name and its slider control data array
|
||||
static const char *_modeData[MODE_COUNT];
|
||||
|
||||
public:
|
||||
|
||||
// segment parameters
|
||||
@ -294,7 +297,7 @@ class WS2812FX {
|
||||
uint32_t colors[NUM_COLORS];
|
||||
uint8_t cct; //0==1900K, 255==10091K
|
||||
uint8_t _capabilities;
|
||||
uint8_t c1x, c2x, c3x; // custom FX parameters
|
||||
uint8_t custom1, custom2, custom3; // custom FX parameters
|
||||
uint16_t startY; // start Y coodrinate 2D (top)
|
||||
uint16_t stopY; // stop Y coordinate 2D (bottom)
|
||||
char *name;
|
||||
@ -344,6 +347,7 @@ class WS2812FX {
|
||||
ColorTransition::startTransition(0, colors[0], instance->_transitionDur, segn, 0);
|
||||
}
|
||||
}
|
||||
// 2D matrix
|
||||
uint16_t virtualWidth() {
|
||||
uint16_t groupLen = groupLength();
|
||||
uint16_t vWidth = (width() + groupLen - 1) / groupLen;
|
||||
@ -356,6 +360,7 @@ class WS2812FX {
|
||||
if (getOption(SEG_OPTION_MIRROR_Y)) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
||||
return vHeight;
|
||||
}
|
||||
// 1D strip
|
||||
uint16_t virtualLength() {
|
||||
uint16_t groupLen = groupLength();
|
||||
uint16_t vLength = (length() + groupLen - 1) / groupLen;
|
||||
@ -934,7 +939,7 @@ class WS2812FX {
|
||||
|
||||
uint16_t
|
||||
XY(uint16_t, uint16_t),
|
||||
getPixelIndex(uint16_t x, uint16_t y, uint8_t seg=255);
|
||||
get2DPixelIndex(uint16_t x, uint16_t y, uint8_t seg=255);
|
||||
|
||||
uint32_t
|
||||
getPixelColorXY(uint16_t, uint16_t);
|
||||
|
@ -106,20 +106,27 @@ void WS2812FX::setUpMatrix() {
|
||||
}
|
||||
}
|
||||
|
||||
// XY(x,y) - gets pixel index within current segment
|
||||
// XY(x,y) - gets pixel index within current segment (takes into account transposed segment)
|
||||
uint16_t IRAM_ATTR WS2812FX::XY(uint16_t x, uint16_t y) {
|
||||
uint16_t width = SEGMENT.virtualWidth(); // segment width in logical pixels
|
||||
if (SEGMENT.getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
|
||||
return (x%width) + (y%SEGMENT.virtualHeight()) * width;
|
||||
uint16_t width = SEGMENT.virtualWidth(); // segment width in logical pixels (is already transposed)
|
||||
uint16_t height = SEGMENT.virtualHeight(); // segment height in logical pixels (is already transposed)
|
||||
if (SEGMENT.getOption(SEG_OPTION_TRANSPOSED)) {
|
||||
uint16_t t;
|
||||
// swap X & Y if segment transposed
|
||||
t = x; x = y; y = t;
|
||||
// swap width & height if segment transposed
|
||||
t = width; width = height; height = t;
|
||||
}
|
||||
return (x%width) + (y%height) * width;
|
||||
}
|
||||
|
||||
// getPixelIndex(x,y,seg) - returns an index of segment pixel in a matrix layout
|
||||
// get2DPixelIndex(x,y,seg) - returns an index of segment pixel in a matrix layout
|
||||
// index still needs to undergo ledmap processing to represent actual physical pixel
|
||||
// matrix is always organized by matrixHeight number of matrixWidth pixels from top to bottom, left to right
|
||||
// so: pixel at getPixelIndex(5,6) in a 2D segment with [start=10, stop=19, startY=20, stopY=29 : 10x10 pixels]
|
||||
// so: pixel at get2DPixelIndex(5,6) in a 2D segment with [start=10, stop=19, startY=20, stopY=29 : 10x10 pixels]
|
||||
// corresponds to pixel with logical index of 847 (0 based) if a 2D segment belongs to a 32x32 matrix.
|
||||
// math: (matrixWidth * (startY + y)) + start + x => (32 * (20+6)) + 10 + 5 = 847
|
||||
uint16_t IRAM_ATTR WS2812FX::getPixelIndex(uint16_t x, uint16_t y, uint8_t seg) {
|
||||
uint16_t IRAM_ATTR WS2812FX::get2DPixelIndex(uint16_t x, uint16_t y, uint8_t seg) {
|
||||
if (seg == 255) seg = _segment_index;
|
||||
x %= _segments[seg].width(); // just in case constrain x (wrap around)
|
||||
y %= _segments[seg].height(); // just in case constrain y (wrap around)
|
||||
@ -152,17 +159,17 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(uint16_t x, uint16_t y, byte r, byte g,
|
||||
if (SEGMENT.getOption(SEG_OPTION_REVERSED) ) xX = SEGMENT.width() - xX - 1;
|
||||
if (SEGMENT.getOption(SEG_OPTION_REVERSED_Y)) yY = SEGMENT.height() - yY - 1;
|
||||
|
||||
index = getPixelIndex(xX, yY);
|
||||
index = get2DPixelIndex(xX, yY);
|
||||
if (index < customMappingSize) index = customMappingTable[index];
|
||||
busses.setPixelColor(index, col);
|
||||
|
||||
if (SEGMENT.getOption(SEG_OPTION_MIRROR)) { //set the corresponding horizontally mirrored pixel
|
||||
index = getPixelIndex(SEGMENT.width() - xX - 1, yY);
|
||||
index = get2DPixelIndex(SEGMENT.width() - xX - 1, yY);
|
||||
if (index < customMappingSize) index = customMappingTable[index];
|
||||
busses.setPixelColor(index, col);
|
||||
}
|
||||
if (SEGMENT.getOption(SEG_OPTION_MIRROR_Y)) { //set the corresponding vertically mirrored pixel
|
||||
index = getPixelIndex(xX, SEGMENT.height() - yY - 1);
|
||||
index = get2DPixelIndex(xX, SEGMENT.height() - yY - 1);
|
||||
if (index < customMappingSize) index = customMappingTable[index];
|
||||
busses.setPixelColor(index, col);
|
||||
}
|
||||
@ -181,7 +188,7 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
|
||||
if (SEGMENT.getOption(SEG_OPTION_REVERSED) ) x = SEGMENT.width() - x - 1;
|
||||
if (SEGMENT.getOption(SEG_OPTION_REVERSED_Y)) y = SEGMENT.height() - y - 1;
|
||||
|
||||
uint16_t index = getPixelIndex(x, y);
|
||||
uint16_t index = get2DPixelIndex(x, y);
|
||||
if (index < customMappingSize) index = customMappingTable[index];
|
||||
|
||||
return busses.getPixelColor(index);
|
||||
|
@ -566,9 +566,9 @@ uint8_t WS2812FX::Segment::differs(Segment& b) {
|
||||
if (speed != b.speed) d |= SEG_DIFFERS_FX;
|
||||
if (intensity != b.intensity) d |= SEG_DIFFERS_FX;
|
||||
if (palette != b.palette) d |= SEG_DIFFERS_FX;
|
||||
if (c1x != b.c1x) d |= SEG_DIFFERS_FX;
|
||||
if (c2x != b.c2x) d |= SEG_DIFFERS_FX;
|
||||
if (c3x != b.c3x) d |= SEG_DIFFERS_FX;
|
||||
if (custom1 != b.custom1) d |= SEG_DIFFERS_FX;
|
||||
if (custom2 != b.custom2) d |= SEG_DIFFERS_FX;
|
||||
if (custom3 != b.custom3) d |= SEG_DIFFERS_FX;
|
||||
if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS;
|
||||
if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS;
|
||||
|
||||
@ -710,9 +710,9 @@ void WS2812FX::resetSegments() {
|
||||
_segments[0].setOption(SEG_OPTION_ON, 1);
|
||||
_segments[0].opacity = 255;
|
||||
_segments[0].cct = 127;
|
||||
_segments[0].c1x = DEFAULT_C1;
|
||||
_segments[0].c2x = DEFAULT_C2;
|
||||
_segments[0].c3x = DEFAULT_C3;
|
||||
_segments[0].custom1 = DEFAULT_C1;
|
||||
_segments[0].custom2 = DEFAULT_C2;
|
||||
_segments[0].custom3 = DEFAULT_C3;
|
||||
|
||||
for (uint16_t i = 1; i < MAX_NUM_SEGMENTS; i++)
|
||||
{
|
||||
@ -723,9 +723,9 @@ void WS2812FX::resetSegments() {
|
||||
_segments[i].cct = 127;
|
||||
_segments[i].speed = DEFAULT_SPEED;
|
||||
_segments[i].intensity = DEFAULT_INTENSITY;
|
||||
_segments[i].c1x = DEFAULT_C1;
|
||||
_segments[i].c2x = DEFAULT_C2;
|
||||
_segments[i].c3x = DEFAULT_C3;
|
||||
_segments[i].custom1 = DEFAULT_C1;
|
||||
_segments[i].custom2 = DEFAULT_C2;
|
||||
_segments[i].custom3 = DEFAULT_C3;
|
||||
_segment_runtimes[i].markForReset();
|
||||
}
|
||||
_segment_runtimes[0].markForReset();
|
||||
|
@ -1221,9 +1221,9 @@ function readState(s,command=false)
|
||||
|
||||
gId('sliderSpeed').value = i.sx;
|
||||
gId('sliderIntensity').value = i.ix;
|
||||
gId('sliderC1').value = i.c1x ? i.c1x : 0;
|
||||
gId('sliderC2').value = i.c2x ? i.c2x : 0;
|
||||
gId('sliderC3').value = i.c3x ? i.c3x : 0;
|
||||
gId('sliderC1').value = i.c1 ? i.c1 : 0;
|
||||
gId('sliderC2').value = i.c2 ? i.c2 : 0;
|
||||
gId('sliderC3').value = i.c3 ? i.c3 : 0;
|
||||
|
||||
if (s.error && s.error != 0) {
|
||||
var errstr = "";
|
||||
@ -2011,9 +2011,9 @@ function setCustom(i=1)
|
||||
if (i<1 || i>3) return;
|
||||
var obj = {"seg": {}};
|
||||
var val = parseInt(gId(`sliderC${i}`).value);
|
||||
if (i===3) obj.seg.c3x = val;
|
||||
else if (i===2) obj.seg.c2x = val;
|
||||
else obj.seg.c1x = val;
|
||||
if (i===3) obj.seg.c3 = val;
|
||||
else if (i===2) obj.seg.c2 = val;
|
||||
else obj.seg.c1 = val;
|
||||
requestJson(obj);
|
||||
}
|
||||
|
||||
|
1003
wled00/html_ui.h
1003
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -165,9 +165,9 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||
getVal(elem[F("sx")], &seg.speed, 0, 255);
|
||||
getVal(elem[F("ix")], &seg.intensity, 0, 255);
|
||||
getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount());
|
||||
getVal(elem[F("c1x")], &seg.c1x, 0, 255);
|
||||
getVal(elem[F("c2x")], &seg.c2x, 0, 255);
|
||||
getVal(elem[F("c3x")], &seg.c3x, 0, 255);
|
||||
getVal(elem[F("c1")], &seg.custom1, 0, 255);
|
||||
getVal(elem[F("c2")], &seg.custom2, 0, 255);
|
||||
getVal(elem[F("c3")], &seg.custom3, 0, 255);
|
||||
|
||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||
if (!iarr.isNull()) {
|
||||
@ -433,9 +433,9 @@ void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool fo
|
||||
root[F("sx")] = seg.speed;
|
||||
root[F("ix")] = seg.intensity;
|
||||
root["pal"] = seg.palette;
|
||||
root[F("c1x")] = seg.c1x;
|
||||
root[F("c2x")] = seg.c2x;
|
||||
root[F("c3x")] = seg.c3x;
|
||||
root[F("c1")] = seg.custom1;
|
||||
root[F("c2")] = seg.custom2;
|
||||
root[F("c3")] = seg.custom3;
|
||||
root[F("sel")] = seg.isSelected();
|
||||
root["rev"] = seg.getOption(SEG_OPTION_REVERSED);
|
||||
root[F("mi")] = seg.getOption(SEG_OPTION_MIRROR);
|
||||
|
Loading…
Reference in New Issue
Block a user