What have you tried so far?
I have two separate screens, one that plots three graphs and one more static. When I press a button on the first screen, it takes a significant amount of time to see the reaction (due to the timer?), while on the second screen it is quite fluid. How can I fix the problem on the first screen? Do I need to switch to animations?
Thanks for your support
Code to reproduce
void CostruisciSchermo1()
{
lv_obj_set_style_bg_color(schermo1, lv_color_white(), 0);
lv_obj_set_style_bg_opa(schermo1, LV_OPA_COVER, 0);
/*CHART 1*/
chart1 = lv_chart_create(schermo1);
lv_obj_set_size(chart1, lv_pct(100), lv_pct(30));
lv_obj_align(chart1, LV_ALIGN_TOP_MID, 0, 0);
lv_chart_set_range(chart1, LV_CHART_AXIS_PRIMARY_Y, -1000, 1000);
lv_chart_set_type(chart1, LV_CHART_TYPE_LINE);
lv_chart_set_div_line_count(chart1, 0, 0);
lv_chart_set_point_count(chart1, 500);
lv_chart_set_update_mode(chart1, LV_CHART_UPDATE_MODE_CIRCULAR);
lv_obj_set_style_size(chart1, 0, 0, LV_PART_INDICATOR);
series1 = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_x_start_point(chart1, series1, 15);
/*CHART 2*/
chart2 = lv_chart_create(schermo1);
lv_obj_set_size(chart2, lv_pct(100), lv_pct(30));
lv_obj_align(chart2, LV_ALIGN_CENTER, 0, -50);
lv_chart_set_range(chart2, LV_CHART_AXIS_PRIMARY_Y, -1000,1000);
lv_chart_set_type(chart2, LV_CHART_TYPE_LINE);
lv_chart_set_div_line_count(chart2, 0, 0);
lv_chart_set_point_count(chart2, 500);
lv_chart_set_update_mode(chart2, LV_CHART_UPDATE_MODE_CIRCULAR);
lv_obj_set_style_size(chart2, 0, 0, LV_PART_INDICATOR);
series2 = lv_chart_add_series(chart2, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_x_start_point(chart2, series2, 15);
/*CHART 3*/
chart3 = lv_chart_create(schermo1);
lv_obj_set_size(chart3, lv_pct(100), lv_pct(30));
lv_obj_align(chart3, LV_ALIGN_BOTTOM_MID, 0, -50);
lv_chart_set_range(chart3, LV_CHART_AXIS_PRIMARY_Y, -1500, 500);
lv_chart_set_type(chart3, LV_CHART_TYPE_LINE);
lv_chart_set_div_line_count(chart3, 0, 0);
lv_chart_set_point_count(chart3, 500);
lv_chart_set_update_mode(chart3, LV_CHART_UPDATE_MODE_CIRCULAR);
lv_obj_set_style_size(chart3, 0, 0, LV_PART_INDICATOR);
series3 = lv_chart_add_series(chart3, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_x_start_point(chart3, series3, 15);
DisplayEnable = true;
lv_timer_create(update_chart_cb, 5, NULL); // aggiorna ogni 50 ms
// PULSANTE 1
lv_obj_t* btn_setting = lv_btn_create(schermo1);
lv_obj_set_size(btn_setting, lv_pct(15), lv_pct(10));
lv_obj_align(btn_setting, LV_ALIGN_BOTTOM_LEFT, 0, 0);
lv_obj_t* lbl_setting = lv_label_create(btn_setting);
lv_label_set_text(lbl_setting, "Setting");
lv_obj_align_to(lbl_setting, btn_setting, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btn_setting, cb_swap1, LV_EVENT_ALL, NULL);
// PULSANTE 2
lv_obj_t* btn_menu = lv_btn_create(schermo1);
lv_obj_set_size(btn_menu, lv_pct(15), lv_pct(10));
lv_obj_align_to(btn_menu, btn_setting, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
lv_obj_t* lbl_menu = lv_label_create(btn_menu);
lv_label_set_text(lbl_menu, "Main Menu");
lv_obj_align_to(lbl_menu, btn_menu, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btn_menu, cb_main_menu, LV_EVENT_ALL, NULL);
// PULSANTE 3
lv_obj_t* btn_aed = lv_btn_create(schermo1);
lv_obj_set_size(btn_aed, lv_pct(15), lv_pct(10));
lv_obj_align_to(btn_aed, btn_menu, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
lv_obj_t* lbl_aed = lv_label_create(btn_aed);
lv_label_set_text(lbl_aed, "AED");
lv_obj_align_to(lbl_aed, btn_aed, LV_ALIGN_CENTER, 0, 0);
// PULSANTE 4
lv_obj_t* btn_manual = lv_btn_create(schermo1);
lv_obj_set_size(btn_manual, lv_pct(15), lv_pct(10));
lv_obj_align_to(btn_manual, btn_aed, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
lv_obj_t* lbl_manual = lv_label_create(btn_manual);
lv_label_set_text(lbl_manual, "Manual");
lv_obj_align_to(lbl_manual, btn_manual, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_style(btn_setting, &style_btn_default, 0);
lv_obj_add_style(btn_menu, &style_btn_default, 0);
lv_obj_add_style(btn_aed, &style_btn_default, 0);
lv_obj_add_style(btn_manual, &style_btn_default, 0);
}
void update_chart_cb(lv_timer_t* timer)
{
if (WaitAcquire > 10)
{
int16_t ecg_data1[512];
int16_t ecg_data2[512];
int16_t ecg_data3[512];
unsigned int samples1 = EcgGetMonitor(pEcgFifoDts1, ecg_data1, 512);
unsigned int samples2 = EcgGetMonitor(pEcgFifoDts2, ecg_data2, 512);
unsigned int samples3 = EcgGetMonitor(pEcgFifoDts3, ecg_data3, 512);
unsigned int num_samples = samples1;
if (samples2 < num_samples) num_samples = samples2;
if (samples3 < num_samples) num_samples = samples3;
// Se ci sono campioni, aggiungili
if (num_samples > 0)
{
for (unsigned int i = 0; i < num_samples; i++)
{
lv_chart_set_next_value(chart1, series1, ecg_data1[i]);
lv_chart_set_next_value(chart2, series2, ecg_data2[i]);
lv_chart_set_next_value(chart3, series3, ecg_data3[i]);
// Inserisci punti vuoti subito dopo per visualizzare lo scorrimento
uint16_t p = lv_chart_get_point_count(chart1);
uint16_t s = lv_chart_get_x_start_point(chart1, series1);
int32_t *a1 = lv_chart_get_y_array(chart1, series1);
int32_t *a2 = lv_chart_get_y_array(chart2, series2);
int32_t *a3 = lv_chart_get_y_array(chart3, series3);
a1[(s + 1) % p] = LV_CHART_POINT_NONE;
a2[(s + 1) % p] = LV_CHART_POINT_NONE;
a3[(s + 1) % p] = LV_CHART_POINT_NONE;
}
}
else
{
// Se non ci sono campioni, forza lo scorrimento con punti vuoti
lv_chart_set_next_value(chart1, series1, LV_CHART_POINT_NONE);
lv_chart_set_next_value(chart2, series2, LV_CHART_POINT_NONE);
lv_chart_set_next_value(chart3, series3, LV_CHART_POINT_NONE);
}
lv_obj_invalidate(chart1);
lv_obj_invalidate(chart2);
lv_obj_invalidate(chart3);
}
}
Screenshot and/or video
Environment
- MCU/MPU/Board: STM32F7
- LVGL version: 9.3.0