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];
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user