/* * Copyright (C) 2022-2023 ArtinChip Technology Co., Ltd. * Authors: Ning Fang */ #include #include #include #include #include #include "lvgl.h" #include "aic_ui.h" #include "lv_port_disp.h" #include "mpp_fb.h" #include "meter_ui.h" struct rot_id_info { int start_id; int end_id; }; static lv_obj_t *bg_fps = NULL; static lv_obj_t *bg_cpu = NULL; static lv_obj_t *img_bg = NULL; static lv_obj_t *img_circle = NULL; static lv_obj_t *img_point = NULL; static lv_obj_t *img_engine = NULL; static lv_obj_t *img_esp = NULL; static lv_obj_t *img_oil_less = NULL; static lv_obj_t *img_battery = NULL; static lv_obj_t *img_battery_num = NULL; static lv_obj_t *img_battery_hl = NULL; static lv_obj_t *img_oil_fe = NULL; static lv_obj_t *img_oil_num = NULL; static lv_obj_t *img_oil = NULL; static lv_obj_t *img_water_temp = NULL; static lv_obj_t *img_water_num = NULL; static lv_obj_t *img_gear = NULL; static lv_obj_t *img_trip = NULL; static lv_obj_t *img_trip_0 = NULL; static lv_obj_t *img_trip_1 = NULL; static lv_obj_t *img_trip_2 = NULL; static lv_obj_t *img_trip_3 = NULL; static lv_obj_t *img_trip_km = NULL; static lv_obj_t *img_speed_num = NULL; static lv_obj_t *img_speed_km = NULL; static lv_obj_t *img_time = NULL; static lv_obj_t *img_time_0 = NULL; static lv_obj_t *img_time_1 = NULL; static lv_obj_t *img_time_2 = NULL; static lv_obj_t *img_time_3 = NULL; static lv_obj_t *img_time_dot = NULL; static lv_timer_t *speed_timer = NULL; LV_FONT_DECLARE(ui_font_Title); struct rot_id_info rot_mode_list[] = { {1, 74}, {74, 1}, {1, 149}, {149, 75}, {75, 149}, {149, 1}, }; static inline void meter_ui_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) { lv_obj_set_pos(obj, x + 112, y + 60); } static void point_callback(lv_timer_t *tmr) { char data_str[128]; (void)tmr; static bool first = true; static int id = 1; static int direct = 0; static int mode_id = 0; static int mode_num = sizeof(rot_mode_list) / sizeof(rot_mode_list[0]); static int start_id = 0; static int end_id = 0; if (first) { first = false; start_id = rot_mode_list[mode_id].start_id; end_id = rot_mode_list[mode_id].end_id; } direct = start_id < end_id ? 0: 1; if (id < 75) { lv_img_set_src(img_circle, LVGL_PATH(bg/small_blue.png)); lv_obj_clear_flag(img_circle, LV_OBJ_FLAG_HIDDEN); } else { lv_obj_add_flag(img_circle, LV_OBJ_FLAG_HIDDEN); } if (id < 75) { ui_snprintf(data_str, "%spoint/point_%05d.png", LVGL_DIR, id); lv_img_set_src(img_point, data_str); lv_img_set_angle(img_point, 0); #ifdef AIC_CHIP_D13X lv_timer_set_period(speed_timer, 100); #endif } else { // id to angle float rot_angle = ((float)(id - 75) * 2 * 10) * 0.84; ui_snprintf(data_str, "%spoint/point_%05d.png", LVGL_DIR, 75); lv_img_set_src(img_point, data_str); lv_img_set_pivot(img_point, 210, 210); lv_img_set_angle(img_point, (int16_t)rot_angle); #ifdef AIC_CHIP_D13X lv_timer_set_period(speed_timer, 300); #endif } if (direct == 0) { id++; } else { id--; } if ((!direct && (id > end_id)) || (direct && (id < end_id))) { id = end_id; mode_id++; mode_id %= mode_num; start_id = rot_mode_list[mode_id].start_id; end_id = rot_mode_list[mode_id].end_id; } return; } static void speed_callback(lv_timer_t *tmr) { char data_str[128]; static int speed_num = 0; (void)tmr; ui_snprintf(data_str, "%sspeed_num/%d.png", LVGL_DIR, speed_num); speed_num++; speed_num = speed_num > 9 ? 0: speed_num; lv_img_set_src(img_speed_num, data_str); } static void time_callback(lv_timer_t *tmr) { char data_str[128]; static int hour = 2; static int min = 0; (void)tmr; min++; if (min >= 60) { hour++; min = 0; } if (hour >= 24) hour = 0; ui_snprintf(data_str, "%stime/%d.png", LVGL_DIR, hour / 10); lv_img_set_src(img_time_0, data_str); ui_snprintf(data_str, "%stime/%d.png", LVGL_DIR, hour % 10); lv_img_set_src(img_time_1, data_str); ui_snprintf(data_str, "%stime/%d.png", LVGL_DIR, min / 10); lv_img_set_src(img_time_2, data_str); ui_snprintf(data_str, "%stime/%d.png", LVGL_DIR, min % 10); lv_img_set_src(img_time_3, data_str); } static void trip_callback(lv_timer_t *tmr) { char data_str[128]; int num[4]; int cur; static int trip = 98; (void)tmr; trip++; if (trip >= 9999) trip = 0; num[0] = trip / 1000; cur = trip % 1000; num[1] = cur / 100; cur = cur % 100; num[2] = cur / 10; num[3] = cur % 10; ui_snprintf(data_str, "%smileage/%d.png", LVGL_DIR, num[0]); lv_img_set_src(img_trip_0, data_str); ui_snprintf(data_str, "%smileage/%d.png", LVGL_DIR, num[1]); lv_img_set_src(img_trip_1, data_str); ui_snprintf(data_str, "%smileage/%d.png", LVGL_DIR, num[2]); lv_img_set_src(img_trip_2, data_str); ui_snprintf(data_str, "%smileage/%d.png", LVGL_DIR, num[3]); lv_img_set_src(img_trip_3, data_str); } static void obj_set_clear_hidden_flag(lv_obj_t *obj) { if (lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) { lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); } else { lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); } } static void water_anim() { char data_str[128]; static int level = 1; static int direct = 0; ui_snprintf(data_str, "%swater_temp/%d.png", LVGL_DIR, level); lv_img_set_src(img_water_num, data_str); if (level < 19) lv_img_set_src(img_water_temp, LVGL_PATH(water_temp/water_temp2.png)); else lv_img_set_src(img_water_temp, LVGL_PATH(water_temp/water_temp.png)); if (direct == 0) level++; else level--; if (level > 20) { level = 20; direct = 1; } if (level < 1) { level = 1; direct = 0; } } static void baterry_anim() { char data_str[128]; static int level = 1; static int direct = 0; ui_snprintf(data_str, "%sbattery/%d.png", LVGL_DIR, level); lv_img_set_src(img_battery_num, data_str); if (level > 1) lv_img_set_src(img_battery, LVGL_PATH(battery/battery2.png)); else lv_img_set_src(img_battery, LVGL_PATH(battery/battery.png)); if (direct == 0) level++; else level--; if (level > 5) { level = 5; direct = 1; } if (level < 1) { level = 1; direct = 0; } } static void oil_anim() { char data_str[128]; static int level = 1; static int direct = 0; ui_snprintf(data_str, "%soil_level/%d.png", LVGL_DIR, level); lv_img_set_src(img_oil_num, data_str); if (level > 1) lv_img_set_src(img_oil, LVGL_PATH(oil_level/oil_level2.png)); else lv_img_set_src(img_oil, LVGL_PATH(oil_level/oil_level.png)); if (direct == 0) level++; else level--; if (level > 5) { level = 5; direct = 1; } if (level < 1) { level = 1; direct = 0; } } static void gear_callback() { char data_str[128]; static int level = 1; static int direct = 0; if (level <= 6) ui_snprintf(data_str, "%sgear/d%d.png", LVGL_DIR, level); else ui_snprintf(data_str, "%sgear/n.png", LVGL_DIR); lv_img_set_src(img_gear, data_str); if (direct == 0) level++; else level--; if (level > 7) { level = 7; direct = 1; } if (level < 1) { level = 1; direct = 0; } } static void other_callback(lv_timer_t *tmr) { static int mode = 0; (void)tmr; if (mode <= 2) { water_anim(); baterry_anim(); } else if (mode > 2 && mode <= 5) { water_anim(); oil_anim(); } mode++; if (mode > 5) mode = 0; } static void signal_callback(lv_timer_t *tmr) { static int mode = 0; (void)tmr; if (mode == 0) { obj_set_clear_hidden_flag(img_engine); } else if (mode == 1) { obj_set_clear_hidden_flag(img_engine); } else if (mode == 2) { obj_set_clear_hidden_flag(img_esp); } else if (mode == 3) { obj_set_clear_hidden_flag(img_esp); } else if (mode == 4) { obj_set_clear_hidden_flag(img_oil_less); } else if (mode == 5) { obj_set_clear_hidden_flag(img_oil_less); } mode++; if (mode > 5) mode = 0; } static void fps_callback(lv_timer_t *tmr) { char data_str[128]; float value; (void)tmr; /* frame rate */ ui_snprintf(data_str, "%2d FPS", fbdev_draw_fps()); lv_label_set_text(bg_fps, data_str); /* cpu usage */ #ifdef LPKG_USING_CPU_USAGE #include "cpu_usage.h" value = cpu_load_average(); #else value = 0; #endif ui_snprintf(data_str, "%d%% CPU", (int)value); lv_label_set_text(bg_cpu, data_str); return; } void meter_ui_init() { img_bg = lv_img_create(lv_scr_act()); lv_img_set_src(img_bg, LVGL_PATH(bg/bg_red.jpg)); lv_obj_set_pos(img_bg, 0, 0); img_engine = lv_img_create(img_bg); lv_img_set_src(img_engine, LVGL_PATH(warning/engine_err.png)); meter_ui_set_pos(img_engine, 21, 13); img_esp = lv_img_create(img_bg); lv_img_set_src(img_esp, LVGL_PATH(warning/esp.png)); meter_ui_set_pos(img_esp, 109, 12); img_oil_less = lv_img_create(img_bg); lv_img_set_src(img_oil_less, LVGL_PATH(warning/oil_less.png)); meter_ui_set_pos(img_oil_less, 740, 12); // water img_water_temp = lv_img_create(img_bg); lv_img_set_src(img_water_temp, LVGL_PATH(water_temp/water_temp2.png)); meter_ui_set_pos(img_water_temp, 59, 178); img_water_num = lv_img_create(img_bg); lv_img_set_src(img_water_num, LVGL_PATH(water_temp/1.png)); meter_ui_set_pos(img_water_num, 117, 121); // battery img_battery = lv_img_create(img_bg); lv_img_set_src(img_battery, LVGL_PATH(battery/battery.png)); meter_ui_set_pos(img_battery, 12, 349); img_battery_hl = lv_img_create(img_bg); lv_img_set_src(img_battery_hl, LVGL_PATH(battery/h_l.png)); meter_ui_set_pos(img_battery_hl, 39, 282); img_battery_num = lv_img_create(img_bg); lv_img_set_src(img_battery_num, LVGL_PATH(battery/5.png)); meter_ui_set_pos(img_battery_num, 56, 281); // oil img_oil_num = lv_img_create(img_bg); lv_img_set_src(img_oil_num, LVGL_PATH(oil_level/5.png)); meter_ui_set_pos(img_oil_num, 628, 281); img_oil_fe = lv_img_create(img_bg); lv_img_set_src(img_oil_fe, LVGL_PATH(oil_level/fe.png)); meter_ui_set_pos(img_oil_fe, 731, 282); img_oil = lv_img_create(img_bg); lv_img_set_src(img_oil, LVGL_PATH(oil_level/oil_level.png)); meter_ui_set_pos(img_oil, 754, 352); img_gear = lv_img_create(img_bg); lv_img_set_src(img_gear, LVGL_PATH(gear/d6.png)); meter_ui_set_pos(img_gear, 357, 380); img_circle = lv_img_create(img_bg); lv_img_set_src(img_circle, LVGL_PATH(bg/small_blue.png)); meter_ui_set_pos(img_circle, 306, 152); // trip img_trip = lv_img_create(img_bg); lv_img_set_src(img_trip, LVGL_PATH(mileage/trip.png)); meter_ui_set_pos(img_trip, 9, 439); img_trip_0 = lv_img_create(img_bg); lv_img_set_src(img_trip_0, LVGL_PATH(mileage/0.png)); meter_ui_set_pos(img_trip_0, 69 + 5, 439); img_trip_1 = lv_img_create(img_bg); lv_img_set_src(img_trip_1, LVGL_PATH(mileage/0.png)); meter_ui_set_pos(img_trip_1, 89, 439); img_trip_2 = lv_img_create(img_bg); lv_img_set_src(img_trip_2, LVGL_PATH(mileage/9.png)); meter_ui_set_pos(img_trip_2, 109 - 5, 439); img_trip_3 = lv_img_create(img_bg); lv_img_set_src(img_trip_3, LVGL_PATH(mileage/8.png)); meter_ui_set_pos(img_trip_3, 129 - 10, 439); img_trip_km = lv_img_create(img_bg); lv_img_set_src(img_trip_km, LVGL_PATH(mileage/km.png)); meter_ui_set_pos(img_trip_km, 149 - 10, 439); // speed img_speed_num = lv_img_create(img_bg); lv_img_set_src(img_speed_num, LVGL_PATH(speed_num/0.png)); meter_ui_set_pos(img_speed_num, 372, 204); img_speed_km = lv_img_create(img_bg); lv_img_set_src(img_speed_km, LVGL_PATH(speed_num/mph.png)); meter_ui_set_pos(img_speed_km, 361, 284); // time img_time = lv_img_create(img_bg); lv_img_set_src(img_time, LVGL_PATH(time/time.png)); meter_ui_set_pos(img_time, 690, 154); img_time_0 = lv_img_create(img_bg); lv_img_set_src(img_time_0, LVGL_PATH(time/0.png)); meter_ui_set_pos(img_time_0, 690 - 29, 154 - 28); img_time_1 = lv_img_create(img_bg); lv_img_set_src(img_time_1, LVGL_PATH(time/2.png)); meter_ui_set_pos(img_time_1, 690, 154 - 28); img_time_dot = lv_img_create(img_bg); lv_img_set_src(img_time_dot, LVGL_PATH(time/dot.png)); meter_ui_set_pos(img_time_dot, 690 + 29, 154 - 28); img_time_2 = lv_img_create(img_bg); lv_img_set_src(img_time_2, LVGL_PATH(time/0.png)); meter_ui_set_pos(img_time_2, 690 + 29 + 17, 154 - 28); img_time_3 = lv_img_create(img_bg); lv_img_set_src(img_time_3, LVGL_PATH(time/0.png)); meter_ui_set_pos(img_time_3, 690 + 29 * 2 + 17, 154 - 28); // point img_point = lv_img_create(img_bg); lv_img_set_src(img_point, LVGL_PATH(point/point_00001.png)); lv_img_set_pivot(img_point, 210, 210); meter_ui_set_pos(img_point, 186, 21); bg_cpu = lv_label_create(img_bg); lv_obj_set_width(bg_cpu, LV_SIZE_CONTENT); lv_obj_set_height(bg_cpu, LV_SIZE_CONTENT); lv_obj_align(bg_cpu, LV_ALIGN_TOP_RIGHT, 0, 0); lv_obj_set_pos(bg_cpu, -20, 10); lv_label_set_text(bg_cpu, ""); lv_obj_set_style_text_color(bg_cpu, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_opa(bg_cpu, 255, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_font(bg_cpu, &ui_font_Title, LV_PART_MAIN | LV_STATE_DEFAULT); bg_fps = lv_label_create(img_bg); lv_obj_set_width(bg_fps, LV_SIZE_CONTENT); lv_obj_set_height(bg_fps, LV_SIZE_CONTENT); lv_obj_align(bg_fps, LV_ALIGN_TOP_RIGHT, 0, 0); lv_obj_set_pos(bg_fps, -20, 30); lv_label_set_text(bg_fps, ""); lv_obj_set_style_text_color(bg_fps, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_opa(bg_fps, 255, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_font(bg_fps, &ui_font_Title, LV_PART_MAIN | LV_STATE_DEFAULT); lv_timer_create(point_callback, 10, 0); lv_timer_create(fps_callback, 1000, 0); lv_timer_create(time_callback, 1000 * 60, 0); lv_timer_create(trip_callback, 1000 * 5, 0); lv_timer_create(other_callback, 600, 0); lv_timer_create(signal_callback, 500, 0); lv_timer_create(gear_callback, 1000 * 3, 0); speed_timer = lv_timer_create(speed_callback, 100, 0); return; }