Unresponsive buttons

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