/** * @file main * */ /********************* * INCLUDES *********************/ #include #include #include "lvgl/lvgl.h" #include "lv_demos/src/lv_demo_widgets/lv_demo_widgets.h" #include "lv_drivers/win32drv/win32drv.h" #include /********************* * DEFINES *********************/ #define uint16_t unsigned short /********************** * TYPEDEFS **********************/ /********************** * STATIC PROTOTYPES **********************/ static void hal_init(void); static int tick_thread(void *data); /********************** * STATIC VARIABLES **********************/ /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ static lv_obj_t *chart[2]; static lv_obj_t *obj_chart; static lv_chart_series_t *series_chart[2]; static void create_chart(void) { if(chart[0] == NULL) //chart[0] & chart[1] are global variable { obj_chart = lv_obj_create(lv_scr_act()); lv_obj_set_style_bg_opa(obj_chart, LV_PART_MAIN, LV_OPA_TRANSP); lv_obj_set_style_border_opa(obj_chart, LV_PART_MAIN, LV_OPA_TRANSP); lv_obj_set_style_border_width(obj_chart, 0, LV_PART_MAIN); lv_obj_align(obj_chart, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_set_style_pad_all(obj_chart, 0, LV_PART_MAIN); lv_obj_set_style_pad_column(obj_chart, -5, LV_PART_MAIN); lv_obj_set_style_pad_row(obj_chart, 0, LV_PART_MAIN); lv_obj_clear_flag(obj_chart, LV_OBJ_FLAG_SCROLLABLE); chart[0] = lv_chart_create(obj_chart); lv_chart_set_update_mode(chart[0], LV_CHART_UPDATE_MODE_CIRCULAR); lv_obj_align(chart[0], LV_ALIGN_TOP_MID, 0, 0); lv_chart_set_div_line_count(chart[0], 0, 0); lv_chart_set_point_count(chart[0], 342); lv_obj_set_style_bg_opa(chart[0], LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_style_border_opa(chart[0], LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_style_pad_all(chart[0], LV_PART_MAIN, 0); lv_obj_set_style_bg_opa(chart[0], LV_OPA_100, LV_PART_ITEMS); lv_obj_set_style_line_width(chart[0], 2, LV_PART_INDICATOR); lv_obj_set_style_size(chart[0], 0, LV_PART_INDICATOR); /*radius of points*/ series_chart[0] = lv_chart_add_series(chart[0], lv_palette_main(LV_PALETTE_CYAN), LV_CHART_AXIS_PRIMARY_Y); lv_chart_set_range(chart[0], LV_CHART_AXIS_PRIMARY_Y, 0, 255); lv_chart_set_all_value(chart[0], series_chart[0], 0); chart[1] = lv_chart_create(obj_chart); lv_chart_set_update_mode(chart[1], LV_CHART_UPDATE_MODE_CIRCULAR); lv_obj_align(chart[1], LV_ALIGN_TOP_MID, 0, 0); lv_chart_set_div_line_count(chart[1], 0, 0); lv_chart_set_point_count(chart[1], 342); series_chart[1] = lv_chart_add_series(chart[1], lv_palette_main(LV_PALETTE_CYAN), LV_CHART_AXIS_SECONDARY_Y); lv_chart_set_range(chart[1], LV_CHART_AXIS_SECONDARY_Y, 0, 255); lv_chart_set_all_value(chart[1], series_chart[1], 0); lv_obj_set_style_bg_opa(chart[1], LV_OPA_TRANSP, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_pad_all(chart[1], LV_PART_MAIN, 0); lv_obj_set_style_bg_opa(chart[1], LV_OPA_100, LV_PART_ITEMS); lv_obj_set_style_line_width(chart[1], 2, LV_PART_INDICATOR); lv_obj_set_style_size(chart[1], 0, LV_PART_INDICATOR);/*radius of points*/ lv_obj_set_style_border_opa(chart[1], LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_flex_flow(obj_chart, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(obj_chart, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_add_flag(chart[0], LV_OBJ_FLAG_EVENT_BUBBLE); lv_obj_add_flag(chart[1], LV_OBJ_FLAG_EVENT_BUBBLE); lv_obj_add_flag(obj_chart, LV_OBJ_FLAG_EVENT_BUBBLE); } refresh_chart_size(); } static void add_data(lv_timer_t * timer) { LV_UNUSED(timer); static uint32_t cnt = 0; if(cnt < 342) //set chat[0] to new value { lv_chart_set_value_by_id(chart[0], series_chart[0],cnt,lv_rand(0, 255)); } else if(cnt == 342) { /* repeat the last data of chart[0] in first data of chart[1] to not have visual discontinuity. */ lv_chart_set_value_by_id(chart[1], series_chart[1], cnt % 342, series_chart[0]->y_points[342 - 1]); cnt++; lv_chart_set_value_by_id(chart[1], series_chart[1], cnt % 342, lv_rand(0, 255)); } else if(cnt > 342) //set chat[1] to new value { lv_chart_set_value_by_id(chart[1], series_chart[1],cnt% 342,lv_rand(0, 255)); } cnt++; if(cnt >= 2 * 342) { cnt = 0; } } void refresh_chart_size(void) { if(chart[0] == NULL) { create_chart(); } lv_obj_clear_flag(chart[1], LV_OBJ_FLAG_HIDDEN); lv_obj_set_size(chart[0], 348, 110); lv_obj_set_size(chart[1], 348, 110); lv_obj_set_size(obj_chart, 2 * 348 - 4, 115); lv_obj_set_flex_flow(obj_chart, LV_FLEX_FLOW_ROW); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) { /*Initialize LittlevGL*/ lv_init(); /*Initialize the HAL for LittlevGL*/ lv_win32_init(hInstance, SW_SHOWNORMAL, 800, 480, NULL); /*Output prompt information to the console, you can also use printf() to print directly*/ LV_LOG_USER("LVGL initialization completed!"); /*Run the demo*/ //lv_demo_widgets(); lv_timer_create(add_data, 8, NULL); create_chart(); while(!lv_win32_quit_signal) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ lv_task_handler(); usleep(10000); /*Just to let the system breath*/ } return 0; }