mcu_ab568x/app/projects/AB5682C_128/functions/func_charge.c
2025-05-30 18:03:10 +08:00

488 lines
18 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}