ringbuffer logic from O(n^2) -> O(n), much faster ui than in beforehand

This commit is contained in:
Timo Niemann
2026-07-01 16:17:04 +02:00
parent 8c72727455
commit a53303e862
+16 -12
View File
@@ -40,18 +40,23 @@ static const char *ui_log_store_line(const char *text, bool *out_evicted){
return log_lines[line_index]; 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){ 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++){ 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)]); const char *line = log_lines[ui_log_buffer_index(line_offset)];
lv_textarea_add_text(log_textarea, "\n"); 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); 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; if(text == NULL) return;
bool evicted = false; bool evicted = false;
const char *stored_line = ui_log_store_line(text, &evicted); ui_log_store_line(text, &evicted);
if(log_textarea == NULL) return; if(log_textarea == NULL) return;
lvgl_port_lock(0); lvgl_port_lock(0);
if(evicted) ui_log_render_all_locked(); ui_log_render_all_locked();
else ui_log_append_line_locked(stored_line);
lvgl_port_unlock(); lvgl_port_unlock();
} }