/** * @file main * */ /********************* * INCLUDES *********************/ #include #include #include "lvgl/lvgl.h" #include "lvgl/demos/widgets/lv_demo_widgets.h" #include "lv_drivers/win32drv/win32drv.h" #include static void hal_init(void); static int tick_thread(void *data); #define lowpower_img "E:lowpower.png" #define bg_img "E:sunset.png" #define return_img "E:return.png" #define home_img "E:home.png" #define bell_img "E:bell.png" #define call_img "E:call.png" #define answer_img "E:answer.png" #define visible_img "E:visible.png" #define invisible_img "E:invisible.png" #define vol_img "E:vol.png" #define light_img "E:light.png" #define wait_img "E:wait.png" #define keyboard_img "E:keyboard.png" #define nfc_img "E:nfc.png" #define palm_img "E:palm.png" #define face_img "E:face.png" #define add_admin_img "E:add_admin.png" #define add_normal_img "E:add_normal.png" #define nfc_detect_img "E:nfc_detect.png" #define avatar_img "E:avatar.png" #define success_img "E:success.png" #define fail_img "E:fail.png" #define edit_img "E:edit.png" #define finish_img "E:finish.png" #define tick_img "E:tick.png" #define fork_img "E:fork.png" #define greentick_img "E:greentick.png" #define top() lv_scr_act() #define scr_act_width() lv_obj_get_width(lv_scr_act()) #define scr_act_height() lv_obj_get_height(lv_scr_act()) LV_FONT_DECLARE(lv_font_heiti24) static const char password[] = {"1"}; static const char *string_map[] = {"0","1","2","3","4","5","6","7","8","9"}; typedef enum { DEL_USER = 0, DEL_PASS = 1, DEL_NFC, DEL_PALM, DEL_FACE, }delete_type; /********主界面需要静态的部件******/ static lv_obj_t *tileview; static lv_obj_t *scr_main; static lv_obj_t *scr_keyboard; static lv_obj_t *scr_login; static lv_obj_t *btn_ring_main; static lv_obj_t *btn_return; static lv_obj_t *vol_slider; static lv_obj_t *light_slider; static lv_style_t scr_style; static lv_style_t btn_style; static lv_style_t btn_text_style; static lv_style_t return_style; static lv_style_t add_style; static lv_style_t del_style; /********密码解锁 界面需要静态的部件******/ static lv_obj_t *btnmatrix; static lv_obj_t *text_keyboard; static lv_obj_t *visi_btn; static lv_obj_t *invisi_btn; static lv_obj_t *btn_msg; static lv_obj_t *btn_yes; static lv_obj_t *btn_no; /********门铃呼叫需要静态的部件******/ /*******管理员登录 界面需要静态的部件******/ static lv_obj_t *btn_pass_login; static lv_obj_t *btn_nfc_login; static lv_obj_t *btn_palm_login; static lv_obj_t *btn_face_login; static lv_obj_t *btn_return_login; /*******密码登录需要静态的部件******/ /*******用户管理菜单需要静态的部件******/ static lv_obj_t *btn_admin_menu; static lv_obj_t *btn_normal_menu; static lv_obj_t *btn_return_menu; static lv_obj_t *btn_return_home; static lv_obj_t *user_list; static lv_obj_t *btn_add; static lv_obj_t *btn_edit; static lv_obj_t *btn_trash; static lv_obj_t *btn_finish; static lv_obj_t *checkbox_full; /*用户详情方式 界面需要*/ static lv_obj_t *btn_add_pass; static lv_obj_t *btn_del_pass; static lv_obj_t *btn_add_nfc; static lv_obj_t *btn_del_nfc; static lv_obj_t *btn_add_palm; static lv_obj_t *btn_del_palm; static lv_obj_t *btn_add_face; static lv_obj_t *btn_del_face; static lv_obj_t *btn_return_add_menu; static lv_obj_t *btn_return_add_mode; /*添加密码 界面*/ static lv_obj_t *add_btnmatrix; static lv_obj_t *add_text_keyboard; static lv_obj_t *add_text_keyboard2; static int32_t input_pass_where = 0; static void lv_obj_style_init(void); static void show_main_gui(void); static void main_gui(void); static void lowpower_gui(void); static void ring_gui(void); static void pass_login_gui(void); static void nfc_login_gui(void); static void palm_login_gui(void); static void face_login_gui(void); static void login_verify_succ(void); static void login_verify_fail(void); static void menu_gui(void); static void user_menu_gui(void); static void user_mode_gui(void); static void add_pass_gui(void); static void add_nfc_gui(void); static void add_palm_gui(void); static void add_face_gui(void); static void add_user_anim(bool result); static void key_msg(void); static void key_msg_event_cb(lv_event_cb_t * e); static void login_msg(void); static void login_msg_event_cb(lv_event_cb_t * e); static void del_user_msg(delete_type type); static void del_user_msg_event_cb(lv_event_cb_t * e); static void del_usermode_msg_event_cb(lv_event_cb_t * e); static void show_main_event_cb(lv_event_cb_t * e); static void return_event_cb(lv_event_cb_t * e); static void main_event_cb(lv_event_cb_t * e); static void ring_event_cb(lv_event_cb_t * e); static void key_event_cb(lv_event_cb_t * e); static void login_event_cb(lv_event_cb_t * e); static void pass_login_event_cb(lv_event_cb_t * e); static void menu_event_cb(lv_event_cb_t * e); static void user_menu_event_cb(lv_event_cb_t * e); static void user_mode_event_cb(lv_event_cb_t * e); static void add_pass_event_cb(lv_event_cb_t * e); /*相关动画*/ static void wait_open_anim(void); static void wait_open_anim_end(lv_anim_t * anim); static void open_anim_event_cb(void); /*功能函数*/ static void random_map_convert(char **string_map, char **matrix_map); static void lv_obj_show_battery(int batterylevel, lv_obj_t *parent); static void lv_obj_show_wifi(int connect_state, lv_obj_t *parent); static void lv_obj_blink(lv_obj_t *obj, int32_t Value); static void lv_obj_display_top_layer(void); static void lv_obj_disappear_top_layer(void); static void lv_obj_style_init(void) { /*创建btn_style*/ lv_style_init(&btn_style); lv_style_set_radius(&btn_style, 25); lv_style_set_bg_color(&btn_style, lv_color_hex(0x000000)); lv_style_set_bg_opa(&btn_style, LV_OPA_10); lv_style_set_border_opa(&btn_style, LV_OPA_TRANSP); lv_style_set_border_width(&btn_style, 0); /*创建btn_text_style*/ lv_style_init(&btn_text_style); lv_style_set_text_color(&btn_text_style, lv_color_hex(0xffffff)); lv_style_set_opa(&btn_text_style, LV_OPA_80); /*创建scr_style*/ lv_style_init(&scr_style); lv_style_set_width(&scr_style, 720); lv_style_set_height(&scr_style, 1280); lv_style_set_text_font(&scr_style, &lv_font_heiti24); lv_style_set_bg_color(&scr_style, lv_color_hex(0xB0E0E6)); lv_style_set_bg_img_src(&scr_style, bg_img); /*创建return_style, 返回键、home键*/ lv_style_init(&return_style); lv_style_set_width(&return_style, 48); lv_style_set_height(&return_style, 48); /*创建add_style*/ lv_style_init(&add_style); lv_style_set_width(&add_style, 100); lv_style_set_height(&add_style, 50); lv_style_set_text_font(&add_style, &lv_font_montserrat_24); lv_style_set_bg_color(&add_style, lv_palette_main(LV_PALETTE_GREEN)); /*创建del_style*/ lv_style_init(&del_style); lv_style_set_width(&del_style, 100); lv_style_set_height(&del_style, 50); lv_style_set_text_font(&del_style, &lv_font_montserrat_24); lv_style_set_bg_color(&del_style, lv_palette_main(LV_PALETTE_RED)); } static void show_main_gui(void) { lv_obj_clean(top()); lv_obj_t *scr = lv_obj_create(NULL); lv_obj_add_style(scr, &scr_style, 0); lv_scr_load(scr); lv_obj_add_event_cb(scr, show_main_event_cb, LV_EVENT_CLICKED, NULL); } static void show_main_event_cb(lv_event_cb_t * e) { lv_event_code_t code = lv_event_get_code(e); if(code == LV_EVENT_CLICKED) { main_gui(); } } static void stop_anim_cb(lv_anim_t * animation) { show_main_gui(); } /*低电量预警 界面*/ static void lowpower_gui(void) { lv_obj_clean(top()); lv_obj_t *scr = lv_obj_create(NULL); lv_obj_add_style(scr, &scr_style, 0); lv_scr_load(scr); lv_obj_t *img = lv_img_create(scr); lv_img_set_src(img, lowpower_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr); lv_obj_align_to(label, img, LV_ALIGN_OUT_BOTTOM_MID, -150, 50); lv_label_set_text(label, "电池电量过低,请及时充电"); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, img); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_obj_blink); lv_anim_set_time(&anim, 500); lv_anim_set_values(&anim, 0, 100); lv_anim_set_repeat_count(&anim, 1); lv_anim_set_playback_delay(&anim, 100); lv_anim_set_playback_time(&anim, 500); lv_anim_set_ready_cb(&anim, stop_anim_cb); lv_anim_start(&anim); } static void return_event_cb(lv_event_cb_t * e) { lv_obj_t * target = lv_event_get_target(e); if(target == btn_return) { main_gui(); } else if(target == btn_return_login) { main_gui(); lv_obj_set_tile(tileview, scr_login, LV_ANIM_OFF); } else if ( target == btn_return_menu) { menu_gui(); } else if( target == btn_return_home) { menu_gui(); } else if( target == btn_return_add_menu) { LV_LOG_USER("user_menu_gui"); user_menu_gui(); } else if(target == btn_return_add_mode) { user_mode_gui(); } } /*主界面框架*/ static void main_gui(void) { lv_obj_t *scr = lv_obj_create(NULL); lv_obj_add_style(scr, &scr_style, 0); lv_scr_load(scr); lv_obj_show_battery(4, top()); lv_obj_show_wifi(true, top()); tileview = lv_tileview_create(scr); lv_obj_set_style_bg_opa(tileview, LV_OPA_TRANSP, 0); lv_obj_set_style_opa(tileview, LV_OPA_TRANSP, LV_PART_SCROLLBAR); scr_keyboard = lv_tileview_add_tile(tileview, 0, 1, LV_DIR_RIGHT); scr_main = lv_tileview_add_tile(tileview, 1, 1, LV_DIR_HOR | LV_DIR_TOP); scr_login = lv_tileview_add_tile(tileview, 2, 1, LV_DIR_LEFT); lv_obj_set_tile(tileview, scr_main, LV_ANIM_OFF); /*创建 主屏幕*/ lv_obj_set_size(scr_main, scr_act_width(), scr_act_height()); /*门铃按钮*/ btn_ring_main = lv_btn_create(scr_main); lv_obj_set_size(btn_ring_main, 640, 150); lv_obj_align(btn_ring_main, LV_ALIGN_LEFT_MID, 40, 200); lv_obj_add_style(btn_ring_main, &btn_style, 0); lv_obj_set_style_bg_img_src(btn_ring_main, bell_img, 0); lv_obj_set_style_bg_color(btn_ring_main, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_add_event_cb(btn_ring_main, main_event_cb, LV_EVENT_CLICKED, NULL); vol_slider = lv_slider_create(scr_main); lv_slider_set_range(vol_slider, 0, 100); lv_obj_set_size(vol_slider, 300, 100); lv_obj_align_to(vol_slider, btn_ring_main, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 50); lv_obj_add_style(vol_slider, &btn_style, 0); lv_obj_set_style_opa(vol_slider, LV_OPA_TRANSP, LV_PART_KNOB); lv_obj_set_style_radius(vol_slider, 0, LV_PART_INDICATOR); lv_obj_add_event_cb(vol_slider, main_event_cb, LV_EVENT_VALUE_CHANGED, NULL); lv_obj_t *img_vol = lv_img_create(vol_slider); lv_img_set_src(img_vol, vol_img); lv_obj_center(img_vol); lv_obj_move_foreground(img_vol); light_slider = lv_slider_create(scr_main); lv_slider_set_range(light_slider, 0, 100); lv_obj_set_size(light_slider, 300, 100); lv_obj_align_to(light_slider, vol_slider, LV_ALIGN_OUT_RIGHT_TOP, 40, 0); lv_obj_add_style(light_slider, &btn_style, 0); lv_obj_set_style_opa(light_slider, LV_OPA_TRANSP, LV_PART_KNOB); lv_obj_set_style_radius(light_slider, 0, LV_PART_INDICATOR); lv_obj_add_event_cb(light_slider, main_event_cb, LV_EVENT_VALUE_CHANGED, NULL); lv_obj_t *img_light = lv_img_create(light_slider); lv_img_set_src(img_light, light_img); lv_obj_center(img_light); lv_obj_move_foreground(img_light); /*创建键盘屏幕*/ lv_obj_set_size(scr_keyboard, scr_act_width(), scr_act_height()); /*matrix 矩阵键盘*/ btnmatrix = lv_btnmatrix_create(scr_keyboard); lv_obj_set_size(btnmatrix, scr_act_width(), 900); lv_obj_align(btnmatrix, LV_ALIGN_BOTTOM_MID, 0, 0); static char *matrixmap[17]; random_map_convert(string_map, matrixmap); lv_btnmatrix_set_map(btnmatrix, matrixmap); lv_obj_set_style_text_font(btnmatrix, &lv_font_montserrat_34, 0); lv_obj_set_style_bg_opa(btnmatrix, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(btnmatrix, 0, 0); /*消除边框*/ lv_obj_set_style_pad_gap(btnmatrix, 5, 0); /*设置按钮间距*/ lv_obj_set_style_opa(btnmatrix, LV_OPA_90, 0); lv_obj_add_event_cb(btnmatrix, key_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*textarea 文本区域*/ text_keyboard = lv_textarea_create(scr_keyboard); lv_obj_set_size(text_keyboard, 500, 200); lv_obj_align_to(text_keyboard, btnmatrix, LV_ALIGN_OUT_TOP_MID, 0, 0); lv_obj_set_style_text_font(text_keyboard, &lv_font_montserrat_34, 0); lv_obj_set_style_bg_opa(text_keyboard, LV_OPA_50, 0); lv_textarea_set_max_length(text_keyboard, 32); lv_textarea_set_one_line(text_keyboard, true); lv_textarea_set_password_mode(text_keyboard, true); /*隐藏/显现 密码*/ visi_btn = lv_imgbtn_create(scr_keyboard); lv_imgbtn_set_src(visi_btn, LV_IMGBTN_STATE_RELEASED, visible_img, visible_img, visible_img); lv_obj_set_size(visi_btn, 32, 32); lv_obj_align_to(visi_btn, text_keyboard, LV_ALIGN_RIGHT_MID, 0, 0); lv_obj_clear_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_set_style_opa(visi_btn, LV_OPA_50, 0); lv_obj_add_event_cb(visi_btn, key_event_cb, LV_EVENT_CLICKED, 0); invisi_btn = lv_imgbtn_create(scr_keyboard); lv_imgbtn_set_src(invisi_btn, LV_IMGBTN_STATE_RELEASED, invisible_img, invisible_img, invisible_img); lv_obj_set_size(invisi_btn, 32, 32); lv_obj_align_to(invisi_btn, text_keyboard, LV_ALIGN_RIGHT_MID, 0, 0); lv_obj_add_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_set_style_opa(invisi_btn, LV_OPA_50, 0); lv_obj_add_event_cb(invisi_btn, key_event_cb, LV_EVENT_CLICKED, 0); /*创建 登录屏幕*/ lv_obj_set_size(scr_login, scr_act_width(), scr_act_height()); lv_obj_t *scr_login_label = lv_label_create(scr_login); lv_obj_align(scr_login_label, LV_ALIGN_TOP_MID, 0 , 15); lv_label_set_text(scr_login_label, "管理员登录方式"); btn_pass_login = lv_btn_create(scr_login); lv_obj_set_size(btn_pass_login, 500, 200); lv_obj_align(btn_pass_login, LV_ALIGN_TOP_LEFT, 100, 100); lv_obj_set_style_bg_img_src(btn_pass_login, keyboard_img, 0); lv_obj_add_style(btn_pass_login, &btn_style, 0); lv_obj_add_event_cb(btn_pass_login, login_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_pass = lv_label_create(btn_pass_login); lv_label_set_text(label_pass, "密码登录"); lv_obj_add_style(label_pass, &btn_text_style, 0); btn_nfc_login = lv_btn_create(scr_login); lv_obj_set_size(btn_nfc_login, 500, 200); lv_obj_align_to(btn_nfc_login, btn_pass_login, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 100); lv_obj_set_style_bg_img_src(btn_nfc_login, nfc_img, 0); lv_obj_add_style(btn_nfc_login, &btn_style, 0); lv_obj_add_event_cb(btn_nfc_login, login_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_nfc = lv_label_create(btn_nfc_login); lv_label_set_text(label_nfc, "NFC卡登录"); lv_obj_add_style(label_nfc, &btn_text_style, 0); btn_palm_login = lv_btn_create(scr_login); lv_obj_set_size(btn_palm_login, 500, 200); lv_obj_align_to(btn_palm_login, btn_nfc_login, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 100); lv_obj_set_style_bg_img_src(btn_palm_login, palm_img, 0); lv_obj_add_style(btn_palm_login, &btn_style, 0); lv_obj_add_event_cb(btn_palm_login, login_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_palm = lv_label_create(btn_palm_login); lv_label_set_text(label_palm, "掌静脉登录"); lv_obj_add_style(label_palm, &btn_text_style, 0); btn_face_login = lv_btn_create(scr_login); lv_obj_set_size(btn_face_login, 500, 200); lv_obj_align_to(btn_face_login, btn_palm_login, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 100); lv_obj_set_style_bg_img_src(btn_face_login, face_img, 0); lv_obj_add_style(btn_face_login, &btn_style, 0); lv_obj_add_event_cb(btn_face_login, login_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_face = lv_label_create(btn_face_login); lv_label_set_text(label_face, "人脸登录"); lv_obj_add_style(label_face, &btn_text_style, 0); } /*主界面部件回调函数(包含返回键)*/ static void main_event_cb(lv_event_cb_t * e) { lv_obj_t * target = lv_event_get_target(e); if(target == btn_ring_main) { LV_LOG_USER("RING"); ring_gui(); } else if(target == vol_slider) { LV_LOG_USER("vol_slider %d",lv_slider_get_value(vol_slider)); } else if(target == light_slider) { LV_LOG_USER("light_slider %d",lv_slider_get_value(light_slider)); } } /*密码键盘输入回调函数*/ static void key_event_cb(lv_event_cb_t * e) { lv_obj_t * target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); lv_obj_t *parent = lv_obj_get_parent(target); if(target == btnmatrix) { const char *txt = lv_btnmatrix_get_btn_text(btnmatrix, lv_btnmatrix_get_selected_btn(btnmatrix)); if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { lv_textarea_del_char(text_keyboard); } else if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { if(strcmp(lv_textarea_get_text(text_keyboard), password) == 0) { wait_open_anim(); } else { lv_textarea_set_text(text_keyboard, ""); key_msg(); } } else { lv_textarea_add_text(text_keyboard, txt); } } else if(target == visi_btn) { lv_textarea_set_password_mode(text_keyboard, false); lv_obj_add_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); } else if(target == invisi_btn) { lv_textarea_set_password_mode(text_keyboard, true); lv_obj_add_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); } } static void key_msg(void) { /* 消息弹窗*/ lv_obj_display_top_layer(); btn_msg = lv_btn_create(lv_layer_top()); lv_obj_set_size(btn_msg, 400, 200); lv_obj_center(btn_msg); lv_obj_set_style_bg_color(btn_msg, lv_palette_main(LV_PALETTE_BLUE_GREY), 0); lv_obj_t *label = lv_label_create(btn_msg); lv_label_set_text(label, "密码错误,请重新输入"); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 50); btn_yes = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_yes, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_set_size(btn_yes, 150, 50); lv_obj_align_to(btn_yes, label, LV_ALIGN_OUT_BOTTOM_RIGHT, 50, 50); lv_obj_add_event_cb(btn_yes, key_msg_event_cb, LV_EVENT_CLICKED, 0); lv_obj_t *label_btn = lv_label_create(btn_yes); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "确认"); lv_obj_center(label_btn); btn_no = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_no, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_size(btn_no, 150, 50); lv_obj_align_to(btn_no, label, LV_ALIGN_OUT_BOTTOM_LEFT, -50, 50); lv_obj_add_event_cb(btn_no, key_msg_event_cb, LV_EVENT_CLICKED, 0); label_btn = lv_label_create(btn_no); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "取消"); lv_obj_center(label_btn); } static void key_msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); if(target == btn_yes) { lv_obj_disappear_top_layer(); } else if(target == btn_no) { lv_obj_disappear_top_layer(); lv_obj_set_tile(tileview, scr_main, LV_ANIM_ON); } } /*缓冲动画结束后,回调到 开锁界面*/ static void wait_open_anim(void) { lv_obj_t *img = lv_img_create(top()); lv_img_set_src(img, wait_img); lv_obj_center(img); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, img); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 1500); lv_anim_set_values(&anim, 0, 3599); lv_anim_set_repeat_count(&anim, LV_ANIM_REPEAT_INFINITE); lv_anim_set_start_cb(&anim, wait_open_anim_end); lv_anim_start(&anim); } static void wait_open_anim_end(lv_anim_t * anim) { LV_LOG_USER("xxx"); //lv_anim_del(anim->var, NULL);/*确保删除动画*/ } /*开锁成功 界面*/ static void open_anim_event_cb(void) { lv_obj_clean(top()); lv_obj_t *scr_open = lv_obj_create(top()); lv_obj_set_size(scr_open, scr_act_width(), scr_act_height()); lv_obj_set_style_bg_img_src(scr_open, success_img, 0); lv_obj_t *label = lv_label_create(scr_open); lv_obj_align(label, LV_ALIGN_CENTER, 0, 300); lv_label_set_text(label, "请开门"); btn_return = lv_imgbtn_create(scr_open); lv_imgbtn_set_src(btn_return, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return, &return_style, 0); lv_obj_add_event_cb(btn_return, return_event_cb, LV_EVENT_CLICKED, NULL); } /*门铃呼叫界面*/ static void ring_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_ring = lv_obj_create(NULL); lv_obj_add_style(scr_ring, &scr_style, 0); lv_scr_load(scr_ring); lv_obj_t *img = lv_img_create(scr_ring); lv_img_set_src(img, call_img); lv_obj_center(img); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, img); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 1000); lv_anim_set_values(&anim, 0, 200); lv_anim_set_repeat_count(&anim, LV_ANIM_REPEAT_INFINITE); lv_anim_set_playback_delay(&anim, 50); lv_anim_set_playback_time(&anim, 1000); lv_anim_start(&anim); lv_obj_t *label = lv_label_create(scr_ring); lv_label_set_text(label, "正在呼叫中..."); lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_set_size(label, 100, 24); lv_obj_align(label, LV_ALIGN_CENTER, 0, 200); lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_event_cb(label, ring_event_cb, LV_EVENT_CLICKED, NULL); btn_return = lv_imgbtn_create(scr_ring); lv_imgbtn_set_src(btn_return, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return, &return_style, 0); lv_obj_add_event_cb(btn_return, return_event_cb, LV_EVENT_CLICKED, NULL); } /*门铃接听回调*/ static void ring_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); if(code == LV_EVENT_CLICKED) { lv_obj_clean(top()); lv_obj_t *scr_ring = lv_obj_create(NULL); lv_obj_add_style(scr_ring, &scr_style, 0); lv_scr_load(scr_ring); lv_obj_t *img = lv_img_create(scr_ring); lv_img_set_src(img, answer_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_ring); lv_label_set_text(label, "已接听"); lv_obj_align(label, LV_ALIGN_CENTER, 0, 200); btn_return = lv_imgbtn_create(scr_ring); lv_imgbtn_set_src(btn_return, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return, &return_style, 0); lv_obj_add_event_cb(btn_return, return_event_cb, LV_EVENT_CLICKED, NULL); } } static void login_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); /*判断管理员登录方式时选择的按键*/ if(target == btn_pass_login) { pass_login_gui(); } else if(target == btn_nfc_login) { nfc_login_gui(); } else if(target == btn_palm_login) { palm_login_gui(); } else if(target == btn_face_login) { face_login_gui(); } } /*密码登录 界面*/ static void pass_login_gui(void) { /*创建键盘屏幕*/ lv_obj_clean(top()); lv_obj_t *scr_keyboard = lv_obj_create(NULL); lv_obj_add_style(scr_keyboard, &scr_style, 0); lv_scr_load(scr_keyboard); /*matrix 矩阵键盘*/ btnmatrix = lv_btnmatrix_create(scr_keyboard); lv_obj_set_size(btnmatrix, scr_act_width(), 900); lv_obj_align(btnmatrix, LV_ALIGN_BOTTOM_MID, 0, 0); static char *matrixmap[17]; random_map_convert(string_map, matrixmap); lv_btnmatrix_set_map(btnmatrix, matrixmap); lv_obj_set_style_text_font(btnmatrix, &lv_font_montserrat_34, 0); lv_obj_set_style_bg_opa(btnmatrix, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(btnmatrix, 0, 0); /*消除边框*/ lv_obj_set_style_pad_gap(btnmatrix, 5, 0); /*设置按钮间距*/ lv_obj_set_style_opa(btnmatrix, LV_OPA_90, 0); lv_obj_add_event_cb(btnmatrix, pass_login_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*textarea 文本区域*/ text_keyboard = lv_textarea_create(scr_keyboard); lv_obj_set_size(text_keyboard, 500, 200); lv_obj_align_to(text_keyboard, btnmatrix, LV_ALIGN_OUT_TOP_MID, 0, 0); lv_obj_set_style_text_font(text_keyboard, &lv_font_montserrat_34, 0); lv_obj_set_style_bg_opa(text_keyboard, LV_OPA_50, 0); lv_textarea_set_max_length(text_keyboard, 32); lv_textarea_set_one_line(text_keyboard, true); lv_textarea_set_password_mode(text_keyboard, true); /*隐藏/显现 密码*/ visi_btn = lv_imgbtn_create(scr_keyboard); lv_imgbtn_set_src(visi_btn, LV_IMGBTN_STATE_RELEASED, visible_img, visible_img, visible_img); lv_obj_set_size(visi_btn, 32, 32); lv_obj_align_to(visi_btn, text_keyboard, LV_ALIGN_RIGHT_MID, 0, 0); lv_obj_clear_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_set_style_opa(visi_btn, LV_OPA_50, 0); lv_obj_add_event_cb(visi_btn, pass_login_event_cb, LV_EVENT_CLICKED, 0); invisi_btn = lv_imgbtn_create(scr_keyboard); lv_imgbtn_set_src(invisi_btn, LV_IMGBTN_STATE_RELEASED, invisible_img, invisible_img, invisible_img); lv_obj_set_size(invisi_btn, 32, 32); lv_obj_align_to(invisi_btn, text_keyboard, LV_ALIGN_RIGHT_MID, 0, 0); lv_obj_add_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_set_style_opa(invisi_btn, LV_OPA_50, 0); lv_obj_add_event_cb(invisi_btn, pass_login_event_cb, LV_EVENT_CLICKED, 0); /*返回键*/ btn_return_login = lv_imgbtn_create(scr_keyboard); lv_imgbtn_set_src(btn_return_login, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return_login, &return_style, 0); lv_obj_add_event_cb(btn_return_login, return_event_cb , LV_EVENT_CLICKED, NULL); } static void pass_login_event_cb(lv_event_cb_t * e) { lv_obj_t * target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); if(target == btnmatrix) { const char *txt = lv_btnmatrix_get_btn_text(btnmatrix, lv_btnmatrix_get_selected_btn(btnmatrix)); if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { lv_textarea_del_char(text_keyboard); } else if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { if(strcmp(lv_textarea_get_text(text_keyboard), password) == 0) { login_verify_succ(); } else { lv_textarea_set_text(text_keyboard, ""); login_msg(); } } else { lv_textarea_add_text(text_keyboard, txt); } } else if(target == visi_btn) { lv_textarea_set_password_mode(text_keyboard, false); lv_obj_add_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); } else if(target == invisi_btn) { lv_textarea_set_password_mode(text_keyboard, true); lv_obj_add_flag(invisi_btn, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(visi_btn, LV_OBJ_FLAG_HIDDEN); } } /*nfc 登录界面*/ static void nfc_login_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_nfc_login = lv_obj_create(NULL); lv_obj_add_style(scr_nfc_login, &scr_style, 0); lv_scr_load(scr_nfc_login); lv_obj_t *img = lv_img_create(scr_nfc_login); lv_img_set_src(img, nfc_detect_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_nfc_login); lv_label_set_text(label, "请将NFC卡放到标识区域内"); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -300); /*返回键*/ btn_return_login = lv_imgbtn_create(scr_nfc_login); lv_imgbtn_set_src(btn_return_login, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return_login, &return_style, 0); lv_obj_add_event_cb(btn_return_login, return_event_cb , LV_EVENT_CLICKED, NULL); } /*掌静脉登录界面*/ static void palm_login_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_palm_login = lv_obj_create(NULL); lv_obj_add_style(scr_palm_login, &scr_style, 0); lv_scr_load(scr_palm_login); /*返回键*/ btn_return_login = lv_imgbtn_create(scr_palm_login); lv_imgbtn_set_src(btn_return_login, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return_login, &return_style, 0); lv_obj_add_event_cb(btn_return_login, return_event_cb , LV_EVENT_CLICKED, NULL); } /*人脸登录*/ static void face_login_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_face_login = lv_obj_create(NULL); lv_obj_add_style(scr_face_login, &scr_style, 0); lv_scr_load(scr_face_login); /*返回键*/ btn_return_login = lv_imgbtn_create(scr_face_login); lv_imgbtn_set_src(btn_return_login, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_add_style(btn_return_login, &return_style, 0); lv_obj_add_event_cb(btn_return_login, return_event_cb , LV_EVENT_CLICKED, NULL); } /*msgbox 消息弹窗*/ static void login_msg(void) { lv_obj_display_top_layer(); btn_msg = lv_btn_create(lv_layer_top()); lv_obj_set_size(btn_msg, 400, 200); lv_obj_center(btn_msg); lv_obj_set_style_bg_color(btn_msg, lv_palette_main(LV_PALETTE_BLUE_GREY), 0); lv_obj_t *label = lv_label_create(btn_msg); lv_label_set_text(label, "认证错误,请重新认证"); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 50); btn_yes = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_yes, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_set_size(btn_yes, 150, 50); lv_obj_align_to(btn_yes, label, LV_ALIGN_OUT_BOTTOM_RIGHT, 50, 50); lv_obj_add_event_cb(btn_yes, login_msg_event_cb, LV_EVENT_CLICKED, 0); lv_obj_t *label_btn = lv_label_create(btn_yes); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "确认"); lv_obj_center(label_btn); btn_no = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_no, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_size(btn_no, 150, 50); lv_obj_align_to(btn_no, label, LV_ALIGN_OUT_BOTTOM_LEFT, -50, 50); lv_obj_add_event_cb(btn_no, login_msg_event_cb, LV_EVENT_CLICKED, 0); label_btn = lv_label_create(btn_no); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "取消"); lv_obj_center(label_btn); } static void login_msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); if(target == btn_yes) { lv_obj_disappear_top_layer(); } else if(target == btn_no) { login_verify_fail(); lv_obj_disappear_top_layer(); } } static void login_verify_fail_anim_cb(lv_anim_t *anim) { main_gui(); lv_obj_set_tile(tileview, scr_login, LV_ANIM_OFF); lv_anim_del(anim, NULL); } static void login_verify_fail(void) { lv_obj_t *showbtn = lv_btn_create(top()); lv_obj_set_size(showbtn, 300, 200); lv_obj_center(showbtn); lv_obj_set_style_bg_color(showbtn, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_style_bg_img_src(showbtn, fork_img, 0); lv_obj_t *label = lv_label_create(showbtn); lv_label_set_text(label, "认证失败"); lv_obj_add_style(label, &btn_text_style, 0); lv_obj_align(label, LV_ALIGN_CENTER, 0, 50); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, label); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 500); lv_anim_set_values(&anim, 0, 0); lv_anim_set_ready_cb(&anim, login_verify_fail_anim_cb); lv_anim_start(&anim); } static void login_verify_succ_anim_cb(lv_anim_t *anim) { menu_gui(); lv_anim_del(anim, NULL); } static void login_verify_succ(void) { lv_obj_t *showbtn = lv_btn_create(top()); lv_obj_set_size(showbtn, 300, 200); lv_obj_center(showbtn); lv_obj_set_style_bg_color(showbtn, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_set_style_bg_img_src(showbtn, tick_img, 0); lv_obj_t *label = lv_label_create(showbtn); lv_label_set_text(label, "认证成功"); lv_obj_add_style(label, &btn_text_style, 0); lv_obj_align(label, LV_ALIGN_CENTER, 0, 50); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, label); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 500); lv_anim_set_values(&anim, 0, 0); lv_anim_set_ready_cb(&anim, login_verify_succ_anim_cb); lv_anim_start(&anim); } /*管理菜单界面*/ static void menu_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_menu = lv_obj_create(NULL); lv_obj_add_style(scr_menu, &scr_style, 0); lv_scr_load(scr_menu); lv_obj_t *label = lv_label_create(scr_menu); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "用户管理"); btn_admin_menu = lv_btn_create(scr_menu); lv_obj_set_size(btn_admin_menu, 500, 200); lv_obj_align(btn_admin_menu, LV_ALIGN_TOP_MID, 0, 300); lv_obj_set_style_bg_img_src(btn_admin_menu, add_admin_img, 0); lv_obj_add_style(btn_admin_menu, &btn_style, 0); lv_obj_add_event_cb(btn_admin_menu, menu_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_admin = lv_label_create(btn_admin_menu); lv_label_set_text(label_admin, "管理员登记"); lv_obj_add_style(label_admin, &btn_text_style, 0); btn_normal_menu = lv_btn_create(scr_menu); lv_obj_set_size(btn_normal_menu, 500, 200); lv_obj_align_to(btn_normal_menu, btn_admin_menu, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 200); lv_obj_set_style_bg_img_src(btn_normal_menu, add_normal_img, 0); lv_obj_add_style(btn_normal_menu, &btn_style, 0); lv_obj_add_event_cb(btn_normal_menu, menu_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *label_normal = lv_label_create(btn_normal_menu); lv_label_set_text(label_normal, "普通用户登记"); lv_obj_add_style(label_normal, &btn_text_style, 0); btn_return = lv_imgbtn_create(scr_menu); lv_imgbtn_set_src(btn_return, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return, &return_style, 0); lv_obj_add_event_cb(btn_return, return_event_cb , LV_EVENT_CLICKED, NULL); } static void menu_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); if( target == btn_admin_menu) { user_menu_gui(); } else if( target == btn_normal_menu) { user_menu_gui(); } } static void user_menu_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_user = lv_obj_create(NULL); lv_obj_add_style(scr_user, &scr_style, 0); lv_scr_load(scr_user); lv_obj_t *label = lv_label_create(scr_user); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "用户列表"); /*用户列表*/ user_list = lv_list_create(scr_user); lv_obj_set_size(user_list, scr_act_width(), scr_act_height() - 100); lv_obj_align(user_list, LV_ALIGN_TOP_MID, 0, 100); lv_obj_set_style_bg_opa(user_list, LV_OPA_TRANSP, 0); lv_obj_set_style_pad_hor(user_list, 0, 0); /*用户列表项*/ lv_obj_t *list_btn; lv_obj_t *checkbox; const char *users_item[] = {"用户1", "用户2", "用户3"}; for(int i = 0; i < sizeof(users_item) / sizeof(users_item[0]); i++) { list_btn = lv_list_add_btn(user_list, NULL, users_item[i]); lv_obj_set_height(list_btn, 150); lv_obj_set_style_bg_opa(list_btn, LV_OPA_TRANSP, 0); lv_obj_add_event_cb(list_btn, user_menu_event_cb, LV_EVENT_CLICKED, NULL); checkbox = lv_checkbox_create(list_btn); lv_checkbox_set_text(checkbox, ""); lv_obj_add_flag(checkbox, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(checkbox, user_menu_event_cb, LV_EVENT_VALUE_CHANGED, NULL); } /*新建用户 按钮*/ btn_add = lv_btn_create(scr_user); lv_obj_set_size(btn_add, 75, 75); lv_obj_align(btn_add, LV_ALIGN_BOTTOM_MID, 0, -100); lv_obj_add_flag(btn_add, LV_OBJ_FLAG_FLOATING); lv_obj_set_style_radius(btn_add, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_add, LV_SYMBOL_PLUS, 0); lv_obj_set_style_text_font(btn_add, &lv_font_montserrat_34, 0); lv_obj_add_event_cb(btn_add, user_menu_event_cb, LV_EVENT_CLICKED, NULL); /*编辑用户 按键*/ btn_edit = lv_imgbtn_create(scr_user); lv_imgbtn_set_src(btn_edit, LV_IMGBTN_STATE_RELEASED, edit_img, edit_img, edit_img); lv_obj_set_size(btn_edit, 32, 32); lv_obj_align_to(btn_edit, user_list, LV_ALIGN_OUT_TOP_RIGHT, -20, 0); lv_obj_add_event_cb(btn_edit, user_menu_event_cb, LV_EVENT_CLICKED, NULL); /*全选用户 复选框*/ checkbox_full = lv_checkbox_create(scr_user); lv_obj_align_to(checkbox_full, user_list, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); lv_obj_set_style_text_align(checkbox_full, LV_TEXT_ALIGN_LEFT, 0); lv_checkbox_set_text(checkbox_full, "全选"); lv_obj_add_flag(checkbox_full, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(checkbox_full, user_menu_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*删除用户 按钮*/ btn_trash = lv_btn_create(scr_user); lv_obj_set_size(btn_trash, 75, 75); lv_obj_align(btn_trash, LV_ALIGN_BOTTOM_MID, 0, -100); lv_obj_add_flag(btn_trash, LV_OBJ_FLAG_FLOATING); lv_obj_move_foreground(btn_trash); lv_obj_set_style_radius(btn_trash, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_trash, LV_SYMBOL_TRASH, 0); lv_obj_set_style_text_font(btn_trash, &lv_font_montserrat_34, 0); lv_obj_add_flag(btn_trash, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_trash, user_menu_event_cb, LV_EVENT_CLICKED, NULL); /*编辑完成 按键*/ btn_finish = lv_imgbtn_create(scr_user); lv_imgbtn_set_src(btn_finish, LV_IMGBTN_STATE_RELEASED, finish_img, finish_img, finish_img); lv_obj_set_size(btn_finish, 32, 32); lv_obj_align_to(btn_finish, user_list, LV_ALIGN_OUT_TOP_RIGHT, -20, 0); lv_obj_add_flag(btn_finish, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_finish, user_menu_event_cb, LV_EVENT_CLICKED, NULL); /*返回 按键*/ btn_return_menu = lv_imgbtn_create(scr_user); lv_imgbtn_set_src(btn_return_menu, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_menu, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_menu, &return_style, 0); lv_obj_add_event_cb(btn_return_menu, return_event_cb , LV_EVENT_CLICKED, NULL); /*家 按键*/ btn_return_home = lv_imgbtn_create(scr_user); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_align_to(btn_return_home, btn_return_menu, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } static void user_menu_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); lv_obj_t *child; lv_obj_t *cb; int32_t loop; int32_t i; if( target == btn_add) { user_mode_gui(); } else if( target == btn_edit) { lv_obj_add_flag(btn_edit, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(btn_add, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btn_trash, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(checkbox_full, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btn_finish, LV_OBJ_FLAG_HIDDEN); loop = lv_obj_get_child_cnt(user_list); for(i = 0; i < loop; i++) { child = lv_obj_get_child(user_list, i); lv_obj_clear_flag(child, LV_OBJ_FLAG_CLICKABLE); cb = lv_obj_get_child(child, -1); /* 获取复选框 */ lv_obj_clear_flag(cb, LV_OBJ_FLAG_HIDDEN);/*显现复选框*/ } } else if( target == btn_trash) { del_user_msg(DEL_USER); } else if( target == checkbox_full) { loop = lv_obj_get_child_cnt(user_list); LV_LOG_USER("loop = %d", loop); for(i = 0; i < loop; i++) { child = lv_obj_get_child(user_list, i); cb = lv_obj_get_child(child, -1); /* 获取复选框 */ if(lv_obj_get_state(checkbox_full) & LV_STATE_CHECKED) { lv_obj_add_state(cb, LV_STATE_CHECKED); } else { lv_obj_clear_state(cb, LV_STATE_CHECKED); } } } else if( target == btn_finish) { lv_obj_add_flag(btn_trash, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(checkbox_full, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(btn_finish, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btn_edit, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btn_add, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_state(checkbox_full, LV_STATE_CHECKED); loop = lv_obj_get_child_cnt(user_list); for(i = 0; i < loop; i++) { child = lv_obj_get_child(user_list, i); lv_obj_add_flag(child, LV_OBJ_FLAG_CLICKABLE); cb = lv_obj_get_child(child, -1); /* 获取复选框 */ lv_obj_add_flag(cb, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_state(cb, LV_STATE_CHECKED); } } else { if(code == LV_EVENT_CLICKED) { user_mode_gui(); } else if(code == LV_EVENT_VALUE_CHANGED) /*子复选框来判断全选复选框的状态*/ { loop = lv_obj_get_child_cnt(user_list); LV_LOG_USER("loop = %d", loop); for(i = 0; i < loop; i++) { child = lv_obj_get_child(user_list, i); cb = lv_obj_get_child(child, -1); /* 获取复选框 */ if(lv_obj_get_state(cb) & LV_STATE_CHECKED) { lv_obj_add_state(checkbox_full, LV_STATE_CHECKED); } else { lv_obj_clear_state(checkbox_full, LV_STATE_CHECKED); break; } } } } } /*用户方式 界面*/ static void user_mode_gui() { lv_obj_clean(top()); lv_obj_t *scr_user_mode = lv_obj_create(NULL); lv_obj_add_style(scr_user_mode, &scr_style, 0); lv_scr_load(scr_user_mode); lv_obj_t *label = lv_label_create(scr_user_mode); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "登记方式"); lv_obj_t *btn = lv_btn_create(scr_user_mode); lv_obj_set_size(btn, 500, 200); lv_obj_align(btn, LV_ALIGN_TOP_MID, 0, 100); lv_obj_add_style(btn, &btn_style, 0); lv_obj_add_event_cb(btn, user_mode_event_cb, LV_EVENT_LONG_PRESSED, NULL); lv_obj_add_event_cb(btn, user_mode_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *btn_label = lv_label_create(btn); lv_label_set_text(btn_label, "密码"); lv_obj_add_style(btn, &btn_text_style, 0); lv_obj_t *label_pass = lv_label_create(btn); lv_obj_center(label_pass); lv_label_set_text_fmt(label_pass, "%s", "123456"); btn_add_pass = lv_btn_create(btn); lv_obj_align(btn_add_pass, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_set_style_bg_img_src(btn_add_pass, LV_SYMBOL_EDIT, 0); lv_obj_add_flag(btn_add_pass, LV_OBJ_FLAG_HIDDEN); lv_obj_add_style(btn_add_pass, &add_style, 0); lv_obj_add_event_cb(btn_add_pass, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn_del_pass = lv_btn_create(btn); lv_obj_align(btn_del_pass, LV_ALIGN_RIGHT_MID, -50, 0); lv_obj_set_style_bg_img_src(btn_del_pass, LV_SYMBOL_TRASH, 0); lv_obj_add_style(btn_del_pass, &del_style, 0); lv_obj_add_flag(btn_del_pass, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_del_pass, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn = lv_btn_create(scr_user_mode); lv_obj_set_size(btn, 500, 200); lv_obj_align(btn, LV_ALIGN_TOP_MID, 0, 400); lv_obj_add_style(btn, &btn_style, 0); lv_obj_add_event_cb(btn, user_mode_event_cb, LV_EVENT_LONG_PRESSED, NULL); btn_label = lv_label_create(btn); lv_label_set_text(btn_label, "NFC卡"); lv_obj_add_style(btn, &btn_text_style, 0); lv_obj_t *label_nfc = lv_label_create(btn); lv_obj_center(label_nfc); lv_label_set_text_fmt(label_nfc, "%s", "0x25fd7968"); btn_add_nfc = lv_btn_create(btn); lv_obj_align(btn_add_nfc, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_set_style_bg_img_src(btn_add_nfc, LV_SYMBOL_EDIT, 0); lv_obj_add_style(btn_add_nfc, &add_style, 0); lv_obj_add_flag(btn_add_nfc, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_add_nfc, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn_del_nfc = lv_btn_create(btn); lv_obj_align(btn_del_nfc, LV_ALIGN_RIGHT_MID, -50, 0); lv_obj_set_style_bg_img_src(btn_del_nfc, LV_SYMBOL_TRASH, 0); lv_obj_add_style(btn_del_nfc, &del_style, 0); lv_obj_add_flag(btn_del_nfc, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_del_nfc, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn = lv_btn_create(scr_user_mode); lv_obj_set_size(btn, 500, 200); lv_obj_align(btn, LV_ALIGN_TOP_MID, 0, 700); lv_obj_add_style(btn, &btn_style, 0); lv_obj_add_event_cb(btn, user_mode_event_cb, LV_EVENT_LONG_PRESSED, NULL); btn_label = lv_label_create(btn); lv_label_set_text(btn_label, "掌静脉"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_palm = lv_btn_create(btn); lv_obj_align(btn_add_palm, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_set_style_bg_img_src(btn_add_palm, LV_SYMBOL_EDIT, 0); lv_obj_add_style(btn_add_palm, &add_style, 0); lv_obj_add_flag(btn_add_palm, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_add_palm, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn_del_palm = lv_btn_create(btn); lv_obj_align(btn_del_palm, LV_ALIGN_RIGHT_MID, -50, 0); lv_obj_set_style_bg_img_src(btn_del_palm, LV_SYMBOL_TRASH, 0); lv_obj_add_style(btn_del_palm, &del_style, 0); lv_obj_add_flag(btn_del_palm, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_del_palm, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn = lv_btn_create(scr_user_mode); lv_obj_set_size(btn, 500, 200); lv_obj_align(btn, LV_ALIGN_TOP_MID, 0, 1000); lv_obj_add_style(btn, &btn_style, 0); lv_obj_add_event_cb(btn, user_mode_event_cb, LV_EVENT_LONG_PRESSED, NULL); btn_label = lv_label_create(btn); lv_label_set_text(btn_label, "人脸"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_face = lv_btn_create(btn); lv_obj_align(btn_add_face, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_set_style_bg_img_src(btn_add_face, LV_SYMBOL_EDIT, 0); lv_obj_add_style(btn_add_face, &add_style, 0); lv_obj_add_flag(btn_add_face, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_add_face, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn_del_face = lv_btn_create(btn); lv_obj_align(btn_del_face, LV_ALIGN_RIGHT_MID, -50, 0); lv_obj_set_style_bg_img_src(btn_del_face, LV_SYMBOL_TRASH, 0); lv_obj_add_style(btn_del_face, &del_style, 0); lv_obj_add_flag(btn_del_face, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(btn_del_face, user_mode_event_cb, LV_EVENT_CLICKED, NULL); btn_return_add_menu = lv_imgbtn_create(scr_user_mode); lv_imgbtn_set_src(btn_return_add_menu, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_menu, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_menu, &return_style, 0); lv_obj_add_event_cb(btn_return_add_menu, return_event_cb , LV_EVENT_CLICKED, NULL); btn_return_home = lv_imgbtn_create(scr_user_mode); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_align_to(btn_return_home, btn_return_add_menu, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } static void user_mode_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); lv_obj_t *child_add = NULL; lv_obj_t *child_del = NULL; if(code == LV_EVENT_LONG_PRESSED) { LV_LOG_USER("show"); child_add = lv_obj_get_child(target, -2); child_del = lv_obj_get_child(target, -1); if(child_add->flags & LV_OBJ_FLAG_HIDDEN) { lv_obj_clear_flag(child_add, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(child_del, LV_OBJ_FLAG_HIDDEN); } else { lv_obj_add_flag(child_add, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(child_del, LV_OBJ_FLAG_HIDDEN); } } if(target == btn_add_pass) { add_pass_gui(); } else if(target == btn_del_pass) { del_user_msg(DEL_PASS); } else if(target == btn_add_nfc) { add_nfc_gui(); } else if(target == btn_del_nfc) { del_user_msg(DEL_NFC); } else if(target == btn_add_palm) { add_palm_gui(); } else if(target == btn_del_palm) { del_user_msg(DEL_PALM); } else if(target == btn_add_face) { add_face_gui(); } else if(target == btn_del_face) { del_user_msg(DEL_FACE); } } /*添加密码 界面*/ static void add_pass_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_pass = lv_obj_create(NULL); lv_obj_add_style(scr_add_pass, &scr_style, 0); lv_scr_load(scr_add_pass); input_pass_where = 0; lv_obj_t *label = lv_label_create(scr_add_pass); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "添加密码"); /*matrix 矩阵键盘*/ add_btnmatrix = lv_btnmatrix_create(scr_add_pass); lv_obj_set_size(add_btnmatrix, scr_act_width(), 600); lv_obj_align(add_btnmatrix, LV_ALIGN_CENTER, 0, 200); static const char *matrixmap[] = {"1","2","3","\n","4","5","6","\n","7","8","9","\n",LV_SYMBOL_BACKSPACE,"0",LV_SYMBOL_NEW_LINE,""}; lv_btnmatrix_set_map(add_btnmatrix, matrixmap); lv_obj_set_style_text_font(add_btnmatrix, &lv_font_montserrat_34, 0); lv_obj_set_style_bg_opa(add_btnmatrix, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(add_btnmatrix, 0, 0); /*消除边框*/ lv_obj_add_event_cb(add_btnmatrix, add_pass_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*textarea 文本区域,首先焦点放在这*/ add_text_keyboard = lv_textarea_create(scr_add_pass); lv_obj_set_size(add_text_keyboard, scr_act_width() / 2, 200); lv_obj_align_to(add_text_keyboard, add_btnmatrix, LV_ALIGN_TOP_MID, 0, -400); lv_obj_set_style_bg_opa(add_text_keyboard, LV_OPA_50, 0); lv_textarea_set_max_length(add_text_keyboard, 32); lv_textarea_set_one_line(add_text_keyboard, true); lv_textarea_set_password_mode(add_text_keyboard, true); lv_textarea_set_placeholder_text(add_text_keyboard, "请输入密码"); lv_obj_add_event_cb(add_text_keyboard, add_pass_event_cb, LV_EVENT_FOCUSED, NULL); lv_obj_add_state(add_text_keyboard, LV_STATE_FOCUSED); add_text_keyboard2 = lv_textarea_create(scr_add_pass); lv_obj_set_size(add_text_keyboard2, scr_act_width() / 2, 200); lv_obj_align_to(add_text_keyboard2, add_btnmatrix, LV_ALIGN_TOP_MID, 0, -200); lv_obj_set_style_bg_opa(add_text_keyboard2, LV_OPA_50, 0); lv_textarea_set_max_length(add_text_keyboard2, 32); lv_textarea_set_one_line(add_text_keyboard2, true); lv_textarea_set_password_mode(add_text_keyboard2, true); lv_textarea_set_placeholder_text(add_text_keyboard2, "再次确认密码"); lv_obj_add_event_cb(add_text_keyboard2, add_pass_event_cb, LV_EVENT_FOCUSED, NULL); btn_return_add_mode = lv_imgbtn_create(scr_add_pass); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); btn_return_home = lv_imgbtn_create(scr_add_pass); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_align_to(btn_return_home, btn_return_add_mode, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } /*密码键盘输入回调函数*/ static void add_pass_event_cb(lv_event_cb_t * e) { lv_obj_t * target = lv_event_get_target(e); if(target == add_btnmatrix) { const char *txt = lv_btnmatrix_get_btn_text(add_btnmatrix, lv_btnmatrix_get_selected_btn(add_btnmatrix)); if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { if(input_pass_where == 0) { lv_textarea_del_char(add_text_keyboard); } else { lv_textarea_del_char(add_text_keyboard2); } } else if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { input_pass_where ++; lv_obj_add_state(add_text_keyboard2, LV_STATE_FOCUSED); lv_obj_clear_state(add_text_keyboard, LV_STATE_FOCUSED); if(input_pass_where == 2) { input_pass_where = 0; if(strcmp(lv_textarea_get_text(add_text_keyboard), lv_textarea_get_text(add_text_keyboard2)) == 0) { add_user_anim(true); } else { add_user_anim(false); } } } else { if(input_pass_where == 0) { lv_textarea_add_text(add_text_keyboard, txt); lv_obj_add_state(add_text_keyboard, LV_STATE_FOCUSED); } else { lv_textarea_add_text(add_text_keyboard2, txt); lv_obj_add_state(add_text_keyboard2, LV_STATE_FOCUSED); /*附属光标*/ } } } else if(target == add_text_keyboard) { LV_LOG_USER("1111"); input_pass_where = 0; lv_obj_clear_state(add_text_keyboard2, LV_STATE_FOCUSED); } else if(target == add_text_keyboard2) { LV_LOG_USER("2222"); input_pass_where = 1; lv_obj_clear_state(add_text_keyboard, LV_STATE_FOCUSED); } } /*添加NFC 界面*/ static void add_nfc_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_nfc = lv_obj_create(NULL); lv_obj_add_style(scr_add_nfc, &scr_style, 0); lv_scr_load(scr_add_nfc); lv_obj_t *label = lv_label_create(scr_add_nfc); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "添加NFC卡"); label = lv_label_create(scr_add_nfc); lv_label_set_text(label, "请将NFC卡放到标识区域内"); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -300); btn_return_add_mode = lv_imgbtn_create(scr_add_nfc); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); btn_return_home = lv_imgbtn_create(scr_add_nfc); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_align_to(btn_return_home, btn_return_add_mode, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } /*添加掌静脉 界面*/ static void add_palm_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_palm = lv_obj_create(NULL); lv_obj_add_style(scr_add_palm, &scr_style, 0); lv_scr_load(scr_add_palm); lv_obj_t *label = lv_label_create(scr_add_palm); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "添加掌静脉"); btn_return_add_mode = lv_imgbtn_create(scr_add_palm); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); btn_return_home = lv_imgbtn_create(scr_add_palm); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_align_to(btn_return_home, btn_return_add_mode, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } /*添加人脸 界面*/ static void add_face_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_face = lv_obj_create(NULL); lv_obj_add_style(scr_add_face, &scr_style, 0); lv_scr_load(scr_add_face); lv_obj_t *label = lv_label_create(scr_add_face); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 15); lv_label_set_text(label, "添加人脸"); btn_return_add_mode = lv_imgbtn_create(scr_add_face); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); btn_return_home = lv_imgbtn_create(scr_add_face); lv_imgbtn_set_src(btn_return_home, LV_IMGBTN_STATE_RELEASED, home_img, home_img, home_img); lv_obj_align_to(btn_return_home, btn_return_add_mode, LV_ALIGN_OUT_RIGHT_MID, 25, 0); lv_obj_add_style(btn_return_home, &return_style, 0); lv_obj_add_event_cb(btn_return_home, return_event_cb , LV_EVENT_CLICKED, NULL); } static void add_user_succ_anim_event_cb(lv_anim_t *anim) { lv_obj_clean(top()); lv_obj_t *scr_add_user = lv_obj_create(NULL); lv_obj_add_style(scr_add_user, &scr_style, 0); lv_scr_load(scr_add_user); lv_obj_t *img = lv_img_create(scr_add_user); lv_img_set_src(img, success_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_add_user); lv_obj_align_to(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); lv_obj_set_size(label, 200, 250); lv_label_set_text(label, "添加成功 "); lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); btn_return_add_mode = lv_imgbtn_create(scr_add_user); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); } static void add_user_fail_anim_event_cb(lv_anim_t *anim) { lv_obj_clean(top()); lv_obj_t *scr_add_user = lv_obj_create(NULL); lv_obj_add_style(scr_add_user, &scr_style, 0); lv_scr_load(scr_add_user); lv_obj_t *img = lv_img_create(scr_add_user); lv_img_set_src(img, fail_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_add_user); lv_obj_align_to(label, img, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); lv_obj_set_size(label, 200, 250); lv_label_set_text(label, "xx添加失败 "); lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); btn_return_add_mode = lv_imgbtn_create(scr_add_user); lv_imgbtn_set_src(btn_return_add_mode, LV_IMGBTN_STATE_RELEASED, return_img, return_img, return_img); lv_obj_align(btn_return_add_mode, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_add_style(btn_return_add_mode, &return_style, 0); lv_obj_add_event_cb(btn_return_add_mode, return_event_cb , LV_EVENT_CLICKED, NULL); } /*添加用户成功 界面*/ static void add_user_anim(bool result) { lv_obj_t *img = lv_img_create(top()); lv_img_set_src(img, wait_img); lv_obj_center(img); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, img); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 500); lv_anim_set_values(&anim, 0, 500); if(result) { lv_anim_set_ready_cb(&anim, add_user_succ_anim_event_cb); } else { lv_anim_set_ready_cb(&anim, add_user_fail_anim_event_cb); } lv_anim_start(&anim); } /*删除用户弹窗 界面*/ static void del_user_msg(delete_type type) { lv_obj_display_top_layer(); const char *del_array[] = {"所选用户", "密码", "NFC卡", "掌静脉", "人脸"}; lv_obj_t *btn_msg = lv_btn_create(lv_layer_top()); lv_obj_set_size(btn_msg, 500, 200); lv_obj_set_style_bg_color(btn_msg, lv_palette_main(LV_PALETTE_BLUE_GREY), 0); lv_obj_t *label = lv_label_create(btn_msg); lv_label_set_text_fmt(label, "确定要删除 %s ?", del_array[type]); lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 50); btn_no = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_no, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_set_size(btn_no, 100, 50); lv_obj_align_to(btn_no, label, LV_ALIGN_OUT_BOTTOM_LEFT, -50, 50); lv_obj_t *label_btn = lv_label_create(btn_no); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "取消"); lv_obj_center(label_btn); btn_yes = lv_btn_create(btn_msg); lv_obj_set_style_bg_color(btn_yes, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_size(btn_yes, 100, 50); lv_obj_align_to(btn_yes, label, LV_ALIGN_OUT_BOTTOM_RIGHT, 50, 50); label_btn = lv_label_create(btn_yes); lv_obj_add_style(label_btn, &btn_text_style, 0); lv_label_set_text(label_btn, "确认"); lv_obj_center(label_btn); if(type) { lv_obj_align(btn_msg, LV_ALIGN_TOP_MID, 0, 100 + (type - 1) * 300); lv_obj_add_event_cb(btn_no, del_usermode_msg_event_cb, LV_EVENT_CLICKED, 0); lv_obj_add_event_cb(btn_yes, del_usermode_msg_event_cb, LV_EVENT_CLICKED, 0); } else { lv_obj_center(btn_msg); lv_obj_add_event_cb(btn_no, del_user_msg_event_cb, LV_EVENT_CLICKED, 0); lv_obj_add_event_cb(btn_yes, del_user_msg_event_cb, LV_EVENT_CLICKED, 0); } } static void del_user_msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); uint32_t loop = 0; lv_obj_t *child; lv_obj_t *cb; if(target == btn_yes) { loop = lv_obj_get_child_cnt(user_list); LV_LOG_USER("user_list loop = %d", loop); for(uint32_t i = 0; i < loop; i++) { child = lv_obj_get_child(user_list, i); cb = lv_obj_get_child(child, -1); /* 获取复选框 */ if(lv_obj_get_state(cb) & LV_STATE_CHECKED) /* 检查复选框是否被选中 */ { LV_LOG_USER("delete %s", lv_list_get_btn_text(user_list,child)); lv_obj_del_delayed(child, 100); /*加延时才能删除掉*/ lv_obj_update_layout(user_list); /*更新列表部件显示*/ } } lv_obj_disappear_top_layer(); } else if(target == btn_no) { lv_obj_disappear_top_layer(); } } static void del_succ_anim_event_cb(lv_anim_t *anim) { lv_obj_disappear_top_layer(); user_mode_gui(); } static void del_usermode_msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); lv_obj_t *parent = NULL; if(code == LV_EVENT_CLICKED) { parent = lv_obj_get_parent(target); /*获取弹窗*/ if(target == lv_obj_get_child(parent, -1)) /*消息弹窗中最年轻的创建部件:确认*/ { LV_LOG_USER("YES,I WANT TO DELETE"); lv_obj_clean(parent); lv_obj_set_style_bg_img_src(parent, greentick_img, 0); lv_obj_t *label = lv_label_create(parent); lv_label_set_text(label, "删除成功"); lv_obj_align(label, LV_ALIGN_CENTER, 0, 50); lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_var(&anim, label); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t) lv_img_set_angle); lv_anim_set_time(&anim, 1000); lv_anim_set_values(&anim, 100, 100); lv_anim_set_ready_cb(&anim, del_succ_anim_event_cb); lv_anim_start(&anim); } else if(target == lv_obj_get_child(parent, -2)) /*取消,删除弹窗*/ { lv_obj_del(parent); lv_obj_disappear_top_layer(); } } } 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, 720, 1280, 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_obj_style_init(); lowpower_gui(); //lv_demo_widgets(); 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; } /*显示电池电压 分五档*/ static void lv_obj_show_battery(int batterylevel, lv_obj_t *parent) { lv_obj_t *battery = lv_label_create(parent); switch (batterylevel) { case 0: lv_label_set_text(battery, LV_SYMBOL_BATTERY_EMPTY);break; case 1: lv_label_set_text(battery, LV_SYMBOL_BATTERY_1);break; case 2: lv_label_set_text(battery, LV_SYMBOL_BATTERY_2);break; case 3: lv_label_set_text(battery, LV_SYMBOL_BATTERY_3);break; case 4: lv_label_set_text(battery, LV_SYMBOL_BATTERY_FULL);break; } lv_obj_align(battery, LV_ALIGN_TOP_RIGHT, -20, 10); lv_obj_set_style_text_font(battery,&lv_font_montserrat_34, 0); } static void lv_obj_show_wifi(int connect_state, lv_obj_t *parent) { lv_obj_t *wifi = lv_label_create(parent); if(connect_state) { lv_label_set_text(wifi, LV_SYMBOL_WIFI); } else { lv_label_set_text(wifi, LV_SYMBOL_WIFI); lv_obj_set_style_text_color(wifi, lv_palette_main(LV_PALETTE_GREY), 0); } lv_obj_align(wifi, LV_ALIGN_TOP_RIGHT, -70, 10); lv_obj_set_style_text_font(wifi,&lv_font_montserrat_34, 0); } /*随机矩阵键盘地图生成*/ static void random_map_convert(char **string_map, char **matrix_map) { srand((unsigned)time(NULL)); for (int i = 9; i > 0; i--) { int j = rand() % (i + 1); char *temp = *(string_map + i); *(string_map + i) = *(string_map + j); *(string_map + j) = temp; } *(matrix_map +0) = *(string_map +0); *(matrix_map +1) = *(string_map +1); *(matrix_map +2) = *(string_map +2); *(matrix_map +3) = "\n"; *(matrix_map +4) = *(string_map +3); *(matrix_map +5) = *(string_map +4); *(matrix_map +6) = *(string_map +5); *(matrix_map +7) = "\n"; *(matrix_map +8) = *(string_map +6); *(matrix_map +9) = *(string_map +7); *(matrix_map +10) = *(string_map +8); *(matrix_map +11) = "\n"; *(matrix_map +12) = LV_SYMBOL_BACKSPACE; *(matrix_map +13) = *(string_map +9); *(matrix_map +14) = LV_SYMBOL_NEW_LINE; *(matrix_map +15) = "\n"; *(matrix_map +16) = ""; } static void lv_obj_blink(lv_obj_t *obj, int32_t Value) { if(Value == 0) { lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); } else if(Value == 100) { lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); } } static void lv_obj_display_top_layer(void) { lv_obj_clean(lv_layer_top()); lv_obj_set_style_text_font(lv_layer_top(), &lv_font_heiti24, 0); lv_obj_add_flag(lv_layer_top(), LV_OBJ_FLAG_CLICKABLE); } static void lv_obj_disappear_top_layer(void) { lv_obj_clean(lv_layer_top()); lv_obj_clear_flag(lv_layer_top(), LV_OBJ_FLAG_CLICKABLE); }