mcu_ab568x/userboot240328/app/projects/AB5681G_320/functions/func_setting.c
2025-05-30 18:03:10 +08:00

326 lines
12 KiB
C
Raw Permalink 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"
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
#define FOCUS_AUTO_TICK_EXPIRE 10 //松手后自动对齐焦点单位时间(ms)
#define FOCUS_AUTO_STEP 5 //松手后自动对齐焦点单位时间步进
#define FOCUS_AUTO_STEP_DIV 16
#define DRAG_AUTO_SPEED 80 //拖动松手后的速度
#define SET_LIST_CNT ((int)(sizeof(tbl_setting_list) / sizeof(tbl_setting_list[0])))
enum {
COMPO_ID_LISTBOX = 1,
};
typedef struct f_set_list_t_ {
compo_listbox_t *listbox;
bool flag_drag; //开始拖动
bool flag_move_auto; //自动移到坐标
u32 tick;
s32 focus_y;
s32 focus_dy;
s32 focus_ystep;
int moveto_idx; //设定自动移到的目标菜单
s32 moveto_y; //设定自动移到的y坐标
s32 first_y; //首图标坐标
s32 last_y; //尾图标坐标
} f_set_list_t;
static const compo_listbox_item_t tbl_setting_list[] = {
{UI_BUF_SETTING_LIGHT_BIN, STR_SETTING_LIGHT, FUNC_LIGHT}, //亮度调节
{UI_BUF_SETTING_BREATHING_SCREEN_CLICK_BIN, STR_SETTING_DOUSING, FUNC_SET_SUB_DOUSING}, //息屏时长
{UI_BUF_SETTING_WRIST_BIN, STR_SETTING_UP, FUNC_SET_SUB_WRIST}, //抬腕亮屏
{UI_BUF_SETTING_DISTURB_CLICK_BIN, STR_SETTING_DISTURD, FUNC_SET_SUB_DISTURD}, //勿扰模式
{UI_BUF_SETTING_SOUND_AND_VIBRATION_BIN, STR_SETTING_SAV, FUNC_SET_SUB_SAV}, //声音与振动
{UI_BUF_SETTING_LANGUAGE_BIN, STR_SETTING_LANGUAGE, FUNC_SET_SUB_LANGUAGE}, //语言设置
{UI_BUF_SETTING_TIME_BIN, STR_SETTING_TIME, FUNC_SET_SUB_TIME}, //时间设置
{UI_BUF_SETTING_CALENDAR_BIN, STR_SETTING_CALENDAR, FUNC_CALENDAER}, //日期设置
{UI_BUF_SETTING_PASSWORD_BIN, STR_SETTING_PASSWORD, FUNC_SET_SUB_PASSWORD}, //密码锁
{UI_BUF_SETTING_ABOUT_BIN, STR_SETTING_ABOUT, FUNC_SET_SUB_ABOUT}, //关于
{UI_BUF_SETTING_RESTART_BIN, STR_SETTING_RESTART, FUNC_SET_SUB_RESTART}, //重启
{UI_BUF_SETTING_RESTORE_FACTORY_BIN, STR_SETTING_RSTFY, FUNC_SET_SUB_RSTFY}, //恢复出厂
{UI_BUF_SETTING_OFF_BIN, STR_SETTING_OFF, FUNC_SET_SUB_OFF}, //关机
};
//创建主菜单窗体,创建窗体中不要使用功能结构体 func_cb.f_cb
compo_form_t *func_set_sub_list_form_create(void)
{
//新建窗体
compo_form_t *frm = compo_form_create(true);
//新建菜单列表
compo_listbox_t *listbox = compo_listbox_create(frm, tbl_setting_list, SET_LIST_CNT);
compo_setid(listbox, COMPO_ID_LISTBOX);
u8 set_idx = sys_cb.set_idx;
if (set_idx < 1) {
set_idx = 1;
}
compo_listbox_set_focus_byidx(listbox, set_idx);
compo_listbox_update(listbox);
return frm;
}
//点进图标进入应用
static void func_set_sub_list_icon_click(void)
{
int icon_idx;
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
compo_listbox_t *listbox = f_set->listbox;
u8 func_sta;
icon_idx = compo_listbox_select(listbox, ctp_get_sxy().y);
if (icon_idx < 0 || icon_idx >= SET_LIST_CNT) {
return;
}
//根据图标索引获取应用ID
func_sta = tbl_setting_list[icon_idx].func_sta;
//切入应用
if (func_sta > 0) {
compo_form_t *frm = func_create_form(func_sta);
func_switching(FUNC_SWITCH_ZOOM_ENTER | FUNC_SWITCH_AUTO, listbox->sel_icon);
compo_form_destroy(frm);
func_cb.sta = func_sta;
sys_cb.set_idx = icon_idx;
}
}
//切换到设置菜单页面
static void func_set_sub_list_switch_to_clock(void)
{
u8 func_sta = FUNC_CLOCK;
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
compo_listbox_t *listbox = f_set->listbox;
widget_icon_t *icon = compo_listbox_select_byidx(listbox, 0);
compo_form_t *frm = func_create_form(func_sta);
func_switching(FUNC_SWITCH_ZOOM_FADE_ENTER | FUNC_SWITCH_AUTO, icon);
compo_form_destroy(frm);
func_cb.sta = func_sta;
sys_cb.set_idx = 0;
}
//主菜单功能事件处理
static void func_set_sub_list_process(void)
{
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
compo_listbox_t *listbox = f_set->listbox;
if (f_set->flag_drag) {
s32 dx;
s32 dy = f_set->focus_dy;
f_set->flag_drag = ctp_get_dxy(&dx, &f_set->focus_dy);
if (f_set->flag_drag) {
//拖动菜单图标
f_set->focus_ystep = f_set->focus_dy - dy;
compo_listbox_set_focus(listbox, f_set->focus_y - f_set->focus_dy);
compo_listbox_update(listbox);
} else {
//抬手后开始自动移动
s32 last_dy = ctp_get_last_dxy().y;
f_set->focus_y = listbox->ofs_y;
f_set->flag_move_auto = true;
f_set->moveto_idx = listbox->focus_icon_idx - (last_dy * DRAG_AUTO_SPEED / GUI_SCREEN_HEIGHT);
if (f_set->moveto_idx > SET_LIST_CNT) {
f_set->moveto_idx = SET_LIST_CNT;
} else if (f_set->moveto_idx < -1) {
f_set->moveto_idx = -1;
}
f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx);
f_set->tick = tick_get();
}
}
if (f_set->flag_move_auto) {
//自动移动
if (f_set->focus_y == f_set->moveto_y) {
if (f_set->focus_y < f_set->first_y) {
f_set->moveto_y = f_set->first_y; //超过第1个回弹
} else if (f_set->focus_y > f_set->last_y) {
f_set->moveto_y = f_set->last_y; //超过最后1个回弹
} else {
f_set->flag_move_auto = false; //移动完成
}
} else if (tick_check_expire(f_set->tick, FOCUS_AUTO_TICK_EXPIRE)) {
s32 dy;
f_set->tick = tick_get();
dy = f_set->moveto_y - f_set->focus_y;
if (dy > 0) {
if (dy > FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV) {
dy = dy / FOCUS_AUTO_STEP_DIV;
} else if (dy > FOCUS_AUTO_STEP) {
dy = FOCUS_AUTO_STEP;
} else {
dy = 1;
}
} else {
if (dy < -FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV) {
dy = dy / FOCUS_AUTO_STEP_DIV;
} else if (dy < -FOCUS_AUTO_STEP) {
dy = -FOCUS_AUTO_STEP;
} else {
dy = -1;
}
}
f_set->focus_y += dy;
compo_listbox_set_focus(listbox, f_set->focus_y);
compo_listbox_update(listbox);
}
}
func_process();
}
//拖动过程中,只响应部分消息
static void func_set_sub_list_drag_message(size_msg_t msg)
{
switch (msg) {
default:
evt_message(msg);
break;
}
}
//自动移动中,只响应部分消息
static void func_set_sub_list_move_auto_message(size_msg_t msg)
{
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
compo_listbox_t *listbox = f_set->listbox;
switch (msg) {
case MSG_CTP_TOUCH:
f_set->flag_drag = true; //移动过程中,触屏停止
f_set->flag_move_auto = false;
break;
case MSG_QDEC_FORWARD: //向前滚动菜单
if (f_set->moveto_idx <= SET_LIST_CNT - 1) {
f_set->moveto_idx++;
f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx);
}
break;
case MSG_QDEC_REVERSE: //向后滚动菜单
if (f_set->moveto_idx >= 0) {
f_set->moveto_idx--;
f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx);
}
break;
default:
evt_message(msg);
break;
}
}
//进入设置主菜单页面
static void func_set_sub_list_enter(void)
{
func_cb.f_cb = func_zalloc(sizeof(f_set_list_t));
func_cb.frm_main = func_set_sub_list_form_create();
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
f_set->listbox = compo_getobj_byid(COMPO_ID_LISTBOX);
compo_listbox_t *listbox = f_set->listbox;
if (listbox->type != COMPO_TYPE_LISTBOX) {
halt(HALT_GUI_COMPO_LISTBOX_TYPE);
}
f_set->focus_y = listbox->ofs_y;
f_set->first_y = compo_listbox_gety_byidx(listbox, 0);
f_set->last_y = compo_listbox_gety_byidx(listbox, SET_LIST_CNT - 1);
func_cb.enter_tick = tick_get();
}
//正常模式下
static void func_set_sub_list_normal_message(size_msg_t msg)
{
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
compo_listbox_t *listbox = f_set->listbox;
switch (msg) {
case MSG_CTP_CLICK:
func_set_sub_list_icon_click(); //单击图标
break;
case MSG_CTP_SHORT_UP:
case MSG_CTP_SHORT_DOWN:
f_set->flag_drag = true; //任何方向短划,开启拖动
f_set->flag_move_auto = false;
break;
case MSG_CTP_SHORT_RIGHT:
func_switching_to_menu(); //右滑缓慢退出任务
break;
case MSG_QDEC_FORWARD: //向前滚动菜单
f_set->flag_move_auto = true;
f_set->moveto_idx = listbox->focus_icon_idx;
if (f_set->moveto_idx <= SET_LIST_CNT - 1) {
f_set->moveto_idx++;
f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx);
}
break;
case MSG_QDEC_REVERSE: //向后滚动菜单
f_set->flag_move_auto = true;
f_set->moveto_idx = listbox->focus_icon_idx;
if (f_set->moveto_idx >= 0) {
f_set->moveto_idx--;
f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx);
}
break;
case MSG_CTP_LONG:
break;
case KU_DELAY_BACK:
if (tick_check_expire(func_cb.enter_tick, TICK_IGNORE_KEY)) {
func_set_sub_list_switch_to_clock(); //返回设置界面
}
break;
default:
// func_set_sub_message(msg);
break;
}
}
//主菜单功能消息处理
static void func_set_sub_list_message(size_msg_t msg)
{
f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb;
if (f_set->flag_drag) {
//拖动过程中,只响应部分消息
func_set_sub_list_drag_message(msg);
} else if (f_set->flag_move_auto) {
//自动移动中,只响应部分消息
func_set_sub_list_move_auto_message(msg);
} else {
//正常模式下
func_set_sub_list_normal_message(msg);
}
}
//退出菜单样式
void func_set_sub_exit(void)
{
printf("func_set_sub_exit\r\n");
func_cb.last = FUNC_SETTING;
}
//主菜单功能
void func_set_sub_list(void)
{
func_set_sub_list_enter();
while (func_cb.sta == FUNC_SETTING) {
func_set_sub_list_process();
func_set_sub_list_message(msg_dequeue());
}
func_set_sub_exit();
}