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

312 lines
11 KiB
C

#include "include.h"
#include "func.h"
#include "app_variable.h"
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
typedef struct f_alarmclock_t_ {
page_tp_move_t *ptm;
} f_alarmclock_t;
extern void func_ampm_time_string_get(char *buf, u8 hour, u8 min);
#define GRAY_REC_WIDTH 126//灰色矩形框宽度
#define GRAY_REC_HEIGHT 42//灰色矩形框高度
#define GRAY_REC_R 7//灰色矩形框圆角半径r
#define GRAY_REC_START_Y (23+GRAY_REC_HEIGHT/2)//首个灰色矩形框高度中心点y轴坐标
#define GRAT_REC_OFFSET_Y 46//各个灰色矩形框中心点间的间隔
//组件ID
enum
{
/* 列表 */
COMPO_ID_LISTBOX = 1,
COMPO_ID_LISTBOX_1,
COMPO_ID_LISTBOX_2,
/* 按键 */
COMPO_ID_BTN_ADD,
COMPO_ID_BTN_NO_ALARM_ADD,
/* 闹钟列表开关按键 */
COMPO_ID_BTN_SWITCH_0,
COMPO_ID_BTN_SWITCH_1,
COMPO_ID_BTN_SWITCH_2,
};
// static const compo_listbox_item_t tbl_aclock_list[] = {
// {STR_ALARM_CLOCK1, .item_mode = COMPO_LISTBOX_ITEM_MODE_SWITCH, .vidx = SYS_CTL_ACLOCK1_ON},
// {STR_ALARM_CLOCK2, .item_mode = COMPO_LISTBOX_ITEM_MODE_SWITCH, .vidx = SYS_CTL_ACLOCK2_ON},
// {STR_ALARM_CLOCK3, .item_mode = COMPO_LISTBOX_ITEM_MODE_SWITCH, .vidx = SYS_CTL_ACLOCK3_ON},
// };
compo_listbox_custom_item_t tbl_aclock_txt_list[ALARM_CLOCK_NUM_MAX] = {0};
static bool func_alarm_clock_en_get(u8 index)
{
return (SysVariable.alarm_enable_sel & 1 << index) ? TRUE : FALSE;
}
static void func_alarm_clock_en_set(u8 index, bool en)
{
if (en) {
SysVariable.alarm_enable_sel |= BIT(index);
} else {
SysVariable.alarm_enable_sel &= ~ BIT(index);
}
}
//创建闹钟窗体,创建窗体中不要使用功能结构体 func_cb.f_cb
compo_form_t *func_alarm_clock_form_create(void)
{
//新建窗体
compo_form_t *frm = compo_form_create(true);
//设置标题栏
compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TITLE | COMPO_FORM_MODE_SHOW_TIME);
compo_form_set_title(frm, i18n[STR_ALARM_CLOCK]);
if (SysVariable.alarm_enable_cnt != 0) {
/* 闹钟列表 */
char week_en_text[][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
for (int i = 0; i < SysVariable.alarm_enable_cnt; i++)
{
/* 创建灰色矩形框 背景 */
compo_shape_t *shape_up = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE, GRAY_REC_R);
compo_shape_set_color(shape_up, make_color(75, 75, 75));
compo_shape_set_location(shape_up, GUI_SCREEN_CENTER_X, GRAY_REC_START_Y + (i * GRAT_REC_OFFSET_Y), GRAY_REC_WIDTH, GRAY_REC_HEIGHT);
/* 新建按钮 */
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_LISTBOX + i);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X , GRAY_REC_START_Y + (i * GRAT_REC_OFFSET_Y), GRAY_REC_WIDTH, GRAY_REC_HEIGHT);
/* 显示时间 */
u8 hour, min;
hour = SysVariable.alarm_total_sec[i] / 3600;
min = (SysVariable.alarm_total_sec[i] % 3600) / 60;
char time_txt[TEXTBOX_TEXT_BUF_LEN] = {0};
func_ampm_time_string_get(time_txt, hour, min);
compo_textbox_t *txt;
txt = compo_textbox_create(frm, 10);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN);
compo_textbox_set_align_center(txt, false);
compo_textbox_set_pos(txt, 5, 24 + (i * GRAT_REC_OFFSET_Y));
compo_textbox_set(txt, time_txt);
/* 每周重复 */
char week_txt[TEXTBOX_TEXT_BUF_LEN] = {0};
if (SysVariable.alarm_week_sel[i] == 0x00) {
sprintf(week_txt, "%s", i18n[STR_ALARM_CLOCK_NOT_REPEAT]); // 无重复闹钟
} else if (SysVariable.alarm_week_sel[i] == 0x41) {
sprintf(week_txt, "%s", i18n[STR_WEEKEND]); // 周六、周日---休息日
} else if (SysVariable.alarm_week_sel[i] == 0x3E) {
sprintf(week_txt, "%s", i18n[STR_WORKING_DAY]); // 周一到周五---工作日
} else if (SysVariable.alarm_week_sel[i] == 0x7F) {
sprintf(week_txt, "%s", i18n[STR_EVERYDAY]); // 每日
} else { // 自定义重复
for (int index = 0; index < 7; index++) {
if (SysVariable.alarm_week_sel[i] & 1 << index) {
if (week_txt[0] != '\0') {
sprintf(week_txt + strlen(week_txt), " %s",
tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_English ? week_en_text[index] : i18n[STR_SUNDAY_SIMPLE + index]);
} else {
sprintf(week_txt, "%s",
tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_English ? week_en_text[index] : i18n[STR_SUNDAY_SIMPLE + index]); // 第一次拼接不需要空格
}
}
}
}
txt = compo_textbox_create(frm, 110);
compo_textbox_set_align_center(txt, false);
compo_textbox_set_location(txt, 5, 44 + (i * GRAT_REC_OFFSET_Y), 80, 20);
compo_textbox_set_autoroll_mode(txt, TEXT_AUTOROLL_MODE_SROLL_CIRC);
compo_textbox_set(txt, week_txt);
/* 切换按钮 */
u32 res_addr = func_alarm_clock_en_get(i) ? UI_BUF_COMMON_ON_BIN : UI_BUF_COMMON_OFF_BIN;
btn = compo_button_create_by_image(frm, res_addr);
compo_setid(btn, COMPO_ID_BTN_SWITCH_0 + i);
compo_button_set_pos(btn, GUI_SCREEN_CENTER_X + 34, GRAY_REC_START_Y + (i * GRAT_REC_OFFSET_Y));
}
} else {
/* 创建文本 */
compo_form_add_image(frm, UI_BUF_COMMON_BG_BIN, GUI_SCREEN_CENTER_X, 23 + 21);
compo_form_add_image(frm, UI_BUF_ALARM_CLOCK_NULL_BIN, 3 + 9, 35 + 9);
compo_textbox_t *txt_null_1 = compo_textbox_create(frm, 20);
compo_textbox_set_align_center(txt_null_1, false);
compo_textbox_set_location(txt_null_1, 28, 27, GUI_SCREEN_WIDTH-GUI_SCREEN_WIDTH/3, 20);
compo_textbox_set(txt_null_1, i18n[STR_GET_UP]);
// compo_textbox_set_autoroll_mode(txt_null_1, TEXT_AUTOROLL_MODE_SROLL_CIRC);
compo_textbox_t *txt_null = compo_textbox_create(frm, 50);
compo_textbox_set_align_center(txt_null, false);
compo_textbox_set_location(txt_null, 28, 45, GUI_SCREEN_WIDTH-GUI_SCREEN_WIDTH/3, 20);
compo_textbox_set(txt_null, i18n[STR_NOCLOCK_GETUP]);
// compo_textbox_set_autoroll_mode(txt_null, TEXT_AUTOROLL_MODE_SROLL_CIRC);
}
compo_button_t *btn;
/* 新建按钮 */
if(SysVariable.alarm_enable_cnt != 3){
compo_button_t *btn;
btn = compo_button_create_by_image(frm, UI_BUF_ALARM_CLOCK_ADD_BIN);
compo_setid(btn, COMPO_ID_BTN_ADD);
compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, 122+16);
}
if(SysVariable.alarm_enable_cnt == 0){
btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_NO_ALARM_ADD);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GRAY_REC_START_Y , GRAY_REC_WIDTH, GRAY_REC_HEIGHT);
}
return frm;
}
//单击按钮
static void func_alarm_clock_button_click(void)
{
int id = compo_get_button_id();
u32 res_addr = 0;
compo_button_t *btn = NULL;
point_t click_loca = ctp_get_sxy();
switch (id)
{
case COMPO_ID_LISTBOX ... COMPO_ID_LISTBOX_2:
if (click_loca.x < GUI_SCREEN_CENTER_X)
{
SysVariable.alarm_idx = id - COMPO_ID_LISTBOX;
func_switch_to_assign_screen(FUNC_ALARM_CLOCK_SUB_EDIT, false);
}
else
{
func_alarm_clock_en_set(id - COMPO_ID_LISTBOX, !func_alarm_clock_en_get(id - COMPO_ID_LISTBOX));
res_addr = func_alarm_clock_en_get(id - COMPO_ID_LISTBOX) ? UI_BUF_COMMON_ON_BIN : UI_BUF_COMMON_OFF_BIN;
btn = compo_getobj_byid(COMPO_ID_BTN_SWITCH_0 + (id - COMPO_ID_LISTBOX));
widget_icon_set(btn->widget, res_addr);
}
break;
case COMPO_ID_BTN_NO_ALARM_ADD:
case COMPO_ID_BTN_ADD:
if (SysVariable.alarm_enable_cnt == ALARM_CLOCK_NUM_MAX) {
break;
}
SysVariable.alarm_idx = SysVariable.alarm_enable_cnt; // 最后一个闹钟idx
func_switch_to_assign_screen(FUNC_ALARM_CLOCK_SUB_SET, false);
break;
default:
break;
}
}
//闹钟功能事件处理
static void func_alarm_clock_process(void)
{
f_alarmclock_t *f_alarmclock = (f_alarmclock_t *)func_cb.f_cb;
compo_page_move_process(f_alarmclock->ptm);
func_process();
}
//闹钟功能消息处理
static void func_alarm_clock_message(size_msg_t msg)
{
f_alarmclock_t *f_alarmclock = (f_alarmclock_t *)func_cb.f_cb;
switch (msg) {
case MSG_CTP_TOUCH:
compo_page_move_touch_handler(f_alarmclock->ptm);
break;
case MSG_CTP_CLICK:
func_alarm_clock_button_click();
break;
case MSG_CTP_SHORT_UP:
case MSG_CTP_SHORT_DOWN:
case MSG_CTP_SHORT_LEFT:
case MSG_CTP_LONG:
if (func_cb.flag_sort) {
func_message(msg);
}
break;
case MSG_CTP_SHORT_RIGHT:
func_message(msg);
break;
case MSG_QDEC_BACKWARD:
if (func_cb.flag_sort) { //快捷应用状态下不滚动页面
func_message(msg);
} else {
compo_page_move_set_by_pages(f_alarmclock->ptm, -1);
}
break;
case MSG_QDEC_FORWARD:
if (func_cb.flag_sort) {
func_message(msg);
} else {
compo_page_move_set_by_pages(f_alarmclock->ptm, 1);
}
break;
default:
func_message(msg);
break;
}
}
//进入闹钟功能
static void func_alarm_clock_enter(void)
{
func_cb.f_cb = func_zalloc(sizeof(f_alarmclock_t));
func_cb.frm_main = func_alarm_clock_form_create();
f_alarmclock_t *f_alarmclock = (f_alarmclock_t *)func_cb.f_cb;
f_alarmclock->ptm = (page_tp_move_t *)func_zalloc(sizeof(page_tp_move_t));
page_move_info_t info = {
.title_used = true,
.page_size = 180-20, //除标题外页面总长度
.page_count = 1,
.up_over_perc = 10,
.down_over_perc = 10,
};
compo_page_move_init(f_alarmclock->ptm, func_cb.frm_main->page_body, &info);
}
//退出闹钟功能
static void func_alarm_clock_exit(void)
{
f_alarmclock_t *f_alarmclock = (f_alarmclock_t *)func_cb.f_cb;
func_cb.last = FUNC_ALARM_CLOCK;
SysVariable.duty_flag = true;
if (f_alarmclock->ptm) {
func_free(f_alarmclock->ptm);
}
}
//闹钟功能
void func_alarm_clock(void)
{
printf("%s\n", __func__);
func_alarm_clock_enter();
while (func_cb.sta == FUNC_ALARM_CLOCK) {
func_alarm_clock_process();
func_alarm_clock_message(msg_dequeue());
}
func_alarm_clock_exit();
}