Merge branch 'json-mapping' into mdev
This commit is contained in:
@@ -208,6 +208,7 @@ void Segment::setUpLeds() {
|
||||
|
||||
CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
||||
static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment
|
||||
static CRGBPalette16 randomPalette = CRGBPalette16(DEFAULT_COLOR);
|
||||
byte tcp[72];
|
||||
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0;
|
||||
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0;
|
||||
@@ -229,30 +230,31 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
||||
targetPalette = PartyColors_p; break;
|
||||
case 1: //periodically replace palette with a random one. Doesn't work with multiple FastLED segments
|
||||
if (millis() - _lastPaletteChange > 5000 /*+ ((uint32_t)(255-intensity))*100*/) {
|
||||
targetPalette = CRGBPalette16(
|
||||
CHSV(random8(), 255, random8(128, 255)),
|
||||
CHSV(random8(), 255, random8(128, 255)),
|
||||
CHSV(random8(), 192, random8(128, 255)),
|
||||
CHSV(random8(), 255, random8(128, 255)));
|
||||
randomPalette = CRGBPalette16(
|
||||
CHSV(random8(), random8(160, 255), random8(128, 255)),
|
||||
CHSV(random8(), random8(160, 255), random8(128, 255)),
|
||||
CHSV(random8(), random8(160, 255), random8(128, 255)),
|
||||
CHSV(random8(), random8(160, 255), random8(128, 255)));
|
||||
_lastPaletteChange = millis();
|
||||
} break;
|
||||
}
|
||||
targetPalette = randomPalette; break;
|
||||
case 2: {//primary color only
|
||||
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
|
||||
CRGB prim = gamma32(colors[0]);
|
||||
targetPalette = CRGBPalette16(prim); break;}
|
||||
case 3: {//primary + secondary
|
||||
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
|
||||
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
|
||||
CRGB prim = gamma32(colors[0]);
|
||||
CRGB sec = gamma32(colors[1]);
|
||||
targetPalette = CRGBPalette16(prim,prim,sec,sec); break;}
|
||||
case 4: {//primary + secondary + tertiary
|
||||
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
|
||||
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
|
||||
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
|
||||
CRGB prim = gamma32(colors[0]);
|
||||
CRGB sec = gamma32(colors[1]);
|
||||
CRGB ter = gamma32(colors[2]);
|
||||
targetPalette = CRGBPalette16(ter,sec,prim); break;}
|
||||
case 5: {//primary + secondary (+tert if not off), more distinct
|
||||
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
|
||||
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
|
||||
CRGB prim = gamma32(colors[0]);
|
||||
CRGB sec = gamma32(colors[1]);
|
||||
if (colors[2]) {
|
||||
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
|
||||
CRGB ter = gamma32(colors[2]);
|
||||
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,ter,ter,ter,ter,ter,prim);
|
||||
} else {
|
||||
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,sec,sec,sec);
|
||||
@@ -420,8 +422,130 @@ uint16_t Segment::nrOfVStrips() const {
|
||||
return vLen;
|
||||
}
|
||||
|
||||
//WLEDSR jMap
|
||||
class JMapC {
|
||||
public:
|
||||
char previousSegmentName[50] = "";
|
||||
|
||||
~JMapC() {
|
||||
Serial.println("~JMapC");
|
||||
if (jMapDoc) {
|
||||
delete jMapDoc; jMapDoc = nullptr;
|
||||
}
|
||||
}
|
||||
uint16_t length() {
|
||||
initjMapDoc();
|
||||
if (jMapDoc)
|
||||
return jMapDoc->size();
|
||||
else
|
||||
return SEGMENT.virtualWidth() * SEGMENT.virtualHeight(); //pixels
|
||||
}
|
||||
void setPixelColor(uint16_t i, uint32_t col) {
|
||||
initjMapDoc();
|
||||
if (jMapDoc) {
|
||||
if (i==0) {
|
||||
SEGMENT.fadeToBlackBy(10); //as not all pixels used
|
||||
}
|
||||
//get itH element of jMap and use x and y to sPCXY call (or multiple calls if tuples)
|
||||
JsonArray outerArray = jMapDoc->as<JsonArray>();
|
||||
if (outerArray[i][0].is<JsonArray>()){
|
||||
for (JsonVariant innerElement: outerArray[i].as<JsonArray>()) {
|
||||
SEGMENT.setPixelColorXY(innerElement[0].as<uint16_t>() * scale, innerElement[1].as<uint16_t>() * scale, col);
|
||||
}
|
||||
}
|
||||
else {
|
||||
SEGMENT.setPixelColorXY(outerArray[i][0].as<uint16_t>() * scale, outerArray[i][1].as<uint16_t>() * scale, col);
|
||||
// SEGMENT.drawLine(outerArray[i][0].as<uint16_t>()*scale, outerArray[i-1][0].as<uint16_t>()*scale, outerArray[i-1][0].as<uint16_t>()*scale, outerArray[i][1].as<uint16_t>()*scale, col);
|
||||
}
|
||||
}
|
||||
}
|
||||
uint32_t getPixelColor(uint16_t i) {
|
||||
initjMapDoc();
|
||||
if (jMapDoc) {
|
||||
JsonArray outerArray = jMapDoc->as<JsonArray>();
|
||||
if (outerArray[i][0].is<JsonArray>())
|
||||
return SEGMENT.getPixelColorXY(outerArray[i][0][0].as<uint16_t>() * scale, outerArray[i][0][1].as<uint16_t>() * scale);
|
||||
else
|
||||
return SEGMENT.getPixelColorXY(outerArray[i][0].as<uint16_t>() * scale, outerArray[i][1].as<uint16_t>() * scale);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
private:
|
||||
DynamicJsonDocument *jMapDoc = nullptr;
|
||||
uint8_t scale;
|
||||
void initjMapDoc() {
|
||||
// if (jMapDoc && SEGMENT.name == nullptr) {
|
||||
// Serial.println("Delete jMapDoc");
|
||||
// delete jMapDoc; jMapDoc = nullptr;
|
||||
// }
|
||||
if (!jMapDoc && SEGMENT.name != nullptr) {
|
||||
Serial.println("Create jMapDoc");
|
||||
jMapDoc = new DynamicJsonDocument(4*4096);
|
||||
}
|
||||
|
||||
if (jMapDoc && SEGMENT.name != nullptr && strcmp(SEGMENT.name, previousSegmentName) != 0) {
|
||||
Serial.println("New name");
|
||||
char jMapFileName[50];
|
||||
strcpy(jMapFileName, "/");
|
||||
strcat(jMapFileName, SEGMENT.name);
|
||||
strcat(jMapFileName, ".jmap");
|
||||
File jMapFile;
|
||||
jMapFile = LITTLEFS.open(jMapFileName, "r");
|
||||
|
||||
DeserializationError err = deserializeJson(*jMapDoc, jMapFile);
|
||||
if (err)
|
||||
{
|
||||
Serial.printf("deserializeJson() of parseTree failed with code %s\n", err.c_str());
|
||||
SEGMENT.name = nullptr; //need to clear the name as otherwise continuously loaded
|
||||
return;
|
||||
}
|
||||
//get the width and height of the jMap
|
||||
uint8_t maxWidth = 0;
|
||||
uint8_t maxHeight = 0;
|
||||
JsonArray outerArray = jMapDoc->as<JsonArray>();
|
||||
for (JsonVariant outerElement: outerArray) {
|
||||
if (outerElement[0].is<JsonArray>()){
|
||||
for (JsonVariant innerElement: outerElement.as<JsonArray>()) {
|
||||
maxWidth = MAX(maxWidth, innerElement[0].as<uint16_t>());
|
||||
maxHeight = MAX(maxHeight, innerElement[1].as<uint16_t>());
|
||||
}
|
||||
}
|
||||
else {
|
||||
maxWidth = MAX(maxWidth, outerElement[0].as<uint16_t>());
|
||||
maxHeight = MAX(maxHeight, outerElement[1].as<uint16_t>());
|
||||
}
|
||||
}
|
||||
maxWidth++; maxHeight++;
|
||||
scale = MIN(SEGMENT.virtualWidth() / maxWidth, SEGMENT.virtualHeight() / maxHeight);
|
||||
|
||||
Serial.printf("jMapDoc %u / %u%% (%u %u %u)\n", (unsigned int)jMapDoc->memoryUsage(), 100 * jMapDoc->memoryUsage() / jMapDoc->capacity(), (unsigned int)jMapDoc->size(), jMapDoc->overflowed(), (unsigned int)jMapDoc->nesting());
|
||||
Serial.println(scale);
|
||||
// serializeJson(*jMapDoc, Serial); Serial.println();
|
||||
strcpy(previousSegmentName, SEGMENT.name);
|
||||
}
|
||||
} //initjMapDoc
|
||||
}; //class JMapC
|
||||
|
||||
//WLEDSR jMap
|
||||
void * Segment::getjMap() {
|
||||
if (!jMapC) {
|
||||
Serial.println("getjMap");
|
||||
jMapC = new JMapC();
|
||||
}
|
||||
return jMapC;
|
||||
}
|
||||
|
||||
//WLEDSR jMap
|
||||
void Segment::deletejMap() {
|
||||
//Should be called from ~Segment but causes crash (and ~Segment is called quite often...)
|
||||
if (jMapC) {
|
||||
Serial.println("deletejMap");
|
||||
delete (JMapC *)jMapC; jMapC = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
// 1D strip
|
||||
uint16_t Segment::virtualLength() const {
|
||||
uint16_t Segment::virtualLength() { //WLEDSR jMap: without const
|
||||
#ifndef WLED_DISABLE_2D
|
||||
if (is2D()) {
|
||||
uint16_t vW = virtualWidth();
|
||||
@@ -435,6 +559,10 @@ uint16_t Segment::virtualLength() const {
|
||||
case M12_pArc:
|
||||
vLen = max(vW,vH); // get the longest dimension
|
||||
break;
|
||||
case M12_jMap: //WLEDSR jMap
|
||||
JMapC *jMapC = (JMapC *)getjMap();
|
||||
vLen = jMapC->length();
|
||||
break;
|
||||
}
|
||||
return vLen;
|
||||
}
|
||||
@@ -477,6 +605,10 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col)
|
||||
for (int x = 0; x <= i; x++) setPixelColorXY(x, i, col);
|
||||
for (int y = 0; y < i; y++) setPixelColorXY(i, y, col);
|
||||
break;
|
||||
case M12_jMap: //WLEDSR jMap
|
||||
JMapC *jMapC = (JMapC *)getjMap();
|
||||
jMapC->setPixelColor(i, col);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
} else if (strip.isMatrix && (width()==1 || height()==1)) { // TODO remove this hack
|
||||
@@ -583,6 +715,10 @@ uint32_t Segment::getPixelColor(int i)
|
||||
// use longest dimension
|
||||
return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i);
|
||||
break;
|
||||
case M12_jMap: //WLEDSR jMap
|
||||
JMapC *jMapC = (JMapC *)getjMap();
|
||||
return jMapC->getPixelColor(i);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -816,7 +952,7 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
|
||||
// default palette or no RGB support on segment
|
||||
if ((palette == 0 && mcol < NUM_COLORS) || !(_capabilities & 0x01)) {
|
||||
uint32_t color = (transitional && _t) ? _t->_colorT[mcol] : colors[mcol];
|
||||
color = strip.gammaCorrectCol ? gamma32(color) : color;
|
||||
color = gamma32(color);
|
||||
if (pbri == 255) return color;
|
||||
return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user