From 2544d2e0680d4fd27ae3741bb773d9e513e42b0d Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 12 Feb 2021 11:54:35 +0100 Subject: [PATCH] Dynamic LED map creation from JSON file /ledmap.json in format {"map":[4,3,2,1,...]}. Used for rearranging LEDs (matrices, awkward placement, ...) --- wled00/FX_fcn.cpp | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 8c1681a3..41b01016 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -28,26 +28,50 @@ #include "palettes.h" //enable custom per-LED mapping. This can allow for better effects on matrices or special displays -//#define WLED_CUSTOM_LED_MAPPING - -#ifdef WLED_CUSTOM_LED_MAPPING +/* //this is just an example (30 LEDs). It will first set all even, then all uneven LEDs. const uint16_t customMappingTable[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29}; //another example. Switches direction every 5 LEDs. -/*const uint16_t customMappingTable[] = { +const uint16_t customMappingTable[] = { 0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10, 11, 12, 13, 14, - 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 29, 28, 27, 26, 25};*/ + 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 29, 28, 27, 26, 25}; const uint16_t customMappingSize = sizeof(customMappingTable)/sizeof(uint16_t); //30 in example -#endif +*/ +uint16_t* customMappingTable = nullptr; +uint16_t customMappingSize = 0; #ifndef PWM_INDEX #define PWM_INDEX 0 #endif +void WS2812FX::deserializeMap(void) { + DynamicJsonDocument doc(JSON_BUFFER_SIZE); // full sized buffer for larger maps + + DEBUG_PRINTLN(F("Reading LED map from /ledmap.json...")); + + if (!readObjectFromFile("/ledmap.json", nullptr, &doc)) return; //if file does not exist just exit + + if (customMappingTable != nullptr) { + delete[] customMappingTable; + customMappingTable = nullptr; + customMappingSize = 0; + } + + JsonArray map = doc[F("map")]; + if (!map.isNull() && map.size()) { // not an empty map + customMappingSize = map.size(); + customMappingTable = new uint16_t[customMappingSize]; + for (uint16_t i=0; iBegin((NeoPixelType)ty, _lengthRaw); _segments[0].start = 0; @@ -189,9 +215,7 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) int16_t indexSet = realIndex + (reversed ? -j : j); int16_t indexSetRev = indexSet; if (reverseMode) indexSetRev = REV(indexSet); - #ifdef WLED_CUSTOM_LED_MAPPING if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet]; - #endif if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) { bus->SetPixelColor(indexSet + skip, col); if (IS_MIRROR) { //set the corresponding mirrored pixel @@ -205,9 +229,7 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) } } else { //live data, etc. if (reverseMode) i = REV(i); - #ifdef WLED_CUSTOM_LED_MAPPING if (i < customMappingSize) i = customMappingTable[i]; - #endif bus->SetPixelColor(i + skip, col); } if (skip && i == 0) { @@ -482,9 +504,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i) { i = realPixelIndex(i); - #ifdef WLED_CUSTOM_LED_MAPPING if (i < customMappingSize) i = customMappingTable[i]; - #endif if (_skipFirstMode) i += LED_SKIP_AMOUNT;