longer segment names

* introducing WLED_MAX_SEGNAME_LEN from upstream
* default: max name length = 48
* hopefully found all places where the segment name length was hardcoded (32, 33, 34)
* some comments still refer to "32" but wtf
This commit is contained in:
Frank
2025-11-20 23:49:26 +01:00
parent dcdc05b592
commit e63dc7e71e
6 changed files with 31 additions and 25 deletions

View File

@@ -6814,8 +6814,8 @@ uint16_t mode_2Dscrollingtext(void) {
case 5: letterWidth = 5; letterHeight = 12; break; case 5: letterWidth = 5; letterHeight = 12; break;
} }
const int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-letterHeight)/2; const int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-letterHeight)/2;
char text[33] = {'\0'}; // ToDO use WLED_MAX_SEGNAME_LEN + 1 char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'};
unsigned maxLen = (SEGMENT.name) ? min(32, (int)strlen(SEGMENT.name)) : 0; // WLEDMM make it robust against too long segment names, ToDO use WLED_MAX_SEGNAME_LEN unsigned maxLen = (SEGMENT.name) ? min(WLED_MAX_SEGNAME_LEN, (int)strlen(SEGMENT.name)) : 0; // WLEDMM make it robust against too long segment names
#if !defined(WLED_ENABLE_FULL_FONTS) #if !defined(WLED_ENABLE_FULL_FONTS)
if (SEGMENT.name) for (size_t i=0,j=0; i<maxLen; i++) if (SEGMENT.name[i]>31 && SEGMENT.name[i]<128) text[j++] = SEGMENT.name[i]; // unicode killer if (SEGMENT.name) for (size_t i=0,j=0; i<maxLen; i++) if (SEGMENT.name[i]>31 && SEGMENT.name[i]<128) text[j++] = SEGMENT.name[i]; // unicode killer

View File

@@ -842,7 +842,7 @@ void Segment::drawArc(unsigned x0, unsigned y0, int radius, uint32_t color, uint
//WLEDMM for artifx //WLEDMM for artifx
bool Segment::jsonToPixels(char * name, uint8_t fileNr) { bool Segment::jsonToPixels(char * name, uint8_t fileNr) {
if (!isActive()) return true; // segment not active, nothing to do if (!isActive()) return true; // segment not active, nothing to do
char fileName[42] = { '\0' }; // we need up to 40 bytes (seg.name is 32 bytes max) char fileName[WLED_MAX_SEGNAME_LEN+12] = { '\0' }; // we need up to 40 bytes (seg.name is 32 bytes max)
//WLEDMM: als support segment name ledmaps //WLEDMM: als support segment name ledmaps
bool isFile = false; bool isFile = false;
// strcpy_P(fileName, PSTR("/mario")); // strcpy_P(fileName, PSTR("/mario"));
@@ -886,11 +886,6 @@ bool Segment::jsonToPixels(char * name, uint8_t fileNr) {
#include "src/font/codepages.h" #include "src/font/codepages.h"
#endif #endif
//upstream compatibility
#if !defined(WLED_MAX_SEGNAME_LEN)
#define WLED_MAX_SEGNAME_LEN 32 // ToDO: inrease default to 48
#endif
// unicode-aware wrapper for drawCharacter(), to be called from mode_2Dscrollingtext() // unicode-aware wrapper for drawCharacter(), to be called from mode_2Dscrollingtext()
void Segment::drawText(const unsigned char* text, size_t maxLen, int maxLetters, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, bool drawShadow) { void Segment::drawText(const unsigned char* text, size_t maxLen, int maxLetters, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, bool drawShadow) {
if (!isActive()) return; // not active if (!isActive()) return; // not active

View File

@@ -698,7 +698,7 @@ struct ArrayAndSize {
}; };
class JMapC { class JMapC {
public: public:
char previousSegmentName[50] = ""; char previousSegmentName[WLED_MAX_SEGNAME_LEN+12] = "";
~JMapC() { ~JMapC() {
DEBUG_PRINTLN("~JMapC"); DEBUG_PRINTLN("~JMapC");
@@ -751,7 +751,7 @@ class JMapC {
uint32_t dataSize = 0; uint32_t dataSize = 0;
deletejVectorMap(); deletejVectorMap();
DEBUG_PRINT("New "); DEBUG_PRINTLN(SEGMENT.name); DEBUG_PRINT("New "); DEBUG_PRINTLN(SEGMENT.name);
char jMapFileName[50] = {'\0'}; // we need at most 32 + 7 bytes char jMapFileName[WLED_MAX_SEGNAME_LEN+12] = {'\0'}; // we need at most 32 + 7 bytes
strcpy(jMapFileName, "/"); strcpy(jMapFileName, "/");
strcat(jMapFileName, SEGMENT.name); strcat(jMapFileName, SEGMENT.name);
strcat(jMapFileName, ".json"); strcat(jMapFileName, ".json");
@@ -1728,22 +1728,22 @@ void WS2812FX::enumerateLedmaps() {
f = WLED_FS.open(fileName, "r"); f = WLED_FS.open(fileName, "r");
if (f) { if (f) {
f.find("\"n\":"); f.find("\"n\":");
char name[34] = { '\0' }; // ensure string termination char name[WLED_MAX_SEGNAME_LEN+2] = { '\0' }; // ensure string termination
f.readBytesUntil('\n', name, sizeof(name)-1); f.readBytesUntil('\n', name, sizeof(name)-1);
size_t len = strlen(name); size_t len = strlen(name);
if (len > 0 && len < 33) { if (len > 0 && len < (sizeof(name)-1)) {
(void) cleanUpName(name); (void) cleanUpName(name);
len = strlen(name); len = strlen(name);
ledmapNames[i-1] = new(std::nothrow) char[len+1]; // +1 to include terminating \0 ledmapNames[i-1] = new(std::nothrow) char[len+1]; // +1 to include terminating \0
if (ledmapNames[i-1]) strlcpy(ledmapNames[i-1], name, 33); if (ledmapNames[i-1]) strlcpy(ledmapNames[i-1], name, sizeof(name));
} }
if (!ledmapNames[i-1]) { if (!ledmapNames[i-1]) {
char tmp[33]; char tmp[33];
snprintf_P(tmp, 32, PSTR("ledmap%d.json"), i); snprintf_P(tmp, 32, PSTR("ledmap%d.json"), i);
len = strlen(tmp); size_t tmplen = strlen(tmp);
ledmapNames[i-1] = new(std::nothrow) char[len+1]; ledmapNames[i-1] = new(std::nothrow) char[tmplen+1];
if (ledmapNames[i-1]) strlcpy(ledmapNames[i-1], tmp, 33); if (ledmapNames[i-1]) strlcpy(ledmapNames[i-1], tmp, tmplen);
} }
USER_PRINTF("enumerateLedmaps %s \"%s\"", fileName, name); USER_PRINTF("enumerateLedmaps %s \"%s\"", fileName, name);
@@ -1779,7 +1779,7 @@ void WS2812FX::enumerateLedmaps() {
uint8_t segment_index = 0; uint8_t segment_index = 0;
for (segment &seg : _segments) { for (segment &seg : _segments) {
if (seg.name != nullptr && strlen(seg.name) > 0) { if (seg.name != nullptr && strlen(seg.name) > 0) {
char fileName[33+11] = { '\0' }; // segment name is 32 chars max, so we need 43 chars in worst case char fileName[WLED_MAX_SEGNAME_LEN+12] = { '\0' }; // segment name is 32 chars max, so we need 43 chars in worst case
snprintf_P(fileName, sizeof(fileName)-1, PSTR("/lm%s.json"), seg.name); snprintf_P(fileName, sizeof(fileName)-1, PSTR("/lm%s.json"), seg.name);
bool isFile = WLED_FS.exists(fileName); bool isFile = WLED_FS.exists(fileName);
if (isFile) ledMaps |= 1 << (10+segment_index); if (isFile) ledMaps |= 1 << (10+segment_index);
@@ -2587,7 +2587,7 @@ void WS2812FX::loadCustomPalettes() {
bool WS2812FX::deserializeMap(uint8_t n) { bool WS2812FX::deserializeMap(uint8_t n) {
// 2D support creates its own ledmap (on the fly) if a ledmap.json exists it will overwrite built one. // 2D support creates its own ledmap (on the fly) if a ledmap.json exists it will overwrite built one.
char fileName[42] = {'\0'}; // WLEDMM we need at least 32 + 7 bytes char fileName[WLED_MAX_SEGNAME_LEN+10] = {'\0'}; // WLEDMM we need at least 32 + 7 bytes
//WLEDMM: als support segment name ledmaps //WLEDMM: als support segment name ledmaps
bool isFile = false;; bool isFile = false;;
if (n<10) { if (n<10) {

View File

@@ -91,6 +91,22 @@
#endif #endif
#endif #endif
#ifndef WLED_MAX_SEGNAME_LEN
#ifdef ESP8266
#define WLED_MAX_SEGNAME_LEN 32
#else
#define WLED_MAX_SEGNAME_LEN 48 // WLEDMM upstream uses 64, but 48 seems to be a good compromise between flexibility and memory needed
#endif
#else
#if WLED_MAX_SEGNAME_LEN<32
#undef WLED_MAX_SEGNAME_LEN
#define WLED_MAX_SEGNAME_LEN 32
#else
#warning WLED UI does not support your modified maximum segment name length!
#endif
#endif
//Usermod IDs //Usermod IDs
#define USERMOD_ID_RESERVED 0 //Unused. Might indicate no usermod present #define USERMOD_ID_RESERVED 0 //Unused. Might indicate no usermod present
#define USERMOD_ID_UNSPECIFIED 1 //Default value for a general user mod that does not specify a custom ID #define USERMOD_ID_UNSPECIFIED 1 //Default value for a general user mod that does not specify a custom ID

View File

@@ -5,11 +5,6 @@
#include "GifDecoder.h" #include "GifDecoder.h"
//upstream compatibility
#if !defined(WLED_MAX_SEGNAME_LEN)
#define WLED_MAX_SEGNAME_LEN 32
#endif
/* /*
* Functions to render images from filesystem to segments, used by the "Image" effect * Functions to render images from filesystem to segments, used by the "Image" effect
*/ */

View File

@@ -151,8 +151,8 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
if (name != nullptr) len = strlen(name); if (name != nullptr) len = strlen(name);
if (len > 0) { if (len > 0) {
// WLEDMM: truncate segment name, instead of silently deleting // WLEDMM: truncate segment name, instead of silently deleting
if (len > 32) { // ToDO: use WLED_MAX_SEGNAME_LEN if (len > WLED_MAX_SEGNAME_LEN) {
len = 32; // cut to max segment name length len = WLED_MAX_SEGNAME_LEN; // cut to max segment name length
#if defined(WLED_ENABLE_FULL_FONTS) #if defined(WLED_ENABLE_FULL_FONTS)
if (name[len] > 127) // UTF-8 => don't cut in the middle of a multi-byte char if (name[len] > 127) // UTF-8 => don't cut in the middle of a multi-byte char
len = cutUnicodeAt((unsigned char*)name, len-1) +1; // +1 to convert between index and length len = cutUnicodeAt((unsigned char*)name, len-1) +1; // +1 to convert between index and length