LED matrix gaps.
This commit is contained in:
parent
e2215ced34
commit
e51f7bfbff
@ -71,6 +71,9 @@ void WS2812FX::setUpMatrix() {
|
|||||||
customMappingTable = new uint16_t[Segment::maxWidth * Segment::maxHeight];
|
customMappingTable = new uint16_t[Segment::maxWidth * Segment::maxHeight];
|
||||||
|
|
||||||
if (customMappingTable != nullptr) {
|
if (customMappingTable != nullptr) {
|
||||||
|
int gapSize = 0;
|
||||||
|
int8_t *gapTable = nullptr;
|
||||||
|
|
||||||
customMappingSize = Segment::maxWidth * Segment::maxHeight;
|
customMappingSize = Segment::maxWidth * Segment::maxHeight;
|
||||||
|
|
||||||
// fill with empty in case we don't fill the entire matrix
|
// fill with empty in case we don't fill the entire matrix
|
||||||
@ -78,21 +81,50 @@ void WS2812FX::setUpMatrix() {
|
|||||||
customMappingTable[i] = (uint16_t)-1;
|
customMappingTable[i] = (uint16_t)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char fileName[32];
|
||||||
|
strcpy_P(fileName, PSTR("/ledgap.json"));
|
||||||
|
bool isFile = WLED_FS.exists(fileName);
|
||||||
|
|
||||||
|
if (isFile && requestJSONBufferLock(20)) {
|
||||||
|
DEBUG_PRINT(F("Reading LED gap from "));
|
||||||
|
DEBUG_PRINTLN(fileName);
|
||||||
|
|
||||||
|
if (readObjectFromFile(fileName, nullptr, &doc)) {
|
||||||
|
// the array is similar to ledmap, except it has only 3 values:
|
||||||
|
// -1 ... missing pixel (do not increase pixel count)
|
||||||
|
// 0 ... inactive pixel (it does count, but should be mapped out)
|
||||||
|
// 1 ... active pixel
|
||||||
|
JsonArray map = doc.as<JsonArray>();
|
||||||
|
gapSize = map.size();
|
||||||
|
if (!map.isNull() && gapSize >= customMappingSize) { // not an empty map
|
||||||
|
gapTable = new int8_t[gapSize];
|
||||||
|
for (size_t i = 0; i < gapSize; i++) {
|
||||||
|
gapTable[i] = constrain(map[i], -1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
releaseJSONBufferLock();
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t x, y, pix=0; //pixel
|
uint16_t x, y, pix=0; //pixel
|
||||||
for (size_t pan = 0; pan < panel.size(); pan++) {
|
for (size_t pan = 0; pan < panel.size(); pan++) {
|
||||||
Panel &p = panel[pan];
|
Panel &p = panel[pan];
|
||||||
uint16_t h = p.vertical ? p.height : p.width;
|
uint16_t h = p.vertical ? p.height : p.width;
|
||||||
uint16_t v = p.vertical ? p.width : p.height;
|
uint16_t v = p.vertical ? p.width : p.height;
|
||||||
for (size_t j = 0; j < v; j++){
|
for (size_t j = 0; j < v; j++){
|
||||||
for(size_t i = 0; i < h; i++, pix++) {
|
for(size_t i = 0; i < h; i++) {
|
||||||
y = (p.vertical?p.rightStart:p.bottomStart) ? v-j-1 : j;
|
y = (p.vertical?p.rightStart:p.bottomStart) ? v-j-1 : j;
|
||||||
x = (p.vertical?p.bottomStart:p.rightStart) ? h-i-1 : i;
|
x = (p.vertical?p.bottomStart:p.rightStart) ? h-i-1 : i;
|
||||||
x = p.serpentine && j%2 ? h-x-1 : x;
|
x = p.serpentine && j%2 ? h-x-1 : x;
|
||||||
customMappingTable[(p.yOffset + (p.vertical?x:y)) * Segment::maxWidth + p.xOffset + (p.vertical?y:x)] = pix;
|
size_t index = (p.yOffset + (p.vertical?x:y)) * Segment::maxWidth + p.xOffset + (p.vertical?y:x);
|
||||||
|
if (!gapTable || (gapTable && gapTable[index] > 0)) customMappingTable[index] = pix;
|
||||||
|
if (!gapTable || (gapTable && gapTable[index] >= 0)) pix++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gapTable) delete[] gapTable;
|
||||||
|
|
||||||
#ifdef WLED_DEBUG
|
#ifdef WLED_DEBUG
|
||||||
DEBUG_PRINT(F("Matrix ledmap:"));
|
DEBUG_PRINT(F("Matrix ledmap:"));
|
||||||
for (uint16_t i=0; i<customMappingSize; i++) {
|
for (uint16_t i=0; i<customMappingSize; i++) {
|
||||||
|
@ -1014,10 +1014,11 @@ void WS2812FX::finalizeInit(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isMatrix) { // if 2D then max values defined in setUpMatrix() using panel set-up
|
if (isMatrix) setUpMatrix();
|
||||||
|
else {
|
||||||
Segment::maxWidth = _length;
|
Segment::maxWidth = _length;
|
||||||
Segment::maxHeight = 1;
|
Segment::maxHeight = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//initialize leds array. TBD: realloc if nr of leds change
|
//initialize leds array. TBD: realloc if nr of leds change
|
||||||
if (Segment::_globalLeds) {
|
if (Segment::_globalLeds) {
|
||||||
@ -1583,7 +1584,7 @@ void WS2812FX::loadCustomPalettes() {
|
|||||||
|
|
||||||
//load custom mapping table from JSON file (called from finalizeInit() or deserializeState())
|
//load custom mapping table from JSON file (called from finalizeInit() or deserializeState())
|
||||||
void WS2812FX::deserializeMap(uint8_t n) {
|
void WS2812FX::deserializeMap(uint8_t n) {
|
||||||
if (isMatrix) return; // 2D support creates its own ledmap
|
//if (isMatrix) return; // 2D support creates its own ledmap
|
||||||
|
|
||||||
char fileName[32];
|
char fileName[32];
|
||||||
strcpy_P(fileName, PSTR("/ledmap"));
|
strcpy_P(fileName, PSTR("/ledmap"));
|
||||||
|
@ -130,8 +130,6 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
p.options = 0;
|
p.options = 0;
|
||||||
strip.panel.push_back(p);
|
strip.panel.push_back(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
strip.setUpMatrix();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -673,11 +673,11 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
pO[l] = 'H'; p.height = request->arg(pO).toInt();
|
pO[l] = 'H'; p.height = request->arg(pO).toInt();
|
||||||
strip.panel.push_back(p);
|
strip.panel.push_back(p);
|
||||||
}
|
}
|
||||||
|
strip.setUpMatrix(); // will check limits
|
||||||
} else {
|
} else {
|
||||||
Segment::maxWidth = strip.getLengthTotal();
|
Segment::maxWidth = strip.getLengthTotal();
|
||||||
Segment::maxHeight = 1;
|
Segment::maxHeight = 1;
|
||||||
}
|
}
|
||||||
strip.setUpMatrix(); // will check limits
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user