From 20f196d8139fe3cbb498776567fdf796c5a385f0 Mon Sep 17 00:00:00 2001 From: Ewoud Date: Thu, 9 May 2024 22:04:40 +0200 Subject: [PATCH] add Noise2D and swap Pan and Tilt LedEffects: add Noise2D LedLeds, LedModEffects, LedModFixture(Gen) - swap Pan and Tilt (Tilt is on x-axis first) LedModFixtureGen - remove enum Fixtures - add Strips group - prepare for 1D,2D,3D icon (WIP) --- src/App/LedEffects.h | 28 ++++- src/App/LedLeds.cpp | 8 +- src/App/LedLeds.h | 14 +-- src/App/LedModEffects.h | 16 +-- src/App/LedModFixture.h | 24 ++--- src/App/LedModFixtureGen.h | 203 +++++++++++++++++-------------------- 6 files changed, 153 insertions(+), 140 deletions(-) diff --git a/src/App/LedEffects.h b/src/App/LedEffects.h index a0c4e660..34926d2c 100644 --- a/src/App/LedEffects.h +++ b/src/App/LedEffects.h @@ -1258,7 +1258,32 @@ class ScrollingText: public Effect { default: return false; }}); } -}; +}; //ScrollingText + +class Noise2D: public Effect { + const char * name() {return "Noise2D";} + unsigned8 dim() {return _2D;} + const char * tags() {return "💡";} + + void loop(Leds &leds) { + CRGBPalette16 pal = getPalette(); + stackUnsigned8 speed = mdl->getValue("speed"); + stackUnsigned8 scale = mdl->getValue("scale"); + + for (int y = 0; y < leds.size.y; y++) { + for (int x = 0; x < leds.size.x; x++) { + uint8_t pixelHue8 = inoise8(x * scale, y * scale, now / (16 - speed)); + leds.setPixelColor(leds.XY(x, y), ColorFromPalette(pal, pixelHue8)); + } + } + } + + void controls(JsonObject parentVar) { + addPalette(parentVar, 4); + ui->initSlider(parentVar, "speed", 8, 0, 15); + ui->initSlider(parentVar, "scale", 128, 2, 255); + } +}; //Noise2D #ifdef STARLEDS_USERMOD_WLEDAUDIO @@ -1594,6 +1619,7 @@ class Effects { effects.push_back(new Lissajous); effects.push_back(new Frizzles); effects.push_back(new ScrollingText); + effects.push_back(new Noise2D); #ifdef STARLEDS_USERMOD_WLEDAUDIO //2D WLED effects.push_back(new Waverly); diff --git a/src/App/LedLeds.cpp b/src/App/LedLeds.cpp index 28433c3f..c0fa5f6d 100644 --- a/src/App/LedLeds.cpp +++ b/src/App/LedLeds.cpp @@ -23,11 +23,11 @@ void fastled_fill_rainbow(struct CRGB * targetArray, int numToFill, unsigned8 in } unsigned16 Leds::XYZ(unsigned16 x, unsigned16 y, unsigned16 z) { - if (projectionNr == p_PanTiltRoll || projectionNr == p_Preset1) { + if (projectionNr == p_TiltPanRoll || projectionNr == p_Preset1) { Coord3D result = Coord3D{x, y, z}; - if (proPanSpeed) result = trigoPanTiltRoll.pan(result, size/2, millis() * 5 / (255 - proPanSpeed)); - if (proTiltSpeed) result = trigoPanTiltRoll.tilt(result, size/2, millis() * 5 / (255 - proTiltSpeed)); - if (proRollSpeed) result = trigoPanTiltRoll.roll(result, size/2, millis() * 5 / (255 - proRollSpeed)); + if (proTiltSpeed) result = trigoTiltPanRoll.tilt(result, size/2, millis() * 5 / (255 - proTiltSpeed)); + if (proPanSpeed) result = trigoTiltPanRoll.pan(result, size/2, millis() * 5 / (255 - proPanSpeed)); + if (proRollSpeed) result = trigoTiltPanRoll.roll(result, size/2, millis() * 5 / (255 - proRollSpeed)); if (fixture->fixSize.z == 1) result.z = 0; // 3d effects will be flattened on 2D fixtures if (result >= 0 && result < size) return result.x + result.y * size.x + result.z * size.x * size.y; diff --git a/src/App/LedLeds.h b/src/App/LedLeds.h index 40f4520b..395e2519 100644 --- a/src/App/LedLeds.h +++ b/src/App/LedLeds.h @@ -32,7 +32,7 @@ enum Projections { p_Default, p_Multiply, - p_PanTiltRoll, + p_TiltPanRoll, p_DistanceFromPoint, p_Preset1, p_None, @@ -55,8 +55,8 @@ static unsigned trigoUnCached = 1; struct Trigo { uint16_t period = 360; //default period 360 Trigo(uint16_t period = 360) {this->period = period;} - float sinValue[3]; uint16_t sinAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of sinValue=sin(sinAngle) for pan, tilt and roll - float cosValue[3]; uint16_t cosAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of cosValue=cos(cosAngle) for pan, tilt and roll + float sinValue[3]; uint16_t sinAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of sinValue=sin(sinAngle) for tilt, pan and roll + float cosValue[3]; uint16_t cosAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of cosValue=cos(cosAngle) for tilt, pan and roll virtual float sinBase(uint16_t angle) {return sinf(M_TWOPI * angle / period);} virtual float cosBase(uint16_t angle) {return cosf(M_TWOPI * angle / period);} int16_t sin(int16_t factor, uint16_t angle, uint8_t cache012 = 0) { @@ -92,9 +92,9 @@ struct Trigo { out.z = inM.z; return out + middle; } - Coord3D rotate(Coord3D in, Coord3D middle, uint16_t panAngle, uint16_t tiltAngle, uint16_t rollAngle, uint16_t period = 360) { + Coord3D rotate(Coord3D in, Coord3D middle, uint16_t tiltAngle, uint16_t panAngle, uint16_t rollAngle, uint16_t period = 360) { this->period = period; - return roll(tilt(pan(in, middle, panAngle), middle, tiltAngle), middle, rollAngle); + return roll(pan(tilt(in, middle, tiltAngle), middle, panAngle), middle, rollAngle); } }; @@ -109,7 +109,7 @@ struct Trigo16: Trigo { //FastLed sin16 and cos16 float cosBase(uint16_t angle) {return cos16(65536.0f * angle / period) / 32645.0f;} }; -static Trigo trigoPanTiltRoll(255); // Trigo8 is hardly any faster (27 vs 28 fps) (spanXY=28) +static Trigo trigoTiltPanRoll(255); // Trigo8 is hardly any faster (27 vs 28 fps) (spanXY=28) class Fixture; //forward @@ -185,8 +185,8 @@ class Leds { unsigned8 effectDimension = -1; Coord3D startPos = {0,0,0}, endPos = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //default - unsigned8 proPanSpeed = 128; unsigned8 proTiltSpeed = 128; + unsigned8 proPanSpeed = 128; unsigned8 proRollSpeed = 128; SharedData sharedData; diff --git a/src/App/LedModEffects.h b/src/App/LedModEffects.h index 1dac61b7..af51da31 100644 --- a/src/App/LedModEffects.h +++ b/src/App/LedModEffects.h @@ -120,7 +120,7 @@ class LedModEffects:public SysModule { JsonArray options = ui->setOptions(var); // see enum Projections in LedFixture.h and keep the same order ! options.add("Default"); options.add("Multiply"); - options.add("PanTiltRoll"); + options.add("TiltPanRoll"); options.add("Distance ⌛"); options.add("Preset 1"); options.add("None"); @@ -181,23 +181,23 @@ class LedModEffects:public SysModule { default: return false; }}); } - if (proValue == p_PanTiltRoll || proValue == p_Preset1) { - ui->initSlider(var, "proPan", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun + if (proValue == p_TiltPanRoll || proValue == p_Preset1) { + ui->initSlider(var, "proTilt", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun case f_ChangeFun: if (rowNr < fixture.projections.size()) - fixture.projections[rowNr]->proPanSpeed = mdl->getValue(var, rowNr); + fixture.projections[rowNr]->proTiltSpeed = mdl->getValue(var, rowNr); return true; default: return false; }}); - ui->initSlider(var, "proTilt", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun + ui->initSlider(var, "proPan", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun case f_ChangeFun: if (rowNr < fixture.projections.size()) - fixture.projections[rowNr]->proTiltSpeed = mdl->getValue(var, rowNr); + fixture.projections[rowNr]->proPanSpeed = mdl->getValue(var, rowNr); return true; default: return false; }}); } - if (proValue == p_Preset1 || proValue == p_PanTiltRoll) { + if (proValue == p_Preset1 || proValue == p_TiltPanRoll) { ui->initSlider(var, "proRoll", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun case f_UIFun: ui->setLabel(var, "Roll speed"); @@ -357,7 +357,7 @@ class LedModEffects:public SysModule { mdl->getValueRowNr = rowNr++; effects.loop(*leds); mdl->getValueRowNr = UINT8_MAX; - if (leds->projectionNr == p_PanTiltRoll || leds->projectionNr == p_Preset1) + if (leds->projectionNr == p_TiltPanRoll || leds->projectionNr == p_Preset1) leds->fadeToBlackBy(50); } } diff --git a/src/App/LedModFixture.h b/src/App/LedModFixture.h index e732ac40..6810f996 100644 --- a/src/App/LedModFixture.h +++ b/src/App/LedModFixture.h @@ -75,18 +75,18 @@ class LedModFixture:public SysModule { buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; - } else if (viewRotation == 1) { //pan - buffer[1] = 0;//beatsin8(4, 250, 5); //tilt - buffer[2] = beat8(1);//, 0, 255); //pan - buffer[3] = 0;//beatsin8(6, 255, 5); //roll - } else if (viewRotation == 2) { //tilt - buffer[1] = beat8(1);//, 0, 255); //pan - buffer[2] = 0;//beatsin8(4, 250, 5); //tilt - buffer[3] = 0;//beatsin8(6, 255, 5); //roll + } else if (viewRotation == 1) { //tilt + buffer[1] = beat8(1);//, 0, 255); + buffer[2] = 0;//beatsin8(4, 250, 5); + buffer[3] = 0;//beatsin8(6, 255, 5); + } else if (viewRotation == 2) { //pan + buffer[1] = 0;//beatsin8(4, 250, 5); + buffer[2] = beat8(1);//, 0, 255); + buffer[3] = 0;//beatsin8(6, 255, 5); } else if (viewRotation == 3) { //roll - buffer[1] = 0;//beatsin8(4, 250, 5); //tilt - buffer[2] = 0;//beatsin8(6, 255, 5); //roll - buffer[3] = beat8(1);//, 0, 255); //pan + buffer[1] = 0;//beatsin8(4, 250, 5); + buffer[2] = 0;//beatsin8(6, 255, 5); + buffer[3] = beat8(1);//, 0, 255); } else if (viewRotation == 4) { buffer[1] = eff->fixture.head.x; buffer[2] = eff->fixture.head.y; @@ -113,8 +113,8 @@ class LedModFixture:public SysModule { // ui->setComment(var, "View rotation"); JsonArray options = ui->setOptions(var); options.add("None"); - options.add("Pan"); options.add("Tilt"); + options.add("Pan"); options.add("Roll"); #ifdef STARLEDS_USERMOD_WLEDAUDIO options.add("Moving heads GEQ"); diff --git a/src/App/LedModFixtureGen.h b/src/App/LedModFixtureGen.h index 4632efdc..5d2f7fdc 100644 --- a/src/App/LedModFixtureGen.h +++ b/src/App/LedModFixtureGen.h @@ -135,7 +135,7 @@ class GenFix { else return x; } - void matrix(Coord3D first, Coord3D rowEnd, Coord3D colEnd, unsigned8 ip, unsigned8 pin, uint16_t pan = 0, uint16_t tilt = 0, uint16_t roll = 0) { + void matrix(Coord3D first, Coord3D rowEnd, Coord3D colEnd, unsigned8 ip, unsigned8 pin, uint16_t tilt = 0, uint16_t pan = 0, uint16_t roll = 0) { openPin(pin); @@ -203,7 +203,7 @@ class GenFix { while (true) { ppf(" %d,%d,%d", rowPixel.x, rowPixel.y, rowPixel.z); // write3D(rowPixel.x*10, rowPixel.y*10, rowPixel.z*10); - write3D(trigo.rotate(rowPixel, middle, pan, tilt, roll, 360)); + write3D(trigo.rotate(rowPixel, middle, tilt, pan, roll, 360)); if (rowPixel == cRowEnd) break; //end condition row @@ -220,7 +220,7 @@ class GenFix { closePin(); } - void ring(Coord3D middle, unsigned16 ledCount, unsigned8 ip, unsigned8 pin, uint16_t pan = 0, uint16_t tilt = 0, uint16_t roll = 0, bool preRadius = false) { + void ring(Coord3D middle, unsigned16 ledCount, unsigned8 ip, unsigned8 pin, uint16_t tilt = 0, uint16_t pan = 0, uint16_t roll = 0, bool preRadius = false) { openPin(pin); @@ -250,13 +250,13 @@ class GenFix { pixel.y = middle.y + trigo.cos(radius, i); pixel.z = middle.z; - write3D(trigo.rotate(pixel, middle, pan, tilt, roll, 360)); + write3D(trigo.rotate(pixel, middle, tilt, pan, roll, 360)); } closePin(); } - void rings241(Coord3D middle, unsigned8 nrOfRings, bool in2out, unsigned8 ip, unsigned8 pin, uint16_t pan = 0, uint16_t tilt = 0, uint16_t roll = 0) { + void rings241(Coord3D middle, unsigned8 nrOfRings, bool in2out, unsigned8 ip, unsigned8 pin, uint16_t tilt = 0, uint16_t pan = 0, uint16_t roll = 0) { stackUnsigned8 ringsNrOfLeds[9] = {1, 8, 12, 16, 24, 32, 40, 48, 60}; // stackUnsigned8 radiuss[9] = {0, 13, 23, 33, 43, 53, 63, 73, 83}; //in mm // {0, 0}, //0 Center Point -> 1 @@ -272,7 +272,7 @@ class GenFix { // stackUnsigned16 size = radiuss[nrOfRings-1]; //size if the biggest ring for (int j=0; jinitNumber(parentVar, "fixLeds", 64, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun + case f_UIFun: + ui->setLabel(var, "Leds"); + return true; + default: return false; + }}); + ui->initNumber(parentVar, "radius", 100, 1, 1000); + } + else if (strstr(fgText, "Helix") != nullptr) { + ui->initNumber(parentVar, "fixLeds", 100, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun + case f_UIFun: + ui->setLabel(var, "Leds"); + return true; + default: return false; + }}); + ui->initNumber(parentVar, "radius", 60, 1, 600); + ui->initNumber(parentVar, "pitch", 30, 1, 100); + ui->initNumber(parentVar, "deltaLed", 30, 1, 100); + } + } + else if (strcmp(fgGroup, "Matrices") == 0) { ui->initCoord3D(parentVar, "mrxRowEnd", {7,0,0}, 0, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun case f_UIFun: @@ -615,67 +624,45 @@ class LedModFixtureGen:public SysModule { }}); } else if (strcmp(fgGroup, "Shapes") == 0) { - if (strcmp(fgText, "Rings241") == 0) { + if (strstr(fgText, "Rings241") != nullptr) { ui->initNumber(parentVar, "nrOfRings", 9, 1, 9); ui->initCheckBox(parentVar, "in2out", true); } - else if (strcmp(fgText, "Spiral") == 0) { - ui->initNumber(parentVar, "fixLeds", 64, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Leds"); - return true; - default: return false; - }}); - ui->initNumber(parentVar, "radius", 100, 1, 1000); - } - else if (strcmp(fgText, "Helix") == 0) { - ui->initNumber(parentVar, "fixLeds", 100, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Leds"); - return true; - default: return false; - }}); - ui->initNumber(parentVar, "radius", 60, 1, 600); - ui->initNumber(parentVar, "pitch", 30, 1, 100); - ui->initNumber(parentVar, "deltaLed", 30, 1, 100); - } - else if (strcmp(fgText, "Hexagon") == 0) { - ui->initNumber(parentVar, "ledsPerSide", 12, 1, 255); - } else if (strcmp(fgText, "HexaWall") == 0) { + else if (strstr(fgText, "Hexa") != nullptr) { ui->initNumber(parentVar, "ledsPerSide", 12, 1, 255); } - else if (strcmp(fgText, "Cone") == 0) { + else if (strstr(fgText, "Cone") != nullptr) { ui->initNumber(parentVar, "nrOfRings", 24, 1, 360); } } else if (strcmp(fgGroup, "Combinations") == 0) { - if (strcmp(fgText, "Wheel") == 0) { + if (strstr(fgText, "Wheel") != nullptr) { ui->initNumber(parentVar, "nrOfSpokes", 36, 1, 360); ui->initNumber(parentVar, "ledsPerSpoke", 24, 1, 360); } - else if (strcmp(fgText, "Human") == 0) { + else if (strstr(fgText, "Human") != nullptr) { } - else if (strcmp(fgText, "Curtain") == 0) { + else if (strstr(fgText, "Curtain") != nullptr) { ui->initNumber(parentVar, "width", 20, 1, 100); ui->initNumber(parentVar, "height", 20, 1, 100); } } else if (strcmp(fgGroup, "Spheres") == 0) { - if (strcmp(fgText, "Globe") == 0) { + if (strstr(fgText, "Globe") != nullptr) { ui->initNumber(parentVar, "width", 24, 1, 48); } - else if (strcmp(fgText, "GeodesicDome WIP") == 0) { + else if (strstr(fgText, "GeodesicDome") != nullptr) { ui->initNumber(parentVar, "radius", 100, 1, 1000); } } //default variables - part 2 - if (strcmp(fgGroup, "Matrices") == 0 || strcmp(fgText, "Rings241") == 0) { //tbd: the rest + if (strcmp(fgGroup, "Matrices") == 0 || strstr(fgText, "Rings241") != nullptr || strstr(fgText, "Helix") != nullptr) { //tbd: the rest ui->initCoord3D(parentVar, "fixRotate", {0,0,0}, 0, 359, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun case f_UIFun: ui->setLabel(var, "Rotate"); - ui->setComment(var, "Pan, Tilt, Roll"); + ui->setComment(var, "Tilt, Pan, Roll"); return true; default: return false; }}); @@ -719,14 +706,7 @@ class LedModFixtureGen:public SysModule { mdl->findVar("fixIP").remove("value"); mdl->findVar("fixPin").remove("value"); - if (strcmp(fgText, "16x16") == 0) { - stackUnsigned8 lengthMinOne = 15; - fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); - fixNr = 0; mdl->setValue("mrxRowEnd", Coord3D{0,lengthMinOne,0}, fixNr++); - fixNr = 0; mdl->setValue("mrxColEnd", Coord3D{lengthMinOne,lengthMinOne,0}, fixNr++); - fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); // default per board... - } - else if (strcmp(fgText, "4x16x16") == 0) { + if (strstr(fgText, "4x16x16") != nullptr) { stackUnsigned8 lengthMinOne = 15; stackUnsigned8 size = lengthMinOne + 1; fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{16,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{0,16,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{16,16,0}, fixNr++); fixNr = 0; mdl->setValue("mrxRowEnd", Coord3D{0,lengthMinOne,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{16,lengthMinOne,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{0,31,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{16,31,0}, fixNr++); @@ -734,14 +714,21 @@ class LedModFixtureGen:public SysModule { fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); } - else if (strcmp(fgText, "4x32x8") == 0) { + else if (strstr(fgText, "16x16") != nullptr) { //after 4x16x16 + stackUnsigned8 lengthMinOne = 15; + fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); + fixNr = 0; mdl->setValue("mrxRowEnd", Coord3D{0,lengthMinOne,0}, fixNr++); + fixNr = 0; mdl->setValue("mrxColEnd", Coord3D{lengthMinOne,lengthMinOne,0}, fixNr++); + fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); // default per board... + } + else if (strstr(fgText, "4x32x8") != nullptr) { stackUnsigned8 lengthMinOne = 31; fixNr = 0; mdl->setValue("fixFirst", Coord3D{lengthMinOne,lengthMinOne,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{lengthMinOne,23,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{lengthMinOne,15,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{lengthMinOne,7,0}, fixNr++); fixNr = 0; mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,24,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,16,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,8,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,0,0}, fixNr++); fixNr = 0; mdl->setValue("mrxColEnd", Coord3D{0,lengthMinOne,0}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{0,23,0}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{0,15,0}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{0,7,0}, fixNr++); fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); } - else if (strcmp(fgText, "Human Sized Cube") == 0) { + else if (strstr(fgText, "Human Sized Cube") != nullptr) { stackUnsigned8 length = 20; stackUnsigned8 size = length + 1; fixNr = 0; mdl->setValue("fixFirst", Coord3D{1,1,size}, fixNr++); mdl->setValue("fixFirst", Coord3D{0,1,1}, fixNr++); mdl->setValue("fixFirst", Coord3D{1,1,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{size,1,1}, fixNr++); mdl->setValue("fixFirst", Coord3D{1,0,1}, fixNr++); @@ -749,14 +736,14 @@ class LedModFixtureGen:public SysModule { fixNr = 0; mdl->setValue("mrxColEnd", Coord3D{length,length,size}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{0,length,length}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{length,length,0}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{size,length,length}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{length,0,length}, fixNr++); fixNr = 0; mdl->setValue("fixPin", 16, fixNr++); mdl->setValue("fixPin", 14, fixNr++); mdl->setValue("fixPin", 32, fixNr++); mdl->setValue("fixPin", 3, fixNr++); mdl->setValue("fixPin", 15, fixNr++); } - else if (strcmp(fgText, "CubeBox") == 0) { + else if (strstr(fgText, "CubeBox") != nullptr) { stackUnsigned8 length = 8; stackUnsigned8 size = length + 1; fixNr = 0; mdl->setValue("fixFirst", Coord3D{1,1,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{length, size, length}, fixNr++); mdl->setValue("fixFirst", Coord3D{size, 1, 1}, fixNr++); mdl->setValue("fixFirst", Coord3D{0, length, length}, fixNr++); mdl->setValue("fixFirst", Coord3D{length, 1, size}, fixNr++); mdl->setValue("fixFirst", Coord3D{1, 0, length}, fixNr++); fixNr = 0; mdl->setValue("mrxRowEnd", Coord3D{1,length,0}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{1, size, length}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{size, 1, length}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{0, 1, length}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{1, 1, size}, fixNr++); mdl->setValue("mrxRowEnd", Coord3D{length, 0, length}, fixNr++); fixNr = 0; mdl->setValue("mrxColEnd", Coord3D{length,length,0}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{1, size, 1}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{size, length, length}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{0, 1, 1}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{1, length, size}, fixNr++); mdl->setValue("mrxColEnd", Coord3D{length, 0, 1}, fixNr++); fixNr = 0; mdl->setValue("fixPin", 12, fixNr++); mdl->setValue("fixPin", 12, fixNr++); mdl->setValue("fixPin", 13, fixNr++); mdl->setValue("fixPin", 13, fixNr++); mdl->setValue("fixPin", 14, fixNr++); mdl->setValue("fixPin", 14, fixNr++); } - else if (strcmp(fgText, "Cube3D") == 0) { + else if (strstr(fgText, "Cube3D") != nullptr) { stackUnsigned8 length = 8; stackUnsigned8 size = length -1; for (forUnsigned8 fixNr = 0; fixNr < length; fixNr++) { mdl->setValue("fixFirst", Coord3D{0,0,(unsigned16)fixNr}, fixNr); @@ -765,7 +752,7 @@ class LedModFixtureGen:public SysModule { mdl->setValue("fixPin", 12, fixNr); } } - else if (strcmp(fgText, "Sticks") == 0) { + else if (strstr(fgText, "Sticks") != nullptr) { stackUnsigned8 length = 16; stackUnsigned8 height = 54; for (forUnsigned8 fixNr = 0; fixNr < length; fixNr++) { @@ -777,12 +764,12 @@ class LedModFixtureGen:public SysModule { } } else if (strcmp(fgGroup, "Rings") == 0) { - if (strcmp(fgText, "Olympic") == 0) { + if (strstr(fgText, "Olympic") != nullptr) { fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{10,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{20,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{5,3,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{15,3,0}, fixNr++); fixNr = 0; mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); // default per board... } - else if (strcmp(fgText, "Audi") == 0) { + else if (strstr(fgText, "Audi") != nullptr) { fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{6,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{12,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{18 ,0,0}, fixNr++); fixNr = 0; mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); mdl->setValue("fixLeds", 24, fixNr++); fixNr = 0; mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); mdl->setValue("fixPin", 2, fixNr++); // default per board... @@ -790,7 +777,7 @@ class LedModFixtureGen:public SysModule { } else if (strcmp(fgGroup, "Shapes") == 0) { - if (strcmp(fgText, "HexaWall") == 0) { + if (strstr(fgText, "HexaWall") != nullptr) { fixNr = 0; mdl->setValue("fixFirst", Coord3D{0,0,0}, fixNr++); mdl->setValue("fixFirst", Coord3D{10,6,0}, fixNr++); @@ -866,8 +853,7 @@ class LedModFixtureGen:public SysModule { if (strcmp(fgGroup, "Matrices") == 0) { - Coord3D size = (mdl->getValue("mrxColEnd").as() - mdl->getValue("fixFirst").as()) + Coord3D{1,1,1}; - print->fFormat(fileName, 31, "%s%d%d%d", fgText, size.x, size.y, size.z); + print->fFormat(fileName, 31, "%s", fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { Coord3D fixRotate = mdl->getValue("fixRotate", rowNr); @@ -891,7 +877,7 @@ class LedModFixtureGen:public SysModule { genFix->ring(middle, ledCount, fixIP, fixPin); }); - } else if (strcmp(fgText, "Rings241") == 0) { + } else if (strstr(fgText, "Rings241") != nullptr) { print->fFormat(fileName, 31, "%s-%d", fgText, mdl->getValue("nrOfRings").as()); @@ -906,7 +892,7 @@ class LedModFixtureGen:public SysModule { genFix->rings241(middle, mdl->getValue("nrOfRings", rowNr), mdl->getValue("in2out", rowNr), fixIP, fixPin, fixRotate.x, fixRotate.y, fixRotate.z); }); - } else if (strcmp(fgText, "Spiral") == 0) { + } else if (strstr(fgText, "Spiral") != nullptr) { print->fFormat(fileName, 31, "%s%d", fgText, mdl->getValue("fixLeds").as()); @@ -922,11 +908,12 @@ class LedModFixtureGen:public SysModule { genFix->spiral(middle, fixLeds, radius, fixIP, fixPin); }); - } else if (strcmp(fgText, "Helix") == 0) { + } else if (strstr(fgText, "Helix") != nullptr) { print->fFormat(fileName, 31, "%s%d", fgText, mdl->getValue("fixLeds").as()); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { + Coord3D fixRotate = mdl->getValue("fixRotate", rowNr); uint16_t fixLeds = mdl->getValue("fixLeds", rowNr); uint16_t radius = mdl->getValue("radius", rowNr); uint16_t pitch = mdl->getValue("pitch", rowNr); @@ -938,10 +925,10 @@ class LedModFixtureGen:public SysModule { middle.y = fixFirst.y*10; middle.z = fixFirst.z*10 + radius; - genFix->helix(middle, fixLeds, radius, pitch, deltaLed, fixIP, fixPin); + genFix->helix(middle, fixLeds, radius, pitch, deltaLed, fixIP, fixPin, fixRotate.x, fixRotate.y, fixRotate.z); }); - } else if (strcmp(fgText, "Wheel") == 0) { + } else if (strstr(fgText, "Wheel") != nullptr) { print->fFormat(fileName, 31, "%s%d%d", fgText, mdl->getValue("nrOfSpokes").as(), mdl->getValue("ledsPerSpoke").as()); @@ -957,7 +944,7 @@ class LedModFixtureGen:public SysModule { genFix->wheel(middle, mdl->getValue("nrOfSpokes", rowNr), ledsPerSpoke, fixIP, fixPin); }); - } else if (strcmp(fgText, "Hexagon") == 0) { + } else if (strstr(fgText, "Hexa") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -967,7 +954,7 @@ class LedModFixtureGen:public SysModule { genFix->hexagon(middle, ledsPerSide, fixIP, fixPin); }); - } else if (strcmp(fgText, "Cone") == 0) { + } else if (strstr(fgText, "Cone") != nullptr) { print->fFormat(fileName, 31, "%s%d", fgText, mdl->getValue("nrOfRings").as()); @@ -984,14 +971,14 @@ class LedModFixtureGen:public SysModule { genFix->cone(middle, nrOfRings, fixIP, fixPin); }); - } else if (strcmp(fgText, "Cloud5416") == 0) { + } else if (strstr(fgText, "Cloud5416") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { genFix->cloud5416(fixFirst*10, fixIP, fixPin); }); - } else if (strcmp(fgText, "Wall") == 0) { + } else if (strstr(fgText, "Wall") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -1005,7 +992,7 @@ class LedModFixtureGen:public SysModule { // genFix.spiral(240, 0, 0, 48); }); - } else if (strcmp(fgText, "Star") == 0) { + } else if (strstr(fgText, "Star") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -1027,19 +1014,19 @@ class LedModFixtureGen:public SysModule { }); - } else if (strcmp(fgText, "6Rings") == 0) { + } else if (strstr(fgText, "6Rings") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { genFix->rings241(Coord3D{110,110,0}, 9, true, fixIP, fixPin); - genFix->rings241(Coord3D{0,110,110}, 9, true, fixIP, fixPin, 90); //pan 90 + genFix->rings241(Coord3D{0,110,110}, 9, true, fixIP, fixPin, 0, 90); //pan 90 genFix->rings241(Coord3D{110,110,220}, 9, true, fixIP, fixPin); - genFix->rings241(Coord3D{220,110,110}, 9, true, fixIP, fixPin, 90); // pan 90 - genFix->rings241(Coord3D{110,0,110}, 9, true, fixIP, fixPin, 0, 90); // tilt 90 - genFix->rings241(Coord3D{110,220,110}, 9, true, fixIP, fixPin, 0, 90); // tilt 90 + genFix->rings241(Coord3D{220,110,110}, 9, true, fixIP, fixPin, 0, 90); // pan 90 + genFix->rings241(Coord3D{110,0,110}, 9, true, fixIP, fixPin, 90); // tilt 90 + genFix->rings241(Coord3D{110,220,110}, 9, true, fixIP, fixPin, 90); // tilt 90 }); - } else if (strcmp(fgText, "SpaceStation") == 0) { + } else if (strstr(fgText, "SpaceStation") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -1048,11 +1035,11 @@ class LedModFixtureGen:public SysModule { uint8_t ringRadius = 50; uint8_t issRadius = 150; Coord3D middle = Coord3D{ringRadius + issRadius + trigo.sin(issRadius, i), ringRadius + issRadius + trigo.cos(issRadius, i), ringRadius}; - genFix->ring(middle, 12, fixIP, fixPin, 0, 90, 360-i); // tilt 90 then roll a bit + genFix->ring(middle, 12, fixIP, fixPin, 90, 0, 360-i); // tilt 90 then roll a bit } }); - } else if (strcmp(fgText, "Human") == 0) { + } else if (strstr(fgText, "Human") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -1077,7 +1064,7 @@ class LedModFixtureGen:public SysModule { }); - } else if (strcmp(fgText, "Globe") == 0) { + } else if (strstr(fgText, "Globe") != nullptr) { print->fFormat(fileName, 31, "%s%d", fgText, mdl->getValue("width").as()); @@ -1092,7 +1079,7 @@ class LedModFixtureGen:public SysModule { genFix->globe(middle, width, fixIP, fixPin); }); - } else if (strcmp(fgText, "LeGlorb") == 0) { + } else if (strstr(fgText, "LeGlorb") != nullptr) { strcpy(fileName, fgText); getFixtures(fileName, [](GenFix * genFix, unsigned8 rowNr, Coord3D fixFirst, unsigned8 fixIP, unsigned8 fixPin) { @@ -1116,7 +1103,7 @@ class LedModFixtureGen:public SysModule { }); - } else if (strcmp(fgText, "GeodesicDome WIP") == 0) { + } else if (strstr(fgText, "GeodesicDome") != nullptr) { print->fFormat(fileName, 31, "%s%d", fgText, mdl->getValue("radius").as()); @@ -1124,7 +1111,7 @@ class LedModFixtureGen:public SysModule { genFix->geodesicDome(fixFirst, mdl->getValue("radius", rowNr), fixIP, fixPin); }); - } else if (strcmp(fgText, "Curtain") == 0) { + } else if (strstr(fgText, "Curtain") != nullptr) { uint16_t width = mdl->getValue("width"); uint16_t height = mdl->getValue("height");