/** * @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 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()) static const char password[] = {"1"}; static const char *string_map[] = {"0","1","2","3","4","5","6","7","8","9"}; /********主界面需要静态的部件******/ 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 *scr_set; 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 btn_style; static lv_style_t btn_text_style; static lv_style_t return_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 *msgbox_fail; static lv_obj_t *img; /********门铃呼叫需要静态的部件******/ /*******管理员登录 界面需要静态的部件******/ 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_chk_pass; static lv_obj_t *btn_add_pass; static lv_obj_t *btn_del_pass; static lv_obj_t *btn_chk_nfc; static lv_obj_t *btn_add_nfc; static lv_obj_t *btn_del_nfc; static lv_obj_t *btn_chk_palm; static lv_obj_t *btn_add_palm; static lv_obj_t *btn_del_palm; static lv_obj_t *btn_chk_face; 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_cnt = 0; static void lv_obj_style_init(void); static void opendoor_gui(lv_anim_t * anim); static void main_gui(void); static void lowpower_gui(void); static void ring_gui(void); static void ring_call_gui(lv_anim_t * anim); 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 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_succ_gui(void); static void add_user_fail_gui(void); static void key_event_cb(lv_event_cb_t * e); static void msg_event_cb(lv_event_cb_t * e); static void login_event_cb(lv_event_cb_t * e); /*功能函数*/ static void random_map_convert(char **string_map, char **matrix_map); static void show_battery(int batterylevel, lv_obj_t *parent); static void show_wifi(int connect_state, lv_obj_t *parent); 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_20); lv_style_set_width(&btn_style, 500); lv_style_set_height(&btn_style, 200); 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*/ /*创建return_style, 返回键、home键*/ lv_style_init(&return_style); lv_style_set_width(&return_style, 48); lv_style_set_height(&return_style, 48); } /*主界面部件回调函数(包含返回键)*/ static void 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) { if(lv_slider_is_dragged(vol_slider)) { } else { LV_LOG_USER("vol_slider %d",lv_slider_get_value(vol_slider)); } } else if(target == light_slider) { if(lv_slider_is_dragged(light_slider)) { } else { LV_LOG_USER("light_slider %d",lv_slider_get_value(light_slider)); } } else if(target == btn_return) { main_gui(); } } /*主界面框架*/ static void main_gui(void) { lv_obj_clean(top()); lv_obj_t *scr = lv_obj_create(NULL); lv_obj_set_size(scr, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr, &lv_font_siyuan, 0); lv_scr_load(scr); 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); scr_set = lv_tileview_add_tile(tileview, 1, 0, LV_DIR_BOTTOM); 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_imgbtn_create(scr_main); lv_imgbtn_set_src(btn_ring_main, LV_IMGBTN_STATE_RELEASED, NULL, bell_img, NULL); lv_obj_set_size(btn_ring_main, 128, 128); lv_obj_align(btn_ring_main, LV_ALIGN_BOTTOM_MID, 0, -100); lv_obj_set_style_opa(btn_ring_main, LV_OPA_50, 0); lv_obj_add_event_cb(btn_ring_main, event_cb, LV_EVENT_CLICKED, NULL); /*创建键盘屏幕*/ lv_obj_set_size(scr_keyboard, scr_act_width(), scr_act_height()); lv_obj_t *scr_keyboard_label = lv_label_create(scr_keyboard); lv_obj_align(scr_keyboard_label, LV_ALIGN_TOP_MID, 0 , 15); lv_label_set_text(scr_keyboard_label, "输入密码"); /*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_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); /*msgbox 消息弹窗*/ static const char *msgbox_btns[] = {"取消","确认",""}; msgbox_fail = lv_msgbox_create(scr_keyboard, LV_SYMBOL_CLOSE, "密码错误,请重新输入\n", msgbox_btns, false); lv_obj_set_size(msgbox_fail, 400, 200); lv_obj_set_align(msgbox_fail, LV_ALIGN_CENTER); lv_obj_set_style_text_align(msgbox_fail, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_pad_hor(msgbox_fail, 0, 0); lv_obj_add_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(msgbox_fail, msg_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*获取msgbox的按键部件,设置宽度*/ lv_obj_t *msg_btn = lv_msgbox_get_btns(msgbox_fail); lv_obj_set_size(msg_btn, 400, 50); /*获取msgbox的title部件,单独设置*/ lv_obj_t *title = lv_msgbox_get_title(msgbox_fail); lv_obj_set_style_text_font(title, &lv_font_montserrat_34, 0); lv_obj_set_style_text_color(title, lv_palette_main(LV_PALETTE_RED), 0); /*动画图片 创建*/ img = lv_img_create(scr_keyboard); lv_img_set_src(img, wait_img); lv_obj_center(img); lv_obj_add_flag(img, LV_OBJ_FLAG_HIDDEN); /*创建 登录屏幕*/ 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_align(btn_pass_login, LV_ALIGN_TOP_MID, 0, 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_align(btn_nfc_login, LV_ALIGN_TOP_MID, 0, 400); 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_align(btn_palm_login, LV_ALIGN_TOP_MID, 0, 700); 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_align(btn_face_login, LV_ALIGN_TOP_MID, 0, 1000); 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); /*创建 设置屏幕*/ lv_obj_set_size(scr_set, scr_act_width(), scr_act_height()); vol_slider = lv_slider_create(scr_set); lv_slider_set_range(vol_slider, 0, 100); lv_obj_set_size(vol_slider, scr_act_width() - 100, 100); lv_obj_align(vol_slider, LV_ALIGN_TOP_MID, 0, 200); 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, event_cb, LV_EVENT_RELEASED, NULL); lv_obj_t *img_vol = lv_img_create(vol_slider); lv_img_set_src(img_vol, vol_img); lv_obj_align_to(img_vol, vol_slider, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_move_foreground(img_vol); light_slider = lv_slider_create(scr_set); lv_slider_set_range(light_slider, 0, 100); lv_obj_set_size(light_slider, scr_act_width() - 100, 100); lv_obj_align(light_slider, LV_ALIGN_TOP_MID, 0, 600); 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, event_cb, LV_EVENT_RELEASED, NULL); lv_obj_t *img_light = lv_img_create(light_slider); lv_img_set_src(img_light, light_img); lv_obj_align_to(img_light, light_slider, LV_ALIGN_LEFT_MID, 50, 0); lv_obj_move_foreground(img_light); } /*显示电池电压 分五档*/ static void 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_set_align(battery, LV_ALIGN_TOP_RIGHT); lv_obj_set_style_text_font(battery,&lv_font_montserrat_24, LV_STATE_DEFAULT); } static void 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); } lv_obj_align(wifi, LV_ALIGN_TOP_RIGHT, -50, 0); lv_obj_set_style_text_font(wifi,&lv_font_montserrat_24, LV_STATE_DEFAULT); } 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 stop_anim_cb(lv_anim_t * animation) { lv_obj_clean(top()); show_battery(3, lv_layer_top()); show_wifi(true, lv_layer_top()); main_gui(); } /*低电量预警 界面*/ static void lowpower_gui(void) { lv_obj_t *img = lv_img_create(top()); lv_img_set_src(img, lowpower_img); lv_obj_center(img); lv_obj_t *label = lv_label_create(top()); lv_obj_align_to(label, img, LV_ALIGN_OUT_BOTTOM_MID, -150, 50); lv_label_set_text(label, "电池电量过低,请及时充电"); lv_obj_set_style_text_font(label, &lv_font_siyuan, 0); 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 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); 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) { /*缓冲动画结束后,回调到 开锁界面*/ lv_obj_clear_flag(img, LV_OBJ_FLAG_HIDDEN); 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); lv_anim_set_ready_cb(&anim, opendoor_gui); lv_anim_start(&anim); } else { lv_obj_clear_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btnmatrix, LV_OBJ_FLAG_CLICKABLE); } } 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 msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_current_target(e); lv_obj_add_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(btnmatrix, LV_OBJ_FLAG_CLICKABLE); if(lv_msgbox_get_active_btn(target) == 1) { lv_textarea_set_text(text_keyboard, ""); } else { lv_textarea_set_text(text_keyboard, ""); lv_obj_set_tile(tileview, scr_main, LV_ANIM_ON); } } /*随机矩阵键盘地图生成*/ 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 opendoor_event_cb(lv_event_cb_t * e) { lv_event_code_t code = lv_event_get_code(e); if(code == LV_EVENT_CLICKED) { LV_LOG_USER("ys"); main_gui(); } } /*开锁成功 界面*/ static void opendoor_gui(lv_anim_t * anim) { 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, "请开门,点击屏幕返回主界面"); lv_obj_add_flag(scr_open, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_event_cb(scr_open, opendoor_event_cb, LV_EVENT_CLICKED, 0); } /*门铃呼叫界面*/ static void ring_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_ring = lv_obj_create(top()); lv_obj_set_size(scr_ring, scr_act_width(), scr_act_height()); 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, 3); lv_anim_set_playback_delay(&anim, 50); lv_anim_set_playback_time(&anim, 1000); lv_anim_set_ready_cb(&anim, ring_call_gui); 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, 20); 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, event_cb, LV_EVENT_CLICKED, NULL); } /*门铃接听界面*/ static void ring_call_gui(lv_anim_t * anim) { lv_obj_clean(top()); lv_obj_t *scr_ring = lv_obj_create(top()); lv_obj_set_size(scr_ring, scr_act_width(), scr_act_height()); 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, 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(); } else if(target == btn_return_login) { main_gui(); lv_obj_set_tile(tileview, scr_login, LV_ANIM_OFF); } } 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) { menu_gui(); } else { lv_obj_clear_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(btnmatrix, LV_OBJ_FLAG_CLICKABLE); } } 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 pass_login_msg_event_cb(lv_event_cb_t * e) { lv_obj_t *target = lv_event_get_current_target(e); if(lv_msgbox_get_active_btn(target) == 1) { lv_textarea_set_text(text_keyboard, ""); lv_obj_add_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(btnmatrix, LV_OBJ_FLAG_CLICKABLE); } else { main_gui(); lv_obj_set_tile(tileview, scr_login, LV_ANIM_OFF); } } /*密码登录 界面*/ static void pass_login_gui(void) { /*创建键盘屏幕*/ lv_obj_clean(top()); lv_obj_t *scr_keyboard = lv_obj_create(top()); 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, 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_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); /*msgbox 消息弹窗*/ static const char *msgbox_btns[] = {"取消","确认",""}; msgbox_fail = lv_msgbox_create(scr_keyboard, LV_SYMBOL_CLOSE, "认证失败,请重新输入\n", msgbox_btns, false); lv_obj_set_size(msgbox_fail, 400, 200); lv_obj_set_align(msgbox_fail, LV_ALIGN_CENTER); lv_obj_set_style_text_align(msgbox_fail, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_pad_hor(msgbox_fail, 0, 0); lv_obj_add_flag(msgbox_fail, LV_OBJ_FLAG_HIDDEN); lv_obj_add_event_cb(msgbox_fail, pass_login_msg_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*获取msgbox的按键部件,设置宽度*/ lv_obj_t *msg_btn = lv_msgbox_get_btns(msgbox_fail); lv_obj_set_size(msg_btn, 400, 50); /*获取msgbox的title部件,单独设置*/ lv_obj_t *title = lv_msgbox_get_title(msgbox_fail); lv_obj_set_style_text_font(title, &lv_font_montserrat_34, 0); lv_obj_set_style_text_color(title, lv_palette_main(LV_PALETTE_RED), 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, login_event_cb , LV_EVENT_CLICKED, NULL); } /*nfc 登录界面*/ static void nfc_login_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_nfc_login = lv_obj_create(top()); lv_obj_set_size(scr_nfc_login, scr_act_width(), scr_act_height()); 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, login_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(top()); lv_obj_set_size(scr_palm_login, scr_act_width(), scr_act_height()); /*返回键*/ 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, login_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(top()); lv_obj_set_size(scr_face_login, scr_act_width(), scr_act_height()); /*返回键*/ 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, login_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(); } else if ( target == btn_return_menu) { menu_gui(); } else if( target == btn_return_home) { menu_gui(); } } /*管理菜单界面*/ static void menu_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_menu = lv_obj_create(top()); lv_obj_set_size(scr_menu, scr_act_width(), scr_act_height()); 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_align(btn_admin_menu, LV_ALIGN_TOP_MID, 0, 100); 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_align(btn_normal_menu, LV_ALIGN_TOP_MID, 0, 400); 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, 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_return_add_menu) { LV_LOG_USER("user_menu_gui"); user_menu_gui(); } else 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) { 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_LOG_USER("delete %s", lv_list_get_btn_text(user_list,child)); lv_obj_del_delayed(child, 100); /*加延时才能删除掉*/ lv_obj_update_layout(user_list); /*更新列表部件显示*/ } } } 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); 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); } } else { if(code == LV_EVENT_CLICKED) { user_mode_gui(); } } } static void user_menu_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_user = lv_obj_create(top()); lv_obj_set_size(scr_user, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_user, &lv_font_siyuan, 0); 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() - 60); lv_obj_align(user_list, LV_ALIGN_TOP_MID, 0, 60); /*用户列表项*/ 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, 200); 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); } /*新建用户 按钮*/ 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, label, LV_ALIGN_OUT_RIGHT_MID, 250, 20); 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, label, LV_ALIGN_OUT_RIGHT_MID, 150, 20); 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, label, LV_ALIGN_OUT_RIGHT_MID, 250, 20); 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, menu_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, menu_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); if(target == btn_add_pass) { add_pass_gui(); } else if(target == btn_del_pass) { } else if(target == btn_return_add_mode) { user_mode_gui(); } } /*用户方式 界面*/ static void user_mode_gui() { lv_obj_clean(top()); lv_obj_t *scr_user_mode = lv_obj_create(top()); lv_obj_set_size(scr_user_mode, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_user_mode, &lv_font_siyuan, 0); 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_align(btn, LV_ALIGN_TOP_MID, 0, 100); lv_obj_add_style(btn, &btn_style, 0); lv_obj_t *btn_label = lv_label_create(btn); lv_obj_align(btn_label, LV_ALIGN_TOP_MID, 0, 0); lv_label_set_text(btn_label, "密码"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_pass = lv_btn_create(btn); lv_obj_set_size(btn_add_pass, 50, 50); lv_obj_align(btn_add_pass, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_move_foreground(btn_add_pass); lv_obj_set_style_radius(btn_add_pass, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_add_pass, LV_SYMBOL_EDIT, 0); lv_obj_set_style_text_font(btn_add_pass, &lv_font_montserrat_24, 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_set_size(btn_del_pass, 50, 50); lv_obj_align(btn_del_pass, LV_ALIGN_BOTTOM_RIGHT, 0, 0); lv_obj_move_foreground(btn_del_pass); lv_obj_set_style_radius(btn_del_pass, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_del_pass, LV_SYMBOL_TRASH, 0); lv_obj_set_style_text_font(btn_del_pass, &lv_font_montserrat_24, 0); 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_align(btn, LV_ALIGN_TOP_MID, 0, 400); lv_obj_add_style(btn, &btn_style, 0); btn_label = lv_label_create(btn); lv_obj_align(btn_label, LV_ALIGN_TOP_MID, 0, 0); lv_label_set_text(btn_label, "NFC卡"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_nfc = lv_btn_create(btn); lv_obj_set_size(btn_add_nfc, 50, 50); lv_obj_align(btn_add_nfc, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_move_foreground(btn_add_nfc); lv_obj_set_style_radius(btn_add_nfc, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_add_nfc, LV_SYMBOL_EDIT, 0); lv_obj_set_style_text_font(btn_add_nfc, &lv_font_montserrat_24, 0); 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_set_size(btn_del_nfc, 50, 50); lv_obj_align(btn_del_nfc, LV_ALIGN_BOTTOM_RIGHT, 0, 0); lv_obj_move_foreground(btn_del_nfc); lv_obj_set_style_radius(btn_del_nfc, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_del_nfc, LV_SYMBOL_TRASH, 0); lv_obj_set_style_text_font(btn_del_nfc, &lv_font_montserrat_24, 0); 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_align(btn, LV_ALIGN_TOP_MID, 0, 700); lv_obj_add_style(btn, &btn_style, 0); btn_label = lv_label_create(btn); lv_obj_align(btn_label, LV_ALIGN_TOP_MID, 0, 0); lv_label_set_text(btn_label, "掌静脉"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_palm = lv_btn_create(btn); lv_obj_set_size(btn_add_palm, 50, 50); lv_obj_align(btn_add_palm, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_move_foreground(btn_add_palm); lv_obj_set_style_radius(btn_add_palm, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_add_palm, LV_SYMBOL_EDIT, 0); lv_obj_set_style_text_font(btn_add_palm, &lv_font_montserrat_24, 0); 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_set_size(btn_del_palm, 50, 50); lv_obj_align(btn_del_palm, LV_ALIGN_BOTTOM_RIGHT, 0, 0); lv_obj_move_foreground(btn_del_palm); lv_obj_set_style_radius(btn_del_palm, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_del_palm, LV_SYMBOL_TRASH, 0); lv_obj_set_style_text_font(btn_del_palm, &lv_font_montserrat_24, 0); 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_align(btn, LV_ALIGN_TOP_MID, 0, 1000); lv_obj_add_style(btn, &btn_style, 0); btn_label = lv_label_create(btn); lv_obj_align(btn_label, LV_ALIGN_TOP_MID, 0, 0); lv_label_set_text(btn_label, "人脸"); lv_obj_add_style(btn, &btn_text_style, 0); btn_add_face = lv_btn_create(btn); lv_obj_set_size(btn_add_face, 50, 50); lv_obj_align(btn_add_face, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_move_foreground(btn_add_face); lv_obj_set_style_radius(btn_add_face, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_add_face, LV_SYMBOL_EDIT, 0); lv_obj_set_style_text_font(btn_add_face, &lv_font_montserrat_24, 0); 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_set_size(btn_del_face, 50, 50); lv_obj_align(btn_del_face, LV_ALIGN_BOTTOM_RIGHT, 0, 0); lv_obj_move_foreground(btn_del_face); lv_obj_set_style_radius(btn_del_face, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_img_src(btn_del_face, LV_SYMBOL_TRASH, 0); lv_obj_set_style_text_font(btn_del_face, &lv_font_montserrat_24, 0); 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, user_menu_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, menu_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_cnt == 1) { lv_textarea_del_char(add_text_keyboard2); } else { lv_textarea_del_char(add_text_keyboard); } } else if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { input_pass_cnt++; lv_obj_add_state(add_text_keyboard2, LV_STATE_FOCUSED); lv_obj_clear_state(add_text_keyboard, LV_STATE_FOCUSED); if(input_pass_cnt == 2) { input_pass_cnt = 0; if(strcmp(lv_textarea_get_text(add_text_keyboard), lv_textarea_get_text(add_text_keyboard2)) == 0) { add_user_succ_gui(); } else { add_user_fail_gui(); } } } else { if(input_pass_cnt == 1) { lv_textarea_add_text(add_text_keyboard2, txt); } else { lv_textarea_add_text(add_text_keyboard, txt); } } } } /*添加密码 界面*/ static void add_pass_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_pass = lv_obj_create(top()); lv_obj_set_size(scr_add_pass, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_add_pass, &lv_font_siyuan, 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_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_state(add_text_keyboard, LV_STATE_FOCUSED); input_pass_cnt = 0; 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_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, "再次确认密码"); 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, user_mode_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, menu_event_cb , LV_EVENT_CLICKED, NULL); } /*添加NFC 界面*/ static void add_nfc_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_nfc = lv_obj_create(top()); lv_obj_set_size(scr_add_nfc, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_add_nfc, &lv_font_siyuan, 0); 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); lv_obj_set_style_text_font(label, &lv_font_siyuan, 0); 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, user_mode_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, menu_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(top()); lv_obj_set_size(scr_add_palm, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_add_palm, &lv_font_siyuan, 0); 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, user_mode_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, menu_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(top()); lv_obj_set_size(scr_add_face, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_add_face, &lv_font_siyuan, 0); 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, user_mode_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, menu_event_cb , LV_EVENT_CLICKED, NULL); } static void add_user_result_event_cb(lv_event_cb_t * e) { lv_event_code_t code = lv_event_get_code(e); if(code == LV_EVENT_CLICKED) { user_mode_gui(); } } /*添加用户成功 界面*/ static void add_user_succ_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_user = lv_obj_create(top()); lv_obj_set_size(scr_add_user, scr_act_width(), scr_act_height()); lv_obj_set_style_text_font(scr_add_user, &lv_font_siyuan, 0); lv_obj_t *img = lv_img_create(scr_add_user); lv_img_set_src(img, success_img); lv_img_set_zoom(img, 256); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_add_user); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -300); lv_obj_set_size(label, 250, 20); lv_label_set_text(label, "添加成功,点击屏幕可继续添加用户"); lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_add_flag(scr_add_user, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_event_cb(scr_add_user, add_user_result_event_cb, LV_EVENT_CLICKED, 0); /*这个得往后放,不然会误触发*/ } /*添加用户失败 界面*/ static void add_user_fail_gui(void) { lv_obj_clean(top()); lv_obj_t *scr_add_user = lv_obj_create(top()); lv_obj_set_size(scr_add_user, scr_act_width(), scr_act_height()); lv_obj_t *img = lv_img_create(scr_add_user); lv_img_set_src(img, fail_img); lv_img_set_zoom(img, 256); lv_obj_center(img); lv_obj_t *label = lv_label_create(scr_add_user); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -300); lv_obj_set_size(label, 250, 20); /*限制长度,让文本滚动*/ lv_label_set_text(label, "添加失败,点击屏幕可重新添加用户"); lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_add_flag(scr_add_user, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_event_cb(scr_add_user, add_user_result_event_cb, LV_EVENT_CLICKED, 0); } 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; }