ringbuffer logic from O(n^2) -> O(n), much faster ui than in beforehand
This commit is contained in:
+16
-12
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user