From f89f44adacae127103fca343354e5c64eb0653ea Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Sat, 25 Oct 2025 17:34:51 +0300 Subject: [PATCH 1/8] leds format: refactor set_leds_pixels() --- components/leds/format.c | 103 +++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/components/leds/format.c b/components/leds/format.c index fef639d9..6d1d5e5e 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -31,6 +31,13 @@ unsigned leds_format_count(size_t len, enum leds_format format, unsigned group) } } +static inline void set_leds_pixels(struct leds *leds, unsigned i, struct leds_format_params params, struct leds_color color) +{ + for (unsigned j = 0; j < params.segment; j++) { + leds->pixels[params.offset + i * params.segment + j] = color; + } +} + void leds_set_format_rgb(struct leds *leds, const uint8_t *data, size_t len, struct leds_format_params params) { uint8_t parameter = leds_parameter_default(leds); @@ -38,15 +45,13 @@ void leds_set_format_rgb(struct leds *leds, const uint8_t *data, size_t len, str LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = (struct leds_color) { - .r = data[i * 3 + 0], - .g = data[i * 3 + 1], - .b = data[i * 3 + 2], - - .parameter = parameter, - }; - } + set_leds_pixels(leds, i, params, (struct leds_color) { + .r = data[i * 3 + 0], + .g = data[i * 3 + 1], + .b = data[i * 3 + 2], + + .parameter = parameter, + }); } } @@ -57,15 +62,13 @@ void leds_set_format_bgr(struct leds *leds, const uint8_t *data, size_t len, str LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = (struct leds_color) { - .b = data[i * 3 + 0], - .g = data[i * 3 + 1], - .r = data[i * 3 + 2], - - .parameter = parameter, - }; - } + set_leds_pixels(leds, i, params, (struct leds_color) { + .b = data[i * 3 + 0], + .g = data[i * 3 + 1], + .r = data[i * 3 + 2], + + .parameter = parameter, + }); } } @@ -76,15 +79,13 @@ void leds_set_format_grb(struct leds *leds, const uint8_t *data, size_t len, str LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = (struct leds_color) { - .g = data[i * 3 + 0], - .r = data[i * 3 + 1], - .b = data[i * 3 + 2], - - .parameter = parameter, - }; - } + set_leds_pixels(leds, i, params, (struct leds_color) { + .g = data[i * 3 + 0], + .r = data[i * 3 + 1], + .b = data[i * 3 + 2], + + .parameter = parameter, + }); } } @@ -96,15 +97,13 @@ void leds_set_format_rgba(struct leds *leds, const uint8_t *data, size_t len, st LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 4; i++) { - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = (struct leds_color) { - .r = data[i * 4 + 0], - .g = data[i * 4 + 1], - .b = data[i * 4 + 2], - - .dimmer = (parameter == LEDS_PARAMETER_DIMMER) ? data[i * 4 + 3] : parameter_default, - }; - } + set_leds_pixels(leds, i, params, (struct leds_color) { + .r = data[i * 4 + 0], + .g = data[i * 4 + 1], + .b = data[i * 4 + 2], + + .dimmer = (parameter == LEDS_PARAMETER_DIMMER) ? data[i * 4 + 3] : parameter_default, + }); } } @@ -116,15 +115,13 @@ void leds_set_format_rgbw(struct leds *leds, const uint8_t *data, size_t len, st LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 4; i++) { - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = (struct leds_color) { - .r = data[i * 4 + 0], - .g = data[i * 4 + 1], - .b = data[i * 4 + 2], - - .white = (parameter == LEDS_PARAMETER_WHITE) ? data[i * 4 + 3] : parameter_default, - }; - } + set_leds_pixels(leds, i, params, (struct leds_color) { + .r = data[i * 4 + 0], + .g = data[i * 4 + 1], + .b = data[i * 4 + 2], + + .white = (parameter == LEDS_PARAMETER_WHITE) ? data[i * 4 + 3] : parameter_default, + }); } } @@ -151,9 +148,7 @@ void leds_set_format_rgbxi(struct leds *leds, const uint8_t *data, size_t len, s uint8_t intensity = data[off++]; struct leds_color pixel_color = leds_color_intensity(group_color, parameter_type, intensity); - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + (g * params.group + i) * params.segment + j] = pixel_color; - } + set_leds_pixels(leds, (g * params.group + i), params, pixel_color); } } } @@ -181,9 +176,7 @@ void leds_set_format_bgrxi(struct leds *leds, const uint8_t *data, size_t len, s uint8_t intensity = data[off++]; struct leds_color pixel_color = leds_color_intensity(group_color, parameter_type, intensity); - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + (g * params.group + i) * params.segment + j] = pixel_color; - } + set_leds_pixels(leds, (g * params.group + i), params, pixel_color); } } } @@ -211,9 +204,7 @@ void leds_set_format_grbxi(struct leds *leds, const uint8_t *data, size_t len, s uint8_t intensity = data[off++]; struct leds_color pixel_color = leds_color_intensity(group_color, parameter_type, intensity); - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + (g * params.group + i) * params.segment + j] = pixel_color; - } + set_leds_pixels(leds, (g * params.group + i), params, pixel_color); } } } @@ -240,9 +231,7 @@ void leds_set_format_rgbwxi(struct leds *leds, const uint8_t *data, size_t len, uint8_t intensity = data[off++]; struct leds_color pixel_color = leds_color_intensity(group_color, parameter_type, intensity); - for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + (g * params.group + i) * params.segment + j] = pixel_color; - } + set_leds_pixels(leds, (g * params.group + i), params, pixel_color); } } } From 233d3c21d6c241064e3b6037b41360413a5eab9f Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 07:54:40 +0200 Subject: [PATCH 2/8] leds: new RGBxxI format --- components/leds/format.c | 33 +++++++++++++++++++++++++++++++++ components/leds/include/leds.h | 10 ++++++---- main/leds_config.c | 1 + 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/components/leds/format.c b/components/leds/format.c index 6d1d5e5e..9cb39106 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -26,6 +26,9 @@ unsigned leds_format_count(size_t len, enum leds_format format, unsigned group) case LEDS_FORMAT_RGBWXI: return len / (4 + group) * group; + case LEDS_FORMAT_RGBXXI: + return (len - 3 * group) * group; + default: LOG_FATAL("invalid format=%d", format); } @@ -236,6 +239,32 @@ void leds_set_format_rgbwxi(struct leds *leds, const uint8_t *data, size_t len, } } +void leds_set_format_rgbxxi(struct leds *leds, const uint8_t *data, size_t len, struct leds_format_params params) +{ + enum leds_parameter_type parameter_type = leds_parameter_type(leds); + uint8_t parameter_default = leds_parameter_default(leds); + + LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + + for (unsigned i = 0; i * params.group < params.count && 3 * params.group + i < len; i++) { + uint8_t intensity = data[3 * params.group + i]; + + for (unsigned j = 0; j < params.group; j++) { + struct leds_color pixel_color = { + .r = data[j * 3 + 0], + .g = data[j * 3 + 1], + .b = data[j * 3 + 2], + + .parameter = parameter_default, + }; + + pixel_color = leds_color_intensity(pixel_color, parameter_type, intensity); + + set_leds_pixels(leds, i * params.group + j, params, pixel_color); + } + } +} + int leds_set_format(struct leds *leds, enum leds_format format, const void *data, size_t len, struct leds_format_params params) { if (params.count == 0) { @@ -297,6 +326,10 @@ int leds_set_format(struct leds *leds, enum leds_format format, const void *data leds_set_format_rgbwxi(leds, data, len, params); return 0; + case LEDS_FORMAT_RGBXXI: + leds_set_format_rgbxxi(leds, data, len, params); + return 0; + default: LOG_ERROR("unknown format=%#x", format); return -1; diff --git a/components/leds/include/leds.h b/components/leds/include/leds.h index 079046d9..3e4dab98 100644 --- a/components/leds/include/leds.h +++ b/components/leds/include/leds.h @@ -113,10 +113,12 @@ enum leds_format { LEDS_FORMAT_RGBA, LEDS_FORMAT_RGBW, - LEDS_FORMAT_RGBXI, // grouped RGB + intensity - LEDS_FORMAT_BGRXI, // grouped BGR + intensity - LEDS_FORMAT_GRBXI, // grouped GRB + intensity - LEDS_FORMAT_RGBWXI, // grouped RGBW + intensity + LEDS_FORMAT_RGBXI, // + GROUPS * + LEDS_FORMAT_BGRXI, // + GROUPS * + LEDS_FORMAT_GRBXI, // + GROUPS * + LEDS_FORMAT_RGBWXI, // + GROUPS * + + LEDS_FORMAT_RGBXXI, // * GROUPS + ... }; /* diff --git a/main/leds_config.c b/main/leds_config.c index 848ea3fe..02353d47 100644 --- a/main/leds_config.c +++ b/main/leds_config.c @@ -111,6 +111,7 @@ const struct config_enum leds_format_enum[] = { { "BGRxI", .value = LEDS_FORMAT_BGRXI }, { "GRBxI", .value = LEDS_FORMAT_GRBXI }, { "RGBWxI", .value = LEDS_FORMAT_RGBWXI }, + { "RGBxxI", .value = LEDS_FORMAT_RGBXXI }, {} }; From 67cdebda0bee33c6f581ad7bcf2ded2d112dc3fc Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:00:26 +0200 Subject: [PATCH 3/8] leds: rename leds_format offset -> index --- components/leds/format.c | 32 ++++++++++++++++---------------- components/leds/include/leds.h | 8 ++++---- main/leds_artnet.c | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/components/leds/format.c b/components/leds/format.c index 9cb39106..9a314a5f 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -37,7 +37,7 @@ unsigned leds_format_count(size_t len, enum leds_format format, unsigned group) static inline void set_leds_pixels(struct leds *leds, unsigned i, struct leds_format_params params, struct leds_color color) { for (unsigned j = 0; j < params.segment; j++) { - leds->pixels[params.offset + i * params.segment + j] = color; + leds->pixels[params.index + i * params.segment + j] = color; } } @@ -45,7 +45,7 @@ void leds_set_format_rgb(struct leds *leds, const uint8_t *data, size_t len, str { uint8_t parameter = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); + LOG_DEBUG("len=%u index=%u count=%u segment=%u", len, params.index, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { set_leds_pixels(leds, i, params, (struct leds_color) { @@ -62,7 +62,7 @@ void leds_set_format_bgr(struct leds *leds, const uint8_t *data, size_t len, str { uint8_t parameter = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); + LOG_DEBUG("len=%u index=%u count=%u segment=%u", len, params.index, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { set_leds_pixels(leds, i, params, (struct leds_color) { @@ -79,7 +79,7 @@ void leds_set_format_grb(struct leds *leds, const uint8_t *data, size_t len, str { uint8_t parameter = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); + LOG_DEBUG("len=%u index=%u count=%u segment=%u", len, params.index, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 3; i++) { set_leds_pixels(leds, i, params, (struct leds_color) { @@ -97,7 +97,7 @@ void leds_set_format_rgba(struct leds *leds, const uint8_t *data, size_t len, st enum leds_parameter_type parameter = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); + LOG_DEBUG("len=%u index=%u count=%u segment=%u", len, params.index, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 4; i++) { set_leds_pixels(leds, i, params, (struct leds_color) { @@ -115,7 +115,7 @@ void leds_set_format_rgbw(struct leds *leds, const uint8_t *data, size_t len, st enum leds_parameter_type parameter = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u", len, params.offset, params.count, params.segment); + LOG_DEBUG("len=%u index=%u count=%u segment=%u", len, params.index, params.count, params.segment); for (unsigned i = 0; i < params.count && len >= (i + 1) * 4; i++) { set_leds_pixels(leds, i, params, (struct leds_color) { @@ -133,7 +133,7 @@ void leds_set_format_rgbxi(struct leds *leds, const uint8_t *data, size_t len, s enum leds_parameter_type parameter_type = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); size_t off = 0; @@ -161,7 +161,7 @@ void leds_set_format_bgrxi(struct leds *leds, const uint8_t *data, size_t len, s enum leds_parameter_type parameter_type = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); size_t off = 0; @@ -189,7 +189,7 @@ void leds_set_format_grbxi(struct leds *leds, const uint8_t *data, size_t len, s enum leds_parameter_type parameter_type = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); size_t off = 0; @@ -216,7 +216,7 @@ void leds_set_format_rgbwxi(struct leds *leds, const uint8_t *data, size_t len, { enum leds_parameter_type parameter_type = leds_parameter_type(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); size_t off = 0; @@ -244,7 +244,7 @@ void leds_set_format_rgbxxi(struct leds *leds, const uint8_t *data, size_t len, enum leds_parameter_type parameter_type = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u offset=%u count=%u segment=%u group=%u", len, params.offset, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); for (unsigned i = 0; i * params.group < params.count && 3 * params.group + i < len; i++) { uint8_t intensity = data[3 * params.group + i]; @@ -279,12 +279,12 @@ int leds_set_format(struct leds *leds, enum leds_format format, const void *data params.group = 1; } - if (params.offset > leds->options.count) { - LOG_DEBUG("offset=%u is over options.count=%u", params.offset, leds->options.count); + if (params.index > leds->options.count) { + LOG_DEBUG("index=%u is over options.count=%u", params.index, leds->options.count); params.count = 0; - } else if (params.offset + (params.count * params.segment) > leds->options.count) { - LOG_DEBUG("offset=%u + count=%u * segment=%u is over options.count=%u", params.offset, params.count, params.segment, leds->options.count); - params.count = (leds->options.count - params.offset) / params.segment; + } else if (params.index + (params.count * params.segment) > leds->options.count) { + LOG_DEBUG("index=%u + count=%u * segment=%u is over options.count=%u", params.index, params.count, params.segment, leds->options.count); + params.count = (leds->options.count - params.index) / params.segment; } leds->pixels_limit_dirty = true; diff --git a/components/leds/include/leds.h b/components/leds/include/leds.h index 3e4dab98..f13b985b 100644 --- a/components/leds/include/leds.h +++ b/components/leds/include/leds.h @@ -129,11 +129,11 @@ enum leds_format { unsigned leds_format_count(size_t len, enum leds_format format, unsigned group); struct leds_format_params { - /* Limit number of LED (segments) to read */ - unsigned count; - /* Set LEDs starting at offset */ - unsigned offset; + unsigned index; + + /* Limit number of LED (segments) to set */ + unsigned count; /* Set segments of multiple consecutive LEDs per channel */ unsigned segment; diff --git a/main/leds_artnet.c b/main/leds_artnet.c index cbeae749..7d7a5f15 100644 --- a/main/leds_artnet.c +++ b/main/leds_artnet.c @@ -209,7 +209,7 @@ static int leds_artnet_set(struct leds_state *state, unsigned index, struct artn struct leds_format_params params = { .count = count, - .offset = index * count * segment, + .index = index * count * segment, .segment = segment, .group = config->artnet_leds_group, }; From 7de1f4d0e490d8b7550548bd3de33cdab8b5e58e Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:23:48 +0200 Subject: [PATCH 4/8] leds: add leds_format offset for use with group --- components/leds/include/leds.h | 3 +++ main/leds_artnet.c | 1 + main/leds_config.h | 4 +++- main/leds_configtab.i | 16 ++++++++++++---- main/leds_sequence.c | 3 ++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/components/leds/include/leds.h b/components/leds/include/leds.h index f13b985b..43e9c901 100644 --- a/components/leds/include/leds.h +++ b/components/leds/include/leds.h @@ -140,6 +140,9 @@ struct leds_format_params { /* Set color for group of LEDs */ unsigned group; + + /* Starting offset within group */ + unsigned offset; }; /* diff --git a/main/leds_artnet.c b/main/leds_artnet.c index 7d7a5f15..7df50c7c 100644 --- a/main/leds_artnet.c +++ b/main/leds_artnet.c @@ -212,6 +212,7 @@ static int leds_artnet_set(struct leds_state *state, unsigned index, struct artn .index = index * count * segment, .segment = segment, .group = config->artnet_leds_group, + .offset = config->artnet_leds_offset, }; if ((err = leds_set_format(state->leds, config->artnet_leds_format, data, len, params))) { diff --git a/main/leds_config.h b/main/leds_config.h index 945ea423..869ee1dc 100644 --- a/main/leds_config.h +++ b/main/leds_config.h @@ -165,14 +165,16 @@ struct leds_config { int artnet_leds_format; uint16_t artnet_leds_segment; uint16_t artnet_leds_group; + uint16_t artnet_leds_offset; bool sequence_enabled; int sequence_format; uint16_t sequence_channel_start; uint16_t sequence_channel_count; uint16_t sequence_leds_count; - uint16_t sequence_leds_offset; + uint16_t sequence_leds_group; uint16_t sequence_leds_segment; + uint16_t sequence_leds_offset; }; extern struct leds_config leds_configs[LEDS_COUNT]; diff --git a/main/leds_configtab.i b/main/leds_configtab.i index 8235cc4d..8842a8d7 100644 --- a/main/leds_configtab.i +++ b/main/leds_configtab.i @@ -219,6 +219,10 @@ const struct configtab LEDS_CONFIGTAB[] = { .validate_func = validate_artnet_leds_group, .ctx = &LEDS_CONFIG, }, + { CONFIG_TYPE_UINT16, "artnet_leds_offset", + .description = "Offset to first LED inside Art-Net Group data.", + .uint16_type = { .value = &LEDS_CONFIG.artnet_leds_offset }, + }, { CONFIG_TYPE_BOOL, "sequence_enabled", .description = "Output LED sequence frames, requires leds-sequence config", @@ -240,14 +244,18 @@ const struct configtab LEDS_CONFIGTAB[] = { .description = "Limit number of LEDs to control. Default 0 -> all LEDs", .uint16_type = { .value = &LEDS_CONFIG.sequence_leds_count }, }, - { CONFIG_TYPE_UINT16, "sequence_leds_offset", - .description = "Set first LED to control. Default 0 -> all LEDs", - .uint16_type = { .value = &LEDS_CONFIG.sequence_leds_offset }, - }, { CONFIG_TYPE_UINT16, "sequence_leds_segment", .description = "Control multiple consecutive LEDs per sequence channel. Default 0 -> control individual LEDs", .uint16_type = { .value = &LEDS_CONFIG.sequence_leds_segment }, }, + { CONFIG_TYPE_UINT16, "sequence_leds_group", + .description = "Group multiple consecutive LEDs for common per-format parameters.", + .uint16_type = { .value = &LEDS_CONFIG.sequence_leds_group }, + }, + { CONFIG_TYPE_UINT16, "sequence_leds_offset", + .description = "Offset to first LED inside per-format Group data.", + .uint16_type = { .value = &LEDS_CONFIG.sequence_leds_offset }, + }, {} }; diff --git a/main/leds_sequence.c b/main/leds_sequence.c index 65b91750..90e1de12 100644 --- a/main/leds_sequence.c +++ b/main/leds_sequence.c @@ -220,8 +220,9 @@ static int set_leds_sequence(struct leds_state *state, const struct fseq_frame * const struct leds_config *config = state->config; struct leds_format_params params = { .count = config->sequence_leds_count, - .offset = config->sequence_leds_offset, .segment = config->sequence_leds_segment, + .group = config->sequence_leds_group, + .offset = config->sequence_leds_offset, }; const uint8_t *ptr = frame->buf; size_t len = frame->size; From 112e70076bda4f51120c842dbf9624c8bd952e84 Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:24:32 +0200 Subject: [PATCH 5/8] leds format rgbxxi: avoid pixels overrun when count not divisible by group --- components/leds/format.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/leds/format.c b/components/leds/format.c index 9a314a5f..2830fb65 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -249,7 +249,7 @@ void leds_set_format_rgbxxi(struct leds *leds, const uint8_t *data, size_t len, for (unsigned i = 0; i * params.group < params.count && 3 * params.group + i < len; i++) { uint8_t intensity = data[3 * params.group + i]; - for (unsigned j = 0; j < params.group; j++) { + for (unsigned j = 0; j < params.group && i * params.group + j < params.count; j++) { struct leds_color pixel_color = { .r = data[j * 3 + 0], .g = data[j * 3 + 1], From ace779d412fcee4475941c895fca1bf4b0821865 Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:24:49 +0200 Subject: [PATCH 6/8] leds format rgbxxi: add offset for intensities --- components/leds/format.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/leds/format.c b/components/leds/format.c index 2830fb65..178ea804 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -244,10 +244,10 @@ void leds_set_format_rgbxxi(struct leds *leds, const uint8_t *data, size_t len, enum leds_parameter_type parameter_type = leds_parameter_type(leds); uint8_t parameter_default = leds_parameter_default(leds); - LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u", len, params.index, params.count, params.segment, params.group); + LOG_DEBUG("len=%u index=%u count=%u segment=%u group=%u offset=%u", len, params.index, params.count, params.segment, params.group, params.offset); - for (unsigned i = 0; i * params.group < params.count && 3 * params.group + i < len; i++) { - uint8_t intensity = data[3 * params.group + i]; + for (unsigned i = 0; i * params.group < params.count && 3 * params.group + params.offset + i < len; i++) { + uint8_t intensity = data[3 * params.group + params.offset + i]; for (unsigned j = 0; j < params.group && i * params.group + j < params.count; j++) { struct leds_color pixel_color = { From 846285f7fa9441db608634400756cc5a69cc14f3 Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:27:45 +0200 Subject: [PATCH 7/8] leds: fix leds_format docs --- components/leds/include/leds.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/leds/include/leds.h b/components/leds/include/leds.h index 43e9c901..1d6cb42a 100644 --- a/components/leds/include/leds.h +++ b/components/leds/include/leds.h @@ -113,12 +113,12 @@ enum leds_format { LEDS_FORMAT_RGBA, LEDS_FORMAT_RGBW, - LEDS_FORMAT_RGBXI, // + GROUPS * - LEDS_FORMAT_BGRXI, // + GROUPS * - LEDS_FORMAT_GRBXI, // + GROUPS * - LEDS_FORMAT_RGBWXI, // + GROUPS * + LEDS_FORMAT_RGBXI, // ( + GROUP * )... + LEDS_FORMAT_BGRXI, // ( + GROUP * )... + LEDS_FORMAT_GRBXI, // ( + GROUP * )... + LEDS_FORMAT_RGBWXI, // ( + GROUP * )... - LEDS_FORMAT_RGBXXI, // * GROUPS + ... + LEDS_FORMAT_RGBXXI, // GROUP * + [OFFSET]... }; /* From 62913489eaa18ddde9dd1c61117bddd19f86f694 Mon Sep 17 00:00:00 2001 From: Tero Marttila Date: Mon, 27 Oct 2025 08:40:34 +0200 Subject: [PATCH 8/8] leds: artnet_leds_offset=1 --- components/leds/format.c | 4 ++++ components/leds/include/leds.h | 2 +- main/leds_configtab.i | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/components/leds/format.c b/components/leds/format.c index 178ea804..1f1a5c28 100644 --- a/components/leds/format.c +++ b/components/leds/format.c @@ -279,6 +279,10 @@ int leds_set_format(struct leds *leds, enum leds_format format, const void *data params.group = 1; } + if (params.offset > 0) { + params.offset -= 1; + } + if (params.index > leds->options.count) { LOG_DEBUG("index=%u is over options.count=%u", params.index, leds->options.count); params.count = 0; diff --git a/components/leds/include/leds.h b/components/leds/include/leds.h index 1d6cb42a..51436bc1 100644 --- a/components/leds/include/leds.h +++ b/components/leds/include/leds.h @@ -141,7 +141,7 @@ struct leds_format_params { /* Set color for group of LEDs */ unsigned group; - /* Starting offset within group */ + /* Starting offset within group, starting at 1 */ unsigned offset; }; diff --git a/main/leds_configtab.i b/main/leds_configtab.i index 8842a8d7..400091d8 100644 --- a/main/leds_configtab.i +++ b/main/leds_configtab.i @@ -220,7 +220,7 @@ const struct configtab LEDS_CONFIGTAB[] = { .ctx = &LEDS_CONFIG, }, { CONFIG_TYPE_UINT16, "artnet_leds_offset", - .description = "Offset to first LED inside Art-Net Group data.", + .description = "Offset to first LED inside Art-Net Group data. Default 0 -> all, starting at 1", .uint16_type = { .value = &LEDS_CONFIG.artnet_leds_offset }, },