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