#include "include.h" #include "func.h" #include "app_variable.h" #include "common/func_lowpwr.h" #define TRACE_EN 0 #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define TEST_EN 0 #if TEST_EN static u16 test_value = 0; #define BAT_PERCENT_VALUE test_value // 电量百分比数值 #else #define BAT_PERCENT_VALUE bsp_vbat_percent_get() // 电量百分比数值 #endif #define LAMP_ANIM_CNT 11 // 天气类型数量 #define LAMP_TIME_CNT 12 // 时间数字数量 #define LAMP_DATE_CNT 10 // 日期数字类型数量 #define LAMP_WEEK_CNT 14 // 星期类型数量 #define LOWPWR_PERCENT 25 // 低电百分比阈值 #define NUM_PERCENT_MARGIN 6 // 数字和百分号间距 #define GUI_CHARGE_SCREEN_Y (GUI_SCREEN_HEIGHT / 2) enum { /* 图像id */ COMPO_ID_PIC_LOWPWR = 1, // 红色底图 COMPO_ID_PIC_LOWPWR1, // 20%红圈 COMPO_ID_PIC_LOWPWR2, // 1/10红圈 COMPO_ID_PIC_QUARTER, // 绿色底图 COMPO_ID_PIC_QUARTER1, // 50%部分 COMPO_ID_PIC_QUARTER2, // 75%部分 COMPO_ID_PIC_QUARTER3, // 1/4绿圈 /* 数字 */ COMPO_ID_BED_LAMP_ANIM, COMPO_ID_BED_LAMP_HOUR_1, COMPO_ID_BED_LAMP_HOUR_2, COMPO_ID_BED_LAMP_MIN_1, COMPO_ID_BED_LAMP_MIN_2, COMPO_ID_BED_LAMP_MIN_COLON, COMPO_ID_BED_LAMP_DATE, COMPO_ID_BED_LAMP_WEEK, }; typedef struct f_charge_t_ { u8 bed_lamp_idx; u8 charge_anim_index; bool charge_full_flag; u32 charge_anim_tick; u32 charge_sleep_temp; u8 charge_level_temp; } f_charge_t; //返回床头钟充电图标的当前索引 static u8 update_lamp_pic_index(u16 vbat_percent) { switch(tjd_charging_show_bat_ui_level()) { #if(LAMP_ANIM_CNT == 5) case 0: case 1: return 0; case 2: case 3: return 1; case 4: case 5: case 6: return 2; case 7: case 8: case 9: return 3; default: return LAMP_ANIM_CNT - 1; } #else if(LAMP_ANIM_CNT == 11) return tjd_charging_show_bat_ui_level(); #endif } //根据百分比计算四分之一圈旋转的角度(0-2700) static u16 func_charge_percent_to_deg(u16 percent) { percent = MIN(100, MAX(25, percent)); return (2700 * (percent - 25) / (100 - 25)); } static u16 func_low_power_percent_to_deg(u16 percent) { percent = MIN(100, MAX(10, percent)); return (3240 * (percent - 10) / (100 - 10)); } // 创建充电窗体,创建窗体中不要使用功能结构体 func_cb.f_cb compo_form_t *func_charge_form_create(void) { // 新建窗体和背景 compo_form_t *frm = compo_form_create(true); // 新建图像 #ifdef TJD_GUI_CHARING_WATCH_SHOW if (SysVariable.charingWatchSwitch == 1) { compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_BAT_ANIM_BIN); compo_picturebox_cut(pic, update_lamp_pic_index(BAT_PERCENT_VALUE), LAMP_ANIM_CNT); compo_setid(pic, COMPO_ID_BED_LAMP_ANIM); compo_picturebox_set_pos(pic, 6+15, 25+15); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_TIME_NUM_BIN); compo_picturebox_cut(pic, 0, LAMP_TIME_CNT); // 时-十位 compo_picturebox_set_pos(pic, 63+12, 25+26); compo_bonddata(pic, COMPO_BOND_HOUR_H); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_TIME_NUM_BIN); compo_picturebox_cut(pic, 0, LAMP_TIME_CNT); // 时-个位 compo_picturebox_set_pos(pic, 63+12+35, 25+26); compo_bonddata(pic, COMPO_BOND_HOUR_L); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_TIME_NUM_BIN); compo_picturebox_cut(pic, 0, LAMP_TIME_CNT); // 分-十位 compo_picturebox_set_pos(pic, 63+12, 92+26); compo_bonddata(pic, COMPO_BOND_MINUTE_H); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_TIME_NUM_BIN); compo_picturebox_cut(pic, 0, LAMP_TIME_CNT); // 分-个位 compo_picturebox_set_pos(pic, 63+12+35, 92+26); compo_bonddata(pic, COMPO_BOND_MINUTE_L); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_TIME_NUM_BIN); compo_picturebox_cut(pic, 10, LAMP_TIME_CNT); // 冒号 compo_setid(pic, COMPO_ID_BED_LAMP_MIN_COLON); compo_picturebox_set_pos(pic, 40, 92+26); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_DATE_NUM_BIN); compo_picturebox_cut(pic, 0, LAMP_DATE_CNT); // 默认第1张图 compo_picturebox_set_pos(pic, 78-5, 7+5); compo_bonddata(pic, COMPO_BOND_DAY); // pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_DATE_NUM_BIN); // compo_picturebox_cut(pic, 0, LAMP_DATE_CNT); // 默认第1张图 // compo_picturebox_set_pos(pic, 139, 21); // compo_bonddata(pic, COMPO_BOND_DAY_L); pic = compo_picturebox_create(frm, UI_BUF_BEDLAMP_WEEK_BIN); #if defined(__LANGUAGE_SM_CHINESE__) compo_picturebox_cut(pic, SysVariable.deviceInfo.language == LANGUAGE_TYPE_Chinese ? 0 : 6, LAMP_WEEK_CNT); // 默认第1张图 #else compo_picturebox_cut(pic, 0, LAMP_WEEK_CNT); // 默认第1张图 #endif compo_picturebox_set_pos(pic, 96+7, 7+5); compo_bonddata(pic, COMPO_BOND_WEEKDAY); // compo_textbox_t *date = compo_textbox_create(frm, 5); // compo_textbox_set_font(date, UI_BUF_0FONT_FONT_BIN); // compo_textbox_set_pos(date, 144, 21); // compo_textbox_set_forecolor(date, make_color(255,255,255)); // compo_bonddata(date, COMPO_BOND_DATE); // compo_textbox_t *week = compo_textbox_create(frm, 15); // compo_textbox_set_font(week, UI_BUF_0FONT_FONT_BIN); // compo_textbox_set_pos(week, 201, 21); // compo_textbox_set_forecolor(week, make_color(255,255,255)); // compo_bonddata(week, COMPO_BOND_WEEKDAY); } else #endif { /* 低电红色动画 */ s16 center_x = 0; s16 center_y = 6; compo_picturebox_t *pic = NULL; pic = compo_picturebox_create(frm, UI_BUF_CHARGE_BJ_LOW_BATTERY_BIN); compo_setid(pic, COMPO_ID_PIC_LOWPWR); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE <= LOWPWR_PERCENT); center_x = gui_image_get_size(UI_BUF_CHARGE_LOW_BATTERY_BIN).wid - 6; pic = compo_picturebox_create(frm, UI_BUF_CHARGE_LOW_BATTERY_BIN); compo_setid(pic, COMPO_ID_PIC_LOWPWR1); compo_picturebox_set_rotation_center(pic, center_x, center_y); compo_picturebox_set_rotation(pic, 360); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE > 20); pic = compo_picturebox_create(frm, UI_BUF_CHARGE_LOW_BATTERY_BIN); compo_setid(pic, COMPO_ID_PIC_LOWPWR2); compo_picturebox_set_rotation_center(pic, center_x, center_y); compo_picturebox_set_rotation(pic, func_low_power_percent_to_deg(BAT_PERCENT_VALUE)); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, FALSE); /* 电量大于25%绿色动画 */ pic = compo_picturebox_create(frm, UI_BUF_CHARGE_BJ_BATTERY_BIN); compo_setid(pic, COMPO_ID_PIC_QUARTER); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE > LOWPWR_PERCENT); center_x = gui_image_get_size(UI_BUF_CHARGE_CHARGING_BIN).wid - 6; pic = compo_picturebox_create(frm, UI_BUF_CHARGE_CHARGING_BIN); compo_setid(pic, COMPO_ID_PIC_QUARTER1); compo_picturebox_set_rotation_center(pic, center_x, center_y); compo_picturebox_set_rotation(pic, 900); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE > 50); pic = compo_picturebox_create(frm, UI_BUF_CHARGE_CHARGING_BIN); compo_setid(pic, COMPO_ID_PIC_QUARTER2); compo_picturebox_set_rotation_center(pic, center_x, center_y); compo_picturebox_set_rotation(pic, 1800); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE > 75); pic = compo_picturebox_create(frm, UI_BUF_CHARGE_CHARGING_BIN); compo_setid(pic, COMPO_ID_PIC_QUARTER3); compo_picturebox_set_rotation_center(pic, center_x, center_y); compo_picturebox_set_rotation(pic, func_charge_percent_to_deg(BAT_PERCENT_VALUE)); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_CHARGE_SCREEN_Y); compo_picturebox_set_visible(pic, BAT_PERCENT_VALUE > LOWPWR_PERCENT); } return frm; } // 充电功能事件处理 static void func_charge_process(void) { f_charge_t *f_charge = (f_charge_t *)func_cb.f_cb; compo_picturebox_t *pic; // compo_textbox_t *txt; // char str_buff[8]; static colon_show = false; /*防止移除充电器后界面未退出问题*/ if (!bsp_charge_sta_get()){ if(func_cb.sta == FUNC_CHARGE){ func_directly_back_to(); return; } } #if TEST_EN static u32 tick = 0; if (tick_check_expire(func_cb.enter_tick, 3000) && tick_check_expire(tick, 300)) { tick = tick_get(); test_value += test_value >= 100 ? 0 : 1; } #endif // TEST_EN #ifdef TJD_GUI_CHARING_WATCH_SHOW if (SysVariable.charingWatchSwitch == 1) { reset_sleep_delay(); reset_pwroff_delay(); if (tick_check_expire(func_cb.enter_tick, 1000)) { func_cb.enter_tick = tick_get(); if (BAT_PERCENT_VALUE < 100) { f_charge->bed_lamp_idx++; if (f_charge->bed_lamp_idx >= LAMP_ANIM_CNT) { f_charge->bed_lamp_idx = update_lamp_pic_index(BAT_PERCENT_VALUE); } } else { f_charge->bed_lamp_idx = (LAMP_ANIM_CNT - 1); } pic = compo_getobj_byid(COMPO_ID_BED_LAMP_ANIM); compo_picturebox_cut(pic, f_charge->bed_lamp_idx, LAMP_ANIM_CNT); colon_show = colon_show ? false : true; pic = compo_getobj_byid(COMPO_ID_BED_LAMP_MIN_COLON); compo_picturebox_set_visible(pic, colon_show); } } else #endif { if (BAT_PERCENT_VALUE >= 100) { if (!f_charge->charge_full_flag) { pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR1); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR2); compo_picturebox_set_visible(pic, FALSE); /* 满电停止动画 */ pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER); compo_picturebox_set_visible(pic, TRUE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER1); compo_picturebox_set_visible(pic, TRUE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER2); compo_picturebox_set_visible(pic, TRUE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER3); compo_picturebox_set_rotation(pic, func_charge_percent_to_deg(BAT_PERCENT_VALUE)); compo_picturebox_set_visible(pic, TRUE); f_charge->charge_full_flag = TRUE; } } else { /* 充电过程循环动画 */ if (tick_check_expire(f_charge->charge_anim_tick, (BAT_PERCENT_VALUE > LOWPWR_PERCENT ? 100 : 150))) // 低电红色动画周期150ms,绿色周期100ms { if (f_charge->charge_anim_index < (BAT_PERCENT_VALUE > LOWPWR_PERCENT ? 100 : LOWPWR_PERCENT)) f_charge->charge_anim_index++; else f_charge->charge_anim_index = BAT_PERCENT_VALUE; if (BAT_PERCENT_VALUE > LOWPWR_PERCENT) { pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR1); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR2); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER); compo_picturebox_set_visible(pic, TRUE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER1); compo_picturebox_set_visible(pic, f_charge->charge_anim_index > 50); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER2); compo_picturebox_set_visible(pic, f_charge->charge_anim_index > 75); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER3); compo_picturebox_set_rotation(pic, func_charge_percent_to_deg(f_charge->charge_anim_index)); compo_picturebox_set_visible(pic, f_charge->charge_anim_index > LOWPWR_PERCENT); } else { pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER1); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER2); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_QUARTER3); compo_picturebox_set_visible(pic, FALSE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR); compo_picturebox_set_visible(pic, TRUE); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR1); compo_picturebox_set_visible(pic, f_charge->charge_anim_index > 20); pic = compo_getobj_byid(COMPO_ID_PIC_LOWPWR2); compo_picturebox_set_rotation(pic, func_low_power_percent_to_deg(f_charge->charge_anim_index)); compo_picturebox_set_visible(pic, TRUE); } f_charge->charge_anim_tick = tick_get(); } } } func_process(); } // 充电功能消息处理 static void func_charge_message(size_msg_t msg) { static u32 res_tick = 0; switch (msg) { #if TEST_EN case MSG_CTP_CLICK: test_value = 0; TRACE("test_value:%d\n", test_value); break; #endif // TEST_EN case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: case MSG_CTP_SHORT_LEFT: // case MSG_CTP_SHORT_RIGHT: case MSG_CTP_LONG: break; case MSG_QDEC_FORWARD: case MSG_QDEC_BACKWARD: break; /* 不响应处理触摸滑动事件 */ case MSG_CTP_SHORT_RIGHT: break; /* 不响应按键事件 */ case KU_BACK: case KU_RIGHT: case KU_LEFT: break; /* 8s长按强制重启 */ case K_BACK: res_tick = tick_get(); break; case KL_BACK: case KH_BACK: case KLH_BACK: if (tick_check_expire(res_tick, 8000)) { user_cfg_info_write(); WDT_RST(); } break; default: func_message(msg); break; } } // 进入充电功能 static void func_charge_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_charge_t)); func_cb.frm_main = func_charge_form_create(); f_charge_t *f_charge = (f_charge_t *)func_cb.f_cb; f_charge->charge_anim_tick = tick_get(); f_charge->charge_full_flag = FALSE; f_charge->charge_anim_index = BAT_PERCENT_VALUE; f_charge->bed_lamp_idx = update_lamp_pic_index(BAT_PERCENT_VALUE); if(SysVariable.charingWatchSwitch == 1) { f_charge->charge_sleep_temp = SysVariable.sleep_time; SysVariable.sleep_time = -1; SysVariable.sleep_delay = SysVariable.sleep_time; SysVariable.guioff_delay = SysVariable.sleep_time; } f_charge->charge_level_temp = SysVariable.light_level; SysVariable.light_level = 1; tft_bglight_set_level(SysVariable.light_level,TRUE); func_cb.enter_tick = tick_get(); } // 退出充电功能 static void func_charge_exit(void) { func_cb.last = FUNC_CHARGE; f_charge_t *f_charge = (f_charge_t *)func_cb.f_cb; if(SysVariable.charingWatchSwitch == 1) { SysVariable.sleep_time = f_charge->charge_sleep_temp; SysVariable.guioff_delay = SysVariable.sleep_time; SysVariable.sleep_delay = SysVariable.sleep_time; } SysVariable.light_level = f_charge->charge_level_temp; tft_bglight_set_level(SysVariable.light_level,false); } // 充电功能 void func_charge(void) { printf("%s\n", __func__); func_charge_enter(); while (func_cb.sta == FUNC_CHARGE) { func_charge_process(); func_charge_message(msg_dequeue()); /* 防止移除充电仍未退出充电界面,返回表盘 */ // if (!sys_cb.charge_sta) { // func_cb.sta = FUNC_CLOCK; // } } func_charge_exit(); }