From a53303e862b666c490fba215c4a577a805d1f485 Mon Sep 17 00:00:00 2001 From: Timo Niemann Date: Wed, 1 Jul 2026 16:17:04 +0200 Subject: [PATCH] ringbuffer logic from O(n^2) -> O(n), much faster ui than in beforehand --- main/lcd/ui_log.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/main/lcd/ui_log.c b/main/lcd/ui_log.c index d894b32..85735c0 100644 --- a/main/lcd/ui_log.c +++ b/main/lcd/ui_log.c @@ -40,18 +40,23 @@ static const char *ui_log_store_line(const char *text, bool *out_evicted){ return log_lines[line_index]; } -static void ui_log_append_line_locked(const char *line){ - lv_textarea_add_text(log_textarea, line); - lv_textarea_add_text(log_textarea, "\n"); - lv_textarea_set_cursor_pos(log_textarea, LV_TEXTAREA_CURSOR_LAST); -} - static void ui_log_render_all_locked(void){ - lv_textarea_set_text(log_textarea, ""); + static char rendered_text[UI_LOG_MAX_LINES * (UI_LOG_LINE_MAX_LENGTH + 1) + 1]; + size_t offset = 0; + for(size_t line_offset = 0; line_offset < log_line_length; line_offset++){ - lv_textarea_add_text(log_textarea, log_lines[ui_log_buffer_index(line_offset)]); - lv_textarea_add_text(log_textarea, "\n"); + const char *line = log_lines[ui_log_buffer_index(line_offset)]; + const int written = snprintf(rendered_text + offset, sizeof(rendered_text) - offset, "%s\n", line); + if(written < 0) break; + if((size_t)written >= sizeof(rendered_text) - offset){ + offset = sizeof(rendered_text) - 1; + break; + } + offset += (size_t)written; } + rendered_text[offset] = '\0'; + + lv_textarea_set_text(log_textarea, rendered_text); lv_textarea_set_cursor_pos(log_textarea, LV_TEXTAREA_CURSOR_LAST); } @@ -59,12 +64,11 @@ void ui_log_append(const char *text){ if(text == NULL) return; bool evicted = false; - const char *stored_line = ui_log_store_line(text, &evicted); + ui_log_store_line(text, &evicted); if(log_textarea == NULL) return; lvgl_port_lock(0); - if(evicted) ui_log_render_all_locked(); - else ui_log_append_line_locked(stored_line); + ui_log_render_all_locked(); lvgl_port_unlock(); }