kopia lustrzana https://github.com/Aircoookie/WLED
Dynamic LED map creation from JSON file /ledmap.json in format {"map":[4,3,2,1,...]}.
Used for rearranging LEDs (matrices, awkward placement, ...)pull/1738/head
rodzic
f7114fc2aa
commit
2544d2e068
|
@ -28,26 +28,50 @@
|
||||||
#include "palettes.h"
|
#include "palettes.h"
|
||||||
|
|
||||||
//enable custom per-LED mapping. This can allow for better effects on matrices or special displays
|
//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.
|
//this is just an example (30 LEDs). It will first set all even, then all uneven LEDs.
|
||||||
const uint16_t customMappingTable[] = {
|
const uint16_t customMappingTable[] = {
|
||||||
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28,
|
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};
|
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29};
|
||||||
|
|
||||||
//another example. Switches direction every 5 LEDs.
|
//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,
|
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
|
const uint16_t customMappingSize = sizeof(customMappingTable)/sizeof(uint16_t); //30 in example
|
||||||
#endif
|
*/
|
||||||
|
uint16_t* customMappingTable = nullptr;
|
||||||
|
uint16_t customMappingSize = 0;
|
||||||
|
|
||||||
#ifndef PWM_INDEX
|
#ifndef PWM_INDEX
|
||||||
#define PWM_INDEX 0
|
#define PWM_INDEX 0
|
||||||
#endif
|
#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; i<customMappingSize; i++) {
|
||||||
|
customMappingTable[i] = (uint16_t) map[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
||||||
{
|
{
|
||||||
if (supportWhite == _useRgbw && countPixels == _length && _skipFirstMode == skipFirst) return;
|
if (supportWhite == _useRgbw && countPixels == _length && _skipFirstMode == skipFirst) return;
|
||||||
|
@ -63,6 +87,8 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
||||||
_lengthRaw += LED_SKIP_AMOUNT;
|
_lengthRaw += LED_SKIP_AMOUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deserializeMap();
|
||||||
|
|
||||||
bus->Begin((NeoPixelType)ty, _lengthRaw);
|
bus->Begin((NeoPixelType)ty, _lengthRaw);
|
||||||
|
|
||||||
_segments[0].start = 0;
|
_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 indexSet = realIndex + (reversed ? -j : j);
|
||||||
int16_t indexSetRev = indexSet;
|
int16_t indexSetRev = indexSet;
|
||||||
if (reverseMode) indexSetRev = REV(indexSet);
|
if (reverseMode) indexSetRev = REV(indexSet);
|
||||||
#ifdef WLED_CUSTOM_LED_MAPPING
|
|
||||||
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
||||||
#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
|
||||||
|
@ -205,9 +229,7 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
||||||
}
|
}
|
||||||
} else { //live data, etc.
|
} else { //live data, etc.
|
||||||
if (reverseMode) i = REV(i);
|
if (reverseMode) i = REV(i);
|
||||||
#ifdef WLED_CUSTOM_LED_MAPPING
|
|
||||||
if (i < customMappingSize) i = customMappingTable[i];
|
if (i < customMappingSize) i = customMappingTable[i];
|
||||||
#endif
|
|
||||||
bus->SetPixelColor(i + skip, col);
|
bus->SetPixelColor(i + skip, col);
|
||||||
}
|
}
|
||||||
if (skip && i == 0) {
|
if (skip && i == 0) {
|
||||||
|
@ -482,9 +504,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i)
|
||||||
{
|
{
|
||||||
i = realPixelIndex(i);
|
i = realPixelIndex(i);
|
||||||
|
|
||||||
#ifdef WLED_CUSTOM_LED_MAPPING
|
|
||||||
if (i < customMappingSize) i = customMappingTable[i];
|
if (i < customMappingSize) i = customMappingTable[i];
|
||||||
#endif
|
|
||||||
|
|
||||||
if (_skipFirstMode) i += LED_SKIP_AMOUNT;
|
if (_skipFirstMode) i += LED_SKIP_AMOUNT;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue